Skip to content

Commit 52e373c

Browse files
JornVerneePaul Hohensee
authored andcommitted
8337753: Target class of upcall stub may be unloaded
Reviewed-by: vlivanov Backport-of: 6af1358
1 parent 7f49da1 commit 52e373c

20 files changed

+281
-71
lines changed

src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7412,6 +7412,28 @@ class StubGenerator: public StubCodeGenerator {
74127412
return start;
74137413
}
74147414

7415+
// load Method* target of MethodHandle
7416+
// j_rarg0 = jobject receiver
7417+
// rmethod = result
7418+
address generate_upcall_stub_load_target() {
7419+
StubCodeMark mark(this, "StubRoutines", "upcall_stub_load_target");
7420+
address start = __ pc();
7421+
7422+
__ resolve_global_jobject(j_rarg0, rscratch1, rscratch2);
7423+
// Load target method from receiver
7424+
__ load_heap_oop(rmethod, Address(j_rarg0, java_lang_invoke_MethodHandle::form_offset()), rscratch1, rscratch2);
7425+
__ load_heap_oop(rmethod, Address(rmethod, java_lang_invoke_LambdaForm::vmentry_offset()), rscratch1, rscratch2);
7426+
__ load_heap_oop(rmethod, Address(rmethod, java_lang_invoke_MemberName::method_offset()), rscratch1, rscratch2);
7427+
__ access_load_at(T_ADDRESS, IN_HEAP, rmethod,
7428+
Address(rmethod, java_lang_invoke_ResolvedMethodName::vmtarget_offset()),
7429+
noreg, noreg);
7430+
__ str(rmethod, Address(rthread, JavaThread::callee_target_offset())); // just in case callee is deoptimized
7431+
7432+
__ ret(lr);
7433+
7434+
return start;
7435+
}
7436+
74157437
// Continuation point for throwing of implicit exceptions that are
74167438
// not handled in the current activation. Fabricates an exception
74177439
// oop and initiates normal exception dispatching in this
@@ -8477,6 +8499,7 @@ class StubGenerator: public StubCodeGenerator {
84778499
#endif
84788500

84798501
StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler();
8502+
StubRoutines::_upcall_stub_load_target = generate_upcall_stub_load_target();
84808503

84818504
StubRoutines::aarch64::set_completed(); // Inidicate that arraycopy and zero_blocks stubs are generated
84828505
}

