xref: /aosp_15_r20/art/openjdkjvmti/art_jvmti.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /* Copyright (C) 2016 The Android Open Source Project
2*795d594fSAndroid Build Coastguard Worker  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * This file implements interfaces from the file jvmti.h. This implementation
5*795d594fSAndroid Build Coastguard Worker  * is licensed under the same terms as the file jvmti.h.  The
6*795d594fSAndroid Build Coastguard Worker  * copyright and license information for the file jvmti.h follows.
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
9*795d594fSAndroid Build Coastguard Worker  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
10*795d594fSAndroid Build Coastguard Worker  *
11*795d594fSAndroid Build Coastguard Worker  * This code is free software; you can redistribute it and/or modify it
12*795d594fSAndroid Build Coastguard Worker  * under the terms of the GNU General Public License version 2 only, as
13*795d594fSAndroid Build Coastguard Worker  * published by the Free Software Foundation.  Oracle designates this
14*795d594fSAndroid Build Coastguard Worker  * particular file as subject to the "Classpath" exception as provided
15*795d594fSAndroid Build Coastguard Worker  * by Oracle in the LICENSE file that accompanied this code.
16*795d594fSAndroid Build Coastguard Worker  *
17*795d594fSAndroid Build Coastguard Worker  * This code is distributed in the hope that it will be useful, but WITHOUT
18*795d594fSAndroid Build Coastguard Worker  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19*795d594fSAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20*795d594fSAndroid Build Coastguard Worker  * version 2 for more details (a copy is included in the LICENSE file that
21*795d594fSAndroid Build Coastguard Worker  * accompanied this code).
22*795d594fSAndroid Build Coastguard Worker  *
23*795d594fSAndroid Build Coastguard Worker  * You should have received a copy of the GNU General Public License version
24*795d594fSAndroid Build Coastguard Worker  * 2 along with this work; if not, write to the Free Software Foundation,
25*795d594fSAndroid Build Coastguard Worker  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
26*795d594fSAndroid Build Coastguard Worker  *
27*795d594fSAndroid Build Coastguard Worker  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
28*795d594fSAndroid Build Coastguard Worker  * or visit www.oracle.com if you need additional information or have any
29*795d594fSAndroid Build Coastguard Worker  * questions.
30*795d594fSAndroid Build Coastguard Worker  */
31*795d594fSAndroid Build Coastguard Worker 
32*795d594fSAndroid Build Coastguard Worker #ifndef ART_OPENJDKJVMTI_ART_JVMTI_H_
33*795d594fSAndroid Build Coastguard Worker #define ART_OPENJDKJVMTI_ART_JVMTI_H_
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker #include <memory>
36*795d594fSAndroid Build Coastguard Worker #include <type_traits>
37*795d594fSAndroid Build Coastguard Worker #include <unordered_map>
38*795d594fSAndroid Build Coastguard Worker #include <unordered_set>
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker #include <jni.h>
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h>
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker #include "deopt_manager.h"
45*795d594fSAndroid Build Coastguard Worker #include "base/casts.h"
46*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
47*795d594fSAndroid Build Coastguard Worker #include "base/strlcpy.h"
48*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h"
49*795d594fSAndroid Build Coastguard Worker #include "events.h"
50*795d594fSAndroid Build Coastguard Worker #include "instrumentation.h"
51*795d594fSAndroid Build Coastguard Worker #include "jni/java_vm_ext.h"
52*795d594fSAndroid Build Coastguard Worker #include "jni/jni_env_ext.h"
53*795d594fSAndroid Build Coastguard Worker #include "jvmti.h"
54*795d594fSAndroid Build Coastguard Worker #include "runtime.h"
55*795d594fSAndroid Build Coastguard Worker #include "ti_breakpoint.h"
56*795d594fSAndroid Build Coastguard Worker 
57*795d594fSAndroid Build Coastguard Worker namespace art {
58*795d594fSAndroid Build Coastguard Worker class ArtField;
59*795d594fSAndroid Build Coastguard Worker class ArtMethod;
60*795d594fSAndroid Build Coastguard Worker class ShadowFrame;
61*795d594fSAndroid Build Coastguard Worker }  // namespace art
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker namespace openjdkjvmti {
64*795d594fSAndroid Build Coastguard Worker 
65*795d594fSAndroid Build Coastguard Worker class ObjectTagTable;
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker // A special version that we use to identify special tooling interface versions which mostly matches
68*795d594fSAndroid Build Coastguard Worker // the jvmti spec but everything is best effort. This is used to implement the userdebug
69*795d594fSAndroid Build Coastguard Worker // 'debug-anything' behavior.
70*795d594fSAndroid Build Coastguard Worker //
71*795d594fSAndroid Build Coastguard Worker // This is the value 0x70010200.
72*795d594fSAndroid Build Coastguard Worker static constexpr jint kArtTiVersion = JVMTI_VERSION_1_2 | 0x40000000;
73*795d594fSAndroid Build Coastguard Worker 
74*795d594fSAndroid Build Coastguard Worker // Returns whether we are able to use all jvmti features.
IsFullJvmtiAvailable()75*795d594fSAndroid Build Coastguard Worker static inline bool IsFullJvmtiAvailable() {
76*795d594fSAndroid Build Coastguard Worker   art::Runtime* runtime = art::Runtime::Current();
77*795d594fSAndroid Build Coastguard Worker   return runtime->GetInstrumentation()->IsForcedInterpretOnly() ||
78*795d594fSAndroid Build Coastguard Worker          runtime->IsJavaDebuggableAtInit();
79*795d594fSAndroid Build Coastguard Worker }
80*795d594fSAndroid Build Coastguard Worker 
81*795d594fSAndroid Build Coastguard Worker // A structure that is a jvmtiEnv with additional information for the runtime.
82*795d594fSAndroid Build Coastguard Worker struct ArtJvmTiEnv : public jvmtiEnv {
83*795d594fSAndroid Build Coastguard Worker   art::JavaVMExt* art_vm;
84*795d594fSAndroid Build Coastguard Worker   void* local_data;
85*795d594fSAndroid Build Coastguard Worker 
86*795d594fSAndroid Build Coastguard Worker   // The ti_version we are compatible with. This is only for giving the correct value for GetVersion
87*795d594fSAndroid Build Coastguard Worker   // when running on a userdebug/eng device.
88*795d594fSAndroid Build Coastguard Worker   jint ti_version;
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   jvmtiCapabilities capabilities;
91*795d594fSAndroid Build Coastguard Worker 
92*795d594fSAndroid Build Coastguard Worker   EventMasks event_masks;
93*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ArtJvmtiEventCallbacks> event_callbacks;
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker   // Tagging is specific to the jvmtiEnv.
96*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ObjectTagTable> object_tag_table;
97*795d594fSAndroid Build Coastguard Worker 
98*795d594fSAndroid Build Coastguard Worker   // Set of watched fields is unique to each jvmtiEnv.
99*795d594fSAndroid Build Coastguard Worker   // TODO It might be good to follow the RI and only let one jvmtiEnv ever have the watch caps so
100*795d594fSAndroid Build Coastguard Worker   // we can record this on the field directly. We could do this either using free access-flag bits
101*795d594fSAndroid Build Coastguard Worker   // or by putting a list in the ClassExt of a field's DeclaringClass.
102*795d594fSAndroid Build Coastguard Worker   // TODO Maybe just have an extension to let one put a watch on every field, that would probably be
103*795d594fSAndroid Build Coastguard Worker   // good enough maybe since you probably want either a few or all/almost all of them.
104*795d594fSAndroid Build Coastguard Worker   std::unordered_set<art::ArtField*> access_watched_fields GUARDED_BY(event_info_mutex_);
105*795d594fSAndroid Build Coastguard Worker   std::unordered_set<art::ArtField*> modify_watched_fields GUARDED_BY(event_info_mutex_);
106*795d594fSAndroid Build Coastguard Worker 
107*795d594fSAndroid Build Coastguard Worker   // Set of breakpoints is unique to each jvmtiEnv.
108*795d594fSAndroid Build Coastguard Worker   std::unordered_set<Breakpoint> breakpoints GUARDED_BY(event_info_mutex_);
109*795d594fSAndroid Build Coastguard Worker   std::unordered_set<const art::ShadowFrame*> notify_frames GUARDED_BY(event_info_mutex_);
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker   // RW lock to protect access to all of the event data.
112*795d594fSAndroid Build Coastguard Worker   art::ReaderWriterMutex event_info_mutex_ DEFAULT_MUTEX_ACQUIRED_AFTER;
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker   std::string last_error_ GUARDED_BY(last_error_mutex_);
115*795d594fSAndroid Build Coastguard Worker   // Lock to touch the last-error-message.
116*795d594fSAndroid Build Coastguard Worker   art::Mutex last_error_mutex_ BOTTOM_MUTEX_ACQUIRED_AFTER;
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker   ArtJvmTiEnv(art::JavaVMExt* runtime, EventHandler* event_handler, jint ti_version);
119*795d594fSAndroid Build Coastguard Worker 
AsArtJvmTiEnvArtJvmTiEnv120*795d594fSAndroid Build Coastguard Worker   static ArtJvmTiEnv* AsArtJvmTiEnv(jvmtiEnv* env) {
121*795d594fSAndroid Build Coastguard Worker     return art::down_cast<ArtJvmTiEnv*>(env);
122*795d594fSAndroid Build Coastguard Worker   }
123*795d594fSAndroid Build Coastguard Worker 
124*795d594fSAndroid Build Coastguard Worker   // Top level lock. Nothing can be held when we get this except for mutator lock for full
125*795d594fSAndroid Build Coastguard Worker   // thread-suspension.
126*795d594fSAndroid Build Coastguard Worker   static art::Mutex *gEnvMutex ACQUIRED_AFTER(art::Locks::mutator_lock_);
127*795d594fSAndroid Build Coastguard Worker };
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker // Macro and constexpr to make error values less annoying to write.
130*795d594fSAndroid Build Coastguard Worker #define ERR(e) JVMTI_ERROR_ ## e
131*795d594fSAndroid Build Coastguard Worker static constexpr jvmtiError OK = JVMTI_ERROR_NONE;
132*795d594fSAndroid Build Coastguard Worker 
133*795d594fSAndroid Build Coastguard Worker // Special error code for unimplemented functions in JVMTI
134*795d594fSAndroid Build Coastguard Worker static constexpr jvmtiError ERR(NOT_IMPLEMENTED) = JVMTI_ERROR_NOT_AVAILABLE;
135*795d594fSAndroid Build Coastguard Worker 
GetJniEnv(jvmtiEnv * env)136*795d594fSAndroid Build Coastguard Worker static inline JNIEnv* GetJniEnv(jvmtiEnv* env) {
137*795d594fSAndroid Build Coastguard Worker   JNIEnv* ret_value = nullptr;
138*795d594fSAndroid Build Coastguard Worker   jint res = reinterpret_cast<ArtJvmTiEnv*>(env)->art_vm->GetEnv(
139*795d594fSAndroid Build Coastguard Worker       reinterpret_cast<void**>(&ret_value), JNI_VERSION_1_1);
140*795d594fSAndroid Build Coastguard Worker   if (res != JNI_OK) {
141*795d594fSAndroid Build Coastguard Worker     return nullptr;
142*795d594fSAndroid Build Coastguard Worker   }
143*795d594fSAndroid Build Coastguard Worker   return ret_value;
144*795d594fSAndroid Build Coastguard Worker }
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker template <typename T>
147*795d594fSAndroid Build Coastguard Worker class JvmtiDeleter {
148*795d594fSAndroid Build Coastguard Worker  public:
JvmtiDeleter()149*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter() : env_(nullptr) {}
JvmtiDeleter(jvmtiEnv * env)150*795d594fSAndroid Build Coastguard Worker   explicit JvmtiDeleter(jvmtiEnv* env) : env_(env) {}
151*795d594fSAndroid Build Coastguard Worker 
152*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter(JvmtiDeleter&) = default;
153*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter(JvmtiDeleter&&) noexcept = default;
154*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter& operator=(const JvmtiDeleter&) = default;
155*795d594fSAndroid Build Coastguard Worker 
operator()156*795d594fSAndroid Build Coastguard Worker   void operator()(T* ptr) const {
157*795d594fSAndroid Build Coastguard Worker     CHECK(env_ != nullptr);
158*795d594fSAndroid Build Coastguard Worker     jvmtiError ret = env_->Deallocate(reinterpret_cast<unsigned char*>(ptr));
159*795d594fSAndroid Build Coastguard Worker     CHECK(ret == ERR(NONE));
160*795d594fSAndroid Build Coastguard Worker   }
161*795d594fSAndroid Build Coastguard Worker 
162*795d594fSAndroid Build Coastguard Worker  private:
163*795d594fSAndroid Build Coastguard Worker   mutable jvmtiEnv* env_;
164*795d594fSAndroid Build Coastguard Worker };
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker template <typename T>
167*795d594fSAndroid Build Coastguard Worker class JvmtiDeleter<T[]> {
168*795d594fSAndroid Build Coastguard Worker  public:
JvmtiDeleter()169*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter() : env_(nullptr) {}
JvmtiDeleter(jvmtiEnv * env)170*795d594fSAndroid Build Coastguard Worker   explicit JvmtiDeleter(jvmtiEnv* env) : env_(env) {}
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter(JvmtiDeleter&) = default;
173*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter(JvmtiDeleter&&) noexcept = default;
174*795d594fSAndroid Build Coastguard Worker   JvmtiDeleter& operator=(const JvmtiDeleter&) = default;
175*795d594fSAndroid Build Coastguard Worker 
176*795d594fSAndroid Build Coastguard Worker   template <typename U>
operator()177*795d594fSAndroid Build Coastguard Worker   void operator()(U* ptr) const {
178*795d594fSAndroid Build Coastguard Worker     CHECK(env_ != nullptr);
179*795d594fSAndroid Build Coastguard Worker     jvmtiError ret = env_->Deallocate(reinterpret_cast<unsigned char*>(ptr));
180*795d594fSAndroid Build Coastguard Worker     CHECK(ret == ERR(NONE));
181*795d594fSAndroid Build Coastguard Worker   }
182*795d594fSAndroid Build Coastguard Worker 
183*795d594fSAndroid Build Coastguard Worker  private:
184*795d594fSAndroid Build Coastguard Worker   mutable jvmtiEnv* env_;
185*795d594fSAndroid Build Coastguard Worker };
186*795d594fSAndroid Build Coastguard Worker 
187*795d594fSAndroid Build Coastguard Worker template <typename T>
188*795d594fSAndroid Build Coastguard Worker using JvmtiUniquePtr = std::unique_ptr<T, JvmtiDeleter<T>>;
189*795d594fSAndroid Build Coastguard Worker 
190*795d594fSAndroid Build Coastguard Worker template <typename T>
191*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
MakeJvmtiUniquePtr(jvmtiEnv * env,T * mem)192*795d594fSAndroid Build Coastguard Worker static inline JvmtiUniquePtr<T> MakeJvmtiUniquePtr(jvmtiEnv* env, T* mem) {
193*795d594fSAndroid Build Coastguard Worker   return JvmtiUniquePtr<T>(mem, JvmtiDeleter<T>(env));
194*795d594fSAndroid Build Coastguard Worker }
195*795d594fSAndroid Build Coastguard Worker 
196*795d594fSAndroid Build Coastguard Worker template <typename T>
197*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
MakeJvmtiUniquePtr(jvmtiEnv * env,unsigned char * mem)198*795d594fSAndroid Build Coastguard Worker static inline JvmtiUniquePtr<T> MakeJvmtiUniquePtr(jvmtiEnv* env, unsigned char* mem) {
199*795d594fSAndroid Build Coastguard Worker   return JvmtiUniquePtr<T>(reinterpret_cast<T*>(mem), JvmtiDeleter<T>(env));
200*795d594fSAndroid Build Coastguard Worker }
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker template <typename T>
203*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
AllocJvmtiUniquePtr(jvmtiEnv * env,jvmtiError * error)204*795d594fSAndroid Build Coastguard Worker static inline JvmtiUniquePtr<T> AllocJvmtiUniquePtr(jvmtiEnv* env, jvmtiError* error) {
205*795d594fSAndroid Build Coastguard Worker   unsigned char* tmp;
206*795d594fSAndroid Build Coastguard Worker   *error = env->Allocate(sizeof(T), &tmp);
207*795d594fSAndroid Build Coastguard Worker   if (*error != ERR(NONE)) {
208*795d594fSAndroid Build Coastguard Worker     return JvmtiUniquePtr<T>();
209*795d594fSAndroid Build Coastguard Worker   }
210*795d594fSAndroid Build Coastguard Worker   return JvmtiUniquePtr<T>(tmp, JvmtiDeleter<T>(env));
211*795d594fSAndroid Build Coastguard Worker }
212*795d594fSAndroid Build Coastguard Worker 
213*795d594fSAndroid Build Coastguard Worker template <typename T>
214*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
AllocJvmtiUniquePtr(jvmtiEnv * env,size_t count,jvmtiError * error)215*795d594fSAndroid Build Coastguard Worker static inline JvmtiUniquePtr<T> AllocJvmtiUniquePtr(jvmtiEnv* env,
216*795d594fSAndroid Build Coastguard Worker                                                     size_t count,
217*795d594fSAndroid Build Coastguard Worker                                                     jvmtiError* error) {
218*795d594fSAndroid Build Coastguard Worker   unsigned char* tmp;
219*795d594fSAndroid Build Coastguard Worker   *error = env->Allocate(sizeof(typename std::remove_extent<T>::type) * count, &tmp);
220*795d594fSAndroid Build Coastguard Worker   if (*error != ERR(NONE)) {
221*795d594fSAndroid Build Coastguard Worker     return JvmtiUniquePtr<T>();
222*795d594fSAndroid Build Coastguard Worker   }
223*795d594fSAndroid Build Coastguard Worker   return JvmtiUniquePtr<T>(reinterpret_cast<typename std::remove_extent<T>::type*>(tmp),
224*795d594fSAndroid Build Coastguard Worker                            JvmtiDeleter<T>(env));
225*795d594fSAndroid Build Coastguard Worker }
226*795d594fSAndroid Build Coastguard Worker 
227*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
CopyDataIntoJvmtiBuffer(ArtJvmTiEnv * env,const unsigned char * source,jint len,unsigned char ** dest)228*795d594fSAndroid Build Coastguard Worker static inline jvmtiError CopyDataIntoJvmtiBuffer(ArtJvmTiEnv* env,
229*795d594fSAndroid Build Coastguard Worker                                                  const unsigned char* source,
230*795d594fSAndroid Build Coastguard Worker                                                  jint len,
231*795d594fSAndroid Build Coastguard Worker                                                  /*out*/unsigned char** dest) {
232*795d594fSAndroid Build Coastguard Worker   jvmtiError res = env->Allocate(len, dest);
233*795d594fSAndroid Build Coastguard Worker   if (res != OK) {
234*795d594fSAndroid Build Coastguard Worker     return res;
235*795d594fSAndroid Build Coastguard Worker   }
236*795d594fSAndroid Build Coastguard Worker   memcpy(reinterpret_cast<void*>(*dest),
237*795d594fSAndroid Build Coastguard Worker          reinterpret_cast<const void*>(source),
238*795d594fSAndroid Build Coastguard Worker          len);
239*795d594fSAndroid Build Coastguard Worker   return OK;
240*795d594fSAndroid Build Coastguard Worker }
241*795d594fSAndroid Build Coastguard Worker 
242*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE
CopyString(jvmtiEnv * env,const char * src,jvmtiError * error)243*795d594fSAndroid Build Coastguard Worker static inline JvmtiUniquePtr<char[]> CopyString(jvmtiEnv* env, const char* src, jvmtiError* error) {
244*795d594fSAndroid Build Coastguard Worker   if (src == nullptr) {
245*795d594fSAndroid Build Coastguard Worker     JvmtiUniquePtr<char[]> ret = AllocJvmtiUniquePtr<char[]>(env, 0, error);
246*795d594fSAndroid Build Coastguard Worker     return ret;
247*795d594fSAndroid Build Coastguard Worker   }
248*795d594fSAndroid Build Coastguard Worker   size_t len = strlen(src) + 1;
249*795d594fSAndroid Build Coastguard Worker   JvmtiUniquePtr<char[]> ret = AllocJvmtiUniquePtr<char[]>(env, len, error);
250*795d594fSAndroid Build Coastguard Worker   if (ret != nullptr) {
251*795d594fSAndroid Build Coastguard Worker     strlcpy(ret.get(), src, len);
252*795d594fSAndroid Build Coastguard Worker   }
253*795d594fSAndroid Build Coastguard Worker   return ret;
254*795d594fSAndroid Build Coastguard Worker }
255*795d594fSAndroid Build Coastguard Worker 
256*795d594fSAndroid Build Coastguard Worker const jvmtiCapabilities kPotentialCapabilities = {
257*795d594fSAndroid Build Coastguard Worker     .can_tag_objects                                 = 1,
258*795d594fSAndroid Build Coastguard Worker     .can_generate_field_modification_events          = 1,
259*795d594fSAndroid Build Coastguard Worker     .can_generate_field_access_events                = 1,
260*795d594fSAndroid Build Coastguard Worker     .can_get_bytecodes                               = 1,
261*795d594fSAndroid Build Coastguard Worker     .can_get_synthetic_attribute                     = 1,
262*795d594fSAndroid Build Coastguard Worker     .can_get_owned_monitor_info                      = 1,
263*795d594fSAndroid Build Coastguard Worker     .can_get_current_contended_monitor               = 1,
264*795d594fSAndroid Build Coastguard Worker     .can_get_monitor_info                            = 1,
265*795d594fSAndroid Build Coastguard Worker     .can_pop_frame                                   = 1,
266*795d594fSAndroid Build Coastguard Worker     .can_redefine_classes                            = 1,
267*795d594fSAndroid Build Coastguard Worker     .can_signal_thread                               = 1,
268*795d594fSAndroid Build Coastguard Worker     .can_get_source_file_name                        = 1,
269*795d594fSAndroid Build Coastguard Worker     .can_get_line_numbers                            = 1,
270*795d594fSAndroid Build Coastguard Worker     .can_get_source_debug_extension                  = 1,
271*795d594fSAndroid Build Coastguard Worker     .can_access_local_variables                      = 1,
272*795d594fSAndroid Build Coastguard Worker     .can_maintain_original_method_order              = 1,
273*795d594fSAndroid Build Coastguard Worker     .can_generate_single_step_events                 = 1,
274*795d594fSAndroid Build Coastguard Worker     .can_generate_exception_events                   = 1,
275*795d594fSAndroid Build Coastguard Worker     .can_generate_frame_pop_events                   = 1,
276*795d594fSAndroid Build Coastguard Worker     .can_generate_breakpoint_events                  = 1,
277*795d594fSAndroid Build Coastguard Worker     .can_suspend                                     = 1,
278*795d594fSAndroid Build Coastguard Worker     .can_redefine_any_class                          = 0,
279*795d594fSAndroid Build Coastguard Worker     .can_get_current_thread_cpu_time                 = 0,
280*795d594fSAndroid Build Coastguard Worker     .can_get_thread_cpu_time                         = 0,
281*795d594fSAndroid Build Coastguard Worker     .can_generate_method_entry_events                = 1,
282*795d594fSAndroid Build Coastguard Worker     .can_generate_method_exit_events                 = 1,
283*795d594fSAndroid Build Coastguard Worker     .can_generate_all_class_hook_events              = 0,
284*795d594fSAndroid Build Coastguard Worker     .can_generate_compiled_method_load_events        = 0,
285*795d594fSAndroid Build Coastguard Worker     .can_generate_monitor_events                     = 1,
286*795d594fSAndroid Build Coastguard Worker     .can_generate_vm_object_alloc_events             = 1,
287*795d594fSAndroid Build Coastguard Worker     .can_generate_native_method_bind_events          = 1,
288*795d594fSAndroid Build Coastguard Worker     .can_generate_garbage_collection_events          = 1,
289*795d594fSAndroid Build Coastguard Worker     .can_generate_object_free_events                 = 1,
290*795d594fSAndroid Build Coastguard Worker     .can_force_early_return                          = 1,
291*795d594fSAndroid Build Coastguard Worker     .can_get_owned_monitor_stack_depth_info          = 1,
292*795d594fSAndroid Build Coastguard Worker     .can_get_constant_pool                           = 0,
293*795d594fSAndroid Build Coastguard Worker     .can_set_native_method_prefix                    = 0,
294*795d594fSAndroid Build Coastguard Worker     .can_retransform_classes                         = 1,
295*795d594fSAndroid Build Coastguard Worker     .can_retransform_any_class                       = 0,
296*795d594fSAndroid Build Coastguard Worker     .can_generate_resource_exhaustion_heap_events    = 0,
297*795d594fSAndroid Build Coastguard Worker     .can_generate_resource_exhaustion_threads_events = 0,
298*795d594fSAndroid Build Coastguard Worker };
299*795d594fSAndroid Build Coastguard Worker 
300*795d594fSAndroid Build Coastguard Worker // These are capabilities that are disabled if we were loaded without being debuggable.
301*795d594fSAndroid Build Coastguard Worker //
302*795d594fSAndroid Build Coastguard Worker // This includes the following capabilities:
303*795d594fSAndroid Build Coastguard Worker //   can_retransform_any_class:
304*795d594fSAndroid Build Coastguard Worker //   can_retransform_classes:
305*795d594fSAndroid Build Coastguard Worker //   can_redefine_any_class:
306*795d594fSAndroid Build Coastguard Worker //   can_redefine_classes:
307*795d594fSAndroid Build Coastguard Worker //   can_pop_frame:
308*795d594fSAndroid Build Coastguard Worker //   can_force_early_return:
309*795d594fSAndroid Build Coastguard Worker //     We need to ensure that inlined code is either not present or can always be deoptimized. This
310*795d594fSAndroid Build Coastguard Worker //     is not guaranteed for non-debuggable processes since we might have inlined bootclasspath code
311*795d594fSAndroid Build Coastguard Worker //     on a threads stack.
312*795d594fSAndroid Build Coastguard Worker const jvmtiCapabilities kNonDebuggableUnsupportedCapabilities = {
313*795d594fSAndroid Build Coastguard Worker     .can_tag_objects                                 = 0,
314*795d594fSAndroid Build Coastguard Worker     .can_generate_field_modification_events          = 0,
315*795d594fSAndroid Build Coastguard Worker     .can_generate_field_access_events                = 0,
316*795d594fSAndroid Build Coastguard Worker     .can_get_bytecodes                               = 0,
317*795d594fSAndroid Build Coastguard Worker     .can_get_synthetic_attribute                     = 0,
318*795d594fSAndroid Build Coastguard Worker     .can_get_owned_monitor_info                      = 0,
319*795d594fSAndroid Build Coastguard Worker     .can_get_current_contended_monitor               = 0,
320*795d594fSAndroid Build Coastguard Worker     .can_get_monitor_info                            = 0,
321*795d594fSAndroid Build Coastguard Worker     .can_pop_frame                                   = 1,
322*795d594fSAndroid Build Coastguard Worker     .can_redefine_classes                            = 1,
323*795d594fSAndroid Build Coastguard Worker     .can_signal_thread                               = 0,
324*795d594fSAndroid Build Coastguard Worker     .can_get_source_file_name                        = 0,
325*795d594fSAndroid Build Coastguard Worker     .can_get_line_numbers                            = 0,
326*795d594fSAndroid Build Coastguard Worker     .can_get_source_debug_extension                  = 0,
327*795d594fSAndroid Build Coastguard Worker     .can_access_local_variables                      = 0,
328*795d594fSAndroid Build Coastguard Worker     .can_maintain_original_method_order              = 0,
329*795d594fSAndroid Build Coastguard Worker     .can_generate_single_step_events                 = 0,
330*795d594fSAndroid Build Coastguard Worker     .can_generate_exception_events                   = 0,
331*795d594fSAndroid Build Coastguard Worker     .can_generate_frame_pop_events                   = 0,
332*795d594fSAndroid Build Coastguard Worker     .can_generate_breakpoint_events                  = 0,
333*795d594fSAndroid Build Coastguard Worker     .can_suspend                                     = 0,
334*795d594fSAndroid Build Coastguard Worker     .can_redefine_any_class                          = 1,
335*795d594fSAndroid Build Coastguard Worker     .can_get_current_thread_cpu_time                 = 0,
336*795d594fSAndroid Build Coastguard Worker     .can_get_thread_cpu_time                         = 0,
337*795d594fSAndroid Build Coastguard Worker     .can_generate_method_entry_events                = 0,
338*795d594fSAndroid Build Coastguard Worker     .can_generate_method_exit_events                 = 0,
339*795d594fSAndroid Build Coastguard Worker     .can_generate_all_class_hook_events              = 0,
340*795d594fSAndroid Build Coastguard Worker     .can_generate_compiled_method_load_events        = 0,
341*795d594fSAndroid Build Coastguard Worker     .can_generate_monitor_events                     = 0,
342*795d594fSAndroid Build Coastguard Worker     .can_generate_vm_object_alloc_events             = 0,
343*795d594fSAndroid Build Coastguard Worker     .can_generate_native_method_bind_events          = 0,
344*795d594fSAndroid Build Coastguard Worker     .can_generate_garbage_collection_events          = 0,
345*795d594fSAndroid Build Coastguard Worker     .can_generate_object_free_events                 = 0,
346*795d594fSAndroid Build Coastguard Worker     .can_force_early_return                          = 1,
347*795d594fSAndroid Build Coastguard Worker     .can_get_owned_monitor_stack_depth_info          = 0,
348*795d594fSAndroid Build Coastguard Worker     .can_get_constant_pool                           = 0,
349*795d594fSAndroid Build Coastguard Worker     .can_set_native_method_prefix                    = 0,
350*795d594fSAndroid Build Coastguard Worker     .can_retransform_classes                         = 1,
351*795d594fSAndroid Build Coastguard Worker     .can_retransform_any_class                       = 1,
352*795d594fSAndroid Build Coastguard Worker     .can_generate_resource_exhaustion_heap_events    = 0,
353*795d594fSAndroid Build Coastguard Worker     .can_generate_resource_exhaustion_threads_events = 0,
354*795d594fSAndroid Build Coastguard Worker };
355*795d594fSAndroid Build Coastguard Worker 
356*795d594fSAndroid Build Coastguard Worker }  // namespace openjdkjvmti
357*795d594fSAndroid Build Coastguard Worker 
358*795d594fSAndroid Build Coastguard Worker #endif  // ART_OPENJDKJVMTI_ART_JVMTI_H_
359