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 {