diff options
author | 2025-03-11 03:24:14 -0700 | |
---|---|---|
committer | 2025-03-20 03:50:21 -0700 | |
commit | 59aaec4d51436995ace22c4bd6f35ff7f6f8aaf4 (patch) | |
tree | 4241d68db637844d86522d0445813d711ff5e8a4 /compiler/optimizing/intrinsics_x86_64.cc | |
parent | a23f36390858d148e7ab2cc8ff159b138946595e (diff) |
Revert^2 "Call target method in accessor MHs when it is set."
Previous LUCI crashes were due to b/404465902, which was
fixed in aosp/3551420.
Bug: 297147201
Test: ART_HEAP_POISONING=true art/test/testrunner/testrunner.py -b \
--host --baseline --debug --gcstress --64
Test: art/test/testrunner/testrunner.py -b \
--host --baseline --debug --gcstress --64
Change-Id: If93b9c6559ac8ddbc3211df1cbc4dec192cb054a
Diffstat (limited to 'compiler/optimizing/intrinsics_x86_64.cc')
-rw-r--r-- | compiler/optimizing/intrinsics_x86_64.cc | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc index f891447848..d3ee1759e0 100644 --- a/compiler/optimizing/intrinsics_x86_64.cc +++ b/compiler/optimizing/intrinsics_x86_64.cc @@ -32,6 +32,7 @@ #include "intrinsics_utils.h" #include "lock_word.h" #include "mirror/array-inl.h" +#include "mirror/method_handle_impl.h" #include "mirror/object_array-inl.h" #include "mirror/reference.h" #include "mirror/string.h" @@ -4241,31 +4242,47 @@ void IntrinsicLocationsBuilderX86_64::VisitMethodHandleInvokeExact(HInvoke* invo InvokeDexCallingConventionVisitorX86_64 calling_convention; locations->SetOut(calling_convention.GetReturnLocation(invoke->GetType())); - locations->SetInAt(0, Location::RequiresRegister()); + uint32_t number_of_args = invoke->GetNumberOfArguments(); // Accomodating LocationSummary for underlying invoke-* call. - uint32_t number_of_args = invoke->GetNumberOfArguments(); for (uint32_t i = 1; i < number_of_args; ++i) { locations->SetInAt(i, calling_convention.GetNextLocation(invoke->InputAt(i)->GetType())); } + // Passing MethodHandle object as the last parameter: accessors implementation rely on it. + DCHECK_EQ(invoke->InputAt(0)->GetType(), DataType::Type::kReference); + Location receiver_mh_loc = calling_convention.GetNextLocation(DataType::Type::kReference); + locations->SetInAt(0, receiver_mh_loc); + // The last input is MethodType object corresponding to the call-site. locations->SetInAt(number_of_args, Location::RequiresRegister()); locations->AddTemp(Location::RequiresRegister()); // Hidden arg for invoke-interface. locations->AddTemp(Location::RegisterLocation(RAX)); + + if (!receiver_mh_loc.IsRegister()) { + locations->AddTemp(Location::RequiresRegister()); + } } void IntrinsicCodeGeneratorX86_64::VisitMethodHandleInvokeExact(HInvoke* invoke) { LocationSummary* locations = invoke->GetLocations(); + X86_64Assembler* assembler = codegen_->GetAssembler(); - CpuRegister method_handle = locations->InAt(0).AsRegister<CpuRegister>(); + Location receiver_mh_loc = locations->InAt(0); + CpuRegister method_handle = receiver_mh_loc.IsRegister() + ? receiver_mh_loc.AsRegister<CpuRegister>() + : locations->GetTemp(2).AsRegister<CpuRegister>(); + + if (!receiver_mh_loc.IsRegister()) { + DCHECK(receiver_mh_loc.IsStackSlot()); + __ movl(method_handle, Address(CpuRegister(RSP), receiver_mh_loc.GetStackIndex())); + } SlowPathCode* slow_path = new (codegen_->GetScopedAllocator()) InvokePolymorphicSlowPathX86_64(invoke, method_handle); codegen_->AddSlowPath(slow_path); - X86_64Assembler* assembler = codegen_->GetAssembler(); CpuRegister call_site_type = locations->InAt(invoke->GetNumberOfArguments()).AsRegister<CpuRegister>(); @@ -4288,10 +4305,18 @@ void IntrinsicCodeGeneratorX86_64::VisitMethodHandleInvokeExact(HInvoke* invoke) CpuRegister method = CpuRegister(kMethodRegisterArgument); __ movq(method, Address(method_handle, mirror::MethodHandle::ArtFieldOrMethodOffset())); - Label static_dispatch; Label execute_target_method; + Label method_dispatch; + Label static_dispatch; Address method_handle_kind = Address(method_handle, mirror::MethodHandle::HandleKindOffset()); + + __ cmpl(method_handle_kind, Immediate(mirror::MethodHandle::kFirstAccessorKind)); + __ j(kLess, &method_dispatch); + __ movq(method, Address(method_handle, mirror::MethodHandleImpl::TargetOffset())); + __ Jump(&execute_target_method); + + __ Bind(&method_dispatch); if (invoke->AsInvokePolymorphic()->CanTargetInstanceMethod()) { CpuRegister receiver = locations->InAt(1).AsRegister<CpuRegister>(); |