summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/optimizing/intrinsics_x86_64.cc3
1 files changed, 3 insertions, 0 deletions
diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc
index cf1bc93129..e5d4dc4cc2 100644
--- a/compiler/optimizing/intrinsics_x86_64.cc
+++ b/compiler/optimizing/intrinsics_x86_64.cc
@@ -4254,6 +4254,7 @@ void IntrinsicCodeGeneratorX86_64::VisitMethodHandleInvokeExact(HInvoke* invoke)
locations->InAt(invoke->GetNumberOfArguments()).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());
@@ -4297,6 +4298,7 @@ void IntrinsicCodeGeneratorX86_64::VisitMethodHandleInvokeExact(HInvoke* invoke)
constexpr uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
// Re-using method register for receiver class.
__ movl(method, Address(receiver, class_offset));
+ __ MaybeUnpoisonHeapReference(method);
constexpr uint32_t vtable_offset =
mirror::Class::EmbeddedVTableOffset(art::PointerSize::k64).Int32Value();
@@ -4338,6 +4340,7 @@ void IntrinsicCodeGeneratorX86_64::VisitMethodHandleInvokeExact(HInvoke* invoke)
__ Bind(&do_imt_dispatch);
// Re-using `method` to store receiver class and ImTableEntry.
__ movl(method, Address(receiver, mirror::Object::ClassOffset()));
+ __ MaybeUnpoisonHeapReference(method);
__ movq(method, Address(method, mirror::Class::ImtPtrOffset(kX86_64PointerSize).Uint32Value()));
// method = receiver->GetClass()->embedded_imtable_->Get(method_offset);