From 1ea7ea181d8d3139df4ea66dc2ee98b27fa66b6f Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 27 Nov 2018 12:29:56 +1030 Subject: [PATCH] [RS6000] libgcc cfi 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 | 13 ++++++++++--- libgcc/config/rs6000/morestack.S | 4 ++++ libgcc/config/rs6000/tramp.S | 5 +++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 7ccf11fff38..a4bce25cb23 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,6 +1,13 @@ +2018-11-27 Alan Modra + + * 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 - * 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 * 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 @@ -243,7 +250,7 @@ 2018-08-22 Iain Sandoe - * 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. diff --git a/libgcc/config/rs6000/morestack.S b/libgcc/config/rs6000/morestack.S index a0fee4037e4..936051eab33 100644 --- a/libgcc/config/rs6000/morestack.S +++ b/libgcc/config/rs6000/morestack.S @@ -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) diff --git a/libgcc/config/rs6000/tramp.S b/libgcc/config/rs6000/tramp.S index 19ea57838fc..637f4510146 100644 --- a/libgcc/config/rs6000/tramp.S +++ b/libgcc/config/rs6000/tramp.S @@ -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