--- a/src/hotspot/cpu/x86/templateTable_x86.cpp Mon Mar 12 16:53:47 2018 +0100
+++ b/src/hotspot/cpu/x86/templateTable_x86.cpp Mon Mar 26 09:56:36 2018 +0200
@@ -28,7 +28,7 @@
#include "interpreter/interpreterRuntime.hpp"
#include "interpreter/interp_masm.hpp"
#include "interpreter/templateTable.hpp"
-#include "memory/universe.inline.hpp"
+#include "memory/universe.hpp"
#include "oops/methodData.hpp"
#include "oops/objArrayKlass.hpp"
#include "oops/oop.inline.hpp"
@@ -154,7 +154,7 @@
assert(val == noreg || val == rax, "parameter is just for looks");
switch (barrier) {
#if INCLUDE_ALL_GCS
- case BarrierSet::G1SATBCTLogging:
+ case BarrierSet::G1BarrierSet:
{
// flatten object address if needed
// We do it regardless of precise because we need the registers
@@ -3879,6 +3879,8 @@
Label no_such_interface, no_such_method;
+ // Preserve method for throw_AbstractMethodErrorVerbose.
+ __ mov(rcx, rbx);
// Receiver subtype check against REFC.
// Superklass in rax. Subklass in rdx. Blows rcx, rdi.
__ lookup_interface_method(// inputs: rec. class, interface, itable index
@@ -3900,8 +3902,10 @@
__ subl(rbx, Method::itable_index_max);
__ negl(rbx);
+ // Preserve recvKlass for throw_AbstractMethodErrorVerbose.
+ __ mov(rlocals, rdx);
__ lookup_interface_method(// inputs: rec. class, interface, itable index
- rdx, rax, rbx,
+ rlocals, rax, rbx,
// outputs: method, scan temp. reg
rbx, rbcp,
no_such_interface);
@@ -3933,8 +3937,19 @@
__ pop(rbx); // pop return address (pushed by prepare_invoke)
__ restore_bcp(); // rbcp must be correct for exception handler (was destroyed)
__ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
- __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
- // the call_VM checks for exception, so we should never return here.
+ // Pass arguments for generating a verbose error message.
+#ifdef _LP64
+ Register recvKlass = c_rarg1;
+ Register method = c_rarg2;
+ if (recvKlass != rdx) { __ movq(recvKlass, rdx); }
+ if (method != rcx) { __ movq(method, rcx); }
+#else
+ Register recvKlass = rdx;
+ Register method = rcx;
+#endif
+ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodErrorVerbose),
+ recvKlass, method);
+ // The call_VM checks for exception, so we should never return here.
__ should_not_reach_here();
__ bind(no_such_interface);
@@ -3942,8 +3957,10 @@
__ pop(rbx); // pop return address (pushed by prepare_invoke)
__ restore_bcp(); // rbcp must be correct for exception handler (was destroyed)
__ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
- __ call_VM(noreg, CAST_FROM_FN_PTR(address,
- InterpreterRuntime::throw_IncompatibleClassChangeError));
+ // Pass arguments for generating a verbose error message.
+ LP64_ONLY( if (recvKlass != rdx) { __ movq(recvKlass, rdx); } )
+ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose),
+ recvKlass, rax);
// the call_VM checks for exception, so we should never return here.
__ should_not_reach_here();
}