Skip to content

Commit e96e191

Browse files
committed
8318586: Explicitly handle upcall stub allocation failure
8318653: UpcallTestHelper::runInNewProcess waits for forked process without timeout Reviewed-by: shade, mcimadamore
1 parent 630bafd commit e96e191

21 files changed

+207
-20
lines changed

src/hotspot/cpu/aarch64/downcallLinker_aarch64.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,29 @@ RuntimeStub* DowncallLinker::make_downcall_stub(BasicType* signature,
5151
int code_size = native_invoker_code_base_size + (num_args * native_invoker_size_per_arg);
5252
int locs_size = 1; // must be non-zero
5353
CodeBuffer code("nep_invoker_blob", code_size, locs_size);
54+
if (code.blob() == nullptr) {
55+
return nullptr;
56+
}
5457
StubGenerator g(&code, signature, num_args, ret_bt, abi,
5558
input_registers, output_registers,
5659
needs_return_buffer, captured_state_mask,
5760
needs_transition);
5861
g.generate();
5962
code.log_section_sizes("nep_invoker_blob");
6063

64+
bool caller_must_gc_arguments = false;
65+
bool alloc_fail_is_fatal = false;
6166
RuntimeStub* stub =
6267
RuntimeStub::new_runtime_stub("nep_invoker_blob",
6368
&code,
6469
g.frame_complete(),
6570
g.framesize(),
66-
g.oop_maps(), false);
71+
g.oop_maps(),
72+
caller_must_gc_arguments,
73+
alloc_fail_is_fatal);
74+
if (stub == nullptr) {
75+
return nullptr;
76+
}
6777

6878
#ifndef PRODUCT
6979
LogTarget(Trace, foreign, downcall) lt;

src/hotspot/cpu/aarch64/upcallLinker_aarch64.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
127127
const CallRegs call_regs = ForeignGlobals::parse_call_regs(jconv);
128128
int code_size = upcall_stub_code_base_size + (total_out_args * upcall_stub_size_per_arg);
129129
CodeBuffer buffer("upcall_stub", code_size, /* locs_size = */ 1);
130+
if (buffer.blob() == nullptr) {
131+
return nullptr;
132+
}
130133

131134
GrowableArray<VMStorage> unfiltered_out_regs;
132135
int out_arg_bytes = ForeignGlobals::java_calling_convention(out_sig_bt, total_out_args, unfiltered_out_regs);
@@ -324,6 +327,9 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
324327
&buffer,
325328
receiver,
326329
in_ByteSize(frame_data_offset));
330+
if (blob == nullptr) {
331+
return nullptr;
332+
}
327333

328334
#ifndef PRODUCT
329335
if (lt.is_enabled()) {

src/hotspot/cpu/ppc/downcallLinker_ppc.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,29 @@ RuntimeStub* DowncallLinker::make_downcall_stub(BasicType* signature,
5151
int code_size = native_invoker_code_base_size + (num_args * native_invoker_size_per_arg);
5252
int locs_size = 1; // must be non-zero
5353
CodeBuffer code("nep_invoker_blob", code_size, locs_size);
54+
if (code.blob() == nullptr) {
55+
return nullptr;
56+
}
5457
StubGenerator g(&code, signature, num_args, ret_bt, abi,
5558
input_registers, output_registers,
5659
needs_return_buffer, captured_state_mask,
5760
needs_transition);
5861
g.generate();
5962
code.log_section_sizes("nep_invoker_blob");
6063

64+
bool caller_must_gc_arguments = false;
65+
bool alloc_fail_is_fatal = false;
6166
RuntimeStub* stub =
6267
RuntimeStub::new_runtime_stub("nep_invoker_blob",
6368
&code,
6469
g.frame_complete(),
6570
g.framesize(),
66-
g.oop_maps(), false);
71+
g.oop_maps(),
72+
caller_must_gc_arguments,
73+
alloc_fail_is_fatal);
74+
if (stub == nullptr) {
75+
return nullptr;
76+
}
6777

6878
#ifndef PRODUCT
6979
LogTarget(Trace, foreign, downcall) lt;

src/hotspot/cpu/ppc/upcallLinker_ppc.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
128128
const CallRegs call_regs = ForeignGlobals::parse_call_regs(jconv);
129129
int code_size = upcall_stub_code_base_size + (total_out_args * upcall_stub_size_per_arg);
130130
CodeBuffer buffer("upcall_stub", code_size, /* locs_size = */ 1);
131+
if (buffer.blob() == nullptr) {
132+
return nullptr;
133+
}
131134

132135
Register callerSP = R2, // C/C++ uses R2 as TOC, but we can reuse it here
133136
tmp = R11_scratch1, // same as shuffle_reg
@@ -332,6 +335,10 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
332335
&buffer,
333336
receiver,
334337
in_ByteSize(frame_data_offset));
338+
if (blob == nullptr) {
339+
return nullptr;
340+
}
341+
335342
#ifndef ABI_ELFv2
336343
// Need to patch the FunctionDescriptor after relocating.
337344
address fd_addr = blob->code_begin();

