On 06/10/17 20:56, Qing Zhao wrote:
> Thanks a lot for Wilcoâs help on this bug.
>
> Yes, Aarch64 does NOT do anything wrong.
>
> The implementation of __builtin_update_setjmp_buf is not correct. It takes a
> pointer
> as an operand and treats the Mode of the pointer as Pmode, which is not
> correct.
> a conversion from ptr_mode to Pmode is needed for this pointer.
>
> bootstrapped on aarch64-unknown-linux-gnu.
> testing on aarch64-unknown-linux-gnu is running.
>
This is more believable for AArch64, but we need to be careful here. I
think this needs testing on at least one other target that has a
ilp32-on-64-bit ABI, eg x86_64's x32 ABI.
R.
> the new patch is:
>
> =====
> gcc/ChangeLog
>
> * builtins.c (expand_builtin_update_setjmp_buf): Add a
> converstion to Pmode from the buf_addr.
>
> gcc/testsuite/ChangeLog
>
> PR middle-end/80295
> * gcc.target/aarch64/pr80295.c: New test.
>
> ---
> gcc/builtins.c | 1 +
> gcc/testsuite/gcc.target/aarch64/pr80295.c | 8 ++++++++
> 2 files changed, 9 insertions(+)
> create mode 100644 gcc/testsuite/gcc.target/aarch64/pr80295.c
>
> diff --git a/gcc/builtins.c b/gcc/builtins.c
> index c8a5ea6..01fb08b 100644
> --- a/gcc/builtins.c
> +++ b/gcc/builtins.c
> @@ -1199,6 +1199,7 @@ void
> expand_builtin_update_setjmp_buf (rtx buf_addr)
> {
> machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
> + buf_addr = convert_memory_address (Pmode, buf_addr);
> rtx stack_save
> = gen_rtx_MEM (sa_mode,
> memory_address
> 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);
> +}
> +
>