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 {