• Wang Nan's avatar
    perf test llvm: Avoid error when PROFILE_ALL_BRANCHES is set · 9b57fb7e
    Wang Nan authored
    The 'if' keyword is a define that expands to complex code when
    CONFIG_PROFILE_ALL_BRANCHES is selected, which causes a 'perf test LLVM'
    failure like:
    
      $ ./perf test LLVM
      35: LLVM search and compile                    :
      35.1: Basic BPF llvm compile                    : Ok
      35.2: kbuild searching                          : Ok
      35.3: Compile source for BPF prologue generation: FAILED!
      35.4: Compile source for BPF relocation         : Skip
    
    The only affected test case is bpf-script-test-prologue.c
    because it uses kernel headers and has 'if' inside.
    
    This patch undefines 'if' to make it passes perf test.
    
    More detailed analysis from a message in this thread, also by Wang:
    
    The problem is caused by following relocation information:
    
      $ readelf -a ./llvmsubtest3
      ...
         [ 5] _ftrace_branch    PROGBITS         0000000000000000  00000260
              00000000000000a0  0000000000000000  WA       0     0     4
      ...
      Relocation section '.relfunc=null_lseek file->f_mode offset orig' at
      offset 0x490 contains 4 entries:
         Offset          Info           Type           Sym. Value    Sym. Name
      000000000038  000b00000001 unrecognized: 1       0000000000000000 _ftrace_branch
      0000000000b0  000b00000001 unrecognized: 1       0000000000000000 _ftrace_branch
      000000000128  000b00000001 unrecognized: 1       0000000000000000 _ftrace_branch
      0000000001c0  000b00000001 unrecognized: 1       0000000000000000 _ftrace_branch
    
      Relocation section '.rel_ftrace_branch' at offset 0x4d0 contains 8 entries:
         Offset          Info           Type           Sym. Value    Sym. Name
      000000000000  000200000001 unrecognized: 1       0000000000000000 .L__func__.bpf_func__n
      000000000008  000100000001 unrecognized: 1       0000000000000015 .L.str
      000000000028  000200000001 unrecognized: 1       0000000000000000 .L__func__.bpf_func__n
      000000000030  000100000001 unrecognized: 1       0000000000000015 .L.str
      000000000050  000200000001 unrecognized: 1       0000000000000000 .L__func__.bpf_func__n
      000000000058  000100000001 unrecognized: 1       0000000000000015 .L.str
      000000000078  000200000001 unrecognized: 1       0000000000000000 .L__func__.bpf_func__n
      000000000080  000100000001 unrecognized: 1       0000000000000015 .L.str
      ...
    
    So I think the failure is because you enabled CONFIG_PROFILE_ALL_BRANCHES.
    
    I can reproduce your buggy result by selecting
    CONFIG_PROFILE_ALL_BRANCHES in my kbuild:
    
      $ ./perf test LLVM
      35: LLVM search and compile                    :
      35.1: Basic BPF llvm compile                    : Ok
      35.2: kbuild searching                          : Ok
      35.3: Compile source for BPF prologue generation: FAILED!
      35.4: Compile source for BPF relocation         : Skip
    
    Simply undef CONFIG_PROFILE_ALL_BRANCHES in clang opts not working
    because it is introduced by "#include <uapi/linux/fs.h>", which override
    cmdline options. So I think the best way is to undefine 'if' inside BPF
    script.
    Reported-and-Tested-by: default avatarThomas-Mich Richter <tmricht@linux.vnet.ibm.com>
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
    Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
    Cc: Zefan Li <lizefan@huawei.com>
    Link: http://lkml.kernel.org/r/20170620183203.2517-1-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    9b57fb7e
bpf-script-test-prologue.c 1019 Bytes