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 /runtime | |
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 'runtime')
-rw-r--r-- | runtime/class_linker.cc | 6 | ||||
-rw-r--r-- | runtime/runtime.cc | 12 | ||||
-rw-r--r-- | runtime/stack.cc | 3 |
3 files changed, 14 insertions, 7 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index e0df6db24e..da1c3c0fad 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -377,7 +377,8 @@ void ClassLinker::InitWithoutImage(std::vector<std::unique_ptr<const DexFile>> b Handle<mirror::Class> java_lang_reflect_ArtMethod(hs.NewHandle( AllocClass(self, java_lang_Class.Get(), mirror::ArtMethod::ClassSize()))); CHECK(java_lang_reflect_ArtMethod.Get() != nullptr); - java_lang_reflect_ArtMethod->SetObjectSize(mirror::ArtMethod::InstanceSize(sizeof(void*))); + size_t pointer_size = GetInstructionSetPointerSize(Runtime::Current()->GetInstructionSet()); + java_lang_reflect_ArtMethod->SetObjectSize(mirror::ArtMethod::InstanceSize(pointer_size)); SetClassRoot(kJavaLangReflectArtMethod, java_lang_reflect_ArtMethod.Get()); java_lang_reflect_ArtMethod->SetStatus(mirror::Class::kStatusResolved, self); mirror::ArtMethod::SetClass(java_lang_reflect_ArtMethod.Get()); @@ -5481,7 +5482,8 @@ bool ClassLinker::LinkFields(Thread* self, Handle<mirror::Class> klass, bool is_ klass->SetNumReferenceInstanceFields(num_reference_fields); if (!klass->IsVariableSize()) { if (klass->DescriptorEquals("Ljava/lang/reflect/ArtMethod;")) { - klass->SetObjectSize(mirror::ArtMethod::InstanceSize(sizeof(void*))); + size_t pointer_size = GetInstructionSetPointerSize(Runtime::Current()->GetInstructionSet()); + klass->SetObjectSize(mirror::ArtMethod::InstanceSize(pointer_size)); } else { std::string temp; DCHECK_GE(size, sizeof(mirror::Object)) << klass->GetDescriptor(&temp); diff --git a/runtime/runtime.cc b/runtime/runtime.cc index 43f3a2e926..f79576861f 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -899,10 +899,11 @@ bool Runtime::Init(const RuntimeOptions& raw_options, bool ignore_unrecognized) dex_locations, runtime_options.GetOrDefault(Opt::Image), &boot_class_path); + instruction_set_ = runtime_options.GetOrDefault(Opt::ImageInstructionSet); class_linker_->InitWithoutImage(std::move(boot_class_path)); // TODO: Should we move the following to InitWithoutImage? - SetInstructionSet(kRuntimeISA); + SetInstructionSet(instruction_set_); for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) { Runtime::CalleeSaveType type = Runtime::CalleeSaveType(i); if (!HasCalleeSaveMethod(type)) { @@ -1322,7 +1323,8 @@ mirror::ArtMethod* Runtime::CreateImtConflictMethod() { method->SetDexMethodIndex(DexFile::kDexNoIndex); // When compiling, the code pointer will get set later when the image is loaded. if (runtime->IsCompiler()) { - method->SetEntryPointFromQuickCompiledCode(nullptr); + size_t pointer_size = GetInstructionSetPointerSize(instruction_set_); + method->SetEntryPointFromQuickCompiledCodePtrSize(nullptr, pointer_size); } else { method->SetEntryPointFromQuickCompiledCode(GetQuickImtConflictStub()); } @@ -1340,7 +1342,8 @@ mirror::ArtMethod* Runtime::CreateResolutionMethod() { method->SetDexMethodIndex(DexFile::kDexNoIndex); // When compiling, the code pointer will get set later when the image is loaded. if (runtime->IsCompiler()) { - method->SetEntryPointFromQuickCompiledCode(nullptr); + size_t pointer_size = GetInstructionSetPointerSize(instruction_set_); + method->SetEntryPointFromQuickCompiledCodePtrSize(nullptr, pointer_size); } else { method->SetEntryPointFromQuickCompiledCode(GetQuickResolutionStub()); } @@ -1356,7 +1359,8 @@ mirror::ArtMethod* Runtime::CreateCalleeSaveMethod() { method->SetDeclaringClass(mirror::ArtMethod::GetJavaLangReflectArtMethod()); // TODO: use a special method for callee saves method->SetDexMethodIndex(DexFile::kDexNoIndex); - method->SetEntryPointFromQuickCompiledCode(nullptr); + size_t pointer_size = GetInstructionSetPointerSize(instruction_set_); + method->SetEntryPointFromQuickCompiledCodePtrSize(nullptr, pointer_size); DCHECK_NE(instruction_set_, kNone); return method.Get(); } diff --git a/runtime/stack.cc b/runtime/stack.cc index b771aa71a1..b39aebfc4f 100644 --- a/runtime/stack.cc +++ b/runtime/stack.cc @@ -134,7 +134,8 @@ mirror::Object* StackVisitor::GetThisObject() const { } else { return cur_shadow_frame_->GetVRegReference(0); } - } else if (m->IsOptimized(sizeof(void*))) { + } else if (m->IsOptimized(GetInstructionSetPointerSize( + Runtime::Current()->GetInstructionSet()))) { // TODO: Implement, currently only used for exceptions when jdwp is enabled. UNIMPLEMENTED(WARNING) << "StackVisitor::GetThisObject is unimplemented with the optimizing compiler"; |