[RS6000] libgcc cfi
authorAlan Modra <amodra@gcc.gnu.org>
Tue, 27 Nov 2018 01:59:56 +0000 (12:29 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 27 Nov 2018 01:59:56 +0000 (12:29 +1030)
There are a few places in libgcc assembly where we don't emit call
frame information for functions, potentially breaking unwinding from
asynchronous signal handlers.  This patch fixes them.  Although I
patch tramp.S there is no attempt made to provide CFI for the actual
trampoline on the stack.  Doing that would require generating CFI at
run time and both registering and deregistering it, which is probably
not worth doing since it would significantly slow down the call.

* config/rs6000/morestack.S (__stack_split_initialize),
(__morestack_get_guard, __morestack_set_guard),
(__morestack_make_guard): Provide CFI covering these functions.
* config/rs6000/tramp.S (__trampoline_setup): Likewise.

From-SVN: r266503

libgcc/ChangeLog
libgcc/config/rs6000/morestack.S
libgcc/config/rs6000/tramp.S

index 7ccf11fff389bf5d40902809bd9e67f50201f6f0..a4bce25cb231d86e38a31db977bacab79fcfb82d 100644 (file)
@@ -1,6 +1,13 @@
+2018-11-27  Alan Modra  <amodra@gmail.com>
+
+       * config/rs6000/morestack.S (__stack_split_initialize),
+       (__morestack_get_guard, __morestack_set_guard),
+       (__morestack_make_guard): Provide CFI covering these functions.
+       * config/rs6000/tramp.S (__trampoline_setup): Likewise.
+
 2018-11-15  Xianmiao Qu  <xianmiao_qu@c-sky.com>
 
-       * config/csky/linux-unwind.h (sc_pt_regs): Update for kernel. 
+       * config/csky/linux-unwind.h (sc_pt_regs): Update for kernel.
        (sc_pt_regs_lr): Update for kernel.
        (sc_pt_regs_tls): Update for kernel.
 
@@ -11,7 +18,7 @@
 2018-11-13  Xianmiao Qu  <xianmiao_qu@c-sky.com>
 
        * config/csky/linux-unwind.h (_sig_ucontext_t): Remove.
-       (csky_fallback_frame_state): Modify the check of the 
+       (csky_fallback_frame_state): Modify the check of the
        instructions to adapt to changes in the kernel
 
 2018-11-09  Stafford Horne  <shorne@gmail.com>
 
 2018-08-22  Iain Sandoe  <iain@sandoe.co.uk>
 
-       * config/unwind-dw2-fde-darwin.c 
+       * config/unwind-dw2-fde-darwin.c
        (_darwin10_Unwind_FindEnclosingFunction): move from here ...
        * config/darwin10-unwind-find-enc-func.c: … to here.
        * config/t-darwin: Build Darwin10 unwinder shim crt.
index a0fee4037e4e47a937812576f633ab8bdc573d17..936051eab33cea3d313ebceef7c810470091e824 100644 (file)
@@ -304,12 +304,15 @@ DW.ref.__gcc_personality_v0:
 # new thread starts.  This is called from a constructor.
 # void __stack_split_initialize (void)
 ENTRY(__stack_split_initialize)
+       .cfi_startproc
        addi %r3,%r1,-0x4000            # We should have at least 16K.
        std %r3,-0x7000-64(%r13)        # tcbhead_t.__private_ss
        # void __generic_morestack_set_initial_sp (void *sp, size_t len)
        mr %r3,%r1
        li %r4, 0x4000
        b __generic_morestack_set_initial_sp
+# The lack of .cfi_endproc here is deliberate.  This function and the
+# following ones can all use the default FDE.
        SIZE (__stack_split_initialize)
 
 
@@ -335,6 +338,7 @@ ENTRY0(__morestack_make_guard)
        sub %r3,%r3,%r4
        addi %r3,%r3,BACKOFF
        blr
+       .cfi_endproc
        SIZE (__morestack_make_guard)
 
 
index 19ea57838fc476693a9c86991a78b745e8aa030d..637f4510146a19b86229aa7bbab23649d80b0e1b 100644 (file)
@@ -56,8 +56,10 @@ trampoline_size = .-trampoline_initial
 /* R6 = static chain */
 
 FUNC_START(__trampoline_setup)
+       .cfi_startproc
        mflr    r0              /* save return address */
         bcl    20,31,.LCF0     /* load up __trampoline_initial into r7 */
+       .cfi_register lr,r0
 .LCF0:
         mflr   r11
         addi   r7,r11,trampoline_initial-4-.LCF0 /* trampoline address -4 */
@@ -112,6 +114,7 @@ FUNC_START(__trampoline_setup)
        addi    r30,r30,_GLOBAL_OFFSET_TABLE_-1b@l
 #endif
        bl      JUMP_TARGET(abort)
+       .cfi_endproc
 FUNC_END(__trampoline_setup)
 
 #endif
@@ -144,6 +147,7 @@ trampoline_size = .-trampoline_initial
        .popsection
 
 FUNC_START(__trampoline_setup)
+       .cfi_startproc
        addis 7,2,.LC0@toc@ha
        ld 7,.LC0@toc@l(7)      /* trampoline address -8 */
 
@@ -180,6 +184,7 @@ FUNC_START(__trampoline_setup)
 .Labort:
        bl      JUMP_TARGET(abort)
        nop
+       .cfi_endproc
 FUNC_END(__trampoline_setup)
 
 #endif