diff options
| author | 2014-05-30 16:47:46 +0000 | |
|---|---|---|
| committer | 2014-05-30 16:47:46 +0000 | |
| commit | 36fc2ebff068af338e223bf97997127df2bfbc45 (patch) | |
| tree | 0f8a9f7a552ccbd2a379416936260a9faed80aa9 /compiler | |
| parent | 035c1e30f8df129d5e8c095494ca907191a21f05 (diff) | |
| parent | 72fc63563661b4b954acd5962ec3ae30b7666569 (diff) | |
am 72fc6356: Merge "Revert "Revert "Add support for relative patching to quick offsets."""
* commit '72fc63563661b4b954acd5962ec3ae30b7666569':
Revert "Revert "Add support for relative patching to quick offsets.""
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/image_writer.cc | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/compiler/image_writer.cc b/compiler/image_writer.cc index be53926ac8..e909c97f64 100644 --- a/compiler/image_writer.cc +++ b/compiler/image_writer.cc @@ -742,30 +742,42 @@ void ImageWriter::PatchOatCodeAndMethods() { const CompilerDriver::CallPatchInformation* patch = code_to_patch[i]; ArtMethod* target = GetTargetMethod(patch); uintptr_t quick_code = reinterpret_cast<uintptr_t>(class_linker->GetQuickOatCodeFor(target)); + DCHECK_NE(quick_code, 0U) << PrettyMethod(target); uintptr_t code_base = reinterpret_cast<uintptr_t>(&oat_file_->GetOatHeader()); uintptr_t code_offset = quick_code - code_base; + bool is_quick_offset = false; + if (quick_code == reinterpret_cast<uintptr_t>(GetQuickToInterpreterBridge())) { + is_quick_offset = true; + code_offset = PointerToLowMemUInt32(GetOatAddress(quick_to_interpreter_bridge_offset_)); + } else if (quick_code == + reinterpret_cast<uintptr_t>(class_linker->GetQuickGenericJniTrampoline())) { + CHECK(target->IsNative()); + is_quick_offset = true; + code_offset = PointerToLowMemUInt32(GetOatAddress(quick_generic_jni_trampoline_offset_)); + } + uintptr_t value; if (patch->IsRelative()) { // value to patch is relative to the location being patched const void* quick_oat_code = class_linker->GetQuickOatCodeFor(patch->GetDexFile(), patch->GetReferrerClassDefIdx(), patch->GetReferrerMethodIdx()); + if (is_quick_offset) { + quick_code = code_offset; + // If its a quick offset it means that we are doing a relative patch from the class linker + // oat_file to the image writer oat_file so we need to adjust the quick oat code to be the + // one in the image writer oat_file. + quick_oat_code = + reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(quick_oat_code) + + reinterpret_cast<uintptr_t>(oat_data_begin_) - code_base); + } uintptr_t base = reinterpret_cast<uintptr_t>(quick_oat_code); uintptr_t patch_location = base + patch->GetLiteralOffset(); - uintptr_t value = quick_code - patch_location + patch->RelativeOffset(); - SetPatchLocation(patch, value); + value = quick_code - patch_location + patch->RelativeOffset(); } else { - if (quick_code == reinterpret_cast<uintptr_t>(GetQuickToInterpreterBridge()) || - quick_code == reinterpret_cast<uintptr_t>(class_linker->GetQuickGenericJniTrampoline())) { - if (target->IsNative()) { - // generic JNI, not interpreter bridge from GetQuickOatCodeFor(). - code_offset = quick_generic_jni_trampoline_offset_; - } else { - code_offset = quick_to_interpreter_bridge_offset_; - } - } - SetPatchLocation(patch, PointerToLowMemUInt32(GetOatAddress(code_offset))); + value = code_offset; } + SetPatchLocation(patch, value); } const CallPatches& methods_to_patch = compiler_driver_.GetMethodsToPatch(); |