Clean up ImageSpace::LoadBootImage().
Do not rely on data from Runtime::Current(), pass required
parameters explicitly. Move initialization of runtime
methods to ClassLinker, remove the "uninitialization" from
ImageSpace destructor as it's performed just before the
Runtime is destroyed and it is therefore unnecessary work.
This is not a complete cleanup as we still rely on the
Runtime::Current() for zygote and boot image compilation but
it allows imgdiag to load the system boot image directly.
This shall be implemented in a follow-up change.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 77856493
Change-Id: Ic08c2918d726df8d2af3f8803c1673d8216a3da5
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index cf66f58..03cc658 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -973,7 +973,8 @@
*error_msg = StringPrintf("Invalid image pointer size: %u", pointer_size_unchecked);
return false;
}
- image_pointer_size_ = spaces[0]->GetImageHeader().GetPointerSize();
+ const ImageHeader& image_header = spaces[0]->GetImageHeader();
+ image_pointer_size_ = image_header.GetPointerSize();
if (!runtime->IsAotCompiler()) {
// Only the Aot compiler supports having an image with a different pointer size than the
// runtime. This happens on the host for compiling 32 bit tests since we use a 64 bit libart
@@ -985,6 +986,30 @@
return false;
}
}
+ DCHECK(!runtime->HasResolutionMethod());
+ runtime->SetResolutionMethod(image_header.GetImageMethod(ImageHeader::kResolutionMethod));
+ runtime->SetImtConflictMethod(image_header.GetImageMethod(ImageHeader::kImtConflictMethod));
+ runtime->SetImtUnimplementedMethod(
+ image_header.GetImageMethod(ImageHeader::kImtUnimplementedMethod));
+ runtime->SetCalleeSaveMethod(
+ image_header.GetImageMethod(ImageHeader::kSaveAllCalleeSavesMethod),
+ CalleeSaveType::kSaveAllCalleeSaves);
+ runtime->SetCalleeSaveMethod(
+ image_header.GetImageMethod(ImageHeader::kSaveRefsOnlyMethod),
+ CalleeSaveType::kSaveRefsOnly);
+ runtime->SetCalleeSaveMethod(
+ image_header.GetImageMethod(ImageHeader::kSaveRefsAndArgsMethod),
+ CalleeSaveType::kSaveRefsAndArgs);
+ runtime->SetCalleeSaveMethod(
+ image_header.GetImageMethod(ImageHeader::kSaveEverythingMethod),
+ CalleeSaveType::kSaveEverything);
+ runtime->SetCalleeSaveMethod(
+ image_header.GetImageMethod(ImageHeader::kSaveEverythingMethodForClinit),
+ CalleeSaveType::kSaveEverythingForClinit);
+ runtime->SetCalleeSaveMethod(
+ image_header.GetImageMethod(ImageHeader::kSaveEverythingMethodForSuspendCheck),
+ CalleeSaveType::kSaveEverythingForSuspendCheck);
+
std::vector<const OatFile*> oat_files =
runtime->GetOatFileManager().RegisterImageOatFiles(spaces);
DCHECK(!oat_files.empty());