Merge "LLVMLongName should preserve the return type." into ics-mr1-plus-art
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 6fac6f8..07a9816 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -543,9 +543,9 @@
 struct ClassLoaderOffsets : public CheckOffsets<ClassLoader> {
   ClassLoaderOffsets() : CheckOffsets<ClassLoader>(false, "Ljava/lang/ClassLoader;") {
     // alphabetical references
-    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, packages_), "packages"));
-    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, parent_),   "parent"));
-    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, proxyCache_),   "proxyCache"));
+    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, packages_),   "packages"));
+    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, parent_),     "parent"));
+    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(ClassLoader, proxyCache_), "proxyCache"));
   };
 };
 
@@ -553,8 +553,9 @@
   BaseDexClassLoaderOffsets()
     : CheckOffsets<BaseDexClassLoader>(false, "Ldalvik/system/BaseDexClassLoader;") {
     // alphabetical references
-    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(BaseDexClassLoader, original_path_), "originalPath"));
-    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(BaseDexClassLoader, path_list_),     "pathList"));
+    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(BaseDexClassLoader, original_library_path_), "originalLibraryPath"));
+    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(BaseDexClassLoader, original_path_),         "originalPath"));
+    offsets.push_back(CheckOffset(OFFSETOF_MEMBER(BaseDexClassLoader, path_list_),             "pathList"));
   };
 };
 
