bpf.mk 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. BPF_DEPENDS := @HAS_BPF_TOOLCHAIN +@NEED_BPF_TOOLCHAIN
  2. CLANG_MIN_VER:=12
  3. ifneq ($(CONFIG_USE_LLVM_HOST),)
  4. find-llvm-tool=$(firstword $(shell PATH='$(BPF_PATH)' command -v $(1) || echo '$(firstword $(1))-not-found'))
  5. BPF_TOOLCHAIN_HOST_PATH:=$(call qstrip,$(CONFIG_BPF_TOOLCHAIN_HOST_PATH))
  6. ifneq ($(BPF_TOOLCHAIN_HOST_PATH),)
  7. BPF_PATH:=$(BPF_TOOLCHAIN_HOST_PATH)/bin:$(PATH)
  8. else
  9. BPF_PATH:=$(PATH)
  10. endif
  11. CLANG:=$(call find-llvm-tool,clang clang-13 clang-12)
  12. LLVM_VER:=$(subst clang,,$(notdir $(CLANG)))
  13. BPF_PATH:=$(dir $(CLANG)):$(BPF_PATH)
  14. LLVM_LLC:=$(call find-llvm-tool,llc$(LLVM_VER))
  15. LLVM_DIS:=$(call find-llvm-tool,llvm-dis$(LLVM_VER))
  16. LLVM_OPT:=$(call find-llvm-tool,opt$(LLVM_VER))
  17. LLVM_STRIP:=$(call find-llvm-tool,llvm-strip$(LLVM_VER))
  18. else
  19. LLVM_PATH:=/invalid
  20. ifneq ($(CONFIG_USE_LLVM_PREBUILT),)
  21. LLVM_PATH:=$(TOPDIR)/llvm-bpf/bin
  22. endif
  23. ifneq ($(CONFIG_USE_LLVM_BUILD),)
  24. LLVM_PATH:=$(STAGING_DIR_HOST)/llvm-bpf/bin
  25. endif
  26. CLANG:=$(LLVM_PATH)/clang
  27. LLVM_LLC:=$(LLVM_PATH)/llc
  28. LLVM_DIS:=$(LLVM_PATH)/llvm-dis
  29. LLVM_OPT:=$(LLVM_PATH)/opt
  30. LLVM_STRIP:=$(LLVM_PATH)/llvm-strip
  31. endif
  32. BPF_KARCH:=mips
  33. BPF_ARCH:=mips$(if $(CONFIG_ARCH_64BIT),64)$(if $(CONFIG_BIG_ENDIAN),,el)
  34. BPF_TARGET:=bpf$(if $(CONFIG_BIG_ENDIAN),eb,el)
  35. BPF_HEADERS_DIR:=$(STAGING_DIR)/bpf-headers
  36. BPF_KERNEL_INCLUDE := \
  37. -nostdinc -isystem $(TOOLCHAIN_ROOT_DIR)/lib/gcc/*/*/include \
  38. $(patsubst %,-isystem%,$(TOOLCHAIN_INC_DIRS)) \
  39. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include \
  40. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/asm/mach-generic \
  41. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated \
  42. -I$(BPF_HEADERS_DIR)/include \
  43. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/uapi \
  44. -I$(BPF_HEADERS_DIR)/arch/$(BPF_KARCH)/include/generated/uapi \
  45. -I$(BPF_HEADERS_DIR)/include/uapi \
  46. -I$(BPF_HEADERS_DIR)/include/generated/uapi \
  47. -I$(BPF_HEADERS_DIR)/tools/lib \
  48. -I$(BPF_HEADERS_DIR)/tools/testing/selftests \
  49. -I$(BPF_HEADERS_DIR)/samples/bpf \
  50. -include linux/kconfig.h -include asm_goto_workaround.h
  51. BPF_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. ifneq ($(CONFIG_HAS_BPF_TOOLCHAIN),)
  67. ifeq ($(DUMP)$(filter download refresh,$(MAKECMDGOALS)),)
  68. CLANG_VER:=$(shell $(CLANG) --target=$(BPF_TARGET) -dM -E - < /dev/null | grep __clang_major__ | cut -d' ' -f3)
  69. CLANG_VER_VALID:=$(shell [ "$(CLANG_VER)" -ge "$(CLANG_MIN_VER)" ] && echo 1 )
  70. ifeq ($(CLANG_VER_VALID),)
  71. $(error ERROR: LLVM/clang version too old. Minimum required: $(CLANG_MIN_VER), found: $(CLANG_VER))
  72. endif
  73. endif
  74. endif
  75. define CompileBPF
  76. $(CLANG) -g -target $(BPF_ARCH)-linux-gnu $(BPF_CFLAGS) $(2) \
  77. -c $(1) -o $(patsubst %.c,%.bc,$(1))
  78. $(LLVM_OPT) -O2 -mtriple=$(BPF_TARGET) < $(patsubst %.c,%.bc,$(1)) > $(patsubst %.c,%.opt,$(1))
  79. $(LLVM_DIS) < $(patsubst %.c,%.opt,$(1)) > $(patsubst %.c,%.S,$(1))
  80. $(LLVM_LLC) -march=$(BPF_TARGET) -mcpu=v3 -filetype=obj -o $(patsubst %.c,%.o,$(1)) < $(patsubst %.c,%.S,$(1))
  81. $(CP) $(patsubst %.c,%.o,$(1)) $(patsubst %.c,%.debug.o,$(1))
  82. $(LLVM_STRIP) --strip-debug $(patsubst %.c,%.o,$(1))
  83. endef