src/hotspot/cpu/riscv/downcallLinker_riscv.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,29 @@ RuntimeStub* DowncallLinker::make_downcall_stub(BasicType* signature,
5252
int code_size = native_invoker_code_base_size + (num_args * native_invoker_size_per_arg);
5353
int locs_size = 1; // must be non-zero
5454
CodeBuffer code("nep_invoker_blob", code_size, locs_size);
55+
if (code.blob() == nullptr) {
56+
return nullptr;
57+
}
5558
StubGenerator g(&code, signature, num_args, ret_bt, abi,
5659
input_registers, output_registers,
5760
needs_return_buffer, captured_state_mask,
5861
needs_transition);
5962
g.generate();
6063
code.log_section_sizes("nep_invoker_blob");
6164

65+
bool caller_must_gc_arguments = false;
66+
bool alloc_fail_is_fatal = false;
6267
RuntimeStub* stub =
6368
RuntimeStub::new_runtime_stub("nep_invoker_blob",
6469
&code,
6570
g.frame_complete(),
6671
g.framesize(),
67-
g.oop_maps(), false);
72+
g.oop_maps(),
73+
caller_must_gc_arguments,
74+
alloc_fail_is_fatal);
75+
if (stub == nullptr) {
76+
return nullptr;
77+
}
6878

6979
#ifndef PRODUCT
7080
LogTarget(Trace, foreign, downcall) lt;

src/hotspot/cpu/riscv/upcallLinker_riscv.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
128128
const CallRegs call_regs = ForeignGlobals::parse_call_regs(jconv);
129129
int code_size = upcall_stub_code_base_size + (total_out_args * upcall_stub_size_per_arg);
130130
CodeBuffer buffer("upcall_stub", code_size, /* locs_size = */ 1);
131+
if (buffer.blob() == nullptr) {
132+
return nullptr;
133+
}
131134

