mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-06 09:29:38 +01:00
8304387: Fix positions of shared static stubs / trampolines
Reviewed-by: adinn, fyang
(cherry picked from commit 1c04686cd6)
This commit is contained in:
committed by
Vitaly Provodin
parent
016d719397
commit
fde0fc8dff
@@ -70,7 +70,6 @@ static bool emit_shared_trampolines(CodeBuffer* cb, CodeBuffer::SharedTrampoline
|
||||
assert(requests->number_of_entries() >= 1, "at least one");
|
||||
const int total_requested_size = MacroAssembler::max_trampoline_stub_size() * requests->number_of_entries();
|
||||
if (cb->stubs()->maybe_expand_to_ensure_remaining(total_requested_size) && cb->blob() == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,9 +28,7 @@
|
||||
private:
|
||||
void pd_initialize() {}
|
||||
bool pd_finalize_stubs() {
|
||||
if (_finalize_stubs) {
|
||||
Unimplemented();
|
||||
}
|
||||
Unimplemented();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,9 +29,7 @@
|
||||
private:
|
||||
void pd_initialize() {}
|
||||
bool pd_finalize_stubs() {
|
||||
if (_finalize_stubs) {
|
||||
Unimplemented();
|
||||
}
|
||||
Unimplemented();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,6 @@ static bool emit_shared_trampolines(CodeBuffer* cb, CodeBuffer::SharedTrampoline
|
||||
assert(requests->number_of_entries() >= 1, "at least one");
|
||||
const int total_requested_size = MacroAssembler::max_trampoline_stub_size() * requests->number_of_entries();
|
||||
if (cb->stubs()->maybe_expand_to_ensure_remaining(total_requested_size) && cb->blob() == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,9 +29,7 @@
|
||||
private:
|
||||
void pd_initialize() {}
|
||||
bool pd_finalize_stubs() {
|
||||
if (_finalize_stubs) {
|
||||
Unimplemented();
|
||||
}
|
||||
Unimplemented();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,9 +29,7 @@
|
||||
private:
|
||||
void pd_initialize() {}
|
||||
bool pd_finalize_stubs() {
|
||||
if (_finalize_stubs) {
|
||||
Unimplemented();
|
||||
}
|
||||
Unimplemented();
|
||||
return true;
|
||||
}
|
||||
public:
|
||||
|
||||
@@ -1009,11 +1009,13 @@ void CodeBuffer::log_section_sizes(const char* name) {
|
||||
}
|
||||
}
|
||||
|
||||
void CodeBuffer::finalize_stubs() {
|
||||
if (!pd_finalize_stubs()) {
|
||||
return;
|
||||
bool CodeBuffer::finalize_stubs() {
|
||||
if (_finalize_stubs && !pd_finalize_stubs()) {
|
||||
// stub allocation failure
|
||||
return false;
|
||||
}
|
||||
_finalize_stubs = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void CodeBuffer::shared_stub_to_interp_for(ciMethod* callee, csize_t call_offset) {
|
||||
|
||||
@@ -715,7 +715,7 @@ class CodeBuffer: public StackObj DEBUG_ONLY(COMMA private Scrubber) {
|
||||
void log_section_sizes(const char* name);
|
||||
|
||||
// Make a set of stubs final. It can create/optimize stubs.
|
||||
void finalize_stubs();
|
||||
bool finalize_stubs();
|
||||
|
||||
// Request for a shared stub to the interpreter
|
||||
void shared_stub_to_interp_for(ciMethod* callee, csize_t call_offset);
|
||||
|
||||
@@ -50,7 +50,6 @@ bool emit_shared_stubs_to_interp(CodeBuffer* cb, SharedStubToInterpRequests* sha
|
||||
for (int i = 0; i < shared_stub_to_interp_requests->length();) {
|
||||
address stub = __ start_a_stub(CompiledStaticCall::to_interp_stub_size());
|
||||
if (stub == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -286,6 +286,11 @@ void Compilation::emit_code_epilog(LIR_Assembler* assembler) {
|
||||
|
||||
CodeOffsets* code_offsets = assembler->offsets();
|
||||
|
||||
if (!code()->finalize_stubs()) {
|
||||
bailout("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
|
||||
// generate code or slow cases
|
||||
assembler->emit_slow_case_stubs();
|
||||
CHECK_BAILOUT();
|
||||
|
||||
@@ -1112,10 +1112,6 @@ void ciEnv::register_method(ciMethod* target,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!failing()) {
|
||||
code_buffer->finalize_stubs();
|
||||
}
|
||||
|
||||
if (failing()) {
|
||||
// While not a true deoptimization, it is a preemptive decompile.
|
||||
MethodData* mdo = method()->method_data();
|
||||
|
||||
@@ -1746,6 +1746,11 @@ void PhaseOutput::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!cb->finalize_stubs()) {
|
||||
C->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
|
||||
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
|
||||
bs->emit_stubs(*cb);
|
||||
if (C->failing()) return;
|
||||
|
||||
Reference in New Issue
Block a user