diff options
author | 2024-04-22 14:24:52 +0000 | |
---|---|---|
committer | 2024-04-29 08:53:36 +0000 | |
commit | eac7cd76d9a39a61c7fecbd3c3eb4f2932a3d55c (patch) | |
tree | c75a973a0e3a761f65d7ac8409659bb1aa402911 /runtime/art_method.cc | |
parent | 75d4422b08058ba92dfdeebc1bbe1f89d591b721 (diff) |
Reland^2 "Revamp JIT GC."
This reverts commit 030a225ade89e2eaf34ac0072b6b1f9ac02ddda7.
Reason for revert: Prevent zombie code being added in the middle of a
JIT GC.
Change-Id: I89157e4d4130896665a11a930d87635f4883db79
Diffstat (limited to 'runtime/art_method.cc')
-rw-r--r-- | runtime/art_method.cc | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/runtime/art_method.cc b/runtime/art_method.cc index c8b16990b2..0b6b883bab 100644 --- a/runtime/art_method.cc +++ b/runtime/art_method.cc @@ -795,16 +795,18 @@ void ArtMethod::CopyFrom(ArtMethod* src, PointerSize image_pointer_size) { const void* entry_point = GetEntryPointFromQuickCompiledCodePtrSize(image_pointer_size); if (runtime->UseJitCompilation()) { if (runtime->GetJit()->GetCodeCache()->ContainsPc(entry_point)) { - SetEntryPointFromQuickCompiledCodePtrSize( - src->IsNative() ? GetQuickGenericJniStub() : GetQuickToInterpreterBridge(), - image_pointer_size); + SetNativePointer(EntryPointFromQuickCompiledCodeOffset(image_pointer_size), + src->IsNative() ? GetQuickGenericJniStub() : GetQuickToInterpreterBridge(), + image_pointer_size); } } ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); if (interpreter::IsNterpSupported() && class_linker->IsNterpEntryPoint(entry_point)) { // If the entrypoint is nterp, it's too early to check if the new method // will support it. So for simplicity, use the interpreter bridge. - SetEntryPointFromQuickCompiledCodePtrSize(GetQuickToInterpreterBridge(), image_pointer_size); + SetNativePointer(EntryPointFromQuickCompiledCodeOffset(image_pointer_size), + GetQuickToInterpreterBridge(), + image_pointer_size); } // Clear the data pointer, it will be set if needed by the caller. @@ -922,4 +924,20 @@ ALWAYS_INLINE static inline void DoGetAccessFlagsHelper(ArtMethod* method) method->GetDeclaringClass<kReadBarrierOption>()->IsErroneous()); } +void ArtMethod::SetEntryPointFromQuickCompiledCodePtrSize( + const void* entry_point_from_quick_compiled_code, PointerSize pointer_size) { + const void* current_entry_point = GetEntryPointFromQuickCompiledCodePtrSize(pointer_size); + if (current_entry_point == entry_point_from_quick_compiled_code) { + return; + } + jit::Jit* jit = Runtime::Current()->GetJit(); + SetNativePointer(EntryPointFromQuickCompiledCodeOffset(pointer_size), + entry_point_from_quick_compiled_code, + pointer_size); + if (jit != nullptr && + jit->GetCodeCache()->ContainsPc(current_entry_point)) { + jit->GetCodeCache()->AddZombieCode(this, current_entry_point); + } +} + } // namespace art |