Hi, This patch fixes the aarch64 bug 80295 https://gcc.gnu.org/PR80295
The aarch64 backend has multiple places that miss the handling of TARGET_ILP32. in the patch, we added correct handling of TARGET_ILP32 into aarch64 backend. a new small testing case is added. bootstrapped and tested on aarch64-unknown-linux-gnu with no regression. thanks. Qing ========== gcc/ChangeLog: * config/aarch64/aarch64.c (aarch64_expand_prologue): emit different modes of stack_tie insn depend on TARGET_ILP32. (aarch64_expand_epilogue): Likewise. * config/aarch64/aarch64.h: define Pmode to SImode/DImode depend on TARGET_ILP32. * config/aarch64/aarch64.md: define insn stack_tie to different modes (SImode/DImode) gcc/testsuite/ChangeLog: PR middle-end/80295 * gcc.target/aarch64/pr80295.c: New test. --- gcc/config/aarch64/aarch64.c | 12 +++++++++--- gcc/config/aarch64/aarch64.h | 2 +- gcc/config/aarch64/aarch64.md | 6 +++--- gcc/testsuite/gcc.target/aarch64/pr80295.c | 8 ++++++++ 4 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/pr80295.c diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 6c3ef76..876e9e3 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -3693,7 +3693,9 @@ aarch64_expand_prologue (void) stack_pointer_rtx, GEN_INT (callee_offset))); RTX_FRAME_RELATED_P (insn) = 1; - emit_insn (gen_stack_tie (stack_pointer_rtx, hard_frame_pointer_rtx)); + emit_insn (TARGET_ILP32 ? + gen_stack_tiesi (stack_pointer_rtx, hard_frame_pointer_rtx) : + gen_stack_tiedi (stack_pointer_rtx, hard_frame_pointer_rtx)); } aarch64_save_callee_saves (DImode, callee_offset, R0_REGNUM, R30_REGNUM, @@ -3750,7 +3752,9 @@ aarch64_expand_epilogue (bool for_sibcall) if (final_adjust > crtl->outgoing_args_size || cfun->calls_alloca || crtl->calls_eh_return) { - emit_insn (gen_stack_tie (stack_pointer_rtx, stack_pointer_rtx)); + emit_insn (TARGET_ILP32 ? + gen_stack_tiesi (stack_pointer_rtx, stack_pointer_rtx) : + gen_stack_tiedi (stack_pointer_rtx, stack_pointer_rtx)); need_barrier_p = false; } @@ -3774,7 +3778,9 @@ aarch64_expand_epilogue (bool for_sibcall) callee_adjust != 0, &cfi_ops); if (need_barrier_p) - emit_insn (gen_stack_tie (stack_pointer_rtx, stack_pointer_rtx)); + emit_insn (TARGET_ILP32 ? + gen_stack_tiesi (stack_pointer_rtx, stack_pointer_rtx) : + gen_stack_tiedi (stack_pointer_rtx, stack_pointer_rtx)); if (callee_adjust != 0) aarch64_pop_regs (reg1, reg2, callee_adjust, &cfi_ops); diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index 8fada9e..df58442 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -782,7 +782,7 @@ typedef struct /* Specify the machine mode that the hardware addresses have. After generation of rtl, the compiler makes no further distinction between pointers and any other objects of this machine mode. */ -#define Pmode DImode +#define Pmode (TARGET_ILP32 ? SImode : DImode) /* A C expression whose value is zero if pointers that need to be extended from being `POINTER_SIZE' bits wide to `Pmode' are sign-extended and diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index bb7f2c0..30853b2 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -5533,10 +5533,10 @@ [(set_attr "type" "call") (set_attr "length" "16")]) -(define_insn "stack_tie" +(define_insn "stack_tie<GPI:mode>" [(set (mem:BLK (scratch)) - (unspec:BLK [(match_operand:DI 0 "register_operand" "rk") - (match_operand:DI 1 "register_operand" "rk")] + (unspec:BLK [(match_operand:GPI 0 "register_operand" "rk") + (match_operand:GPI 1 "register_operand" "rk")] UNSPEC_PRLG_STK))] "" "" diff --git a/gcc/testsuite/gcc.target/aarch64/pr80295.c b/gcc/testsuite/gcc.target/aarch64/pr80295.c new file mode 100644 index 0000000..b3866d8 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr80295.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-mabi=ilp32" } */ + +void f (void *b) +{ + __builtin_update_setjmp_buf (b); +} + -- 1.9.1