ARC: dw2 unwind: enable cfi pseudo ops in string lib
authorVineet Gupta <vgupta@synopsys.com>
Mon, 19 Sep 2016 23:42:25 +0000 (16:42 -0700)
committerVineet Gupta <vgupta@synopsys.com>
Fri, 30 Sep 2016 21:48:22 +0000 (14:48 -0700)
This uses a new set of annoations viz. ENTRY_CFI/END_CFI to enabel cfi
ops generation.

Note that we didn't change the normal ENTRY/EXIT as we don't actually
want unwind info in the trap/exception/interrutp handlers which use
these, as unwinder then gets confused (it keeps recursing vs. stopping).
Semantically these are leaf routines and unwinding should stop when it
hits those routines.

Before
------

    28.52%     1.19%          9929  hackbench  libuClibc-1.0.17.so   [.] __write_nocancel
            |
            ---__write_nocancel
               |--8.95%--EV_Trap
               |           --8.25%--sys_write
               |                     |--3.93%--sock_write_iter
     ...
               |--2.62%--memset   <==== [LEAF entry as no unwind info]
                         ^^^^^^

After
-----

    29.46%     1.24%         13622  hackbench  libuClibc-1.0.17.so   [.] __write_nocancel
            |
            ---__write_nocancel
               |--9.31%--EV_Trap
               |           --8.62%--sys_write
               |                     |--4.17%--sock_write_iter
     ...
               |--6.19%--sys_write
               |           --6.19%--sock_write_iter
               |                     unix_stream_sendmsg
               |                     |--1.62%--sock_alloc_send_pskb
               |                     |--0.89%--sock_def_readable
               |                     |--0.88%--_raw_spin_unlock_irqrestore
               |                     |--0.69%--memset
               |                     |         ^^^^^^     <==== [now in proper callframe]
               |                     |
               |                      --0.52%--skb_copy_datagram_from_iter

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/kernel/ctx_sw_asm.S
arch/arc/lib/memcmp.S
arch/arc/lib/memcpy-700.S
arch/arc/lib/memcpy-archs.S
arch/arc/lib/memset-archs.S
arch/arc/lib/memset.S
arch/arc/lib/strchr-700.S
arch/arc/lib/strcmp-archs.S
arch/arc/lib/strcmp.S
arch/arc/lib/strcpy-700.S
arch/arc/lib/strlen.S

index e6890b1f8650647774b48678c88e805f6b16de3a..7c1f365ef3d20efe644635c07f9a22451190884c 100644 (file)
@@ -23,6 +23,7 @@
        .global __switch_to
        .type   __switch_to, @function
 __switch_to:
+       CFI_STARTPROC
 
        /* Save regs on kernel mode stack of task */
        st.a    blink, [sp, -4]
@@ -59,4 +60,4 @@ __switch_to:
        ld.ab   blink, [sp, 4]
        j       [blink]
 
-END(__switch_to)
+END_CFI(__switch_to)
index a4015e7d9ab7aa6862b41ab6138b7d64c715693e..21a103044b70ac45f58c85a1c9f10c9155bf5279 100644 (file)
@@ -16,7 +16,7 @@
 #define SHIFT r2
 #endif
 
-ENTRY(memcmp)
+ENTRY_CFI(memcmp)
        or      r12,r0,r1
        asl_s   r12,r12,30
        sub     r3,r2,1
@@ -149,4 +149,4 @@ ENTRY(memcmp)
 .Lnil:
        j_s.d   [blink]
        mov     r0,0
-END(memcmp)
+END_CFI(memcmp)
index 3222573e50de6aebce1837152c91f7f209d029bd..ba0beccdaafd7b971c5b1ba01597f4cf58fddada 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <linux/linkage.h>
 
-ENTRY(memcpy)
+ENTRY_CFI(memcpy)
        or      r3,r0,r1
        asl_s   r3,r3,30
        mov_s   r5,r0
@@ -63,4 +63,4 @@ ENTRY(memcpy)
 .Lendbloop:
        j_s.d   [blink]
        stb     r12,[r5,0]
-END(memcpy)
+END_CFI(memcpy)
index f96c75edf30af5b38ecb7aa73710bc523dbfd366..d61044dd8b58e0e6620984468b2c5acc1fb2870b 100644 (file)
@@ -40,7 +40,7 @@
 # define ZOLAND                        0xF
 #endif
 
-ENTRY(memcpy)
+ENTRY_CFI(memcpy)
        prefetch [r1]           ; Prefetch the read location
        prefetchw [r0]          ; Prefetch the write location
        mov.f   0, r2
@@ -233,4 +233,4 @@ ENTRY(memcpy)
 .Lcopybytewise_3:
        j       [blink]
 
