diff options
author | 2025-03-19 08:18:25 -0700 | |
---|---|---|
committer | 2025-03-19 08:18:25 -0700 | |
commit | f0eae60b347946cdd776d252d73a9fee7e2ec93c (patch) | |
tree | e99c0ed615662ba285194f55496accdcdba4c204 /compiler/optimizing | |
parent | d2e3f3b5172118561a7198b2587ea87c84f67141 (diff) | |
parent | 5ce388aa5079c754838d4faf523eb30719073b88 (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>
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/intrinsics_x86_64.cc | 18 |
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. |