[v2,AArch64] Add more cfi annotations to tlsdesc entry points

Message ID 584FEAE9.10207@arm.com
State New
Headers show

Commit Message

Szabolcs Nagy Dec. 13, 2016, 12:34 p.m.
Backtrace through _dl_tlsdesc_resolve_rela was broken because the offset
of x30 from cfa was not in the debug info.

Add enough annotation so backtracing from the dynamic linker through
tlsdesc entry points works and the debugger shows registers correctly.

v2:
- group cfi_rel_offset annotations for smaller debug info.

2016-12-13  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Add cfi
	annotation.
	(_dl_tlsdesc_resolve_rela, _dl_tlsdesc_resolve_hold): Likewise.

Comments

Szabolcs Nagy Jan. 6, 2017, 3:57 p.m. | #1
On 13/12/16 12:34, Szabolcs Nagy wrote:
> Backtrace through _dl_tlsdesc_resolve_rela was broken because the offset

> of x30 from cfa was not in the debug info.

> 

> Add enough annotation so backtracing from the dynamic linker through

> tlsdesc entry points works and the debugger shows registers correctly.

> 

> v2:

> - group cfi_rel_offset annotations for smaller debug info.

> 

> 2016-12-13  Szabolcs Nagy  <szabolcs.nagy@arm.com>

> 

> 	* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Add cfi

> 	annotation.

> 	(_dl_tlsdesc_resolve_rela, _dl_tlsdesc_resolve_hold): Likewise.

> 


ping.
Szabolcs Nagy Jan. 23, 2017, 11:31 a.m. | #2
On 06/01/17 15:57, Szabolcs Nagy wrote:
> On 13/12/16 12:34, Szabolcs Nagy wrote:

>> Backtrace through _dl_tlsdesc_resolve_rela was broken because the offset

>> of x30 from cfa was not in the debug info.

>>

>> Add enough annotation so backtracing from the dynamic linker through

>> tlsdesc entry points works and the debugger shows registers correctly.

>>

>> v2:

>> - group cfi_rel_offset annotations for smaller debug info.

>>

>> 2016-12-13  Szabolcs Nagy  <szabolcs.nagy@arm.com>

>>

>> 	* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Add cfi

>> 	annotation.

>> 	(_dl_tlsdesc_resolve_rela, _dl_tlsdesc_resolve_hold): Likewise.

>>

> 

> ping.

> 


ping.

this is a bug fix which should go in 2.25 i think.
(e.g. the elf/tst-tls-manydynamic crash is hard to debug without this).
Adhemerval Zanella Feb. 7, 2017, 8:26 p.m. | #3
On 23/01/2017 09:31, Szabolcs Nagy wrote:
> On 06/01/17 15:57, Szabolcs Nagy wrote:

>> On 13/12/16 12:34, Szabolcs Nagy wrote:

>>> Backtrace through _dl_tlsdesc_resolve_rela was broken because the offset

>>> of x30 from cfa was not in the debug info.

>>>

>>> Add enough annotation so backtracing from the dynamic linker through

>>> tlsdesc entry points works and the debugger shows registers correctly.

>>>

>>> v2:

>>> - group cfi_rel_offset annotations for smaller debug info.

>>>

>>> 2016-12-13  Szabolcs Nagy  <szabolcs.nagy@arm.com>

>>>

>>> 	* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Add cfi

>>> 	annotation.

>>> 	(_dl_tlsdesc_resolve_rela, _dl_tlsdesc_resolve_hold): Likewise.

>>>

>>

>> ping.

>>

> 

> ping.

> 

> this is a bug fix which should go in 2.25 i think.

> (e.g. the elf/tst-tls-manydynamic crash is hard to debug without this).

> 


Sorry if I did catch this up for 2.25, LGTM.  I think it is worth to at
least backport to 2.25 branch.
Szabolcs Nagy June 21, 2017, 2:05 p.m. | #4
On 13/12/16 12:34, Szabolcs Nagy wrote:
> Backtrace through _dl_tlsdesc_resolve_rela was broken because the offset

> of x30 from cfa was not in the debug info.

> 

> Add enough annotation so backtracing from the dynamic linker through

> tlsdesc entry points works and the debugger shows registers correctly.

