X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=include%2Fbpf.mk;h=7d0cfbd76db45ef17d0778ea817a1f74ebba6035;hb=044ca149f36a08f56fe827a20aa113837c58cb40;hp=5211ec44349519db6591ef1d566769f4ad32f83c;hpb=6738820bf637fd705ea7e61acf4f694e1bcda313;p=openwrt%2Fopenwrt.git diff --git a/include/bpf.mk b/include/bpf.mk index 5211ec4434..7d0cfbd76d 100644 --- a/include/bpf.mk +++ b/include/bpf.mk @@ -1,17 +1,23 @@ BPF_DEPENDS := @HAS_BPF_TOOLCHAIN +LLVM_VER:= -ifneq ($(CONFIG_BPF_TOOLCHAIN_HOST),) +CLANG_MIN_VER:=12 + +ifneq ($(CONFIG_USE_LLVM_HOST),) BPF_TOOLCHAIN_HOST_PATH:=$(call qstrip,$(CONFIG_BPF_TOOLCHAIN_HOST_PATH)) ifneq ($(BPF_TOOLCHAIN_HOST_PATH),) BPF_PATH:=$(BPF_TOOLCHAIN_HOST_PATH)/bin:$(PATH) else - BPF_PATH:=$(BPF_PATH) + BPF_PATH:=$(PATH) endif - CLANG:=$(firstword $(shell PATH='$(BPF_PATH)' which clang clang-13 clang-12 clang-11)) + CLANG:=$(firstword $(shell PATH='$(BPF_PATH)' command -v clang clang-13 clang-12 clang-11)) LLVM_VER:=$(subst clang,,$(notdir $(CLANG))) -else - CLANG:=$(STAGING_DIR_HOST)/bin/clang - LLVM_VER:= +endif +ifneq ($(CONFIG_USE_LLVM_PREBUILT),) + CLANG:=$(TOPDIR)/llvm-bpf/bin/clang +endif +ifneq ($(CONFIG_USE_LLVM_BUILD),) + CLANG:=$(STAGING_DIR_HOST)/llvm-bpf/bin/clang endif LLVM_PATH:=$(dir $(CLANG)) @@ -21,7 +27,8 @@ LLVM_OPT:=$(LLVM_PATH)/opt$(LLVM_VER) LLVM_STRIP:=$(LLVM_PATH)/llvm-strip$(LLVM_VER) BPF_KARCH:=mips -BPF_ARCH:=mips$(if $(CONFIG_BIG_ENDIAN),,el) +BPF_ARCH:=mips$(if $(CONFIG_ARCH_64BIT),64)$(if $(CONFIG_BIG_ENDIAN),,el) +BPF_TARGET:=bpf$(if $(CONFIG_BIG_ENDIAN),eb,el) BPF_HEADERS_DIR:=$(STAGING_DIR)/bpf-headers @@ -42,7 +49,7 @@ BPF_KERNEL_INCLUDE := \ BPF_CFLAGS := \ $(BPF_KERNEL_INCLUDE) -I$(PKG_BUILD_DIR) \ - -D__KERNEL__ -D__BPF_TRACING__ \ + -D__KERNEL__ -D__BPF_TRACING__ -DCONFIG_GENERIC_CSUM \ -D__TARGET_ARCH_${BPF_KARCH} \ -m$(if $(CONFIG_BIG_ENDIAN),big,little)-endian \ -fno-stack-protector -Wall \ @@ -56,12 +63,21 @@ BPF_CFLAGS := \ -Wno-unused-label \ -O2 -emit-llvm -Xclang -disable-llvm-passes +ifeq ($(DUMP),) + CLANG_VER:=$(shell $(CLANG) -dM -E - < /dev/null | grep __clang_major__ | cut -d' ' -f3) + CLANG_VER_VALID:=$(shell [ "$(CLANG_VER)" -ge "$(CLANG_MIN_VER)" ] && echo 1 ) + ifeq ($(CLANG_VER_VALID),) + $(error ERROR: LLVM/clang version too old. Minimum required: $(CLANG_MIN_VER), found: $(CLANG_VER)) + endif +endif + define CompileBPF $(CLANG) -g -target $(BPF_ARCH)-linux-gnu $(BPF_CFLAGS) $(2) \ -c $(1) -o $(patsubst %.c,%.bc,$(1)) - $(LLVM_OPT) -O2 -mtriple=bpf-pc-linux < $(patsubst %.c,%.bc,$(1)) > $(patsubst %.c,%.opt,$(1)) + $(LLVM_OPT) -O2 -mtriple=$(BPF_TARGET) < $(patsubst %.c,%.bc,$(1)) > $(patsubst %.c,%.opt,$(1)) $(LLVM_DIS) < $(patsubst %.c,%.opt,$(1)) > $(patsubst %.c,%.S,$(1)) - $(LLVM_LLC) -march=bpf -filetype=obj -o $(patsubst %.c,%.o,$(1)) < $(patsubst %.c,%.S,$(1)) + $(LLVM_LLC) -march=$(BPF_TARGET) -mcpu=v3 -filetype=obj -o $(patsubst %.c,%.o,$(1)) < $(patsubst %.c,%.S,$(1)) + $(CP) $(patsubst %.c,%.o,$(1)) $(patsubst %.c,%.debug.o,$(1)) $(LLVM_STRIP) --strip-debug $(patsubst %.c,%.o,$(1)) endef