Add thumb-specific code for invoke stub.

On LLVM-based compiler, we are compiling the invoke stubs
into Thumb2 instruction set.  Thus, we should take care
of the thumb offset for invoke stub as well.

Change-Id: Ifc0b0099f2f035a64e89350086d6435e733224b8
diff --git a/src/common_test.h b/src/common_test.h
index a9bd139..cdcac24 100644
--- a/src/common_test.h
+++ b/src/common_test.h
@@ -231,7 +231,9 @@
     } else {
       const std::vector<uint8_t>& invoke_stub = compiled_invoke_stub->GetCode();
       MakeExecutable(invoke_stub);
-      method_invoke_stub = reinterpret_cast<const Method::InvokeStub*>(&invoke_stub[0]);
+      method_invoke_stub = reinterpret_cast<const Method::InvokeStub*>(
+          CompiledCode::CodePointer(&invoke_stub[0],
+                                    compiled_invoke_stub->GetInstructionSet()));
     }
 
     LOG(INFO) << "MakeExecutable " << PrettyMethod(method)
diff --git a/src/oat_file.cc b/src/oat_file.cc
index e97e70c..239239b 100644
--- a/src/oat_file.cc
+++ b/src/oat_file.cc
@@ -435,6 +435,8 @@
     if (code == 0) {
       return 0;
     }
+    // TODO: make this Thumb2 specific
+    code &= ~0x1;
     return reinterpret_cast<uint32_t*>(code)[-1];
   } else {
 #if !defined(ART_USE_LLVM_COMPILER)
diff --git a/src/oat_writer.cc b/src/oat_writer.cc
index ec25ae9..2558eba 100644
--- a/src/oat_writer.cc
+++ b/src/oat_writer.cc
@@ -377,7 +377,8 @@
       const std::vector<uint8_t>& invoke_stub = compiled_invoke_stub->GetCode();
       uint32_t invoke_stub_size = invoke_stub.size() * sizeof(invoke_stub[0]);
       CHECK_NE(invoke_stub_size, 0U);
-      invoke_stub_offset = offset + sizeof(invoke_stub_size);
+      uint32_t thumb_offset = compiled_invoke_stub->CodeDelta();
+      invoke_stub_offset = offset + sizeof(invoke_stub_size) + thumb_offset;
 
       // Deduplicate invoke stubs
       SafeMap<const std::vector<uint8_t>*, uint32_t>::iterator stub_iter = code_offsets_.find(&invoke_stub);
@@ -760,7 +761,7 @@
       CHECK_NE(invoke_stub_size, 0U);
 
       // Deduplicate invoke stubs
-      size_t offset = code_offset + sizeof(invoke_stub_size);
+      size_t offset = code_offset + sizeof(invoke_stub_size) + compiled_invoke_stub->CodeDelta();
       SafeMap<const std::vector<uint8_t>*, uint32_t>::iterator stub_iter =
           code_offsets_.find(&invoke_stub);
       if (stub_iter != code_offsets_.end() && offset != method_offsets.invoke_stub_offset_) {
diff --git a/src/object.h b/src/object.h
index 6334f8e..efdc3d7 100644
--- a/src/object.h
+++ b/src/object.h
@@ -840,11 +840,13 @@
   }
 
   uint32_t GetInvokeStubSize() const {
-    const uint32_t* invoke_stub = reinterpret_cast<const uint32_t*>(GetInvokeStub());
-    if (invoke_stub == NULL) {
+    uintptr_t invoke_stub = reinterpret_cast<uintptr_t>(GetInvokeStub());
+    if (invoke_stub == 0) {
       return 0;
     }
-    return invoke_stub[-1];
+    // TODO: make this Thumb2 specific
+    invoke_stub &= ~0x1;
+    return reinterpret_cast<const uint32_t*>(invoke_stub)[-1];
   }
 
   uint32_t GetOatInvokeStubOffset() const {