> 

> v2:

> - group cfi_rel_offset annotations for smaller debug info.

> 

> 2016-12-13  Szabolcs Nagy  <szabolcs.nagy@arm.com>

> 

> 	* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Add cfi

> 	annotation.

> 	(_dl_tlsdesc_resolve_rela, _dl_tlsdesc_resolve_hold): Likewise.

> 


committed.

Patch

diff --git a/sysdeps/aarch64/dl-tlsdesc.S b/sysdeps/aarch64/dl-tlsdesc.S
index 9e557dd..4cad6fb 100644
--- a/sysdeps/aarch64/dl-tlsdesc.S
+++ b/sysdeps/aarch64/dl-tlsdesc.S
@@ -176,6 +176,8 @@  _dl_tlsdesc_dynamic:
 # define NSAVEXREGPAIRS 2
 	stp	x29, x30, [sp,#-(32+16*NSAVEXREGPAIRS)]!
 	cfi_adjust_cfa_offset (32+16*NSAVEXREGPAIRS)
+	cfi_rel_offset (x29, 0)
+	cfi_rel_offset (x30, 8)
 	mov	x29, sp
 	DELOUSE (0)
 
@@ -184,6 +186,10 @@  _dl_tlsdesc_dynamic:
 
 	stp	x1,  x2, [sp, #32+16*0]
 	stp	x3,  x4, [sp, #32+16*1]
+	cfi_rel_offset (x1, 32)
+	cfi_rel_offset (x2, 32+8)
+	cfi_rel_offset (x3, 32+16)
+	cfi_rel_offset (x4, 32+24)
 
 	mrs	x4, tpidr_el0
 	/* The ldar here happens after the load from [x0] at the call site
@@ -213,6 +219,8 @@  _dl_tlsdesc_dynamic:
 
 	ldp	x29, x30, [sp], #(32+16*NSAVEXREGPAIRS)
 	cfi_adjust_cfa_offset (-32-16*NSAVEXREGPAIRS)
+	cfi_restore (x29)
+	cfi_restore (x30)
 # undef NSAVEXREGPAIRS
 	RET
 2:
@@ -230,6 +238,20 @@  _dl_tlsdesc_dynamic:
 	stp	x13, x14, [sp, #16*4]
 	stp	x15, x16, [sp, #16*5]
 	stp	x17, x18, [sp, #16*6]
+	cfi_rel_offset (x5, 0)
+	cfi_rel_offset (x6, 8)
+	cfi_rel_offset (x7, 16)
+	cfi_rel_offset (x8, 16+8)
+	cfi_rel_offset (x9, 16*2)
+	cfi_rel_offset (x10, 16*2+8)
+	cfi_rel_offset (x11, 16*3)
+	cfi_rel_offset (x12, 16*3+8)
+	cfi_rel_offset (x13, 16*4)
+	cfi_rel_offset (x14, 16*4+8)
+	cfi_rel_offset (x15, 16*5)
+	cfi_rel_offset (x16, 16*5+8)
+	cfi_rel_offset (x17, 16*6)
+	cfi_rel_offset (x18, 16*6+8)
 
 	SAVE_Q_REGISTERS
 
@@ -268,8 +290,14 @@  _dl_tlsdesc_dynamic:
 	.align 2
 _dl_tlsdesc_resolve_rela:
 #define	NSAVEXREGPAIRS 9
+	/* The tlsdesc PLT entry pushes x2 and x3 to the stack.  */
+	cfi_adjust_cfa_offset (16)
+	cfi_rel_offset (x2, 0)
+	cfi_rel_offset (x3, 8)
 	stp	x29, x30, [sp, #-(32+16*NSAVEXREGPAIRS)]!
 	cfi_adjust_cfa_offset (32+16*NSAVEXREGPAIRS)
+	cfi_rel_offset (x29, 0)
+	cfi_rel_offset (x30, 8)
 	mov	x29, sp
 	stp	 x1,  x4, [sp, #32+16*0]
 	stp	 x5,  x6, [sp, #32+16*1]
@@ -280,6 +308,23 @@  _dl_tlsdesc_resolve_rela:
 	stp	x15, x16, [sp, #32+16*6]
 	stp	x17, x18, [sp, #32+16*7]
 	str	x0,       [sp, #32+16*8]
+	cfi_rel_offset (x1, 32)
+	cfi_rel_offset (x4, 32+8)
+	cfi_rel_offset (x5, 32+16)
+	cfi_rel_offset (x6, 32+16+8)
+	cfi_rel_offset (x7, 32+16*2)
+	cfi_rel_offset (x8, 32+16*2+8)
+	cfi_rel_offset (x9, 32+16*3)
+	cfi_rel_offset (x10, 32+16*3+8)
+	cfi_rel_offset (x11, 32+16*4)
+	cfi_rel_offset (x12, 32+16*4+8)
+	cfi_rel_offset (x13, 32+16*5)
+	cfi_rel_offset (x14, 32+16*5+8)
+	cfi_rel_offset (x15, 32+16*6)
+	cfi_rel_offset (x16, 32+16*6+8)
+	cfi_rel_offset (x17, 32+16*7)
+	cfi_rel_offset (x18, 32+16*7+8)
+	cfi_rel_offset (x0, 32+16*8)
 
 	SAVE_Q_REGISTERS
 
@@ -304,6 +349,8 @@  _dl_tlsdesc_resolve_rela:
 	ldp	x17, x18, [sp, #32+16*7]
 	ldp	x29, x30, [sp], #(32+16*NSAVEXREGPAIRS)
 	cfi_adjust_cfa_offset (-32-16*NSAVEXREGPAIRS)
+	cfi_restore (x29)
+	cfi_restore (x30)
 	ldp	x2, x3, [sp], #16
 	cfi_adjust_cfa_offset (-16)
 	RET
@@ -332,6 +379,8 @@  _dl_tlsdesc_resolve_hold:
 1:
 	stp	x29, x30, [sp, #-(32+16*NSAVEXREGPAIRS)]!
 	cfi_adjust_cfa_offset (32+16*NSAVEXREGPAIRS)
+	cfi_rel_offset (x29, 0)
+	cfi_rel_offset (x30, 8)
 	mov	x29, sp
 	stp	 x1,  x2, [sp, #32+16*0]
 	stp	 x3,  x4, [sp, #32+16*1]
@@ -343,6 +392,25 @@  _dl_tlsdesc_resolve_hold:
 	stp	x15, x16, [sp, #32+16*7]
 	stp	x17, x18, [sp, #32+16*8]
 	str	x0,       [sp, #32+16*9]
+	cfi_rel_offset (x1, 32)
+	cfi_rel_offset (x2, 32+8)
+	cfi_rel_offset (x3, 32+16)
+	cfi_rel_offset (x4, 32+16+8)
+	cfi_rel_offset (x5, 32+16*2)
+	cfi_rel_offset (x6, 32+16*2+8)
+	cfi_rel_offset (x7, 32+16*3)
+	cfi_rel_offset (x8, 32+16*3+8)
+	cfi_rel_offset (x9, 32+16*4)
+	cfi_rel_offset (x10, 32+16*4+8)
+	cfi_rel_offset (x11, 32+16*5)
+	cfi_rel_offset (x12, 32+16*5+8)
+	cfi_rel_offset (x13, 32+16*6)
+	cfi_rel_offset (x14, 32+16*6+8)
+	cfi_rel_offset (x15, 32+16*7)
+	cfi_rel_offset (x16, 32+16*7+8)
+	cfi_rel_offset (x17, 32+16*8)
+	cfi_rel_offset (x18, 32+16*8+8)
+	cfi_rel_offset (x0, 32+16*9)
 
 	SAVE_Q_REGISTERS
 
@@ -367,6 +435,8 @@  _dl_tlsdesc_resolve_hold:
 	ldp	x17, x18, [sp, #32+16*8]
 	ldp	x29, x30, [sp], #(32+16*NSAVEXREGPAIRS)
 	cfi_adjust_cfa_offset (-32-16*NSAVEXREGPAIRS)
+	cfi_restore (x29)
+	cfi_restore (x30)
 	RET
 	cfi_endproc
 	.size	_dl_tlsdesc_resolve_hold, .-_dl_tlsdesc_resolve_hold