bpf.mk 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. BPF_DEPENDS := @HAS_BPF_TOOLCHAIN
  2. LLVM_VER:=
  3. ifneq ($(CONFIG_USE_LLVM_HOST),)
  4. BPF_TOOLCHAIN_HOST_PATH:=$(call qstrip,$(CONFIG_BPF_TOOLCHAIN_HOST_PATH))
  5. ifneq ($(BPF_TOOLCHAIN_HOST_PATH),)
  6. BPF_PATH:=$(BPF_TOOLCHAIN_HOST_PATH)/bin:$(PATH)
  7. else
  8. BPF_PATH:=$(PATH)
  9. endif
  10. CLANG:=$(firstword $(shell PATH='$(BPF_PATH)' which clang clang-13 clang-12 clang-11))
  11. LLVM_VER:=$(subst clang,,$(notdir $(CLANG)))
  12. endif
  13. ifneq ($(CONFIG_USE_LLVM_PREBUILT),)
  14. CLANG:=$(TOPDIR)/llvm-bpf/bin/clang
  15. endif
  16. ifneq ($(CONFIG_USE_LLVM_BUILD),)
  17. CLANG:=$(STAGING_DIR_HOST)/llvm-bpf/bin/clang
  18. endif
  19. LLVM_PATH:=$(dir $(CLANG))
  20. LLVM_LLC:=$(LLVM_PATH)/llc$(LLVM_VER)
  21. LLVM_DIS:=$(LLVM_PATH)/llvm-dis$(LLVM_VER)
  22. LLVM_OPT:=$(LLVM_PATH)/opt$(LLVM_VER)
  23. LLVM_STRIP:=$(LLVM_PATH)/llvm-strip$(LLVM_VER)
  24. BPF_KARCH:=mips
  25. BPF_ARCH:=mips$(if $(CONFIG_BIG_ENDIAN),,el)
  26. BPF_TARGET:=bpf$(if $(CONFIG_BIG_ENDIAN),eb,el)
  27. BPF_HEADERS_DIR:=$(STAGING_DIR)/bpf-headers
  28. BPF_KERNEL_INCLUDE := \
  29. -nostdinc -isystem $(TOOLCHAIN_DIR)/include \
  30. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include \
  31. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/asm/mach-generic \
  32. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated \
  33. -I$(BPF_HEADERS_DIR)/include \
  34. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/uapi \
  35. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated/uapi \
  36. -I$(BPF_HEADERS_DIR)/include/uapi \
  37. -I$(BPF_HEADERS_DIR)/include/generated/uapi \
  38. -I$(BPF_HEADERS_DIR)/tools/lib \
  39. -I$(BPF_HEADERS_DIR)/tools/testing/selftests \
  40. -I$(BPF_HEADERS_DIR)/samples/bpf \
  41. -include linux/kconfig.h -include asm_goto_workaround.h
  42. BPF_CFLAGS := \
  43. $(BPF_KERNEL_INCLUDE) -I$(PKG_BUILD_DIR) \
  44. -D__KERNEL__ -D__BPF_TRACING__ \
  45. -D__TARGET_ARCH_${BPF_KARCH} \
  46. -m$(if $(CONFIG_BIG_ENDIAN),big,little)-endian \
  47. -fno-stack-protector -Wall \
  48. -Wno-unused-value -Wno-pointer-sign \
  49. -Wno-compare-distinct-pointer-types \
  50. -Wno-gnu-variable-sized-type-not-at-end \
  51. -Wno-address-of-packed-member -Wno-tautological-compare \
  52. -Wno-unknown-warning-option \
  53. -fno-asynchronous-unwind-tables \
  54. -Wno-uninitialized -Wno-unused-variable \
  55. -Wno-unused-label \
  56. -O2 -emit-llvm -Xclang -disable-llvm-passes
  57. define CompileBPF
  58. $(CLANG) -g -target $(BPF_ARCH)-linux-gnu $(BPF_CFLAGS) $(2) \
  59. -c $(1) -o $(patsubst %.c,%.bc,$(1))
  60. $(LLVM_OPT) -O2 -mtriple=$(BPF_TARGET) < $(patsubst %.c,%.bc,$(1)) > $(patsubst %.c,%.opt,$(1))
  61. $(LLVM_DIS) < $(patsubst %.c,%.opt,$(1)) > $(patsubst %.c,%.S,$(1))
  62. $(LLVM_LLC) -march=$(BPF_TARGET) -filetype=obj -o $(patsubst %.c,%.o,$(1)) < $(patsubst %.c,%.S,$(1))
  63. $(LLVM_STRIP) --strip-debug $(patsubst %.c,%.o,$(1))
  64. endef