diff --git a/src/class_loader.h b/src/class_loader.h
index 8d1c696..0e1148d 100644
--- a/src/class_loader.h
+++ b/src/class_loader.h
@@ -40,6 +40,7 @@
 class MANAGED BaseDexClassLoader : public ClassLoader {
  private:
   // Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses".
+  String* original_library_path_;
   String* original_path_;
   Object* path_list_;
 
diff --git a/src/oat/runtime/arm/runtime_support_arm.S b/src/oat/runtime/arm/runtime_support_arm.S
index 045feac..6163b3e 100644
--- a/src/oat/runtime/arm/runtime_support_arm.S
+++ b/src/oat/runtime/arm/runtime_support_arm.S
@@ -504,13 +504,16 @@
     DELIVER_PENDING_EXCEPTION
 
     .global art_set64_static_from_code
-    .extern artSet32StaticFromCode
+    .extern artSet64StaticFromCode
     /*
      * Called by managed code to resolve a static field and store a 64-bit primitive value.
+     * On entry r0 holds field index, r1:r2 hold new_val
      */
     ALIGN_FUNCTION_ENTRY
 art_set64_static_from_code:
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME     @ save callee saves in case of GC
+    mov    r3, r2                        @ pass one half of wide argument
+    mov    r2, r1                        @ pass other half of wide argument
     ldr    r1, [sp, #32]                 @ pass referrer
     mov    r12, sp                       @ save SP
     sub    sp, #8                        @ grow frame for alignment with stack args
diff --git a/src/oatdump.cc b/src/oatdump.cc
index 52763c6..2f0197c 100644
--- a/src/oatdump.cc
+++ b/src/oatdump.cc
@@ -136,6 +136,113 @@
     os << "END:\n";
     os << reinterpret_cast<const void*>(oat_file_.End()) << "\n\n";
 
+    os << "THREAD ENTRY POINTS:\n";
+    uintptr_t start_offset = OFFSETOF_MEMBER(Thread, entrypoints_);
+    uintptr_t last_offset = start_offset - sizeof(uintptr_t);
+
+#define DUMP_ENTRY_POINT(x) { \
+      uintptr_t offset = ENTRYPOINT_OFFSET(x); \
+      CHECK_EQ(last_offset + sizeof(uintptr_t), offset); \
+      os << #x << ": " << offset << "\n"; \
+      last_offset = offset; \
+    }
+
+    DUMP_ENTRY_POINT(pAllocArrayFromCode);
+    DUMP_ENTRY_POINT(pAllocArrayFromCodeWithAccessCheck);
+    DUMP_ENTRY_POINT(pAllocObjectFromCode);
+    DUMP_ENTRY_POINT(pAllocObjectFromCodeWithAccessCheck);
+    DUMP_ENTRY_POINT(pCheckAndAllocArrayFromCode);
+    DUMP_ENTRY_POINT(pCheckAndAllocArrayFromCodeWithAccessCheck);
+    DUMP_ENTRY_POINT(pInstanceofNonTrivialFromCode);
+    DUMP_ENTRY_POINT(pCanPutArrayElementFromCode);
+    DUMP_ENTRY_POINT(pCheckCastFromCode);
+    DUMP_ENTRY_POINT(pDebugMe);
+    DUMP_ENTRY_POINT(pUpdateDebuggerFromCode);
+    DUMP_ENTRY_POINT(pInitializeStaticStorage);
+    DUMP_ENTRY_POINT(pInitializeTypeAndVerifyAccessFromCode);
+    DUMP_ENTRY_POINT(pInitializeTypeFromCode);
+    DUMP_ENTRY_POINT(pResolveStringFromCode);
+    DUMP_ENTRY_POINT(pSet32Instance);
+    DUMP_ENTRY_POINT(pSet32Static);
+    DUMP_ENTRY_POINT(pSet64Instance);
+    DUMP_ENTRY_POINT(pSet64Static);
+    DUMP_ENTRY_POINT(pSetObjInstance);
+    DUMP_ENTRY_POINT(pSetObjStatic);
+    DUMP_ENTRY_POINT(pGet32Instance);
+    DUMP_ENTRY_POINT(pGet32Static);
+    DUMP_ENTRY_POINT(pGet64Instance);
+    DUMP_ENTRY_POINT(pGet64Static);
+    DUMP_ENTRY_POINT(pGetObjInstance);
+    DUMP_ENTRY_POINT(pGetObjStatic);
+    DUMP_ENTRY_POINT(pHandleFillArrayDataFromCode);
+    DUMP_ENTRY_POINT(pDecodeJObjectInThread);
+    DUMP_ENTRY_POINT(pFindNativeMethod);
+    DUMP_ENTRY_POINT(pLockObjectFromCode);
+    DUMP_ENTRY_POINT(pUnlockObjectFromCode);
+    DUMP_ENTRY_POINT(pCmpgDouble);
+    DUMP_ENTRY_POINT(pCmpgFloat);
+    DUMP_ENTRY_POINT(pCmplDouble);
+    DUMP_ENTRY_POINT(pCmplFloat);
+    DUMP_ENTRY_POINT(pDadd);
+    DUMP_ENTRY_POINT(pDdiv);
+    DUMP_ENTRY_POINT(pDmul);
+    DUMP_ENTRY_POINT(pDsub);
+    DUMP_ENTRY_POINT(pF2d);
+    DUMP_ENTRY_POINT(pFmod);
+    DUMP_ENTRY_POINT(pI2d);
+    DUMP_ENTRY_POINT(pL2d);
+    DUMP_ENTRY_POINT(pD2f);
+    DUMP_ENTRY_POINT(pFadd);
+    DUMP_ENTRY_POINT(pFdiv);
+    DUMP_ENTRY_POINT(pFmodf);
+    DUMP_ENTRY_POINT(pFmul);
+    DUMP_ENTRY_POINT(pFsub);
+    DUMP_ENTRY_POINT(pI2f);
+    DUMP_ENTRY_POINT(pL2f);
+    DUMP_ENTRY_POINT(pD2iz);
+    DUMP_ENTRY_POINT(pF2iz);
+    DUMP_ENTRY_POINT(pIdiv);
+    DUMP_ENTRY_POINT(pIdivmod);
+    DUMP_ENTRY_POINT(pD2l);
+    DUMP_ENTRY_POINT(pF2l);
+    DUMP_ENTRY_POINT(pLadd);
+    DUMP_ENTRY_POINT(pLand);
+    DUMP_ENTRY_POINT(pLdivmod);
+    DUMP_ENTRY_POINT(pLmul);
+    DUMP_ENTRY_POINT(pLor);
+    DUMP_ENTRY_POINT(pLsub);
+    DUMP_ENTRY_POINT(pLxor);
+    DUMP_ENTRY_POINT(pShlLong);
+    DUMP_ENTRY_POINT(pShrLong);
+    DUMP_ENTRY_POINT(pUshrLong);
+    DUMP_ENTRY_POINT(pIndexOf);
+    DUMP_ENTRY_POINT(pMemcmp16);
+    DUMP_ENTRY_POINT(pStringCompareTo);
+    DUMP_ENTRY_POINT(pMemcpy);
+    DUMP_ENTRY_POINT(pFindInterfaceMethodInCache);
+    DUMP_ENTRY_POINT(pUnresolvedDirectMethodTrampolineFromCode);
+    DUMP_ENTRY_POINT(pInvokeDirectTrampolineWithAccessCheck);
+    DUMP_ENTRY_POINT(pInvokeInterfaceTrampoline);
+    DUMP_ENTRY_POINT(pInvokeInterfaceTrampolineWithAccessCheck);
+    DUMP_ENTRY_POINT(pInvokeStaticTrampolineWithAccessCheck);
+    DUMP_ENTRY_POINT(pInvokeSuperTrampolineWithAccessCheck);
+    DUMP_ENTRY_POINT(pInvokeVirtualTrampolineWithAccessCheck);
+    DUMP_ENTRY_POINT(pCheckSuspendFromCode);
+    DUMP_ENTRY_POINT(pTestSuspendFromCode);
+    DUMP_ENTRY_POINT(pDeliverException);
+    DUMP_ENTRY_POINT(pThrowAbstractMethodErrorFromCode);
+    DUMP_ENTRY_POINT(pThrowArrayBoundsFromCode);
+    DUMP_ENTRY_POINT(pThrowDivZeroFromCode);
+    DUMP_ENTRY_POINT(pThrowNoSuchMethodFromCode);
+    DUMP_ENTRY_POINT(pThrowNullPointerFromCode);
+    DUMP_ENTRY_POINT(pThrowStackOverflowFromCode);
+    DUMP_ENTRY_POINT(pThrowVerificationErrorFromCode);
+
+#undef DUMP_ENTRY_POINT
+
+    CHECK_EQ(start_offset + sizeof(EntryPoints), last_offset + sizeof(uintptr_t));
+    os << "\n";
+
     os << std::flush;
 
     for (size_t i = 0; i < oat_dex_files_.size(); i++) {