Add Handle::GetFromGdb function
When using a debugger it is normally quite difficult to examine
mirror objects being held by Handles due to the inlining of the
various accessor functions. This adds a new 'GetFromGdb' function that
is emitted normally to allow one to decode the handle from gdb. This
function is defined for every Handle type using a macro.
Test: Manual debugging
Change-Id: I7cb95468b1a14438df4dccdf84b48e2af5ec71b9
diff --git a/runtime/class_root.h b/runtime/class_root.h
index 1ff4845..835ec90 100644
--- a/runtime/class_root.h
+++ b/runtime/class_root.h
@@ -52,37 +52,50 @@
class VarHandle;
} // namespace mirror
-#define CLASS_ROOT_LIST(M) \
- M(kJavaLangClass, "Ljava/lang/Class;", mirror::Class) \
- M(kJavaLangObject, "Ljava/lang/Object;", mirror::Object) \
- M(kClassArrayClass, "[Ljava/lang/Class;", mirror::ObjectArray<mirror::Class>) \
- M(kObjectArrayClass, "[Ljava/lang/Object;", mirror::ObjectArray<mirror::Object>) \
- M(kJavaLangString, "Ljava/lang/String;", mirror::String) \
- M(kJavaLangDexCache, "Ljava/lang/DexCache;", mirror::DexCache) \
- M(kJavaLangRefReference, "Ljava/lang/ref/Reference;", mirror::Reference) \
- M(kJavaLangReflectConstructor, "Ljava/lang/reflect/Constructor;", mirror::Constructor) \
- M(kJavaLangReflectField, "Ljava/lang/reflect/Field;", mirror::Field) \
- M(kJavaLangReflectMethod, "Ljava/lang/reflect/Method;", mirror::Method) \
- M(kJavaLangReflectProxy, "Ljava/lang/reflect/Proxy;", mirror::Proxy) \
- M(kJavaLangStringArrayClass, "[Ljava/lang/String;", mirror::ObjectArray<mirror::String>) \
- M(kJavaLangReflectConstructorArrayClass, "[Ljava/lang/reflect/Constructor;", mirror::ObjectArray<mirror::Constructor>) \
- M(kJavaLangReflectFieldArrayClass, "[Ljava/lang/reflect/Field;", mirror::ObjectArray<mirror::Field>) \
- M(kJavaLangReflectMethodArrayClass, "[Ljava/lang/reflect/Method;", mirror::ObjectArray<mirror::Method>) \
- M(kJavaLangInvokeCallSite, "Ljava/lang/invoke/CallSite;", mirror::CallSite) \
- M(kJavaLangInvokeMethodHandle, "Ljava/lang/invoke/MethodHandle;", mirror::MethodHandle) \
- M(kJavaLangInvokeMethodHandleImpl, "Ljava/lang/invoke/MethodHandleImpl;", mirror::MethodHandleImpl) \
- M(kJavaLangInvokeMethodHandlesLookup, "Ljava/lang/invoke/MethodHandles$Lookup;", mirror::MethodHandlesLookup) \
- M(kJavaLangInvokeMethodType, "Ljava/lang/invoke/MethodType;", mirror::MethodType) \
- M(kJavaLangInvokeVarHandle, "Ljava/lang/invoke/VarHandle;", mirror::VarHandle) \
- M(kJavaLangInvokeFieldVarHandle, "Ljava/lang/invoke/FieldVarHandle;", mirror::FieldVarHandle) \
- M(kJavaLangInvokeArrayElementVarHandle, "Ljava/lang/invoke/ArrayElementVarHandle;", mirror::ArrayElementVarHandle) \
- M(kJavaLangInvokeByteArrayViewVarHandle, "Ljava/lang/invoke/ByteArrayViewVarHandle;", mirror::ByteArrayViewVarHandle) \
- M(kJavaLangInvokeByteBufferViewVarHandle, "Ljava/lang/invoke/ByteBufferViewVarHandle;", mirror::ByteBufferViewVarHandle) \
- M(kJavaLangClassLoader, "Ljava/lang/ClassLoader;", mirror::ClassLoader) \
- M(kJavaLangThrowable, "Ljava/lang/Throwable;", mirror::Throwable) \
+#define CLASS_MIRROR_ROOT_LIST(M) \
+ M(kJavaLangClass, "Ljava/lang/Class;", mirror::Class) \
+ M(kJavaLangObject, "Ljava/lang/Object;", mirror::Object) \
+ M(kClassArrayClass, "[Ljava/lang/Class;", mirror::ObjectArray<mirror::Class>) \
+ M(kObjectArrayClass, "[Ljava/lang/Object;", mirror::ObjectArray<mirror::Object>) \
+ M(kJavaLangString, "Ljava/lang/String;", mirror::String) \
+ M(kJavaLangDexCache, "Ljava/lang/DexCache;", mirror::DexCache) \
+ M(kJavaLangRefReference, "Ljava/lang/ref/Reference;", mirror::Reference) \
+ M(kJavaLangReflectConstructor, "Ljava/lang/reflect/Constructor;", mirror::Constructor) \
+ M(kJavaLangReflectField, "Ljava/lang/reflect/Field;", mirror::Field) \
+ M(kJavaLangReflectMethod, "Ljava/lang/reflect/Method;", mirror::Method) \
+ M(kJavaLangReflectProxy, "Ljava/lang/reflect/Proxy;", mirror::Proxy) \
+ M(kJavaLangStringArrayClass, "[Ljava/lang/String;", mirror::ObjectArray<mirror::String>) \
+ M(kJavaLangReflectConstructorArrayClass, "[Ljava/lang/reflect/Constructor;", mirror::ObjectArray<mirror::Constructor>) \
+ M(kJavaLangReflectFieldArrayClass, "[Ljava/lang/reflect/Field;", mirror::ObjectArray<mirror::Field>) \
+ M(kJavaLangReflectMethodArrayClass, "[Ljava/lang/reflect/Method;", mirror::ObjectArray<mirror::Method>) \
+ M(kJavaLangInvokeCallSite, "Ljava/lang/invoke/CallSite;", mirror::CallSite) \
+ M(kJavaLangInvokeMethodHandle, "Ljava/lang/invoke/MethodHandle;", mirror::MethodHandle) \
+ M(kJavaLangInvokeMethodHandleImpl, "Ljava/lang/invoke/MethodHandleImpl;", mirror::MethodHandleImpl) \
+ M(kJavaLangInvokeMethodHandlesLookup, "Ljava/lang/invoke/MethodHandles$Lookup;", mirror::MethodHandlesLookup) \
+ M(kJavaLangInvokeMethodType, "Ljava/lang/invoke/MethodType;", mirror::MethodType) \
+ M(kJavaLangInvokeVarHandle, "Ljava/lang/invoke/VarHandle;", mirror::VarHandle) \
+ M(kJavaLangInvokeFieldVarHandle, "Ljava/lang/invoke/FieldVarHandle;", mirror::FieldVarHandle) \
+ M(kJavaLangInvokeArrayElementVarHandle, "Ljava/lang/invoke/ArrayElementVarHandle;", mirror::ArrayElementVarHandle) \
+ M(kJavaLangInvokeByteArrayViewVarHandle, "Ljava/lang/invoke/ByteArrayViewVarHandle;", mirror::ByteArrayViewVarHandle) \
+ M(kJavaLangInvokeByteBufferViewVarHandle, "Ljava/lang/invoke/ByteBufferViewVarHandle;", mirror::ByteBufferViewVarHandle) \
+ M(kJavaLangClassLoader, "Ljava/lang/ClassLoader;", mirror::ClassLoader) \
+ M(kJavaLangThrowable, "Ljava/lang/Throwable;", mirror::Throwable) \
+ M(kJavaLangStackTraceElement, "Ljava/lang/StackTraceElement;", mirror::StackTraceElement) \
+ M(kDalvikSystemEmulatedStackFrame, "Ldalvik/system/EmulatedStackFrame;", mirror::EmulatedStackFrame) \
+ M(kBooleanArrayClass, "[Z", mirror::PrimitiveArray<uint8_t>) \
+ M(kByteArrayClass, "[B", mirror::PrimitiveArray<int8_t>) \
+ M(kCharArrayClass, "[C", mirror::PrimitiveArray<uint16_t>) \
+ M(kDoubleArrayClass, "[D", mirror::PrimitiveArray<double>) \
+ M(kFloatArrayClass, "[F", mirror::PrimitiveArray<float>) \
+ M(kIntArrayClass, "[I", mirror::PrimitiveArray<int32_t>) \
+ M(kLongArrayClass, "[J", mirror::PrimitiveArray<int64_t>) \
+ M(kShortArrayClass, "[S", mirror::PrimitiveArray<int16_t>) \
+ M(kJavaLangStackTraceElementArrayClass, "[Ljava/lang/StackTraceElement;", mirror::ObjectArray<mirror::StackTraceElement>) \
+ M(kJavaLangClassLoaderArrayClass, "[Ljava/lang/ClassLoader;", mirror::ObjectArray<mirror::ClassLoader>) \
+ M(kDalvikSystemClassExt, "Ldalvik/system/ClassExt;", mirror::ClassExt)
+
+#define CLASS_NO_MIRROR_ROOT_LIST(M) \
M(kJavaLangClassNotFoundException, "Ljava/lang/ClassNotFoundException;", detail::NoMirrorType<detail::ClassNotFoundExceptionTag>) \
- M(kJavaLangStackTraceElement, "Ljava/lang/StackTraceElement;", mirror::StackTraceElement) \
- M(kDalvikSystemEmulatedStackFrame, "Ldalvik/system/EmulatedStackFrame;", mirror::EmulatedStackFrame) \
M(kPrimitiveBoolean, "Z", detail::NoMirrorType<uint8_t>) \
M(kPrimitiveByte, "B", detail::NoMirrorType<int8_t>) \
M(kPrimitiveChar, "C", detail::NoMirrorType<uint16_t>) \
@@ -91,18 +104,11 @@
M(kPrimitiveInt, "I", detail::NoMirrorType<int32_t>) \
M(kPrimitiveLong, "J", detail::NoMirrorType<int64_t>) \
M(kPrimitiveShort, "S", detail::NoMirrorType<int16_t>) \
- M(kPrimitiveVoid, "V", detail::NoMirrorType<void>) \
- M(kBooleanArrayClass, "[Z", mirror::PrimitiveArray<uint8_t>) \
- M(kByteArrayClass, "[B", mirror::PrimitiveArray<int8_t>) \
- M(kCharArrayClass, "[C", mirror::PrimitiveArray<uint16_t>) \
- M(kDoubleArrayClass, "[D", mirror::PrimitiveArray<double>) \
- M(kFloatArrayClass, "[F", mirror::PrimitiveArray<float>) \
- M(kIntArrayClass, "[I", mirror::PrimitiveArray<int32_t>) \
- M(kLongArrayClass, "[J", mirror::PrimitiveArray<int64_t>) \
- M(kShortArrayClass, "[S", mirror::PrimitiveArray<int16_t>) \
- M(kJavaLangStackTraceElementArrayClass, "[Ljava/lang/StackTraceElement;", mirror::ObjectArray<mirror::StackTraceElement>) \
- M(kJavaLangClassLoaderArrayClass, "[Ljava/lang/ClassLoader;", mirror::ObjectArray<mirror::ClassLoader>) \
- M(kDalvikSystemClassExt, "Ldalvik/system/ClassExt;", mirror::ClassExt)
+ M(kPrimitiveVoid, "V", detail::NoMirrorType<void>)
+
+#define CLASS_ROOT_LIST(M) \
+ CLASS_MIRROR_ROOT_LIST(M) \
+ CLASS_NO_MIRROR_ROOT_LIST(M)
// Well known mirror::Class roots accessed via ClassLinker::GetClassRoots().
enum class ClassRoot : uint32_t {