]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
[AArch64] Add more cfi annotations to tlsdesc entry points
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 21 Jun 2017 14:01:18 +0000 (15:01 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 21 Jun 2017 14:04:37 +0000 (15:04 +0100)
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.

ChangeLog
sysdeps/aarch64/dl-tlsdesc.S

index 3c9d6ba46118d1cf0297e32eefab17826787ea50..22889ee2e8376602d6ad9b3035a1395424a5aabf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,12 @@
        * misc/tst-preadvwritev2.c (do_test): Add test for invalid flag.
        * misc/tst-preadvwritev64v2.c (do_test): Likewise.
 
+2017-06-21  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.
+
 2017-06-21  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        * sysdeps/aarch64/dl-machine.h (RTLD_START_1): Change _dl_argv to the
index 94679a04ca938435bef2b4eeb7c31feeb70262e5..a70cfd513c8f7553041c3ee615133c5ef57f885d 100644 (file)
@@ -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