]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
PowerPC64 power8 strncpy cfi fixes
authorAlan Modra <amodra@gmail.com>
Sun, 22 Oct 2017 21:14:50 +0000 (07:44 +1030)
committerAlan Modra <amodra@gmail.com>
Sun, 22 Oct 2017 21:16:58 +0000 (07:46 +1030)
cfi info for stack adjust needs to be on the insn doing the adjust.
cfi describing register saves can be anywhere after the save insn but
before the reg is altered.  Fewer locations with cfi result in smaller
cfi programs and possibly slightly faster exception handling.  Thus
the LR cfi_offset move.

The idea behind ajusting sp after restoring regs is to break a
register dependency chain, in this case not be using r1 immediately
after it is modified.

The missing LR cfi_restore meant that code after the blr,
unaligned_lt_16 and other labels, would have cfi that said LR was at
cfa+16, but that code is reached without LR being saved.

* sysdeps/powerpc/powerpc64/power8/strncpy.S: Move LR cfi.
Adjust stack after restoring regs.  Add missing LR cfi_restore.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
ChangeLog
sysdeps/powerpc/powerpc64/power8/strncpy.S

index 444b63981fb47a90d303749334d1fd763621d714..677f46d61accca7790bd0edffa6bbe27c97560aa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-23  Alan Modra  <amodra@gmail.com>
+
+       * sysdeps/powerpc/powerpc64/power8/strncpy.S: Move LR cfi.
+       Adjust stack after restoring regs.  Add missing LR cfi_restore.
+
 2017-10-23  Alan Modra  <amodra@gmail.com>
 
        * sysdeps/powerpc/powerpc64/power7/strncpy.S: Decrease FRAMESIZE.
index 150290ae4a35b4d7b76e6d0c2a7d2df1c85ff83b..c55e62de435a8205548d744090370a7255a203f8 100644 (file)
@@ -241,23 +241,18 @@ L(zero_pad_start_1):
        /* Save the link register.  */
        mflr    r0
        std     r0,16(r1)
-       cfi_offset(lr, 16)
 
        /* Create the stack frame.  */
        stdu    r1,-FRAMESIZE(r1)
        cfi_adjust_cfa_offset(FRAMESIZE)
+       cfi_offset(lr, 16)
 
        bl      MEMSET
 #ifndef MEMSET_is_local
        nop
 #endif
 
-       /* Restore the stack frame.  */
-       addi    r1,r1,FRAMESIZE
-       cfi_adjust_cfa_offset(-FRAMESIZE)
-       /* Restore the link register.  */
-       ld      r0,16(r1)
-       mtlr    r0
+       ld      r0,FRAMESIZE+16(r1)
 
 #ifndef USE_AS_STPNCPY
        mr      r3,r30       /* Restore the return value of strncpy, i.e.:
@@ -266,12 +261,18 @@ L(zero_pad_start_1):
 #endif
 
        /* Restore non-volatile registers and return.  */
-       ld      r26,-48(r1)
-       ld      r27,-40(r1)
-       ld      r28,-32(r1)
-       ld      r29,-24(r1)
-       ld      r30,-16(r1)
-       ld      r31,-8(r1)
+       ld      r26,FRAMESIZE-48(r1)
+       ld      r27,FRAMESIZE-40(r1)
+       ld      r28,FRAMESIZE-32(r1)
+       ld      r29,FRAMESIZE-24(r1)
+       ld      r30,FRAMESIZE-16(r1)
+       ld      r31,FRAMESIZE-8(r1)
+       /* Restore the stack frame.  */
+       addi    r1,r1,FRAMESIZE
+       cfi_adjust_cfa_offset(-FRAMESIZE)
+       /* Restore the link register.  */
+       mtlr    r0
+       cfi_restore(lr)
        blr
 
        /* The common case where [src]+16 will not cross a 4K page boundary.