Update all debug directives.

The libcorkscrew stack unwinder does not understand cfi directives,
so add .save directives so that it can function properly.

Also add the directives in to strcmp.S and fix a missing set of
directives in cortex-a9/memcpy_base.S.

Bug: 10345269

Merge from internal master.

(cherry-picked from 5f7ccea3ffab05aeceecb85c821003cf580630d3)

Change-Id: If48a216203216a643807f5d61906015984987189
diff --git a/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S b/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S
index 08dc78a..4b125c8 100644
--- a/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S
+++ b/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S
@@ -40,14 +40,16 @@
 ENTRY(__strcat_chk)
     .cfi_startproc
     pld     [r0, #0]
+    .save   {r0, lr}
     push    {r0, lr}
     .cfi_def_cfa_offset 8
     .cfi_rel_offset r0, 0
     .cfi_rel_offset lr, 4
+    .save   {r4, r5}
     push    {r4, r5}
     .cfi_adjust_cfa_offset 8
     .cfi_rel_offset r4, 0
-    .cfi_rel_offset r5, 0
+    .cfi_rel_offset r5, 4
 
     mov     lr, r2
 
@@ -185,6 +187,7 @@
     pld     [r1, #64]
     mov     r2, r4
     add     r0, r0, r3
+    .pad    #-8
     pop     {r4, r5}
     .cfi_adjust_cfa_offset -8
     .cfi_restore r4
diff --git a/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S b/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S
index 9fde590..a045816 100644
--- a/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S
+++ b/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S
@@ -39,6 +39,7 @@
 ENTRY(__strcpy_chk)
     .cfi_startproc
     pld     [r0, #0]
+    .save   {r0, lr}
     push    {r0, lr}
     .cfi_def_cfa_offset 8
     .cfi_rel_offset r0, 0
diff --git a/libc/arch-arm/cortex-a15/bionic/memcpy.S b/libc/arch-arm/cortex-a15/bionic/memcpy.S
index 8052d62..16881d4 100644
--- a/libc/arch-arm/cortex-a15/bionic/memcpy.S
+++ b/libc/arch-arm/cortex-a15/bionic/memcpy.S
@@ -74,18 +74,22 @@
 ENTRY(memcpy)
         .cfi_startproc
         pld     [r1, #64]
+        .save   {r0, lr}
         push    {r0, lr}
         .cfi_def_cfa_offset 8
         .cfi_rel_offset r0, 0
         .cfi_rel_offset lr, 4
 
         #include "memcpy_base.S"
+
         .cfi_endproc
 END(memcpy)
 
+        .fnstart
         .cfi_startproc
 __memcpy_chk_fail:
         // Preserve lr for backtrace.
+        .save   {lr}
         push    {lr}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset lr, 0
@@ -100,6 +104,7 @@
 error_message:
         .word   error_string-(1b+8)
         .cfi_endproc
+        .fnend
 
         .data
 error_string:
diff --git a/libc/arch-arm/cortex-a15/bionic/memset.S b/libc/arch-arm/cortex-a15/bionic/memset.S
index 5593be6..b5fc6ba 100644
--- a/libc/arch-arm/cortex-a15/bionic/memset.S
+++ b/libc/arch-arm/cortex-a15/bionic/memset.S
@@ -45,6 +45,7 @@
         bls         .L_done
 
         // Preserve lr for backtrace.
+        .save       {lr}
         push        {lr}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset lr, 0
@@ -73,6 +74,7 @@
 
 ENTRY(memset)
         .cfi_startproc
+        .save       {r0}
         stmfd       sp!, {r0}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset r0, 0
diff --git a/libc/arch-arm/cortex-a15/bionic/strcmp.S b/libc/arch-arm/cortex-a15/bionic/strcmp.S
index 7aff7c4..2719bf7 100644
--- a/libc/arch-arm/cortex-a15/bionic/strcmp.S
+++ b/libc/arch-arm/cortex-a15/bionic/strcmp.S
@@ -122,9 +122,15 @@
 
         .macro  init
         /* Macro to save temporary registers and prepare magic values.  */
+        .save   {r4-r7}
         subs    sp, sp, #16
+        .cfi_def_cfa_offset 16
         strd    r4, r5, [sp, #8]
+        .cfi_rel_offset r4, 0
+        .cfi_rel_offset r5, 4
         strd    r6, r7, [sp]
+        .cfi_rel_offset r6, 8
+        .cfi_rel_offset r7, 12
         mvn     r6, #0  /* all F */
         mov     r7, #0  /* all 0 */
         .endm   /* init */
@@ -165,6 +171,7 @@
 #endif /* not  __ARMEB__ */
         .endm /* setup_return */
 
+        .cfi_startproc
         pld [r0, #0]
         pld [r1, #0]
 
@@ -348,7 +355,13 @@
         /* Restore temporaries early, before computing the return value.  */
         ldrd    r6, r7, [sp]
         ldrd    r4, r5, [sp, #8]
+        .pad    #-16
         adds    sp, sp, #16
+        .cfi_def_cfa_offset 0
+        .cfi_restore r4
+        .cfi_restore r5
+        .cfi_restore r6
+        .cfi_restore r7
 
         /* There is a zero or a different byte between r1 and r2.  */
         /* r0 contains a mask of all-zero bytes in r1.  */
@@ -374,4 +387,5 @@
         it      ls
         sbcls   r0, r0, r0
         bx      lr
+        .cfi_endproc
 END(strcmp)
diff --git a/libc/arch-arm/cortex-a9/bionic/__strcat_chk.S b/libc/arch-arm/cortex-a9/bionic/__strcat_chk.S
index 3f86636..1329c16 100644
--- a/libc/arch-arm/cortex-a9/bionic/__strcat_chk.S
+++ b/libc/arch-arm/cortex-a9/bionic/__strcat_chk.S
@@ -40,10 +40,12 @@
 ENTRY(__strcat_chk)
     .cfi_startproc
     pld     [r0, #0]
+    .save   {r0, lr}
     push    {r0, lr}
     .cfi_def_cfa_offset 8
     .cfi_rel_offset r0, 0
     .cfi_rel_offset lr, 4
+    .save   {r4, r5}
     push    {r4, r5}
     .cfi_adjust_cfa_offset 8
     .cfi_rel_offset r4, 0
@@ -188,6 +190,7 @@
     pld     [r1, #64]
     mov     r2, r4
     add     r0, r0, r3
+    .pad    #-8
     pop     {r4, r5}
     .cfi_adjust_cfa_offset -8
     .cfi_restore r4
diff --git a/libc/arch-arm/cortex-a9/bionic/__strcpy_chk.S b/libc/arch-arm/cortex-a9/bionic/__strcpy_chk.S
index 787b057..b697c1f 100644
--- a/libc/arch-arm/cortex-a9/bionic/__strcpy_chk.S
+++ b/libc/arch-arm/cortex-a9/bionic/__strcpy_chk.S
@@ -39,6 +39,7 @@
 ENTRY(__strcpy_chk)
     .cfi_startproc
     pld     [r0, #0]
+    .save   {r0, lr}
     push    {r0, lr}
     .cfi_def_cfa_offset 8
     .cfi_rel_offset r0, 0
diff --git a/libc/arch-arm/cortex-a9/bionic/memcpy.S b/libc/arch-arm/cortex-a9/bionic/memcpy.S
index e7beb25..ab3b0a0 100644
--- a/libc/arch-arm/cortex-a9/bionic/memcpy.S
+++ b/libc/arch-arm/cortex-a9/bionic/memcpy.S
@@ -52,6 +52,7 @@
 ENTRY(memcpy)
         .cfi_startproc
         pld     [r1, #0]
+        .save   {r0, lr}
         stmfd   sp!, {r0, lr}
         .cfi_def_cfa_offset 8
         .cfi_rel_offset r0, 0
diff --git a/libc/arch-arm/cortex-a9/bionic/memcpy_base.S b/libc/arch-arm/cortex-a9/bionic/memcpy_base.S
index 46b5a93..088d29e 100644
--- a/libc/arch-arm/cortex-a9/bionic/memcpy_base.S
+++ b/libc/arch-arm/cortex-a9/bionic/memcpy_base.S
@@ -133,7 +133,14 @@
         bx          lr
 11:
         /* Simple arm-only copy loop to handle aligned copy operations */
-        stmfd       sp!, {r4, r5, r6, r7, r8}
+        .save       {r4-r8}
+        stmfd       sp!, {r4-r8}
+        .cfi_def_cfa_offset 20
+        .cfi_rel_offset r4, 0
+        .cfi_rel_offset r5, 4
+        .cfi_rel_offset r6, 8
+        .cfi_rel_offset r7, 12
+        .cfi_rel_offset r8, 16
         pld         [r1, #(32 * 4)]
 
         /* Check alignment */
diff --git a/libc/arch-arm/cortex-a9/bionic/memset.S b/libc/arch-arm/cortex-a9/bionic/memset.S
index bc25a3e..a7876fb 100644
--- a/libc/arch-arm/cortex-a9/bionic/memset.S
+++ b/libc/arch-arm/cortex-a9/bionic/memset.S
@@ -43,6 +43,7 @@
         bls         .L_done
 
         // Preserve lr for backtrace.
+        .save       {lr}
         push        {lr}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset lr, 0
@@ -77,6 +78,7 @@
         cmp         r2, #132
         bhi         11f
 
+        .save       {r0}
         stmfd       sp!, {r0}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset r0, 0
@@ -117,6 +119,7 @@
          * offset = (4-(src&3))&3 = -src & 3
          */
 
+        .save       {r0, r4-r7, lr}
         stmfd       sp!, {r0, r4-r7, lr}
         .cfi_def_cfa_offset 24
         .cfi_rel_offset r0, 0
diff --git a/libc/arch-arm/cortex-a9/bionic/strcmp.S b/libc/arch-arm/cortex-a9/bionic/strcmp.S
index 9597d0d..a84c047 100644
--- a/libc/arch-arm/cortex-a9/bionic/strcmp.S
+++ b/libc/arch-arm/cortex-a9/bionic/strcmp.S
@@ -122,9 +122,15 @@
 
         .macro  init
         /* Macro to save temporary registers and prepare magic values.  */
+        .save   {r4-r7}
         subs    sp, sp, #16
+        .cfi_def_cfa_offset 16
         strd    r4, r5, [sp, #8]
+        .cfi_rel_offset r4, 0
+        .cfi_rel_offset r5, 4
         strd    r6, r7, [sp]
+        .cfi_rel_offset r6, 8
+        .cfi_rel_offset r7, 12
         mvn     r6, #0  /* all F */
         mov     r7, #0  /* all 0 */
         .endm   /* init */
@@ -165,6 +171,7 @@
 #endif /* not  __ARMEB__ */
         .endm /* setup_return */
 
+        .cfi_startproc
         pld [r0, #0]
         pld [r1, #0]
 
@@ -334,7 +341,13 @@
         /* Restore temporaries early, before computing the return value.  */
         ldrd    r6, r7, [sp]
         ldrd    r4, r5, [sp, #8]
+        .pad    #-16
         adds    sp, sp, #16
+        .cfi_def_cfa_offset 0
+        .cfi_restore r4
+        .cfi_restore r5
+        .cfi_restore r6
+        .cfi_restore r7
 
         /* There is a zero or a different byte between r1 and r2.  */
         /* r0 contains a mask of all-zero bytes in r1.  */
@@ -519,7 +532,13 @@
     /* Restore registers and stack. */
     ldrd    r6, r7, [sp]
     ldrd    r4, r5, [sp, #8]
+    .pad    #-16
     adds    sp, sp, #16
+    .cfi_def_cfa_offset 0
+    .cfi_restore r4
+    .cfi_restore r5
+    .cfi_restore r6
+    .cfi_restore r7
 
 	bx	lr
 
@@ -538,7 +557,14 @@
     /* Restore registers and stack. */
     ldrd    r6, r7, [sp]
     ldrd    r4, r5, [sp, #8]
+    .pad    #-16
     adds    sp, sp, #16
+    .cfi_def_cfa_offset 0
+    .cfi_restore r4
+    .cfi_restore r5
+    .cfi_restore r6
+    .cfi_restore r7
 
 	bx	lr
+    .cfi_endproc
 END(strcmp)
diff --git a/libc/arch-arm/krait/bionic/__strcat_chk.S b/libc/arch-arm/krait/bionic/__strcat_chk.S
index 4516d30..4b125c8 100644
--- a/libc/arch-arm/krait/bionic/__strcat_chk.S
+++ b/libc/arch-arm/krait/bionic/__strcat_chk.S
@@ -40,10 +40,12 @@
 ENTRY(__strcat_chk)
     .cfi_startproc
     pld     [r0, #0]
+    .save   {r0, lr}
     push    {r0, lr}
     .cfi_def_cfa_offset 8
     .cfi_rel_offset r0, 0
     .cfi_rel_offset lr, 4
+    .save   {r4, r5}
     push    {r4, r5}
     .cfi_adjust_cfa_offset 8
     .cfi_rel_offset r4, 0
@@ -185,6 +187,7 @@
     pld     [r1, #64]
     mov     r2, r4
     add     r0, r0, r3
+    .pad    #-8
     pop     {r4, r5}
     .cfi_adjust_cfa_offset -8
     .cfi_restore r4
diff --git a/libc/arch-arm/krait/bionic/__strcpy_chk.S b/libc/arch-arm/krait/bionic/__strcpy_chk.S
index c57268c..d5e1db6 100644
--- a/libc/arch-arm/krait/bionic/__strcpy_chk.S
+++ b/libc/arch-arm/krait/bionic/__strcpy_chk.S
@@ -39,6 +39,7 @@
 ENTRY(__strcpy_chk)
     .cfi_startproc
     pld     [r0, #0]
+    .save   {r0, lr}
     push    {r0, lr}
     .cfi_def_cfa_offset 8
     .cfi_rel_offset r0, 0
diff --git a/libc/arch-arm/krait/bionic/memcpy.S b/libc/arch-arm/krait/bionic/memcpy.S
index 75b2395..3b4fca4 100644
--- a/libc/arch-arm/krait/bionic/memcpy.S
+++ b/libc/arch-arm/krait/bionic/memcpy.S
@@ -55,6 +55,7 @@
 ENTRY(memcpy)
         .cfi_startproc
         pld     [r1, #64]
+        .save   {r0, lr}
         stmfd   sp!, {r0, lr}
         .cfi_def_cfa_offset 8
         .cfi_rel_offset r0, 0
@@ -64,9 +65,11 @@
         .cfi_endproc
 END(memcpy)
 
+        .fnstart
         .cfi_startproc
 __memcpy_chk_fail:
         // Preserve lr for backtrace.
+        .save   {lr}
         push    {lr}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset lr, 0
@@ -81,6 +84,7 @@
 error_message:
         .word   error_string-(1b+4)
         .cfi_endproc
+        .fnend
 
         .data
 error_string:
diff --git a/libc/arch-arm/krait/bionic/memset.S b/libc/arch-arm/krait/bionic/memset.S
index 1566132..005dfd8 100644
--- a/libc/arch-arm/krait/bionic/memset.S
+++ b/libc/arch-arm/krait/bionic/memset.S
@@ -44,6 +44,7 @@
         bls         .L_done
 
         // Preserve lr for backtrace.
+        .save       {lr}
         push        {lr}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset lr, 0
@@ -74,6 +75,7 @@
 /* memset() returns its first argument.  */
 ENTRY(memset)
         .cfi_startproc
+        .save       {r0}
         stmfd       sp!, {r0}
         .cfi_def_cfa_offset 4
         .cfi_rel_offset r0, 0
diff --git a/libc/arch-arm/krait/bionic/strcmp.S b/libc/arch-arm/krait/bionic/strcmp.S
index d614b9d..f26aaf1 100644
--- a/libc/arch-arm/krait/bionic/strcmp.S
+++ b/libc/arch-arm/krait/bionic/strcmp.S
@@ -122,9 +122,15 @@
 
         .macro  init
         /* Macro to save temporary registers and prepare magic values.  */
+        .save   {r4-r7}
         subs    sp, sp, #16
+        .cfi_def_cfa_offset 16
         strd    r4, r5, [sp, #8]
+        .cfi_rel_offset r4, 0
+        .cfi_rel_offset r5, 4
         strd    r6, r7, [sp]
+        .cfi_rel_offset r6, 8
+        .cfi_rel_offset r7, 12
         mvn     r6, #0  /* all F */
         mov     r7, #0  /* all 0 */
         .endm   /* init */
@@ -165,6 +171,7 @@
 #endif /* not  __ARMEB__ */
         .endm /* setup_return */
 
+        .cfi_startproc
         pld [r0, #0]
         pld [r1, #0]
 
@@ -347,7 +354,13 @@
         /* Restore temporaries early, before computing the return value.  */
         ldrd    r6, r7, [sp]
         ldrd    r4, r5, [sp, #8]
+        .pad    #-16
         adds    sp, sp, #16
+        .cfi_def_cfa_offset 0
+        .cfi_restore r4
+        .cfi_restore r5
+        .cfi_restore r6
+        .cfi_restore r7
 
         /* There is a zero or a different byte between r1 and r2.  */
         /* r0 contains a mask of all-zero bytes in r1.  */
@@ -452,7 +465,13 @@
     /* Restore registers and stack. */
     ldrd    r6, r7, [sp]
     ldrd    r4, r5, [sp, #8]
+    .pad    #-16
     adds    sp, sp, #16
+    .cfi_def_cfa_offset 0
+    .cfi_restore r4
+    .cfi_restore r5
+    .cfi_restore r6
+    .cfi_restore r7
 
 	bx	lr
 
@@ -471,7 +490,14 @@
     /* Restore registers and stack. */
     ldrd    r6, r7, [sp]
     ldrd    r4, r5, [sp, #8]
+    .pad    #-16
     adds    sp, sp, #16
+    .cfi_def_cfa_offset 0
+    .cfi_restore r4
+    .cfi_restore r5
+    .cfi_restore r6
+    .cfi_restore r7
 
 	bx	lr
+    .cfi_endproc
 END(strcmp)