-END(memcpy)
+END_CFI(memcpy)
index 365b183648154c70de1726955b9242e88d3cc60c..62ad4bcb841aa70811a637c3621d80190ed0c352 100644 (file)
@@ -10,7 +10,7 @@
 
 #undef PREALLOC_NOT_AVAIL
 
-ENTRY(memset)
+ENTRY_CFI(memset)
        prefetchw [r0]          ; Prefetch the write location
        mov.f   0, r2
 ;;; if size is zero
@@ -112,11 +112,11 @@ ENTRY(memset)
 
        j       [blink]
 
-END(memset)
+END_CFI(memset)
 
-ENTRY(memzero)
+ENTRY_CFI(memzero)
     ; adjust bzero args to memset args
     mov r2, r1
     b.d  memset    ;tail call so need to tinker with blink
     mov r1, 0
-END(memzero)
+END_CFI(memzero)
index d36bd43fc98d8e29ce13537ea0833e6b68c4c730..cf736f9aa403c5ad8a7f552b33a41802c43093f2 100644 (file)
@@ -10,7 +10,7 @@
 
 #define SMALL  7 /* Must be at least 6 to deal with alignment/loop issues.  */
 
-ENTRY(memset)
+ENTRY_CFI(memset)
        mov_s   r4,r0
        or      r12,r0,r2
        bmsk.f  r12,r12,1
@@ -46,14 +46,14 @@ ENTRY(memset)
        stb.ab  r1,[r4,1]
 .Ltiny_end:
        j_s     [blink]
-END(memset)
+END_CFI(memset)
 
 ; memzero: @r0 = mem, @r1 = size_t
 ; memset:  @r0 = mem, @r1 = char, @r2 = size_t
 
-ENTRY(memzero)
+ENTRY_CFI(memzero)
     ; adjust bzero args to memset args
     mov r2, r1
     mov r1, 0
     b  memset    ;tail call so need to tinker with blink
-END(memzero)
+END_CFI(memzero)
index b725d586210709d9020ec4cf4969d2187a3df24d..2d300daae2aea8e71b82aca9d9c427412e351a5c 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <linux/linkage.h>
 
-ENTRY(strchr)
+ENTRY_CFI(strchr)
        extb_s  r1,r1
        asl     r5,r1,8
        bmsk    r2,r0,1
@@ -130,4 +130,4 @@ ENTRY(strchr)
        j_s.d   [blink]
        mov.mi  r0,0
 #endif /* ENDIAN */
-END(strchr)
+END_CFI(strchr)
index 4f338eec33657f52c9ea8181a8b80c1a383b0e08..fae9e82a09ebc396252a81984274a9ac7c89112b 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <linux/linkage.h>
 
-ENTRY(strcmp)
+ENTRY_CFI(strcmp)
        or      r2, r0, r1
        bmsk_s  r2, r2, 1
        brne    r2, 0, @.Lcharloop
@@ -75,4 +75,4 @@ ENTRY(strcmp)
 .Lcmpend:
        j_s.d   [blink]
        sub     r0, r2, r3
-END(strcmp)
+END_CFI(strcmp)
index 3544600fefe6d6a480e432d5fff27fde69abbe0b..fb20096e5008245c5d2189271fc90fec63b988ca 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <linux/linkage.h>
 
-ENTRY(strcmp)
+ENTRY_CFI(strcmp)
        or      r2,r0,r1
        bmsk_s  r2,r2,1
        brne    r2,0,.Lcharloop
@@ -93,4 +93,4 @@ ENTRY(strcmp)
 .Lcmpend:
        j_s.d   [blink]
        sub     r0,r2,r3
-END(strcmp)
+END_CFI(strcmp)
index 8422f38e12183561855648e6c14fd8d042203185..6a6c1553807d77362af48c287f711261310de37c 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <linux/linkage.h>
 
-ENTRY(strcpy)
+ENTRY_CFI(strcpy)
        or      r2,r0,r1
        bmsk_s  r2,r2,1
        brne.d  r2,0,charloop
@@ -67,4 +67,4 @@ charloop:
        brne.d  r3,0,charloop
        stb.ab  r3,[r10,1]
        j       [blink]
-END(strcpy)
+END_CFI(strcpy)
index 53cfd5685a5f9f80d44d180daecddf9a9c245c87..839b44b8d05549ae03b129f4a2635e00fdd04089 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <linux/linkage.h>
 
-ENTRY(strlen)
+ENTRY_CFI(strlen)
        or      r3,r0,7
        ld      r2,[r3,-7]
        ld.a    r6,[r3,-3]
@@ -80,4 +80,4 @@ ENTRY(strlen)
 .Learly_end:
        b.d     .Lend
        sub_s.ne r1,r1,r1
-END(strlen)
+END_CFI(strlen)