src/hotspot/cpu/aarch64/upcallLinker_aarch64.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "precompiled.hpp"
2626
#include "asm/macroAssembler.hpp"
27+
#include "classfile/javaClasses.hpp"
2728
#include "logging/logStream.hpp"
2829
#include "memory/resourceArea.hpp"
2930
#include "prims/upcallLinker.hpp"
@@ -117,7 +118,7 @@ static void restore_callee_saved_registers(MacroAssembler* _masm, const ABIDescr
117118
static const int upcall_stub_code_base_size = 1024;
118119
static const int upcall_stub_size_per_arg = 16;
119120

120-
address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
121+
address UpcallLinker::make_upcall_stub(jobject receiver, Symbol* signature,
121122
BasicType* out_sig_bt, int total_out_args,
122123
BasicType ret_type,
123124
jobject jabi, jobject jconv,
@@ -222,7 +223,6 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
222223

223224
__ block_comment("{ on_entry");
224225
__ lea(c_rarg0, Address(sp, frame_data_offset));
225-
__ movptr(c_rarg1, (intptr_t)receiver);
226226
__ movptr(rscratch1, CAST_FROM_FN_PTR(uint64_t, UpcallLinker::on_entry));
227227
__ blr(rscratch1);
228228
__ mov(rthread, r0);
@@ -238,12 +238,10 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
238238
arg_shuffle.generate(_masm, as_VMStorage(shuffle_reg), abi._shadow_space_bytes, 0);
239239
__ block_comment("} argument shuffle");
240240

241-
__ block_comment("{ receiver ");
242-
__ get_vm_result(j_rarg0, rthread);
243-
__ block_comment("} receiver ");
244-
245-
__ mov_metadata(rmethod, entry);
246-
__ str(rmethod, Address(rthread, JavaThread::callee_target_offset())); // just in case callee is deoptimized
241+
__ block_comment("{ load target ");
242+
__ movptr(j_rarg0, (intptr_t)receiver);
243+
__ far_call(RuntimeAddress(StubRoutines::upcall_stub_load_target()), rscratch1); // puts target Method* in rmethod
244+
__ block_comment("} load target ");
247245

248246
__ push_cont_fastpath(rthread);
249247

@@ -318,7 +316,7 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
318316

319317
#ifndef PRODUCT
320318
stringStream ss;
321-
ss.print("upcall_stub_%s", entry->signature()->as_C_string());
319+
ss.print("upcall_stub_%s", signature->as_C_string());
322320
const char* name = _masm->code_string(ss.as_string());
323321
#else // PRODUCT
324322
const char* name = "upcall_stub";

src/hotspot/cpu/arm/upcallLinker_arm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#include "prims/upcallLinker.hpp"
2626
#include "utilities/debug.hpp"
2727

28-
address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
28+
address UpcallLinker::make_upcall_stub(jobject receiver, Symbol* signature,
2929
BasicType* out_sig_bt, int total_out_args,
3030
BasicType ret_type,
3131
jobject jabi, jobject jconv,

src/hotspot/cpu/ppc/stubGenerator_ppc.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4728,6 +4728,30 @@ class StubGenerator: public StubCodeGenerator {
47284728
return start;
47294729
}
47304730

4731+
// load Method* target of MethodHandle
4732+
// R3_ARG1 = jobject receiver
4733+
// R19_method = result Method*
4734+
address generate_upcall_stub_load_target() {
4735+
4736+
StubCodeMark mark(this, "StubRoutines", "upcall_stub_load_target");
4737+
address start = __ pc();
4738+
4739+
__ resolve_global_jobject(R3_ARG1, R22_tmp2, R23_tmp3, MacroAssembler::PRESERVATION_FRAME_LR_GP_FP_REGS);
4740+
// Load target method from receiver
4741+
__ load_heap_oop(R19_method, java_lang_invoke_MethodHandle::form_offset(), R3_ARG1,
4742+
R22_tmp2, R23_tmp3, MacroAssembler::PRESERVATION_FRAME_LR_GP_FP_REGS, IS_NOT_NULL);
4743+
__ load_heap_oop(R19_method, java_lang_invoke_LambdaForm::vmentry_offset(), R19_method,
4744+
R22_tmp2, R23_tmp3, MacroAssembler::PRESERVATION_FRAME_LR_GP_FP_REGS, IS_NOT_NULL);
4745+
__ load_heap_oop(R19_method, java_lang_invoke_MemberName::method_offset(), R19_method,
4746+
R22_tmp2, R23_tmp3, MacroAssembler::PRESERVATION_FRAME_LR_GP_FP_REGS, IS_NOT_NULL);
4747+
__ ld(R19_method, java_lang_invoke_ResolvedMethodName::vmtarget_offset(), R19_method);
4748+
__ std(R19_method, in_bytes(JavaThread::callee_target_offset()), R16_thread); // just in case callee is deoptimized
4749+
4750+
__ blr();
4751+
4752+
return start;
4753+
}
4754+
47314755
// Initialization
47324756
void generate_initial_stubs() {
47334757
// Generates all stubs and initializes the entry points
@@ -4808,6 +4832,7 @@ class StubGenerator: public StubCodeGenerator {
48084832
generate_arraycopy_stubs();
48094833

48104834
StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler();
4835+
StubRoutines::_upcall_stub_load_target = generate_upcall_stub_load_target();
48114836
}
48124837

48134838
void generate_compiler_stubs() {

src/hotspot/cpu/ppc/upcallLinker_ppc.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "precompiled.hpp"
2626
#include "asm/macroAssembler.inline.hpp"
27+
#include "classfile/javaClasses.hpp"
2728
#include "logging/logStream.hpp"
2829
#include "memory/resourceArea.hpp"
2930
#include "prims/upcallLinker.hpp"
@@ -118,7 +119,7 @@ static void restore_callee_saved_registers(MacroAssembler* _masm, const ABIDescr
118119
static const int upcall_stub_code_base_size = 1024;
119120
static const int upcall_stub_size_per_arg = 16; // arg save & restore + move
120121

121-
address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
122+
address UpcallLinker::make_upcall_stub(jobject receiver, Symbol* signature,
122123
BasicType* out_sig_bt, int total_out_args,
123124
BasicType ret_type,
124125
jobject jabi, jobject jconv,
@@ -221,7 +222,6 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
221222
__ block_comment("{ on_entry");
222223
__ load_const_optimized(call_target_address, CAST_FROM_FN_PTR(uint64_t, UpcallLinker::on_entry), R0);
223224
__ addi(R3_ARG1, R1_SP, frame_data_offset);
224-
__ load_const_optimized(R4_ARG2, (intptr_t)receiver, R0);
225225
__ call_c(call_target_address);
226226
__ mr(R16_thread, R3_RET);
227227
__ block_comment("} on_entry");
@@ -236,12 +236,12 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
236236
arg_shuffle.generate(_masm, as_VMStorage(callerSP), frame::native_abi_minframe_size, frame::jit_out_preserve_size);
237237
__ block_comment("} argument shuffle");
238238

239-
__ block_comment("{ receiver ");
240-
__ get_vm_result(R3_ARG1);
241-
__ block_comment("} receiver ");
242-
243-
__ load_const_optimized(R19_method, (intptr_t)entry);
244-
__ std(R19_method, in_bytes(JavaThread::callee_target_offset()), R16_thread);
239+
__ block_comment("{ load target ");
240+
__ load_const_optimized(call_target_address, StubRoutines::upcall_stub_load_target(), R0);
241+
__ load_const_optimized(R3_ARG1, (intptr_t)receiver, R0);
242+
__ mtctr(call_target_address);
243+
__ bctrl(); // loads target Method* into R19_method
244+
__ block_comment("} load target ");
245245

246246
__ push_cont_fastpath();
247247

@@ -326,7 +326,7 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
326326

327327
#ifndef PRODUCT
328328
stringStream ss;
329-
ss.print("upcall_stub_%s", entry->signature()->as_C_string());
329+
ss.print("upcall_stub_%s", signature->as_C_string());
330330
const char* name = _masm->code_string(ss.as_string());
331331
#else // PRODUCT
332332
const char* name = "upcall_stub";

src/hotspot/cpu/riscv/stubGenerator_riscv.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5374,6 +5374,29 @@ static const int64_t right_3_bits = right_n_bits(3);
53745374
return start;
53755375
}
53765376

5377+
// load Method* target of MethodHandle
5378+
// j_rarg0 = jobject receiver
5379+
// xmethod = Method* result
5380+
address generate_upcall_stub_load_target() {
5381+
5382+
StubCodeMark mark(this, "StubRoutines", "upcall_stub_load_target");
5383+
address start = __ pc();
5384+
5385+
__ resolve_global_jobject(j_rarg0, t0, t1);
5386+
// Load target method from receiver
5387+
__ load_heap_oop(xmethod, Address(j_rarg0, java_lang_invoke_MethodHandle::form_offset()), t0, t1);
5388+
__ load_heap_oop(xmethod, Address(xmethod, java_lang_invoke_LambdaForm::vmentry_offset()), t0, t1);
5389+
__ load_heap_oop(xmethod, Address(xmethod, java_lang_invoke_MemberName::method_offset()), t0, t1);
5390+
__ access_load_at(T_ADDRESS, IN_HEAP, xmethod,
5391+
Address(xmethod, java_lang_invoke_ResolvedMethodName::vmtarget_offset()),
5392+
noreg, noreg);
5393+
__ sd(xmethod, Address(xthread, JavaThread::callee_target_offset())); // just in case callee is deoptimized
5394+
5395+
__ ret();
5396+
5397+
return start;
5398+
}
5399+
53775400
// Continuation point for throwing of implicit exceptions that are
53785401
// not handled in the current activation. Fabricates an exception
53795402
// oop and initiates normal exception dispatching in this
@@ -5567,6 +5590,7 @@ static const int64_t right_3_bits = right_n_bits(3);
55675590
}
55685591

55695592
StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler();
5593+
StubRoutines::_upcall_stub_load_target = generate_upcall_stub_load_target();
55705594

55715595
StubRoutines::riscv::set_completed();
55725596
}

src/hotspot/cpu/riscv/upcallLinker_riscv.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include "precompiled.hpp"
2727
#include "asm/macroAssembler.hpp"
28+
#include "classfile/javaClasses.hpp"
2829
#include "logging/logStream.hpp"
2930
#include "memory/resourceArea.hpp"
3031
#include "prims/upcallLinker.hpp"
@@ -117,7 +118,7 @@ static void restore_callee_saved_registers(MacroAssembler* _masm, const ABIDescr
117118
static const int upcall_stub_code_base_size = 1024;
118119
static const int upcall_stub_size_per_arg = 16;
119120

120-
address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
121+
address UpcallLinker::make_upcall_stub(jobject receiver, Symbol* signature,
121122
BasicType* out_sig_bt, int total_out_args,
122123
BasicType ret_type,
123124
jobject jabi, jobject jconv,
@@ -223,7 +224,6 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
223224

224225
__ block_comment("{ on_entry");
225226
__ la(c_rarg0, Address(sp, frame_data_offset));
226-
__ movptr(c_rarg1, (address) receiver);
227227
__ rt_call(CAST_FROM_FN_PTR(address, UpcallLinker::on_entry));
228228
__ mv(xthread, x10);
229229
__ reinit_heapbase();
@@ -260,12 +260,10 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
260260
arg_shuffle.generate(_masm, as_VMStorage(shuffle_reg), abi._shadow_space_bytes, 0);
261261
__ block_comment("} argument shuffle");
262262

263-
__ block_comment("{ receiver ");
264-
__ get_vm_result(j_rarg0, xthread);
265-
__ block_comment("} receiver ");
266-
267-
__ mov_metadata(xmethod, entry);
268-
__ sd(xmethod, Address(xthread, JavaThread::callee_target_offset())); // just in case callee is deoptimized
263+
__ block_comment("{ load target ");
264+
__ movptr(j_rarg0, (address) receiver);
265+
__ far_call(RuntimeAddress(StubRoutines::upcall_stub_load_target())); // loads Method* into xmethod
266+
__ block_comment("} load target ");
269267

270268
__ push_cont_fastpath(xthread);
271269

@@ -338,7 +336,7 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
338336

339337
#ifndef PRODUCT
340338
stringStream ss;
341-
ss.print("upcall_stub_%s", entry->signature()->as_C_string());
339+
ss.print("upcall_stub_%s", signature->as_C_string());
342340
const char *name = _masm->code_string(ss.as_string());
343341
#else // PRODUCT
344342
const char* name = "upcall_stub";

src/hotspot/cpu/s390/stubGenerator_s390.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3107,6 +3107,29 @@ class StubGenerator: public StubCodeGenerator {
31073107
return start;
31083108
}
31093109

3110+
// load Method* target of MethodHandle
3111+
// Z_ARG1 = jobject receiver
3112+
// Z_method = Method* result
3113+
address generate_upcall_stub_load_target() {
3114+
StubCodeMark mark(this, "StubRoutines", "upcall_stub_load_target");
3115+
address start = __ pc();
3116+
3117+
__ resolve_global_jobject(Z_ARG1, Z_tmp_1, Z_tmp_2);
3118+
// Load target method from receiver
3119+
__ load_heap_oop(Z_method, Address(Z_ARG1, java_lang_invoke_MethodHandle::form_offset()),
3120+
noreg, noreg, IS_NOT_NULL);
3121+
__ load_heap_oop(Z_method, Address(Z_method, java_lang_invoke_LambdaForm::vmentry_offset()),
3122+
noreg, noreg, IS_NOT_NULL);
3123+
__ load_heap_oop(Z_method, Address(Z_method, java_lang_invoke_MemberName::method_offset()),
3124+
noreg, noreg, IS_NOT_NULL);
3125+
__ z_lg(Z_method, Address(Z_method, java_lang_invoke_ResolvedMethodName::vmtarget_offset()));
3126+
__ z_stg(Z_method, Address(Z_thread, JavaThread::callee_target_offset())); // just in case callee is deoptimized
3127+
3128+
__ z_br(Z_R14);
3129+
3130+
return start;
3131+
}
3132+
31103133
void generate_initial_stubs() {
31113134
// Generates all stubs and initializes the entry points.
31123135

@@ -3188,6 +3211,7 @@ class StubGenerator: public StubCodeGenerator {
31883211
}
31893212

31903213
StubRoutines::_upcall_stub_exception_handler = generate_upcall_stub_exception_handler();
3214+
StubRoutines::_upcall_stub_load_target = generate_upcall_stub_load_target();
31913215
}
31923216

31933217
void generate_compiler_stubs() {

src/hotspot/cpu/s390/upcallLinker_s390.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include "precompiled.hpp"
2525
#include "asm/macroAssembler.inline.hpp"
26+
#include "classfile/javaClasses.hpp"
2627
#include "logging/logStream.hpp"
2728
#include "memory/resourceArea.hpp"
2829
#include "prims/upcallLinker.hpp"
@@ -116,7 +117,7 @@ static void restore_callee_saved_registers(MacroAssembler* _masm, const ABIDescr
116117

117118
static const int upcall_stub_code_base_size = 1024;
118119
static const int upcall_stub_size_per_arg = 16; // arg save & restore + move
119-
address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
120+
address UpcallLinker::make_upcall_stub(jobject receiver, Symbol* signature,
120121
BasicType* out_sig_bt, int total_out_args,
121122
BasicType ret_type,
122123
jobject jabi, jobject jconv,
@@ -206,7 +207,6 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
206207
__ block_comment("on_entry {");
207208
__ load_const_optimized(call_target_address, CAST_FROM_FN_PTR(uint64_t, UpcallLinker::on_entry));
208209
__ z_aghik(Z_ARG1, Z_SP, frame_data_offset);
209-
__ load_const_optimized(Z_ARG2, (intptr_t)receiver);
210210
__ call(call_target_address);
211211
__ z_lgr(Z_thread, Z_RET);
212212
__ block_comment("} on_entry");
@@ -216,12 +216,11 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
216216
arg_shuffle.generate(_masm, shuffle_reg, abi._shadow_space_bytes, frame::z_jit_out_preserve_size);
217217
__ block_comment("} argument_shuffle");
218218

219-
__ block_comment("receiver {");
220-
__ get_vm_result(Z_ARG1);
221-
__ block_comment("} receiver");
222-
223-
__ load_const_optimized(Z_method, (intptr_t)entry);
224-
__ z_stg(Z_method, Address(Z_thread, in_bytes(JavaThread::callee_target_offset())));
219+
__ block_comment("load_target {");
220+
__ load_const_optimized(Z_ARG1, (intptr_t)receiver);
221+
__ load_const_optimized(call_target_address, StubRoutines::upcall_stub_load_target());
222+
__ call(call_target_address); // load taget Method* into Z_method
223+
__ block_comment("} load_target");
225224

226225
__ z_lg(call_target_address, Address(Z_method, in_bytes(Method::from_compiled_offset())));
227226
__ call(call_target_address);
@@ -274,7 +273,7 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
274273

275274
#ifndef PRODUCT
276275
stringStream ss;
277-
ss.print("upcall_stub_%s", entry->signature()->as_C_string());
276+
ss.print("upcall_stub_%s", signature->as_C_string());
278277
const char* name = _masm->code_string(ss.as_string());
279278
#else // PRODUCT
280279
const char* name = "upcall_stub";

0 commit comments

Comments
 (0)