8267098: AArch64: C1 StubFrames end confusingly
Reviewed-by: aph
This commit is contained in:
parent
0daec497fe
commit
ff84577d72
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user