Handle variable size of methods properly between 32 and 64 bit.
Bug: 19100762
Change-Id: I62358905fa882284d0201ed3c1e97e1286ccec5f
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index e0df6db..da1c3c0 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -377,7 +377,8 @@
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 @@
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 43f3a2e..f795768 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -899,10 +899,11 @@
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 @@
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 @@
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 @@
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 b771aa7..b39aebf 100644
--- a/runtime/stack.cc
+++ b/runtime/stack.cc
@@ -134,7 +134,8 @@
} 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";