• Sukadev Bhattiprolu's avatar
    perf tools powerpc: Adjust callchain based on DWARF debug info · a60335ba
    Sukadev Bhattiprolu authored
    When saving the callchain on Power, the kernel conservatively saves excess
    entries in the callchain. A few of these entries are needed in some cases
    but not others. We should use the DWARF debug information to determine
    when the entries are  needed.
    
    Eg: the value in the link register (LR) is needed only when it holds the
    return address of a function. At other times it must be ignored.
    
    If the unnecessary entries are not ignored, we end up with duplicate arcs
    in the call-graphs.
    
    Use the DWARF debug information to determine if any callchain entries
    should be ignored when building call-graphs.
    
    Callgraph before the patch:
    
        14.67%          2234  sprintft  libc-2.18.so       [.] __random
                |
                --- __random
                   |
                   |--61.12%-- __random
                   |          |
                   |          |--97.15%-- rand
                   |          |          do_my_sprintf
                   |          |          main
                   |          |          generic_start_main.isra.0
                   |          |          __libc_start_main
                   |          |          0x0
                   |          |
                   |           --2.85%-- do_my_sprintf
                   |                     main
                   |                     generic_start_main.isra.0
                   |                     __libc_start_main
                   |                     0x0
                   |
                    --38.88%-- rand
                              |
                              |--94.01%-- rand
                              |          do_my_sprintf
                              |          main
                              |          generic_start_main.isra.0
                              |          __libc_start_main
                              |          0x0
                              |
                               --5.99%-- do_my_sprintf
                                         main
                                         generic_start_main.isra.0
                                         __libc_start_main
                                         0x0
    
    Callgraph after the patch:
    
        14.67%          2234  sprintft  libc-2.18.so       [.] __random
                |
                --- __random
                   |
                   |--95.93%-- rand
                   |          do_my_sprintf
                   |          main
                   |          generic_start_main.isra.0
                   |          __libc_start_main
                   |          0x0
                   |
                    --4.07%-- do_my_sprintf
                              main
                              generic_start_main.isra.0
                              __libc_start_main
                              0x0
    
    TODO:	For split-debug info objects like glibc, we can only determine
    	the call-frame-address only when both .eh_frame and .debug_info
    	sections are available. We should be able to determin the CFA
    	even without the .eh_frame section.
    
    Fix suggested by Anton Blanchard.
    
    Thanks to valuable input on DWARF debug information from Ulrich Weigand.
    Reported-by: default avatarMaynard Johnson <maynard@us.ibm.com>
    Tested-by: default avatarMaynard Johnson <maynard@us.ibm.com>
    Signed-off-by: default avatarSukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Link: http://lkml.kernel.org/r/20140625154903.GA29607@us.ibm.comSigned-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    a60335ba
machine.c 34.3 KB