Build raise with -fasynchronous-unwind-tables

Message ID alpine.DEB.2.21.2001240032350.7536@digraph.polyomino.org.uk
State Committed
Headers

Commit Message

Joseph Myers Jan. 24, 2020, 12:33 a.m. UTC
  In testing glibc for Arm and MIPS, I see:

FAIL: misc/tst-sigcontext-get_pc

If this test - backtracing through a call to raise - is valid, then
raise needs to be built with -fasynchronous-unwind-tables (as the test
itself is) to have the required unwind information for that
backtracing to work.  Adding that option, which this patch does,
causes the test for pass for Arm.  For MIPS, the test still does not
pass (the backtrace has an address that is 2 bytes after the "address
in signal handler", for unknown reasons), although the patch allows a
longer backtrace to be produced.
  

Comments

Siddhesh Poyarekar Jan. 24, 2020, 3:14 a.m. UTC | #1
On 24/01/20 6:03 am, Joseph Myers wrote:
> In testing glibc for Arm and MIPS, I see:
> 
> FAIL: misc/tst-sigcontext-get_pc
> 
> If this test - backtracing through a call to raise - is valid, then
> raise needs to be built with -fasynchronous-unwind-tables (as the test
> itself is) to have the required unwind information for that
> backtracing to work.  Adding that option, which this patch does,
> causes the test for pass for Arm.  For MIPS, the test still does not
> pass (the backtrace has an address that is 2 bytes after the "address
> in signal handler", for unknown reasons), although the patch allows a
> longer backtrace to be produced.
> 

The fix seems fine, but I wonder how the test passes on other
architectures.  Also the commit that introduced this test seems to
indicate that the test was passing earlier:

commit a43565ac447b1608ae2626f5012673560bb623ab
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Mon Dec 17 16:44:14 2018 -0200

    Refactor sigcontextinfo.h

Siddhesh
  
Florian Weimer Jan. 24, 2020, 6:35 a.m. UTC | #2
* Siddhesh Poyarekar:

> On 24/01/20 6:03 am, Joseph Myers wrote:
>> In testing glibc for Arm and MIPS, I see:
>> 
>> FAIL: misc/tst-sigcontext-get_pc
>> 
>> If this test - backtracing through a call to raise - is valid, then
>> raise needs to be built with -fasynchronous-unwind-tables (as the test
>> itself is) to have the required unwind information for that
>> backtracing to work.  Adding that option, which this patch does,
>> causes the test for pass for Arm.  For MIPS, the test still does not
>> pass (the backtrace has an address that is 2 bytes after the "address
>> in signal handler", for unknown reasons), although the patch allows a
>> longer backtrace to be produced.
>> 
>
> The fix seems fine, but I wonder how the test passes on other
> architectures.

Many architectures default to -fasynchronous-unwind-tables in GCC.

The patch seems reasonable to me.

Thanks,
Florian
  
Siddhesh Poyarekar Jan. 24, 2020, 8:59 a.m. UTC | #3
On 24/01/20 12:05 pm, Florian Weimer wrote:
>> The fix seems fine, but I wonder how the test passes on other
>> architectures.
> 
> Many architectures default to -fasynchronous-unwind-tables in GCC.
> 
> The patch seems reasonable to me.

Thanks, looks good to me for master then.

Siddhesh
  
Joseph Myers Jan. 25, 2020, 2:18 a.m. UTC | #4
On Fri, 24 Jan 2020, Joseph Myers wrote:

> causes the test for pass for Arm.  For MIPS, the test still does not
> pass (the backtrace has an address that is 2 bytes after the "address
> in signal handler", for unknown reasons), although the patch allows a
> longer backtrace to be produced.

I now understand the MIPS issue: libgcc/config/mips/linux-unwind.h adds 2 
to the return address for a signal frame.

The question then is how best to fix that MIPS issue.  Adding 2 in the 
MIPS sigcontext_get_pc would fix things for the testcase, and be safe for 
the use in debug/segfault.c.  I'm less sure, however, what's safe for the 
use of sigcontext_get_pc in sysdeps/unix/sysv/linux/profil-counter.h - 
what exactly that use requires regarding the return value of 
sigcontext_get_pc.
  

Patch

diff --git a/signal/Makefile b/signal/Makefile
index 7da67def84..37de438bba 100644
--- a/signal/Makefile
+++ b/signal/Makefile
@@ -52,6 +52,7 @@  tests		:= tst-signal tst-sigset tst-sigsimple tst-raise tst-sigset2 \
 
 include ../Rules
 
+CFLAGS-raise.c += -fasynchronous-unwind-tables
 CFLAGS-sigpause.c += -fexceptions
 CFLAGS-sigsuspend.c += -fexceptions -fasynchronous-unwind-tables
 CFLAGS-sigtimedwait.c += -fexceptions -fasynchronous-unwind-tables