Skip to content
Permalink
Browse files
8267098: AArch64: C1 StubFrames end confusingly
Reviewed-by: aph
  • Loading branch information
a74nh authored and nick-arm committed May 19, 2021
1 parent 0daec49 commit ff84577d72226da0bf1ce2c6d6852f3934feecf2
Showing with 29 additions and 27 deletions.
  1. +29 −27 src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp
@@ -160,14 +160,20 @@ int StubAssembler::call_RT(Register oop_result1, Register metadata_result, addre
return call_RT(oop_result1, metadata_result, entry, 3);
}

enum return_state_t {
does_not_return, requires_return
};


// Implementation of StubFrame

class StubFrame: public StackObj {
private:
StubAssembler* _sasm;
bool _return_state;

public:
StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments);
StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments, return_state_t return_state=requires_return);
void load_argument(int offset_in_words, Register reg);

~StubFrame();
@@ -185,8 +191,9 @@ void StubAssembler::epilogue() {

#define __ _sasm->

StubFrame::StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments) {
StubFrame::StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments, return_state_t return_state) {
_sasm = sasm;
_return_state = return_state;
__ prologue(name, must_gc_arguments);
}

@@ -196,9 +203,12 @@ void StubFrame::load_argument(int offset_in_words, Register reg) {
__ load_parameter(offset_in_words, reg);
}


StubFrame::~StubFrame() {
__ epilogue();
if (_return_state == requires_return) {
__ epilogue();
} else {
__ should_not_reach_here();
}
}

#undef __
@@ -345,8 +355,6 @@ OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address targe
}
OopMapSet* oop_maps = new OopMapSet();
oop_maps->add_gc_map(call_offset, oop_map);

__ should_not_reach_here();
return oop_maps;
}

@@ -395,9 +403,7 @@ OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
sasm->set_frame_size(frame_size);
break;
}
default:
__ should_not_reach_here();
break;
default: ShouldNotReachHere();
}

// verify that only r0 and r3 are valid at this time
@@ -452,9 +458,6 @@ OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
restore_live_registers(sasm, id != handle_exception_nofpu_id);
break;
case handle_exception_from_callee_id:
// Pop the return address.
__ leave();
__ ret(lr); // jump to exception handler
break;
default: ShouldNotReachHere();
}
@@ -620,13 +623,13 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
break;

case throw_div0_exception_id:
{ StubFrame f(sasm, "throw_div0_exception", dont_gc_arguments);
{ StubFrame f(sasm, "throw_div0_exception", dont_gc_arguments, does_not_return);
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_div0_exception), false);
}
break;

case throw_null_pointer_exception_id:
{ StubFrame f(sasm, "throw_null_pointer_exception", dont_gc_arguments);
{ StubFrame f(sasm, "throw_null_pointer_exception", dont_gc_arguments, does_not_return);
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_null_pointer_exception), false);
}
break;
@@ -881,13 +884,13 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
break;

case throw_class_cast_exception_id:
{ StubFrame f(sasm, "throw_class_cast_exception", dont_gc_arguments);
{ StubFrame f(sasm, "throw_class_cast_exception", dont_gc_arguments, does_not_return);
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true);
}
break;

case throw_incompatible_class_change_error_id:
{ StubFrame f(sasm, "throw_incompatible_class_cast_exception", dont_gc_arguments);
{ StubFrame f(sasm, "throw_incompatible_class_cast_exception", dont_gc_arguments, does_not_return);
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
}
break;
@@ -981,7 +984,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {

case deoptimize_id:
{
StubFrame f(sasm, "deoptimize", dont_gc_arguments);
StubFrame f(sasm, "deoptimize", dont_gc_arguments, does_not_return);
OopMap* oop_map = save_live_registers(sasm);
f.load_argument(0, c_rarg1);
int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, deoptimize), c_rarg1);
@@ -997,7 +1000,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
break;

case throw_range_check_failed_id:
{ StubFrame f(sasm, "range_check_failed", dont_gc_arguments);
{ StubFrame f(sasm, "range_check_failed", dont_gc_arguments, does_not_return);
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_range_check_exception), true);
}
break;
@@ -1011,28 +1014,28 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
break;

case access_field_patching_id:
{ StubFrame f(sasm, "access_field_patching", dont_gc_arguments);
{ StubFrame f(sasm, "access_field_patching", dont_gc_arguments, does_not_return);
// we should set up register map
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching));
}
break;

case load_klass_patching_id:
{ StubFrame f(sasm, "load_klass_patching", dont_gc_arguments);
{ StubFrame f(sasm, "load_klass_patching", dont_gc_arguments, does_not_return);
// we should set up register map
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching));
}
break;

case load_mirror_patching_id:
{ StubFrame f(sasm, "load_mirror_patching", dont_gc_arguments);
{ StubFrame f(sasm, "load_mirror_patching", dont_gc_arguments, does_not_return);
// we should set up register map
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_mirror_patching));
}
break;

case load_appendix_patching_id:
{ StubFrame f(sasm, "load_appendix_patching", dont_gc_arguments);
{ StubFrame f(sasm, "load_appendix_patching", dont_gc_arguments, does_not_return);
// we should set up register map
oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_appendix_patching));
}
@@ -1052,13 +1055,13 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
break;

case throw_index_exception_id:
{ StubFrame f(sasm, "index_range_check_failed", dont_gc_arguments);
{ StubFrame f(sasm, "index_range_check_failed", dont_gc_arguments, does_not_return);
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_index_exception), true);
}
break;

case throw_array_store_exception_id:
{ StubFrame f(sasm, "throw_array_store_exception", dont_gc_arguments);
{ StubFrame f(sasm, "throw_array_store_exception", dont_gc_arguments, does_not_return);
// tos + 0: link
// + 1: return address
oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), true);
@@ -1067,7 +1070,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {

case predicate_failed_trap_id:
{
StubFrame f(sasm, "predicate_failed_trap", dont_gc_arguments);
StubFrame f(sasm, "predicate_failed_trap", dont_gc_arguments, does_not_return);

OopMap* map = save_live_registers(sasm);

@@ -1095,10 +1098,9 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
break;

default:
{ StubFrame f(sasm, "unimplemented entry", dont_gc_arguments);
{ StubFrame f(sasm, "unimplemented entry", dont_gc_arguments, does_not_return);
__ mov(r0, (int)id);
__ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), r0);
__ should_not_reach_here();
}
break;
}

0 comments on commit ff84577

Please sign in to comment.