diff mbox series

[PowerPC] libgcc cfi

Message ID 20181112114343.GG22752@bubble.grove.modra.org
State New
Headers show
Series [PowerPC] libgcc cfi | expand

Commit Message

Alan Modra Nov. 12, 2018, 11:43 a.m. UTC
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 most.  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.

Note that the out-of-line register save/restore functions do not
need CFI in the assembly.  CFI is added for them by the rs6000.c
prologue and epilogue code.

Bootstrapped etc. powerpc64le-linux.

	* 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.

Comments

Segher Boessenkool Nov. 27, 2018, 1:21 a.m. UTC | #1
On Mon, Nov 12, 2018 at 10:13:43PM +1030, Alan Modra wrote:
> 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 most.  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.
> 
> Note that the out-of-line register save/restore functions do not
> need CFI in the assembly.  CFI is added for them by the rs6000.c
> prologue and epilogue code.
> 
> Bootstrapped etc. powerpc64le-linux.

Okay for trunk.  Thanks!


Segher


> 	* 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.
diff mbox series

Patch

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