132135
GrowableArray<VMStorage> unfiltered_out_regs;
133136
int out_arg_bytes = ForeignGlobals::java_calling_convention(out_sig_bt, total_out_args, unfiltered_out_regs);
@@ -344,6 +347,10 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
344347
&buffer,
345348
receiver,
346349
in_ByteSize(frame_data_offset));
350+
if (blob == nullptr) {
351+
return nullptr;
352+
}
353+
347354
#ifndef PRODUCT
348355
if (lt.is_enabled()) {
349356
ResourceMark rm;

src/hotspot/cpu/s390/downcallLinker_s390.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ RuntimeStub* DowncallLinker::make_downcall_stub(BasicType* signature,
5252
int code_size = native_invoker_code_base_size + (num_args * native_invoker_size_per_args);
5353
int locs_size = 1; //must be non zero
5454
CodeBuffer code("nep_invoker_blob", code_size, locs_size);
55+
if (code.blob() == nullptr) {
56+
return nullptr;
57+
}
5558

5659
StubGenerator g(&code, signature, num_args, ret_bt, abi,
5760
input_registers, output_registers,
@@ -60,12 +63,19 @@ RuntimeStub* DowncallLinker::make_downcall_stub(BasicType* signature,
6063
g.generate();
6164
code.log_section_sizes("nep_invoker_blob");
6265

66+
bool caller_must_gc_arguments = false;
67+
bool alloc_fail_is_fatal = false;
6368
RuntimeStub* stub =
6469
RuntimeStub::new_runtime_stub("nep_invoker_blob",
6570
&code,
6671
g.frame_complete(),
6772
g.framesize(),
68-
g.oop_maps(), false);
73+
g.oop_maps(),
74+
caller_must_gc_arguments,
75+
alloc_fail_is_fatal);
76+
if (stub == nullptr) {
77+
return nullptr;
78+
}
6979

7080
#ifndef PRODUCT
7181
LogTarget(Trace, foreign, downcall) lt;

src/hotspot/cpu/s390/upcallLinker_s390.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
126126
const CallRegs call_regs = ForeignGlobals::parse_call_regs(jconv);
127127
int code_size = upcall_stub_code_base_size + (total_out_args * upcall_stub_size_per_arg);
128128
CodeBuffer buffer("upcall_stub", code_size, /* locs_size = */ 0);
129+
if (buffer.blob() == nullptr) {
130+
return nullptr;
131+
}
129132

130133
Register call_target_address = Z_R1_scratch;
131134

@@ -283,6 +286,10 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
283286
&buffer,
284287
receiver,
285288
in_ByteSize(frame_data_offset));
289+
if (blob == nullptr) {
290+
return nullptr;
291+
}
292+
286293
#ifndef PRODUCT
287294
if (lt.is_enabled()) {
288295
ResourceMark rm;

src/hotspot/cpu/x86/downcallLinker_x86_64.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,29 @@ RuntimeStub* DowncallLinker::make_downcall_stub(BasicType* signature,
4949
int code_size = native_invoker_code_base_size + (num_args * native_invoker_size_per_arg);
5050
int locs_size = 1; // can not be zero
5151
CodeBuffer code("nep_invoker_blob", code_size, locs_size);
52+
if (code.blob() == nullptr) {
53+
return nullptr;
54+
}
5255
StubGenerator g(&code, signature, num_args, ret_bt, abi,
5356
input_registers, output_registers,
5457
needs_return_buffer, captured_state_mask,
5558
needs_transition);
5659
g.generate();
5760
code.log_section_sizes("nep_invoker_blob");
5861

62+
bool caller_must_gc_arguments = false;
63+
bool alloc_fail_is_fatal = false;
5964
RuntimeStub* stub =
6065
RuntimeStub::new_runtime_stub("nep_invoker_blob",
6166
&code,
6267
g.frame_complete(),
6368
g.framesize(),
64-
g.oop_maps(), false);
69+
g.oop_maps(),
70+
caller_must_gc_arguments,
71+
alloc_fail_is_fatal);
72+
if (stub == nullptr) {
73+
return nullptr;
74+
}
6575

6676
#ifndef PRODUCT
6777
LogTarget(Trace, foreign, downcall) lt;

src/hotspot/cpu/x86/upcallLinker_x86_64.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
177177
const CallRegs call_regs = ForeignGlobals::parse_call_regs(jconv);
178178
int code_size = upcall_stub_code_base_size + (total_out_args * upcall_stub_size_per_arg);
179179
CodeBuffer buffer("upcall_stub", code_size, /* locs_size = */ 1);
180+
if (buffer.blob() == nullptr) {
181+
return nullptr;
182+
}
180183

181184
GrowableArray<VMStorage> unfiltered_out_regs;
182185
int out_arg_bytes = ForeignGlobals::java_calling_convention(out_sig_bt, total_out_args, unfiltered_out_regs);
@@ -379,6 +382,9 @@ address UpcallLinker::make_upcall_stub(jobject receiver, Method* entry,
379382
&buffer,
380383
receiver,
381384
in_ByteSize(frame_data_offset));
385+
if (blob == nullptr) {
386+
return nullptr;
387+
}
382388

383389
#ifndef PRODUCT
384390
if (lt.is_enabled()) {

0 commit comments

Comments
 (0)