diff options
author | Jeff Hao <jeffhao@google.com> | 2015-02-03 15:08:39 -0800 |
---|---|---|
committer | Jeff Hao <jeffhao@google.com> | 2015-02-05 14:14:43 -0800 |
commit | c7d11887725e28db2796c848f4485e59d5eb690c (patch) | |
tree | 97f39432ca9d94969f53cae91baaf8de57cf785d /compiler/image_writer.cc | |
parent | a0acc2d5dbf8764b346da3d9e6ce1a91427fc4b5 (diff) | |
download | android_art-c7d11887725e28db2796c848f4485e59d5eb690c.tar.gz android_art-c7d11887725e28db2796c848f4485e59d5eb690c.tar.bz2 android_art-c7d11887725e28db2796c848f4485e59d5eb690c.zip |
Handle variable size of methods properly between 32 and 64 bit.
Bug: 19100762
Change-Id: I62358905fa882284d0201ed3c1e97e1286ccec5f
Diffstat (limited to 'compiler/image_writer.cc')
-rw-r--r-- | compiler/image_writer.cc | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/compiler/image_writer.cc b/compiler/image_writer.cc index b2342491fa..670b76c38f 100644 --- a/compiler/image_writer.cc +++ b/compiler/image_writer.cc @@ -273,13 +273,7 @@ void ImageWriter::SetImageBinSlot(mirror::Object* object, BinSlot bin_slot) { void ImageWriter::AssignImageBinSlot(mirror::Object* object) { DCHECK(object != nullptr); - size_t object_size; - if (object->IsArtMethod()) { - // Methods are sized based on the target pointer size. - object_size = mirror::ArtMethod::InstanceSize(target_ptr_size_); - } else { - object_size = object->SizeOf(); - } + size_t object_size = object->SizeOf(); // The magic happens here. We segregate objects into different bins based // on how likely they are to get dirty at runtime. @@ -931,7 +925,7 @@ void ImageWriter::CopyAndFixupObjectsCallback(Object* obj, void* arg) { if (obj->IsArtMethod()) { // Size without pointer fields since we don't want to overrun the buffer if target art method // is 32 bits but source is 64 bits. - n = mirror::ArtMethod::SizeWithoutPointerFields(sizeof(void*)); + n = mirror::ArtMethod::SizeWithoutPointerFields(image_writer->target_ptr_size_); } else { n = obj->SizeOf(); } @@ -1016,10 +1010,6 @@ void ImageWriter::FixupObject(Object* orig, Object* copy) { } if (orig->IsArtMethod<kVerifyNone>()) { FixupMethod(orig->AsArtMethod<kVerifyNone>(), down_cast<ArtMethod*>(copy)); - } else if (orig->IsClass() && orig->AsClass()->IsArtMethodClass()) { - // Set the right size for the target. - size_t size = mirror::ArtMethod::InstanceSize(target_ptr_size_); - down_cast<mirror::Class*>(copy)->SetObjectSizeWithoutChecks(size); } } @@ -1031,7 +1021,9 @@ const uint8_t* ImageWriter::GetQuickCode(mirror::ArtMethod* method, bool* quick_ // trampoline. // Quick entrypoint: - const uint8_t* quick_code = GetOatAddress(method->GetQuickOatCodeOffset()); + uint32_t quick_oat_code_offset = PointerToLowMemUInt32( + method->GetEntryPointFromQuickCompiledCodePtrSize(target_ptr_size_)); + const uint8_t* quick_code = GetOatAddress(quick_oat_code_offset); *quick_is_interpreted = false; if (quick_code != nullptr && (!method->IsStatic() || method->IsConstructor() || method->GetDeclaringClass()->IsInitialized())) { @@ -1082,11 +1074,12 @@ void ImageWriter::FixupMethod(ArtMethod* orig, ArtMethod* copy) { // locations. // Copy all of the fields from the runtime methods to the target methods first since we did a // bytewise copy earlier. - copy->SetEntryPointFromInterpreterPtrSize<kVerifyNone>(orig->GetEntryPointFromInterpreter(), - target_ptr_size_); - copy->SetEntryPointFromJniPtrSize<kVerifyNone>(orig->GetEntryPointFromJni(), target_ptr_size_); + copy->SetEntryPointFromInterpreterPtrSize<kVerifyNone>( + orig->GetEntryPointFromInterpreterPtrSize(target_ptr_size_), target_ptr_size_); + copy->SetEntryPointFromJniPtrSize<kVerifyNone>( + orig->GetEntryPointFromJniPtrSize(target_ptr_size_), target_ptr_size_); copy->SetEntryPointFromQuickCompiledCodePtrSize<kVerifyNone>( - orig->GetEntryPointFromQuickCompiledCode(), target_ptr_size_); + orig->GetEntryPointFromQuickCompiledCodePtrSize(target_ptr_size_), target_ptr_size_); // The resolution method has a special trampoline to call. Runtime* runtime = Runtime::Current(); |