Skip to content

Commit

Permalink
8310020: MacroAssembler::call_VM(_leaf) doesn't consistently check fo…
Browse files Browse the repository at this point in the history
…r conflict with C calling convention.

Reviewed-by: thartmann, fyang, mdoerr, amitkumar
  • Loading branch information
dafedafe authored and offamitkumar committed Jun 20, 2023
1 parent 79069c5 commit 0878872
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 90 deletions.
33 changes: 15 additions & 18 deletions src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1019,7 +1019,7 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_1,
Register arg_2,
bool check_exceptions) {
assert(arg_1 != c_rarg2, "smashed arg");
assert_different_registers(arg_1, c_rarg2);
pass_arg2(this, arg_2);
pass_arg1(this, arg_1);
call_VM_helper(oop_result, entry_point, 2, check_exceptions);
Expand All @@ -1031,11 +1031,10 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_2,
Register arg_3,
bool check_exceptions) {
assert(arg_1 != c_rarg3, "smashed arg");
assert(arg_2 != c_rarg3, "smashed arg");
assert_different_registers(arg_1, c_rarg2, c_rarg3);
assert_different_registers(arg_2, c_rarg3);
pass_arg3(this, arg_3);

assert(arg_1 != c_rarg2, "smashed arg");
pass_arg2(this, arg_2);

pass_arg1(this, arg_1);
Expand Down Expand Up @@ -1066,7 +1065,7 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_2,
bool check_exceptions) {

assert(arg_1 != c_rarg2, "smashed arg");
assert_different_registers(arg_1, c_rarg2);
pass_arg2(this, arg_2);
pass_arg1(this, arg_1);
call_VM(oop_result, last_java_sp, entry_point, 2, check_exceptions);
Expand All @@ -1079,10 +1078,9 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_2,
Register arg_3,
bool check_exceptions) {
assert(arg_1 != c_rarg3, "smashed arg");
assert(arg_2 != c_rarg3, "smashed arg");
assert_different_registers(arg_1, c_rarg2, c_rarg3);
assert_different_registers(arg_2, c_rarg3);
pass_arg3(this, arg_3);
assert(arg_1 != c_rarg2, "smashed arg");
pass_arg2(this, arg_2);
pass_arg1(this, arg_1);
call_VM(oop_result, last_java_sp, entry_point, 3, check_exceptions);
Expand Down Expand Up @@ -1586,13 +1584,16 @@ void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0) {
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {
assert_different_registers(arg_1, c_rarg0);
pass_arg0(this, arg_0);
pass_arg1(this, arg_1);
call_VM_leaf_base(entry_point, 2);
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0,
Register arg_1, Register arg_2) {
assert_different_registers(arg_1, c_rarg0);
assert_different_registers(arg_2, c_rarg0, c_rarg1);
pass_arg0(this, arg_0);
pass_arg1(this, arg_1);
pass_arg2(this, arg_2);
Expand All @@ -1606,31 +1607,27 @@ void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0) {

void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {

assert(arg_0 != c_rarg1, "smashed arg");
assert_different_registers(arg_0, c_rarg1);
pass_arg1(this, arg_1);
pass_arg0(this, arg_0);
MacroAssembler::call_VM_leaf_base(entry_point, 2);
}

void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2) {
assert(arg_0 != c_rarg2, "smashed arg");
assert(arg_1 != c_rarg2, "smashed arg");
assert_different_registers(arg_0, c_rarg1, c_rarg2);
assert_different_registers(arg_1, c_rarg2);
pass_arg2(this, arg_2);
assert(arg_0 != c_rarg1, "smashed arg");
pass_arg1(this, arg_1);
pass_arg0(this, arg_0);
MacroAssembler::call_VM_leaf_base(entry_point, 3);
}

void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2, Register arg_3) {
assert(arg_0 != c_rarg3, "smashed arg");
assert(arg_1 != c_rarg3, "smashed arg");
assert(arg_2 != c_rarg3, "smashed arg");
assert_different_registers(arg_0, c_rarg1, c_rarg2, c_rarg3);
assert_different_registers(arg_1, c_rarg2, c_rarg3);
assert_different_registers(arg_2, c_rarg3);
pass_arg3(this, arg_3);
assert(arg_0 != c_rarg2, "smashed arg");
assert(arg_1 != c_rarg2, "smashed arg");
pass_arg2(this, arg_2);
assert(arg_0 != c_rarg1, "smashed arg");
pass_arg1(this, arg_1);
pass_arg0(this, arg_0);
MacroAssembler::call_VM_leaf_base(entry_point, 4);
Expand Down
11 changes: 6 additions & 5 deletions src/hotspot/cpu/ppc/macroAssembler_ppc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1249,17 +1249,18 @@ void MacroAssembler::call_VM(Register oop_result, address entry_point, Register
void MacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2,
bool check_exceptions) {
// R3_ARG1 is reserved for the thread
assert_different_registers(arg_2, R4_ARG2);
mr_if_needed(R4_ARG2, arg_1);
assert(arg_2 != R4_ARG2, "smashed argument");
mr_if_needed(R5_ARG3, arg_2);
call_VM(oop_result, entry_point, check_exceptions);
}

void MacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3,
bool check_exceptions) {
// R3_ARG1 is reserved for the thread
assert_different_registers(arg_2, R4_ARG2);
assert_different_registers(arg_3, R4_ARG2, R5_ARG3);
mr_if_needed(R4_ARG2, arg_1);
assert(arg_2 != R4_ARG2, "smashed argument");
mr_if_needed(R5_ARG3, arg_2);
mr_if_needed(R6_ARG4, arg_3);
call_VM(oop_result, entry_point, check_exceptions);
Expand All @@ -1275,17 +1276,17 @@ void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1) {
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1, Register arg_2) {
assert_different_registers(arg_2, R3_ARG1);
mr_if_needed(R3_ARG1, arg_1);
assert(arg_2 != R3_ARG1, "smashed argument");
mr_if_needed(R4_ARG2, arg_2);
call_VM_leaf(entry_point);
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3) {
assert_different_registers(arg_2, R3_ARG1);
assert_different_registers(arg_3, R3_ARG1, R4_ARG2);
mr_if_needed(R3_ARG1, arg_1);
assert(arg_2 != R3_ARG1, "smashed argument");
mr_if_needed(R4_ARG2, arg_2);
assert(arg_3 != R3_ARG1 && arg_3 != R4_ARG2, "smashed argument");
mr_if_needed(R5_ARG3, arg_3);
call_VM_leaf(entry_point);
}
Expand Down
34 changes: 16 additions & 18 deletions src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_1,
Register arg_2,
bool check_exceptions) {
assert(arg_1 != c_rarg2, "smashed arg");
assert_different_registers(arg_1, c_rarg2);
pass_arg2(this, arg_2);
pass_arg1(this, arg_1);
call_VM_helper(oop_result, entry_point, 2, check_exceptions);
Expand All @@ -148,11 +148,10 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_2,
Register arg_3,
bool check_exceptions) {
assert(arg_1 != c_rarg3, "smashed arg");
assert(arg_2 != c_rarg3, "smashed arg");
assert_different_registers(arg_1, c_rarg2, c_rarg3);
assert_different_registers(arg_2, c_rarg3);
pass_arg3(this, arg_3);

assert(arg_1 != c_rarg2, "smashed arg");
pass_arg2(this, arg_2);

pass_arg1(this, arg_1);
Expand Down Expand Up @@ -183,7 +182,7 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_2,
bool check_exceptions) {

assert(arg_1 != c_rarg2, "smashed arg");
assert_different_registers(arg_1, c_rarg2);
pass_arg2(this, arg_2);
pass_arg1(this, arg_1);
call_VM(oop_result, last_java_sp, entry_point, 2, check_exceptions);
Expand All @@ -196,10 +195,9 @@ void MacroAssembler::call_VM(Register oop_result,
Register arg_2,
Register arg_3,
bool check_exceptions) {
assert(arg_1 != c_rarg3, "smashed arg");
assert(arg_2 != c_rarg3, "smashed arg");
assert_different_registers(arg_1, c_rarg2, c_rarg3);
assert_different_registers(arg_2, c_rarg3);
pass_arg3(this, arg_3);
assert(arg_1 != c_rarg2, "smashed arg");
pass_arg2(this, arg_2);
pass_arg1(this, arg_1);
call_VM(oop_result, last_java_sp, entry_point, 3, check_exceptions);
Expand Down Expand Up @@ -668,13 +666,16 @@ void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0) {
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {
assert_different_registers(arg_1, c_rarg0);
pass_arg0(this, arg_0);
pass_arg1(this, arg_1);
call_VM_leaf_base(entry_point, 2);
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0,
Register arg_1, Register arg_2) {
assert_different_registers(arg_1, c_rarg0);
assert_different_registers(arg_2, c_rarg0, c_rarg1);
pass_arg0(this, arg_0);
pass_arg1(this, arg_1);
pass_arg2(this, arg_2);
Expand All @@ -688,31 +689,28 @@ void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0) {

void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {

assert(arg_0 != c_rarg1, "smashed arg");
assert_different_registers(arg_0, c_rarg1);
pass_arg1(this, arg_1);
pass_arg0(this, arg_0);
MacroAssembler::call_VM_leaf_base(entry_point, 2);
}

void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2) {
assert(arg_0 != c_rarg2, "smashed arg");
assert(arg_1 != c_rarg2, "smashed arg");
assert_different_registers(arg_0, c_rarg1, c_rarg2);
assert_different_registers(arg_1, c_rarg2);
pass_arg2(this, arg_2);
assert(arg_0 != c_rarg1, "smashed arg");
pass_arg1(this, arg_1);
pass_arg0(this, arg_0);
MacroAssembler::call_VM_leaf_base(entry_point, 3);
}

void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2, Register arg_3) {
assert(arg_0 != c_rarg3, "smashed arg");
assert(arg_1 != c_rarg3, "smashed arg");
assert(arg_2 != c_rarg3, "smashed arg");
assert_different_registers(arg_0, c_rarg1, c_rarg2, c_rarg3);
assert_different_registers(arg_1, c_rarg2, c_rarg3);
assert_different_registers(arg_2, c_rarg3);

pass_arg3(this, arg_3);
assert(arg_0 != c_rarg2, "smashed arg");
assert(arg_1 != c_rarg2, "smashed arg");
pass_arg2(this, arg_2);
assert(arg_0 != c_rarg1, "smashed arg");
pass_arg1(this, arg_1);
pass_arg0(this, arg_0);
MacroAssembler::call_VM_leaf_base(entry_point, 4);
Expand Down
28 changes: 14 additions & 14 deletions src/hotspot/cpu/s390/macroAssembler_s390.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2231,19 +2231,19 @@ void MacroAssembler::call_VM(Register oop_result, address entry_point, Register

void MacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions) {
// Z_ARG1 is reserved for the thread.
assert_different_registers(arg_2, Z_ARG2);
lgr_if_needed(Z_ARG2, arg_1);
assert(arg_2 != Z_ARG2, "smashed argument");
lgr_if_needed(Z_ARG3, arg_2);
call_VM(oop_result, entry_point, check_exceptions);
}

void MacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2,
Register arg_3, bool check_exceptions) {
// Z_ARG1 is reserved for the thread.
assert_different_registers(arg_3, Z_ARG2, Z_ARG3);
assert_different_registers(arg_2, Z_ARG2);
lgr_if_needed(Z_ARG2, arg_1);
assert(arg_2 != Z_ARG2, "smashed argument");
lgr_if_needed(Z_ARG3, arg_2);
assert(arg_3 != Z_ARG2 && arg_3 != Z_ARG3, "smashed argument");
lgr_if_needed(Z_ARG4, arg_3);
call_VM(oop_result, entry_point, check_exceptions);
}
Expand All @@ -2258,10 +2258,10 @@ void MacroAssembler::call_VM_static(Register oop_result, address entry_point, bo
void MacroAssembler::call_VM_static(Register oop_result, address entry_point, Register arg_1, Register arg_2,
Register arg_3, bool check_exceptions) {
// Z_ARG1 is reserved for the thread.
assert_different_registers(arg_3, Z_ARG2, Z_ARG3);
assert_different_registers(arg_2, Z_ARG2);
lgr_if_needed(Z_ARG2, arg_1);
assert(arg_2 != Z_ARG2, "smashed argument");
lgr_if_needed(Z_ARG3, arg_2);
assert(arg_3 != Z_ARG2 && arg_3 != Z_ARG3, "smashed argument");
lgr_if_needed(Z_ARG4, arg_3);
call_VM_static(oop_result, entry_point, check_exceptions);
}
Expand All @@ -2282,19 +2282,19 @@ void MacroAssembler::call_VM(Register oop_result, Register last_java_sp, address
void MacroAssembler::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1,
Register arg_2, bool check_exceptions) {
// Z_ARG1 is reserved for the thread.
assert_different_registers(arg_2, Z_ARG2);
lgr_if_needed(Z_ARG2, arg_1);
assert(arg_2 != Z_ARG2, "smashed argument");
lgr_if_needed(Z_ARG3, arg_2);
call_VM(oop_result, last_java_sp, entry_point, check_exceptions);
}

void MacroAssembler::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1,
Register arg_2, Register arg_3, bool check_exceptions) {
// Z_ARG1 is reserved for the thread.
assert_different_registers(arg_3, Z_ARG2, Z_ARG3);
assert_different_registers(arg_2, Z_ARG2);
lgr_if_needed(Z_ARG2, arg_1);
assert(arg_2 != Z_ARG2, "smashed argument");
lgr_if_needed(Z_ARG3, arg_2);
assert(arg_3 != Z_ARG2 && arg_3 != Z_ARG3, "smashed argument");
lgr_if_needed(Z_ARG4, arg_3);
call_VM(oop_result, last_java_sp, entry_point, check_exceptions);
}
Expand All @@ -2312,17 +2312,17 @@ void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1) {
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1, Register arg_2) {
assert_different_registers(arg_2, Z_ARG1);
if (arg_1 != noreg) lgr_if_needed(Z_ARG1, arg_1);
assert(arg_2 != Z_ARG1, "smashed argument");
if (arg_2 != noreg) lgr_if_needed(Z_ARG2, arg_2);
call_VM_leaf(entry_point);
}

