• Alexei Starovoitov's avatar
    selftests/bpf: Add profiler test · 03d4d13f
    Alexei Starovoitov authored
    The main purpose of the profiler test to check different llvm generation
    patterns to make sure the verifier can load these large programs.
    
    Note that profiler.inc.h test doesn't follow strict kernel coding style.
    The code was formatted in the kernel style, but variable declarations are
    kept as-is to preserve original llvm IR pattern.
    
    profiler1.c should pass with older and newer llvm
    
    profiler[23].c may fail on older llvm that don't have:
    https://reviews.llvm.org/D85570
    because llvm may do speculative code motion optimization that
    will generate code like this:
    
    // r9 is a pointer to map_value
    // r7 is a scalar
    17:       bf 96 00 00 00 00 00 00 r6 = r9
    18:       0f 76 00 00 00 00 00 00 r6 += r7
    19:       a5 07 01 00 01 01 00 00 if r7 < 257 goto +1
    20:       bf 96 00 00 00 00 00 00 r6 = r9
    // r6 is used here
    
    The verifier will reject such code with the error:
    "math between map_value pointer and register with unbounded min value is not allowed"
    At insn 18 the r7 is indeed unbounded. The later insn 19 checks the bounds and
    the insn 20 undoes map_value addition. It is currently impossible for the
    verifier to understand such speculative pointer arithmetic. Hence llvm D85570
    addresses it on the compiler side.
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarYonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/bpf/20201009011240.48506-4-alexei.starovoitov@gmail.com
    03d4d13f
profiler2.c 173 Bytes