blob: 8a0121aabec0429793c2eec0e8281a74ca15e9ee [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001BPF_DEPENDS := @HAS_BPF_TOOLCHAIN +@NEED_BPF_TOOLCHAIN
2LLVM_VER:=
3
4CLANG_MIN_VER:=12
5
6ifneq ($(CONFIG_USE_LLVM_HOST),)
7 BPF_TOOLCHAIN_HOST_PATH:=$(call qstrip,$(CONFIG_BPF_TOOLCHAIN_HOST_PATH))
8 ifneq ($(BPF_TOOLCHAIN_HOST_PATH),)
9 BPF_PATH:=$(BPF_TOOLCHAIN_HOST_PATH)/bin:$(PATH)
10 else
11 BPF_PATH:=$(PATH)
12 endif
13 CLANG:=$(firstword $(shell PATH='$(BPF_PATH)' command -v clang clang-13 clang-12 clang-11))
14 LLVM_VER:=$(subst clang,,$(notdir $(CLANG)))
15endif
16ifneq ($(CONFIG_USE_LLVM_PREBUILT),)
17 CLANG:=$(TOPDIR)/llvm-bpf/bin/clang
18endif
19ifneq ($(CONFIG_USE_LLVM_BUILD),)
20 CLANG:=$(STAGING_DIR_HOST)/llvm-bpf/bin/clang
21endif
22
23LLVM_PATH:=$(dir $(CLANG))
24LLVM_LLC:=$(LLVM_PATH)/llc$(LLVM_VER)
25LLVM_DIS:=$(LLVM_PATH)/llvm-dis$(LLVM_VER)
26LLVM_OPT:=$(LLVM_PATH)/opt$(LLVM_VER)
27LLVM_STRIP:=$(LLVM_PATH)/llvm-strip$(LLVM_VER)
28
29BPF_KARCH:=mips
30BPF_ARCH:=mips$(if $(CONFIG_ARCH_64BIT),64)$(if $(CONFIG_BIG_ENDIAN),,el)
31BPF_TARGET:=bpf$(if $(CONFIG_BIG_ENDIAN),eb,el)
32
33BPF_HEADERS_DIR:=$(STAGING_DIR)/bpf-headers
34
35BPF_KERNEL_INCLUDE := \
36 -nostdinc -isystem $(TOOLCHAIN_ROOT_DIR)/lib/gcc/*/*/include \
37 $(patsubst %,-isystem%,$(TOOLCHAIN_INC_DIRS)) \
38 -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include \
39 -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/asm/mach-generic \
40 -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated \
41 -I$(BPF_HEADERS_DIR)/include \
42 -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/uapi \
43 -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated/uapi \
44 -I$(BPF_HEADERS_DIR)/include/uapi \
45 -I$(BPF_HEADERS_DIR)/include/generated/uapi \
46 -I$(BPF_HEADERS_DIR)/tools/lib \
47 -I$(BPF_HEADERS_DIR)/tools/testing/selftests \
48 -I$(BPF_HEADERS_DIR)/samples/bpf \
49 -include linux/kconfig.h -include asm_goto_workaround.h
50
51BPF_CFLAGS := \
52 $(BPF_KERNEL_INCLUDE) -I$(PKG_BUILD_DIR) \
53 -D__KERNEL__ -D__BPF_TRACING__ -DCONFIG_GENERIC_CSUM \
54 -D__TARGET_ARCH_${BPF_KARCH} \
55 -m$(if $(CONFIG_BIG_ENDIAN),big,little)-endian \
56 -fno-stack-protector -Wall \
57 -Wno-unused-value -Wno-pointer-sign \
58 -Wno-compare-distinct-pointer-types \
59 -Wno-gnu-variable-sized-type-not-at-end \
60 -Wno-address-of-packed-member -Wno-tautological-compare \
61 -Wno-unknown-warning-option \
62 -fno-asynchronous-unwind-tables \
63 -Wno-uninitialized -Wno-unused-variable \
64 -Wno-unused-label \
65 -O2 -emit-llvm -Xclang -disable-llvm-passes
66
67ifneq ($(CONFIG_HAS_BPF_TOOLCHAIN),)
68ifeq ($(DUMP)$(filter download refresh,$(MAKECMDGOALS)),)
69 CLANG_VER:=$(shell $(CLANG) --target=$(BPF_TARGET) -dM -E - < /dev/null | grep __clang_major__ | cut -d' ' -f3)
70 CLANG_VER_VALID:=$(shell [ "$(CLANG_VER)" -ge "$(CLANG_MIN_VER)" ] && echo 1 )
71 ifeq ($(CLANG_VER_VALID),)
72 $(error ERROR: LLVM/clang version too old. Minimum required: $(CLANG_MIN_VER), found: $(CLANG_VER))
73 endif
74endif
75endif
76
77define CompileBPF
78 $(CLANG) -g -target $(BPF_ARCH)-linux-gnu $(BPF_CFLAGS) $(2) \
79 -c $(1) -o $(patsubst %.c,%.bc,$(1))
80 $(LLVM_OPT) -O2 -mtriple=$(BPF_TARGET) < $(patsubst %.c,%.bc,$(1)) > $(patsubst %.c,%.opt,$(1))
81 $(LLVM_DIS) < $(patsubst %.c,%.opt,$(1)) > $(patsubst %.c,%.S,$(1))
82 $(LLVM_LLC) -march=$(BPF_TARGET) -mcpu=v3 -filetype=obj -o $(patsubst %.c,%.o,$(1)) < $(patsubst %.c,%.S,$(1))
83 $(CP) $(patsubst %.c,%.o,$(1)) $(patsubst %.c,%.debug.o,$(1))
84 $(LLVM_STRIP) --strip-debug $(patsubst %.c,%.o,$(1))
85endef
86