Skip to content
  • Wang Nan's avatar
    perf llvm: Allow dump llvm output object file using llvm.dump-obj · f0784649
    Wang Nan authored
    
    
    Add a 'llvm.dump-obj' config option to enable perf dump BPF object files
    compiled by LLVM.
    
    This option is useful when using BPF objects in embedded platforms.
    LLVM compiler won't be deployed in these platforms, and currently we
    don't support dynamic compiling library.
    
    Before this patch users have to explicitly issue llvm commands to
    compile BPF scripts, and can't use helpers (like include path detection
    and default macros) in perf. With this option, user is allowed to use
    perf to compile their BPF objects then copy them into their embedded
    platforms.
    
    Committer notice:
    
    Testing it:
    
      # cat ~/.perfconfig
      [llvm]
    	dump-obj = true
      #
      # ls -la filter.o
      ls: cannot access filter.o: No such file or directory
      # cat filter.c
      #include <uapi/linux/bpf.h>
      #define SEC(NAME) __attribute__((section(NAME), used))
    
      SEC("func=hrtimer_nanosleep rqtp->tv_nsec")
      int func(void *ctx, int err, long nsec)
      {
    	return nsec > 1000;
      }
      char _license[] SEC("license") = "GPL";
      int _version SEC("version") = LINUX_VERSION_CODE;
      # trace -e nanosleep --event filter.c usleep 6
      LLVM: dumping filter.o
         0.007 ( 0.007 ms): usleep/13976 nanosleep(rqtp: 0x7ffc5847f640                                        ) ...
         0.007 (         ): perf_bpf_probe:func:(ffffffff811137d0) tv_nsec=6000)
         0.070 ( 0.070 ms): usleep/13976  ... [continued]: nanosleep()) = 0
      # ls -la filter.o
      -rw-r--r--. 1 root root 776 Jun 20 17:01 filter.o
      # readelf -SW filter.o
      There are 7 section headers, starting at offset 0x148:
    
      Section Headers:
       [Nr] Name        Type       Address          Off    Size   ES Flg Lk Inf Al
       [ 0]             NULL       0000000000000000 000000 000000 00      0   0  0
       [ 1] .strtab     STRTAB     0000000000000000 0000e8 00005a 00      0   0  1
       [ 2] .text       PROGBITS   0000000000000000 000040 000000 00  AX  0   0  4
       [ 3] func=hrtimer_nanosleep rqtp->tv_nsec PROGBITS 0000000000000000 000040 000028 00  AX  0   0  8
       [ 4] license     PROGBITS   0000000000000000 000068 000004 00  WA  0   0  1
       [ 5] version     PROGBITS   0000000000000000 00006c 000004 00  WA  0   0  4
       [ 6] .symtab     SYMTAB     0000000000000000 000070 000078 18      1   2  8
      Key to Flags:
       W (write), A (alloc), X (execute), M (merge), S (strings)
       I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
       O (extra OS processing required) o (OS specific), p (processor specific)
       #
    
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1466064161-48553-2-git-send-email-wangnan0@huawei.com
    
    
    [ s/dumpping/dumping/g ]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    f0784649