On s390x, for input: (call_insn/u 7 6 11 2 (parallel [ (set (reg:SI 2 %r2) (call (subreg:QI (symbol_ref:SI ("__tls_get_offset") [flags 0x1]) 3) (const_int 0 [0]))) (clobber (reg:SI 14 %r14)) (use (unspec:SI [ (const_int 0 [0]) ] UNSPEC_TLSLDM)) ]) "/tmp/foo.c":12:26 2602 {*brasl_tls} (expr_list:REG_EH_REGION (const_int -2147483648 [0xffffffff80000000]) (nil)) (expr_list (use (reg:SI 2 %r2)) (expr_list (use (reg:SI 12 %r12)) (nil))))
after r16-1041-g2da641d0170090, get_call_rtx_from returns: (call (subreg:QI (symbol_ref:SI ("__tls_get_offset") [flags 0x1]) 3) (const_int 0 [0])) and we got Program received signal SIGSEGV, Segmentation fault. 0x000000000131174f in prepare_call_arguments ( bb=<basic_block 0x7fffe99dfba0 (2)>, insn=0x7fffe980cc60) at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:6277 6277 fndecl = MEM_EXPR (XEXP (call, 0)); (gdb) bt bb=<basic_block 0x7fffe99dfba0 (2)>, insn=0x7fffe980cc60) at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:6277 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10297 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10526 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10579 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10616 Update prepare_call_arguments to check MEM_P before using MEM_EXPR. gcc/ PR debug/120525 * var-tracking.cc (prepare_call_arguments): Use MEM_EXPR only if MEM_P is true. gcc/testsuite/ PR debug/120525 * gcc.dg/pr120525.c: New test. -- H.J.
From 84a2ad50d87a4eb9e2f2cd47ae0c55d08701536b Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.to...@gmail.com> Date: Wed, 4 Jun 2025 08:48:40 +0800 Subject: [PATCH] Use MEM_EXPR only if MEM_P is true On s390x, for input: (call_insn/u 7 6 11 2 (parallel [ (set (reg:SI 2 %r2) (call (subreg:QI (symbol_ref:SI ("__tls_get_offset") [flags 0x1]) 3) (const_int 0 [0]))) (clobber (reg:SI 14 %r14)) (use (unspec:SI [ (const_int 0 [0]) ] UNSPEC_TLSLDM)) ]) "/tmp/foo.c":12:26 2602 {*brasl_tls} (expr_list:REG_EH_REGION (const_int -2147483648 [0xffffffff80000000]) (nil)) (expr_list (use (reg:SI 2 %r2)) (expr_list (use (reg:SI 12 %r12)) (nil)))) after r16-1041-g2da641d0170090, get_call_rtx_from returns: (call (subreg:QI (symbol_ref:SI ("__tls_get_offset") [flags 0x1]) 3) (const_int 0 [0])) and we got Program received signal SIGSEGV, Segmentation fault. 0x000000000131174f in prepare_call_arguments ( bb=<basic_block 0x7fffe99dfba0 (2)>, insn=0x7fffe980cc60) at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:6277 6277 fndecl = MEM_EXPR (XEXP (call, 0)); (gdb) bt bb=<basic_block 0x7fffe99dfba0 (2)>, insn=0x7fffe980cc60) at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:6277 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10297 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10526 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10579 at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10616 Update prepare_call_arguments to check MEM_P before using MEM_EXPR. gcc/ PR debug/120525 * var-tracking.cc (prepare_call_arguments): Use MEM_EXPR only if MEM_P is true. gcc/testsuite/ PR debug/120525 * gcc.dg/pr120525.c: New test. Signed-off-by: H.J. Lu <hjl.to...@gmail.com> --- gcc/testsuite/gcc.dg/pr120525.c | 22 ++++++++++++++++++++++ gcc/var-tracking.cc | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr120525.c diff --git a/gcc/testsuite/gcc.dg/pr120525.c b/gcc/testsuite/gcc.dg/pr120525.c new file mode 100644 index 00000000000..5ab7a2244dc --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr120525.c @@ -0,0 +1,22 @@ +/* { dg-do compile { target fpic } } */ +/* { dg-options "-O2 -fpic -g" } */ +/* { dg-additional-options "-m31" { target s390x-*-* } } */ + +typedef __SIZE_TYPE__ uintptr_t; +static __thread uintptr_t start_sp; +static inline uintptr_t +__thread_stack_pointer (void) +{ + return (uintptr_t) __builtin_frame_address (0); +} + +void +update_data (void) +{ + if (__builtin_expect ((!start_sp), 0)) + start_sp = __thread_stack_pointer (); + + uintptr_t sp = __thread_stack_pointer (); + if (__builtin_expect ((sp > start_sp), 0)) + start_sp = sp; +} diff --git a/gcc/var-tracking.cc b/gcc/var-tracking.cc index d70ed02e98c..8732c3ba62a 100644 --- a/gcc/var-tracking.cc +++ b/gcc/var-tracking.cc @@ -6273,7 +6273,7 @@ prepare_call_arguments (basic_block bb, rtx_insn *insn) if (SYMBOL_REF_DECL (symbol)) fndecl = SYMBOL_REF_DECL (symbol); } - if (fndecl == NULL_TREE) + if (fndecl == NULL_TREE && MEM_P (XEXP (call, 0))) fndecl = MEM_EXPR (XEXP (call, 0)); if (fndecl && TREE_CODE (TREE_TYPE (fndecl)) != FUNCTION_TYPE -- 2.49.0