void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3) {
assert_different_registers(arg_3, Z_ARG1, Z_ARG2);
assert_different_registers(arg_2, Z_ARG1);
if (arg_1 != noreg) lgr_if_needed(Z_ARG1, arg_1);
assert(arg_2 != Z_ARG1, "smashed argument");
if (arg_2 != noreg) lgr_if_needed(Z_ARG2, arg_2);
assert(arg_3 != Z_ARG1 && arg_3 != Z_ARG2, "smashed argument");
if (arg_3 != noreg) lgr_if_needed(Z_ARG3, arg_3);
call_VM_leaf(entry_point);
}
Expand All @@ -2341,17 +2341,17 @@ void MacroAssembler::call_VM_leaf_static(address entry_point, Register arg_1) {
}

void MacroAssembler::call_VM_leaf_static(address entry_point, Register arg_1, Register arg_2) {
assert_different_registers(arg_2, Z_ARG1);
if (arg_1 != noreg) lgr_if_needed(Z_ARG1, arg_1);
assert(arg_2 != Z_ARG1, "smashed argument");
if (arg_2 != noreg) lgr_if_needed(Z_ARG2, arg_2);
call_VM_leaf_static(entry_point);
}

void MacroAssembler::call_VM_leaf_static(address entry_point, Register arg_1, Register arg_2, Register arg_3) {
assert_different_registers(arg_3, Z_ARG1, Z_ARG2);
assert_different_registers(arg_2, Z_ARG1);
if (arg_1 != noreg) lgr_if_needed(Z_ARG1, arg_1);
assert(arg_2 != Z_ARG1, "smashed argument");
if (arg_2 != noreg) lgr_if_needed(Z_ARG2, arg_2);
assert(arg_3 != Z_ARG1 && arg_3 != Z_ARG2, "smashed argument");
if (arg_3 != noreg) lgr_if_needed(Z_ARG3, arg_3);
call_VM_leaf_static(entry_point);
}
Expand Down
Loading

1 comment on commit 0878872

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.