Make system use patchoat to relocate during runtime.
Change dalvik_system_DexFile.cc so that isDexOptNeededInternal will be
able to indicate that a patchoat is required. Change default of relocate
option to be on.
Bug: 15358152
Change-Id: Ibe92d8b55a24bbf718b0416a21b76e5df7a2de26
diff --git a/compiler/elf_patcher.cc b/compiler/elf_patcher.cc
index 6112fbb..137110f 100644
--- a/compiler/elf_patcher.cc
+++ b/compiler/elf_patcher.cc
@@ -120,6 +120,7 @@
uint32_t* ElfPatcher::GetPatchLocation(uintptr_t patch_ptr) {
CHECK_GE(patch_ptr, reinterpret_cast<uintptr_t>(oat_file_->Begin()));
+ CHECK_LE(patch_ptr, reinterpret_cast<uintptr_t>(oat_file_->End()));
uintptr_t off = patch_ptr - reinterpret_cast<uintptr_t>(oat_file_->Begin());
uintptr_t ret = reinterpret_cast<uintptr_t>(oat_header_) + off;
@@ -144,20 +145,20 @@
cpatch->GetTargetDexFile()->GetMethodId(cpatch->GetTargetMethodIdx());
uint32_t expected = reinterpret_cast<uintptr_t>(&id) & 0xFFFFFFFF;
uint32_t actual = *patch_location;
- CHECK(actual == expected || actual == value) << std::hex
- << "actual=" << actual
- << "expected=" << expected
- << "value=" << value;
+ CHECK(actual == expected || actual == value) << "Patching call failed: " << std::hex
+ << " actual=" << actual
+ << " expected=" << expected
+ << " value=" << value;
}
if (patch->IsType()) {
const CompilerDriver::TypePatchInformation* tpatch = patch->AsType();
const DexFile::TypeId& id = tpatch->GetDexFile().GetTypeId(tpatch->GetTargetTypeIdx());
uint32_t expected = reinterpret_cast<uintptr_t>(&id) & 0xFFFFFFFF;
uint32_t actual = *patch_location;
- CHECK(actual == expected || actual == value) << std::hex
- << "actual=" << actual
- << "expected=" << expected
- << "value=" << value;
+ CHECK(actual == expected || actual == value) << "Patching type failed: " << std::hex
+ << " actual=" << actual
+ << " expected=" << expected
+ << " value=" << value;
}
}
*patch_location = value;