• Kim Phillips's avatar
    perf annotate: Fix branch instruction with multiple operands · b13bbeee
    Kim Phillips authored
    'perf annotate' is dropping the cr* fields from branch instructions.
    
    Fix it by adding support to display branch instructions having
    multiple operands.
    
    Power Arch objdump of int_sqrt:
    
     20.36 | c0000000004d2694:   subf   r10,r10,r3
           | c0000000004d2698: v bgt    cr6,c0000000004d26a0 <int_sqrt+0x40>
      1.82 | c0000000004d269c:   mr     r3,r10
     29.18 | c0000000004d26a0:   mr     r10,r8
           | c0000000004d26a4: v bgt    cr7,c0000000004d26ac <int_sqrt+0x4c>
           | c0000000004d26a8:   mr     r10,r7
    
    Power Arch Before Patch:
    
     20.36 |       subf   r10,r10,r3
           |     v bgt    40
      1.82 |       mr     r3,r10
     29.18 | 40:   mr     r10,r8
           |     v bgt    4c
           |       mr     r10,r7
    
    Power Arch After patch:
    
     20.36 |       subf   r10,r10,r3
           |     v bgt    cr6,40
      1.82 |       mr     r3,r10
     29.18 | 40:   mr     r10,r8
           |     v bgt    cr7,4c
           |       mr     r10,r7
    
    Also support AArch64 conditional branch instructions, which can
    have up to three operands:
    
    Aarch64 Non-simplified (raw objdump) view:
    
           │ffff0000083cd11c: ↑ cbz    w0, ffff0000083cd100 <security_fil▒
    ...
      4.44 │ffff000│083cd134: ↓ tbnz   w0, #26, ffff0000083cd190 <securit▒
    ...
      1.37 │ffff000│083cd144: ↓ tbnz   w22, #5, ffff0000083cd1a4 <securit▒
           │ffff000│083cd148:   mov    w19, #0x20000                   //▒
      1.02 │ffff000│083cd14c: ↓ tbz    w22, #2, ffff0000083cd1ac <securit▒
    ...
      0.68 │ffff000└──3cd16c: ↑ cbnz   w0, ffff0000083cd120 <security_fil▒
    
    Aarch64 Simplified, before this patch:
    
           │    ↑ cbz    40
    ...
      4.44 │   │↓ tbnz   w0, #26, ffff0000083cd190 <security_file_permiss▒
    ...
      1.37 │   │↓ tbnz   w22, #5, ffff0000083cd1a4 <security_file_permiss▒
           │   │  mov    w19, #0x20000                   // #131072
      1.02 │   │↓ tbz    w22, #2, ffff0000083cd1ac <security_file_permiss▒
    ...
      0.68 │   └──cbnz   60
    
    the cbz operand is missing, and the tbz doesn't get simplified processing
    at all because the parsing function failed to match an address.
    
    Aarch64 Simplified, After this patch applied:
    
           │    ↑ cbz    w0, 40
    ...
      4.44 │   │↓ tbnz   w0, #26, d0
    ...
      1.37 │   │↓ tbnz   w22, #5, e4
           │   │  mov    w19, #0x20000                   // #131072
      1.02 │   │↓ tbz    w22, #2, ec
    ...
      0.68 │   └──cbnz   w0, 60
    Originally-by: default avatarRavi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
    Tested-by: default avatarRavi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
    Reported-by: default avatarAnton Blanchard <anton@samba.org>
    Reported-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarKim Phillips <kim.phillips@arm.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Christian Borntraeger <borntraeger@de.ibm.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Taeung Song <treeze.taeung@gmail.com>
    Link: http://lkml.kernel.org/r/20170601092959.f60d98912e8a1b66fd1e4c0e@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    b13bbeee
annotate.c 44.4 KB