diff options
author | 2025-02-28 14:46:48 +0000 | |
---|---|---|
committer | 2025-02-28 21:39:12 -0800 | |
commit | e36b5d67dca61eb0a27384ef2a5502c21d8af714 (patch) | |
tree | b3df641c47785327fa33b93f19013d4a0e4e8b39 | |
parent | bcec5e63f33a8db783c12a3d7b3ce4e3153c2b20 (diff) |
Address follow-up comments from aosp/3409718.
Bug: 297147201
Test: art/test/testrunner/testrunner.py --target --64
Test: ART_HEAP_POISONING=1 art/test/testrunner/testrunner.py --target --64
Change-Id: Ib37c7e0e446c80394bf058462b40f9feeaabc33e
-rw-r--r-- | compiler/optimizing/intrinsics_arm64.cc | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index 3eaaa6cb94..75607b77e0 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -6049,21 +6049,19 @@ void IntrinsicCodeGeneratorARM64::VisitMethodHandleInvokeExact(HInvoke* invoke) // If method is defined in the receiver's class, execute it as it is. __ Ldr(temp, MemOperand(method, ArtMethod::DeclaringClassOffset().Int32Value())); __ Ldr(receiver_class, HeapOperand(receiver.W(), mirror::Object::ClassOffset().Int32Value())); + codegen_->GetAssembler()->MaybeUnpoisonHeapReference(receiver_class.W()); + // `receiver_class` is read w/o read barriers: false negatives go through virtual dispatch. __ Cmp(temp, receiver_class); __ B(eq, &execute_target_method); // MethodIndex is uint16_t. __ Ldrh(temp, MemOperand(method, ArtMethod::MethodIndexOffset().Int32Value())); - // Re-using method register for receiver class. - // /* HeapReference<Class> */ method = receiver->klass - __ Ldr(method.W(), HeapOperand(receiver.W(), mirror::Object::ClassOffset())); - codegen_->GetAssembler()->MaybeUnpoisonHeapReference(method.W()); - + // Re-using receiver class register to store vtable. constexpr uint32_t vtable_offset = mirror::Class::EmbeddedVTableOffset(art::PointerSize::k64).Int32Value(); - __ Add(method, method, vtable_offset); - __ Ldr(method, MemOperand(method, temp, Extend::UXTW, 3u)); + __ Add(receiver_class.X(), receiver_class.X(), vtable_offset); + __ Ldr(method, MemOperand(receiver_class.X(), temp, Extend::UXTW, 3u)); __ B(&execute_target_method); __ Bind(&non_virtual_dispatch); |