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