Delay entrypoint update until visibly initialized.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing --jit
Test: aosp_taimen-userdebug boots.
Test: run-gtests.sh
Test: testrunner.py --target --optimizing --jit
Bug: 18161648
Change-Id: Idde0cbc848f19236319426bc82ac10b8b8bb9ee9
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index de4db67..650f907 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -303,6 +303,7 @@
vm->DeleteWeakGlobalRef(self, classes_[i]);
if (klass != nullptr) {
mirror::Class::SetStatus(klass, ClassStatus::kVisiblyInitialized, self);
+ class_linker_->FixupStaticTrampolines(klass.Get());
}
}
num_classes_ = 0u;
@@ -402,12 +403,14 @@
// Thanks to the x86 memory model, we do not need any memory fences and
// we can immediately mark the class as visibly initialized.
mirror::Class::SetStatus(klass, ClassStatus::kVisiblyInitialized, self);
+ FixupStaticTrampolines(klass.Get());
return nullptr;
}
if (Runtime::Current()->IsActiveTransaction()) {
// Transactions are single-threaded, so we can mark the class as visibly intialized.
// (Otherwise we'd need to track the callback's entry in the transaction for rollback.)
mirror::Class::SetStatus(klass, ClassStatus::kVisiblyInitialized, self);
+ FixupStaticTrampolines(klass.Get());
return nullptr;
}
mirror::Class::SetStatus(klass, ClassStatus::kInitialized, self);
@@ -3697,10 +3700,13 @@
void ClassLinker::FixupStaticTrampolines(ObjPtr<mirror::Class> klass) {
ScopedAssertNoThreadSuspension sants(__FUNCTION__);
- DCHECK(klass->IsInitialized()) << klass->PrettyDescriptor();
+ DCHECK(klass->IsVisiblyInitialized()) << klass->PrettyDescriptor();
if (klass->NumDirectMethods() == 0) {
return; // No direct methods => no static methods.
}
+ if (UNLIKELY(klass->IsProxyClass())) {
+ return;
+ }
Runtime* runtime = Runtime::Current();
if (!runtime->IsStarted()) {
if (runtime->IsAotCompiler() || runtime->GetHeap()->HasBootImageSpace()) {
@@ -3735,7 +3741,7 @@
quick_code = oat_method.GetQuickCode();
}
// Check if we have JIT compiled code for it.
- jit::Jit* jit = Runtime::Current()->GetJit();
+ jit::Jit* jit = runtime->GetJit();
if (quick_code == nullptr && jit != nullptr) {
quick_code = jit->GetCodeCache()->GetSavedEntryPointOfPreCompiledMethod(method);
}
@@ -5671,8 +5677,6 @@
LOG(INFO) << "Initialized class " << klass->GetDescriptor(&temp) << " from " <<
klass->GetLocation();
}
- // Opportunistically set static method trampolines to their destination.
- FixupStaticTrampolines(klass.Get());
}
}
if (callback != nullptr) {