xref: /aosp_15_r20/art/runtime/class_root.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_RUNTIME_CLASS_ROOT_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_RUNTIME_CLASS_ROOT_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <stdint.h>
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include "base/locks.h"
23*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
24*795d594fSAndroid Build Coastguard Worker #include "read_barrier_option.h"
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker class ClassLinker;
29*795d594fSAndroid Build Coastguard Worker template<class MirrorType> class ObjPtr;
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker namespace mirror {
32*795d594fSAndroid Build Coastguard Worker class ArrayElementVarHandle;
33*795d594fSAndroid Build Coastguard Worker class ByteArrayViewVarHandle;
34*795d594fSAndroid Build Coastguard Worker class ByteBufferViewVarHandle;
35*795d594fSAndroid Build Coastguard Worker class CallSite;
36*795d594fSAndroid Build Coastguard Worker class Class;
37*795d594fSAndroid Build Coastguard Worker class ClassExt;
38*795d594fSAndroid Build Coastguard Worker class ClassLoader;
39*795d594fSAndroid Build Coastguard Worker class Constructor;
40*795d594fSAndroid Build Coastguard Worker class DexCache;
41*795d594fSAndroid Build Coastguard Worker class EmulatedStackFrame;
42*795d594fSAndroid Build Coastguard Worker class Field;
43*795d594fSAndroid Build Coastguard Worker class FieldVarHandle;
44*795d594fSAndroid Build Coastguard Worker class Method;
45*795d594fSAndroid Build Coastguard Worker class MethodHandleImpl;
46*795d594fSAndroid Build Coastguard Worker class MethodHandlesLookup;
47*795d594fSAndroid Build Coastguard Worker class MethodType;
48*795d594fSAndroid Build Coastguard Worker class Object;
49*795d594fSAndroid Build Coastguard Worker template<class T> class ObjectArray;
50*795d594fSAndroid Build Coastguard Worker class Proxy;
51*795d594fSAndroid Build Coastguard Worker template<typename T> class PrimitiveArray;
52*795d594fSAndroid Build Coastguard Worker class Reference;
53*795d594fSAndroid Build Coastguard Worker class StackTraceElement;
54*795d594fSAndroid Build Coastguard Worker class StaticFieldVarHandle;
55*795d594fSAndroid Build Coastguard Worker class String;
56*795d594fSAndroid Build Coastguard Worker class Throwable;
57*795d594fSAndroid Build Coastguard Worker class VarHandle;
58*795d594fSAndroid Build Coastguard Worker }  // namespace mirror
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker #define CLASS_MIRROR_ROOT_LIST(M)                                                                                                         \
61*795d594fSAndroid Build Coastguard Worker   M(kJavaLangClass,                         "Ljava/lang/Class;",                          mirror::Class)                                  \
62*795d594fSAndroid Build Coastguard Worker   M(kJavaLangObject,                        "Ljava/lang/Object;",                         mirror::Object)                                 \
63*795d594fSAndroid Build Coastguard Worker   M(kClassArrayClass,                       "[Ljava/lang/Class;",                         mirror::ObjectArray<mirror::Class>)             \
64*795d594fSAndroid Build Coastguard Worker   M(kObjectArrayClass,                      "[Ljava/lang/Object;",                        mirror::ObjectArray<mirror::Object>)            \
65*795d594fSAndroid Build Coastguard Worker   M(kJavaLangString,                        "Ljava/lang/String;",                         mirror::String)                                 \
66*795d594fSAndroid Build Coastguard Worker   M(kJavaLangDexCache,                      "Ljava/lang/DexCache;",                       mirror::DexCache)                               \
67*795d594fSAndroid Build Coastguard Worker   M(kJavaLangRefReference,                  "Ljava/lang/ref/Reference;",                  mirror::Reference)                              \
68*795d594fSAndroid Build Coastguard Worker   M(kJavaLangReflectConstructor,            "Ljava/lang/reflect/Constructor;",            mirror::Constructor)                            \
69*795d594fSAndroid Build Coastguard Worker   M(kJavaLangReflectField,                  "Ljava/lang/reflect/Field;",                  mirror::Field)                                  \
70*795d594fSAndroid Build Coastguard Worker   M(kJavaLangReflectMethod,                 "Ljava/lang/reflect/Method;",                 mirror::Method)                                 \
71*795d594fSAndroid Build Coastguard Worker   M(kJavaLangReflectProxy,                  "Ljava/lang/reflect/Proxy;",                  mirror::Proxy)                                  \
72*795d594fSAndroid Build Coastguard Worker   M(kJavaLangStringArrayClass,              "[Ljava/lang/String;",                        mirror::ObjectArray<mirror::String>)            \
73*795d594fSAndroid Build Coastguard Worker   M(kJavaLangReflectConstructorArrayClass,  "[Ljava/lang/reflect/Constructor;",           mirror::ObjectArray<mirror::Constructor>)       \
74*795d594fSAndroid Build Coastguard Worker   M(kJavaLangReflectFieldArrayClass,        "[Ljava/lang/reflect/Field;",                 mirror::ObjectArray<mirror::Field>)             \
75*795d594fSAndroid Build Coastguard Worker   M(kJavaLangReflectMethodArrayClass,       "[Ljava/lang/reflect/Method;",                mirror::ObjectArray<mirror::Method>)            \
76*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeCallSite,                "Ljava/lang/invoke/CallSite;",                mirror::CallSite)                               \
77*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeMethodHandle,            "Ljava/lang/invoke/MethodHandle;",            mirror::MethodHandle)                           \
78*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeMethodHandleImpl,        "Ljava/lang/invoke/MethodHandleImpl;",        mirror::MethodHandleImpl)                       \
79*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeMethodHandlesLookup,     "Ljava/lang/invoke/MethodHandles$Lookup;",    mirror::MethodHandlesLookup)                    \
80*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeMethodType,              "Ljava/lang/invoke/MethodType;",              mirror::MethodType)                             \
81*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeVarHandle,               "Ljava/lang/invoke/VarHandle;",               mirror::VarHandle)                              \
82*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeFieldVarHandle,          "Ljava/lang/invoke/FieldVarHandle;",          mirror::FieldVarHandle)                         \
83*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeStaticFieldVarHandle,    "Ljava/lang/invoke/StaticFieldVarHandle;",    mirror::StaticFieldVarHandle)                   \
84*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeArrayElementVarHandle,   "Ljava/lang/invoke/ArrayElementVarHandle;",   mirror::ArrayElementVarHandle)                  \
85*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeByteArrayViewVarHandle,  "Ljava/lang/invoke/ByteArrayViewVarHandle;",  mirror::ByteArrayViewVarHandle)                 \
86*795d594fSAndroid Build Coastguard Worker   M(kJavaLangInvokeByteBufferViewVarHandle, "Ljava/lang/invoke/ByteBufferViewVarHandle;", mirror::ByteBufferViewVarHandle)                \
87*795d594fSAndroid Build Coastguard Worker   M(kJavaLangClassLoader,                   "Ljava/lang/ClassLoader;",                    mirror::ClassLoader)                            \
88*795d594fSAndroid Build Coastguard Worker   M(kJavaLangThrowable,                     "Ljava/lang/Throwable;",                      mirror::Throwable)                              \
89*795d594fSAndroid Build Coastguard Worker   M(kJavaLangStackTraceElement,             "Ljava/lang/StackTraceElement;",              mirror::StackTraceElement)                      \
90*795d594fSAndroid Build Coastguard Worker   M(kDalvikSystemEmulatedStackFrame,        "Ldalvik/system/EmulatedStackFrame;",         mirror::EmulatedStackFrame)                     \
91*795d594fSAndroid Build Coastguard Worker   M(kBooleanArrayClass,                     "[Z",                                         mirror::PrimitiveArray<uint8_t>)                \
92*795d594fSAndroid Build Coastguard Worker   M(kByteArrayClass,                        "[B",                                         mirror::PrimitiveArray<int8_t>)                 \
93*795d594fSAndroid Build Coastguard Worker   M(kCharArrayClass,                        "[C",                                         mirror::PrimitiveArray<uint16_t>)               \
94*795d594fSAndroid Build Coastguard Worker   M(kDoubleArrayClass,                      "[D",                                         mirror::PrimitiveArray<double>)                 \
95*795d594fSAndroid Build Coastguard Worker   M(kFloatArrayClass,                       "[F",                                         mirror::PrimitiveArray<float>)                  \
96*795d594fSAndroid Build Coastguard Worker   M(kIntArrayClass,                         "[I",                                         mirror::PrimitiveArray<int32_t>)                \
97*795d594fSAndroid Build Coastguard Worker   M(kLongArrayClass,                        "[J",                                         mirror::PrimitiveArray<int64_t>)                \
98*795d594fSAndroid Build Coastguard Worker   M(kShortArrayClass,                       "[S",                                         mirror::PrimitiveArray<int16_t>)                \
99*795d594fSAndroid Build Coastguard Worker   M(kJavaLangStackTraceElementArrayClass,   "[Ljava/lang/StackTraceElement;",             mirror::ObjectArray<mirror::StackTraceElement>) \
100*795d594fSAndroid Build Coastguard Worker   M(kJavaLangClassLoaderArrayClass,         "[Ljava/lang/ClassLoader;",                   mirror::ObjectArray<mirror::ClassLoader>)       \
101*795d594fSAndroid Build Coastguard Worker   M(kDalvikSystemClassExt,                  "Ldalvik/system/ClassExt;",                   mirror::ClassExt)
102*795d594fSAndroid Build Coastguard Worker 
103*795d594fSAndroid Build Coastguard Worker #define CLASS_NO_MIRROR_ROOT_LIST(M)                                                                                                                \
104*795d594fSAndroid Build Coastguard Worker   M(kJavaLangClassNotFoundException,        "Ljava/lang/ClassNotFoundException;",         detail::NoMirrorType<detail::ClassNotFoundExceptionTag>)  \
105*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveBoolean,                      "Z",                                          detail::NoMirrorType<uint8_t>)                            \
106*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveByte,                         "B",                                          detail::NoMirrorType<int8_t>)                             \
107*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveChar,                         "C",                                          detail::NoMirrorType<uint16_t>)                           \
108*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveDouble,                       "D",                                          detail::NoMirrorType<double>)                             \
109*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveFloat,                        "F",                                          detail::NoMirrorType<float>)                              \
110*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveInt,                          "I",                                          detail::NoMirrorType<int32_t>)                            \
111*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveLong,                         "J",                                          detail::NoMirrorType<int64_t>)                            \
112*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveShort,                        "S",                                          detail::NoMirrorType<int16_t>)                            \
113*795d594fSAndroid Build Coastguard Worker   M(kPrimitiveVoid,                         "V",                                          detail::NoMirrorType<void>)
114*795d594fSAndroid Build Coastguard Worker 
115*795d594fSAndroid Build Coastguard Worker #define CLASS_ROOT_LIST(M)     \
116*795d594fSAndroid Build Coastguard Worker   CLASS_MIRROR_ROOT_LIST(M)    \
117*795d594fSAndroid Build Coastguard Worker   CLASS_NO_MIRROR_ROOT_LIST(M)
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker // Well known mirror::Class roots accessed via ClassLinker::GetClassRoots().
120*795d594fSAndroid Build Coastguard Worker enum class ClassRoot : uint32_t {
121*795d594fSAndroid Build Coastguard Worker #define CLASS_ROOT_ENUMERATOR(name, descriptor, mirror_type) name,
122*795d594fSAndroid Build Coastguard Worker   CLASS_ROOT_LIST(CLASS_ROOT_ENUMERATOR)
123*795d594fSAndroid Build Coastguard Worker #undef CLASS_ROOT_ENUMERATOR
124*795d594fSAndroid Build Coastguard Worker   kMax,
125*795d594fSAndroid Build Coastguard Worker };
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker const char* GetClassRootDescriptor(ClassRoot class_root);
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
130*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> GetClassRoot(ClassRoot class_root,
131*795d594fSAndroid Build Coastguard Worker                                    ObjPtr<mirror::ObjectArray<mirror::Class>> class_roots)
132*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_);
133*795d594fSAndroid Build Coastguard Worker 
134*795d594fSAndroid Build Coastguard Worker template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
135*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> GetClassRoot(ClassRoot class_root, ClassLinker* linker)
136*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_);
137*795d594fSAndroid Build Coastguard Worker 
138*795d594fSAndroid Build Coastguard Worker template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
139*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> GetClassRoot(ClassRoot class_root) REQUIRES_SHARED(Locks::mutator_lock_);
140*795d594fSAndroid Build Coastguard Worker 
141*795d594fSAndroid Build Coastguard Worker template <class MirrorType, ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
142*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> GetClassRoot(ObjPtr<mirror::ObjectArray<mirror::Class>> class_roots)
143*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_);
144*795d594fSAndroid Build Coastguard Worker 
145*795d594fSAndroid Build Coastguard Worker template <class MirrorType, ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
146*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> GetClassRoot(ClassLinker* linker) REQUIRES_SHARED(Locks::mutator_lock_);
147*795d594fSAndroid Build Coastguard Worker 
148*795d594fSAndroid Build Coastguard Worker template <class MirrorType, ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
149*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> GetClassRoot() REQUIRES_SHARED(Locks::mutator_lock_);
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker }  // namespace art
152*795d594fSAndroid Build Coastguard Worker 
153*795d594fSAndroid Build Coastguard Worker #endif  // ART_RUNTIME_CLASS_ROOT_H_
154