Re: perf test LLVM & clang 6 failing

From: Arnaldo Carvalho de Melo
Date: Fri Nov 24 2017 - 14:09:33 EST


Em Fri, Nov 24, 2017 at 04:16:52PM +0100, Daniel Borkmann escreveu:
> [ +Yonghong ]
>
> On 11/24/2017 03:47 PM, Arnaldo Carvalho de Melo wrote:
> > FYI, just noticed, recently updated clang to version 6, from its
> > upstream git repo.
>
> Do you recall what was your LLVM version prior to this where it was
> working fine? (Wild guess from below would be the BPF inline asm

IIRC it was 4.0

> support that was added recently to LLVM (2865ab6996) vs asm() used
> in headers included in the stdin header causing trouble due to arch
> mixup?)
>
> > root@jouet ~]# perf test -v LLVM
> > 37: LLVM search and compile :
> > 37.1: Basic BPF llvm compile :
> > --- start ---
> > test child forked, pid 5255
> > Kernel build dir is set to /lib/modules/4.14.0+/build
> > set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> > unset env: KBUILD_OPTS
> > include option is set to -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> > set env: NR_CPUS=4
> > set env: LINUX_VERSION_CODE=0x40e00
> > set env: CLANG_EXEC=/usr/local/bin/clang
> > set env: CLANG_OPTIONS=-xc
> > set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> > set env: WORKING_DIR=/lib/modules/4.14.0+/build
> > set env: CLANG_SOURCE=-
> > llvm compiling command template: echo '/*
> > * bpf-script-example.c
> > * Test basic LLVM building
> > */
> > #ifndef LINUX_VERSION_CODE
> > # error Need LINUX_VERSION_CODE
> > # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> > #endif
> > #define BPF_ANY 0
> > #define BPF_MAP_TYPE_ARRAY 2
> > #define BPF_FUNC_map_lookup_elem 1
> > #define BPF_FUNC_map_update_elem 2
> >
> > static void *(*bpf_map_lookup_elem)(void *map, void *key) =
> > (void *) BPF_FUNC_map_lookup_elem;
> > static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) =
> > (void *) BPF_FUNC_map_update_elem;
> >
> > struct bpf_map_def {
> > unsigned int type;
> > unsigned int key_size;
> > unsigned int value_size;
> > unsigned int max_entries;
> > };
> >
> > #define SEC(NAME) __attribute__((section(NAME), used))
> > struct bpf_map_def SEC("maps") flip_table = {
> > .type = BPF_MAP_TYPE_ARRAY,
> > .key_size = sizeof(int),
> > .value_size = sizeof(int),
> > .max_entries = 1,
> > };
> >
> > SEC("func=SyS_epoll_wait")
> > int bpf_func__SyS_epoll_wait(void *ctx)
> > {
> > int ind =0;
> > int *flag = bpf_map_lookup_elem(&flip_table, &ind);
> > int new_flag;
> > if (!flag)
> > return 0;
> > /* flip flag and store back */
> > new_flag = !*flag;
> > bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
> > return new_flag;
> > }
> > char _license[] SEC("license") = "GPL";
> > int _version SEC("version") = LINUX_VERSION_CODE;
> > ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> > test child finished with 0
> > ---- end ----
> > LLVM search and compile subtest 0: Ok
> > 37.2: kbuild searching :
> > --- start ---
> > test child forked, pid 5728
> > Kernel build dir is set to /lib/modules/4.14.0+/build
> > set env: KBUILD_DIR=/lib/modules/4.14.0+/build
> > unset env: KBUILD_OPTS
> > include option is set to -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> > set env: NR_CPUS=4
> > set env: LINUX_VERSION_CODE=0x40e00
> > set env: CLANG_EXEC=/usr/local/bin/clang
> > set env: CLANG_OPTIONS=-xc
> > set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
> > set env: WORKING_DIR=/lib/modules/4.14.0+/build
> > set env: CLANG_SOURCE=-
> > llvm compiling command template: echo '/*
> > * bpf-script-test-kbuild.c
> > * Test include from kernel header
> > */
> > #ifndef LINUX_VERSION_CODE
> > # error Need LINUX_VERSION_CODE
> > # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
> > #endif
> > #define SEC(NAME) __attribute__((section(NAME), used))
> >
> > #include <uapi/linux/fs.h>
> > #include <uapi/asm/ptrace.h>
> >
> > SEC("func=vfs_llseek")
> > int bpf_func__vfs_llseek(void *ctx)
> > {
> > return 0;
> > }
> >
> > char _license[] SEC("license") = "GPL";
> > int _version SEC("version") = LINUX_VERSION_CODE;
> > ' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
> > In file included from <stdin>:12:
> > In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
> > In file included from /home/acme/git/linux/include/linux/compiler.h:237:
> > In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
> > In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
> > register unsigned long current_stack_pointer asm(_ASM_SP);
> > ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
> > #define _ASM_SP __ASM_REG(sp)
> > ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
> > #define __ASM_REG(reg) __ASM_SEL_RAW(e##reg, r##reg)
> > ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
> > # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
> > ^
> > /home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
> > # define __ASM_FORM_RAW(x) #x
> > ^
> > <scratch space>:4:1: note: expanded from here
> > "esp"
> > ^
> > 1 error generated.
> > ERROR: unable to compile -
> > Hint: Check error message shown above.
> > Hint: You can also pre-compile it into .o using:
> > clang -target bpf -O2 -c -
> > with proper -I and -D options.
> > Failed to compile test case: 'kbuild searching'
> > test child finished with -1
> > ---- end ----
> > LLVM search and compile subtest 1: FAILED!
> > 37.3: Compile source for BPF prologue generation :
> > --- force skipped ---
> > LLVM search and compile subtest 2: Skip
> > 37.4: Compile source for BPF relocation :
> > --- force skipped ---
> > LLVM search and compile subtest 3: Skip
> > [root@jouet ~]# clang -v
> > clang version 6.0.0 (http://llvm.org/git/clang.git 56cc8f8880db2ebc433eeb6b6a707c101467a186) (http://llvm.org/git/llvm.git 3656d83960a4f3fedf6d8f19043abf52379f78c3)
> > Target: x86_64-unknown-linux-gnu
> > Thread model: posix
> > InstalledDir: /usr/local/bin
> > Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
> > Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/7
> > Candidate multilib: .;@m64
> > Candidate multilib: 32;@m32
> > Selected multilib: .;@m64
> > [root@jouet ~]#
> >