summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Almaz Mingaleev <mingaleev@google.com> 2025-03-19 08:18:25 -0700
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2025-03-19 08:18:25 -0700
commitf0eae60b347946cdd776d252d73a9fee7e2ec93c (patch)
treee99c0ed615662ba285194f55496accdcdba4c204
parentd2e3f3b5172118561a7198b2587ea87c84f67141 (diff)
parent5ce388aa5079c754838d4faf523eb30719073b88 (diff)
Do not override register storing MethodType in invokeExact. am: 5ce388aa50
Original change: https://android-review.googlesource.com/c/platform/art/+/3551420 Change-Id: I8de7c2f5c6fa80180eb1b7c06877a464036520e1 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--compiler/optimizing/intrinsics_x86_64.cc18
1 files changed, 13 insertions, 5 deletions
diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc
index 281f196f06..f891447848 100644
--- a/compiler/optimizing/intrinsics_x86_64.cc
+++ b/compiler/optimizing/intrinsics_x86_64.cc
@@ -4270,10 +4270,20 @@ void IntrinsicCodeGeneratorX86_64::VisitMethodHandleInvokeExact(HInvoke* invoke)
CpuRegister call_site_type =
locations->InAt(invoke->GetNumberOfArguments()).AsRegister<CpuRegister>();
+ CpuRegister temp = locations->GetTemp(0).AsRegister<CpuRegister>();
+
// Call site should match with MethodHandle's type.
- __ MaybePoisonHeapReference(call_site_type);
- __ cmpl(call_site_type, Address(method_handle, mirror::MethodHandle::MethodTypeOffset()));
- __ j(kNotEqual, slow_path->GetEntryLabel());
+ if (kPoisonHeapReferences) {
+ // call_site_type should be left intact as it 1) might be in callee-saved register 2) is known
+ // for GC to contain a reference.
+ __ movl(temp, call_site_type);
+ __ PoisonHeapReference(temp);
+ __ cmpl(temp, Address(method_handle, mirror::MethodHandle::MethodTypeOffset()));
+ __ j(kNotEqual, slow_path->GetEntryLabel());
+ } else {
+ __ cmpl(call_site_type, Address(method_handle, mirror::MethodHandle::MethodTypeOffset()));
+ __ j(kNotEqual, slow_path->GetEntryLabel());
+ }
CpuRegister method = CpuRegister(kMethodRegisterArgument);
__ movq(method, Address(method_handle, mirror::MethodHandle::ArtFieldOrMethodOffset()));
@@ -4302,8 +4312,6 @@ void IntrinsicCodeGeneratorX86_64::VisitMethodHandleInvokeExact(HInvoke* invoke)
__ testl(Address(method, ArtMethod::AccessFlagsOffset()), Immediate(kAccPrivate));
__ j(kNotZero, &execute_target_method);
- CpuRegister temp = locations->GetTemp(0).AsRegister<CpuRegister>();
-
__ movl(temp, Address(method, ArtMethod::DeclaringClassOffset()));
__ cmpl(temp, Address(receiver, mirror::Object::ClassOffset()));
// If method is defined in the receiver's class, execute it as it is.