Failed to build arm64 bpf samples with LLVM 3.7 on 4.3 kernel
yang.shi at linaro.org
Tue Nov 10 15:10:42 PST 2015
On 11/10/2015 2:42 PM, Alexei Starovoitov wrote:
> On Tue, Nov 10, 2015 at 11:25 AM, Shi, Yang <yang.shi at linaro.org> wrote:
>> Hi guys,
>> I just tried to build arm64 bpf samples on 4.3 kernel, but LLVM complain:
>> LLVM ERROR: Inline asm not supported by this streamer because we don't have
>> an asm parser for this target
>> I took some time to bisect it, then found it is caused by sysreg.h
>> There is inline assembly macro defined in sysreg.h:
>> " .irp
>> " .equ __reg_num_x\\num, \\num\n"
>> " .endr\n"
>> " .equ __reg_num_xzr, 31\n"
>> " .macro mrs_s, rt, sreg\n"
>> " .inst 0xd5200000|(\\sreg)|(__reg_num_\\rt)\n"
>> " .endm\n"
>> " .macro msr_s, sreg, rt\n"
>> " .inst 0xd5000000|(\\sreg)|(__reg_num_\\rt)\n"
>> " .endm\n"
>> sysreg.h was not included by any other arm64 header files in 4.2, but in 4.3
>> it is included by futex.h and uaccess.h, which are included by bpf samples
>> via skbuff.h.
>> But, it sounds LLVM can't recognize it. I'm not familiar with LLVM, so any
>> Could it be worked around by some LLVM compile flags?
> hmm this used to work. I don't have arm64 setup anymore.
Yes, sysreg.h used to be not included by any header file.
> Try hacking it by adding #define __ASM_SYSREG_H to prevent inclusion
> of that file? all those asms are unused anyway.
> tracing samples include kernel headers to have exact struct layout.
> and #include skbuff.h can be removed from almost all samples.
> In-kernel 'struct sk_buff' only used inside tracex1_kern.c
The below change works:
clang $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \
- -D__KERNEL__ -Wno-unused-value -Wno-pointer-sign \
+ -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value
-O2 -emit-llvm -c $< -o -| $(LLC) -march=bpf
-filetype=obj -o $@
Is it ok for upstream too?
More information about the linux-arm-kernel