• Sandipan Das's avatar
    perf powerpc: Fix callchain ip filtering when return address is in a register · 9068533e
    Sandipan Das authored
    For powerpc64, perf will filter out the second entry in the callchain,
    i.e. the LR value, if the return address of the function corresponding
    to the probed location has already been saved on its caller's stack.
    
    The state of the return address is determined using debug information.
    At any point within a function, if the return address is already saved
    somewhere, a DWARF expression can tell us about its location. If the
    return address in still in LR only, no DWARF expression would exist.
    
    Typically, the instructions in a function's prologue first copy the LR
    value to R0 and then pushes R0 on to the stack. If LR has already been
    copied to R0 but R0 is yet to be pushed to the stack, we can still get a
    DWARF expression that says that the return address is in R0. This is
    indicating that getting a DWARF expression for the return address does
    not guarantee the fact that it has already been saved on the stack.
    
    This can be observed on a powerpc64le system running Fedora 27 as shown
    below.
    
      # objdump -d /usr/lib64/libc-2.26.so | less
      ...
      000000000015af20 <inet_pton>:
        15af20:       0b 00 4c 3c     addis   r2,r12,11
        15af24:       e0 c1 42 38     addi    r2,r2,-15904
        15af28:       a6 02 08 7c     mflr    r0
        15af2c:       f0 ff c1 fb     std     r30,-16(r1)
        15af30:       f8 ff e1 fb     std     r31,-8(r1)
        15af34:       78 1b 7f 7c     mr      r31,r3
        15af38:       78 23 83 7c     mr      r3,r4
        15af3c:       78 2b be 7c     mr      r30,r5
        15af40:       10 00 01 f8     std     r0,16(r1)
        15af44:       c1 ff 21 f8     stdu    r1,-64(r1)
        15af48:       28 00 81 f8     std     r4,40(r1)
      ...
    
      # readelf --debug-dump=frames-interp /usr/lib64/libc-2.26.so | less
      ...
      00027024 0000000000000024 00027028 FDE cie=00000000 pc=000000000015af20..000000000015af88
         LOC           CFA      r30   r31   ra
      000000000015af20 r1+0     u     u     u
      000000000015af34 r1+0     c-16  c-8   r0
      000000000015af48 r1+64    c-16  c-8   c+16
      000000000015af5c r1+0     c-16  c-8   c+16
      000000000015af78 r1+0     u     u
      ...
    
      # perf probe -x /usr/lib64/libc-2.26.so -a inet_pton+0x18
      # perf record -e probe_libc:inet_pton -g ping -6 -c 1 ::1
      # perf script
    
    Before:
    
      ping  2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
                  7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
                  7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
                     12f152d70 _init+0xbfc (/usr/bin/ping)
                  7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
                  7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
                             0 [unknown] ([unknown])
    
    After:
    
      ping  2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
                  7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
                  7fff7e26fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)
                  7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
                     12f152d70 _init+0xbfc (/usr/bin/ping)
                  7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
                  7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
                             0 [unknown] ([unknown])
    Reported-by: default avatarRavi Bangoria <ravi.bangoria@linux.ibm.com>
    Signed-off-by: default avatarSandipan Das <sandipan@linux.ibm.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Maynard Johnson <maynard@us.ibm.com>
    Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Cc: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
    Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Link: http://lkml.kernel.org/r/66e848a7bdf2d43b39210a705ff6d828a0865661.1530724939.git.sandipan@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    9068533e
skip-callchain-idx.c 6.88 KB