Multi-file BPF C builds (#2393)
This commit is contained in:
11
programs/bpf/c/src/bench_alu/test_bench_alu.c
Normal file
11
programs/bpf/c/src/bench_alu/test_bench_alu.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include <criterion/criterion.h>
|
||||||
|
#include "bench_alu.c"
|
||||||
|
|
||||||
|
Test(bench_alu, sanity) {
|
||||||
|
uint64_t input[] = {500, 0};
|
||||||
|
|
||||||
|
cr_assert(entrypoint((uint8_t *) input));
|
||||||
|
|
||||||
|
cr_assert_eq(input[0], 500);
|
||||||
|
cr_assert_eq(input[1], 5);
|
||||||
|
}
|
14
programs/bpf/c/src/multiple_file/entrypoint.c
Normal file
14
programs/bpf/c/src/multiple_file/entrypoint.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* @brief Example C-based BPF program that prints out the parameters
|
||||||
|
* passed to it
|
||||||
|
*/
|
||||||
|
#include <solana_sdk.h>
|
||||||
|
|
||||||
|
#include "helper.h"
|
||||||
|
|
||||||
|
extern bool entrypoint(const uint8_t *input) {
|
||||||
|
sol_log(__FILE__);
|
||||||
|
helper_function();
|
||||||
|
sol_log(__FILE__);
|
||||||
|
return true;
|
||||||
|
}
|
11
programs/bpf/c/src/multiple_file/helper.c
Normal file
11
programs/bpf/c/src/multiple_file/helper.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* @brief Example C-based BPF program that prints out the parameters
|
||||||
|
* passed to it
|
||||||
|
*/
|
||||||
|
#include <solana_sdk.h>
|
||||||
|
|
||||||
|
#include "helper.h"
|
||||||
|
|
||||||
|
void helper_function(void) {
|
||||||
|
sol_log(__FILE__);
|
||||||
|
}
|
7
programs/bpf/c/src/multiple_file/helper.h
Normal file
7
programs/bpf/c/src/multiple_file/helper.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* @brief Example C-based BPF program that prints out the parameters
|
||||||
|
* passed to it
|
||||||
|
*/
|
||||||
|
#include <solana_sdk.h>
|
||||||
|
|
||||||
|
void helper_function(void);
|
@ -28,3 +28,4 @@ extern bool entrypoint(const uint8_t *input) {
|
|||||||
sol_log_params(ka, ka_len, data, data_len);
|
sol_log_params(ka, ka_len, data, data_len);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
121
sdk/bpf/bpf.mk
121
sdk/bpf/bpf.mk
@ -145,42 +145,56 @@ help:
|
|||||||
@echo ' - make dump_foo'
|
@echo ' - make dump_foo'
|
||||||
@echo ''
|
@echo ''
|
||||||
|
|
||||||
|
define C_RULE
|
||||||
|
$1: $2
|
||||||
|
@echo "[cc] $1 ($2)"
|
||||||
|
$(_@)mkdir -p $(dir $1)
|
||||||
|
$(_@)$(CC) $(BPF_C_FLAGS) -o $1 -c $2 -MD -MF $(1:.ll=.d)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define CC_RULE
|
||||||
|
$1: $2
|
||||||
|
@echo "[cxx] $1 ($2)"
|
||||||
|
$(_@)mkdir -p $(dir $1)
|
||||||
|
$(_@)$(CXX) $(BPF_CXX_FLAGS) -o $1 -c $2 -MD -MF $(1:.ll=.d)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define O_RULE
|
||||||
|
$1: $2
|
||||||
|
@echo "[llc] $1 ($2)"
|
||||||
|
$(_@)mkdir -p $(dir $1)
|
||||||
|
$(_@)$(LLC) $(BPF_LLC_FLAGS) -o $1 $2
|
||||||
|
endef
|
||||||
|
|
||||||
|
define SO_RULE
|
||||||
|
$1: $2
|
||||||
|
@echo "[lld] $1 ($2)"
|
||||||
|
$(_@)mkdir -p $(dir $1)
|
||||||
|
$(_@)$(LLD) $(BPF_LLD_FLAGS) --entry entrypoint -o $1 $2
|
||||||
|
endef
|
||||||
|
|
||||||
|
define TEST_C_RULE
|
||||||
|
$1: $2
|
||||||
|
@echo "[test cc] $1 ($2)"
|
||||||
|
$(_@)mkdir -p $(dir $1)
|
||||||
|
$(_@)$(CC) $(TEST_C_FLAGS) -o $1 $2 -MD -MF $(1:.o=.d)
|
||||||
|
$(_@)$(MACOS_ADJUST_TEST_DYLIB) $1
|
||||||
|
endef
|
||||||
|
|
||||||
|
define TEST_CC_RULE
|
||||||
|
$1: $2
|
||||||
|
@echo "[test cxx] $1 ($2)"
|
||||||
|
$(_@)mkdir -p $(dir $1)
|
||||||
|
$(_@)$(CXX) $(TEST_CXX_FLAGS) -o $1 $2 -MD -MF $(1:.o=.d)
|
||||||
|
$(_@)$(MACOS_ADJUST_TEST_DYLIB) $1
|
||||||
|
endef
|
||||||
|
|
||||||
.PHONY: $(INSTALL_SH)
|
.PHONY: $(INSTALL_SH)
|
||||||
$(INSTALL_SH):
|
$(INSTALL_SH):
|
||||||
$(INSTALL_SH)
|
$(_@)$(INSTALL_SH)
|
||||||
|
|
||||||
.PRECIOUS: $(OUT_DIR)/%.o
|
PROGRAM_NAMES := $(notdir $(basename $(wildcard $(SRC_DIR)/*)))
|
||||||
$(OUT_DIR)/%.o: $(SRC_DIR)/%.c $(INSTALL_SH)
|
# TEST_NAMES := $(addprefix test_,$(notdir $(basename $(wildcard $(TEST_DIR)/*.c))))
|
||||||
@echo "[cc] $@ ($<)"
|
|
||||||
$(_@)mkdir -p $(OUT_DIR)
|
|
||||||
$(_@)$(CC) $(BPF_C_FLAGS) -o $@ -c $< -MD -MF $(@:.o=.d)
|
|
||||||
|
|
||||||
$(OUT_DIR)/%.o: $(SRC_DIR)/%.cc $(INSTALL_SH)
|
|
||||||
@echo "[cxx] $@ ($<)"
|
|
||||||
$(_@)mkdir -p $(OUT_DIR)
|
|
||||||
$(_@)$(CXX) $(BPF_CXX_FLAGS) -o $@ -c $< -MD -MF $(@:.o=.d)
|
|
||||||
|
|
||||||
.PRECIOUS: $(OUT_DIR)/%.so
|
|
||||||
$(OUT_DIR)/%.so: $(OUT_DIR)/%.o $(INSTALL_SH)
|
|
||||||
@echo "[lld] $@ ($<)"
|
|
||||||
$(_@)$(LLD) $(BPF_LLD_FLAGS) -o $@ $<
|
|
||||||
|
|
||||||
$(OUT_DIR)/test_%: $(TEST_DIR)/%.c $(INSTALL_SH)
|
|
||||||
@echo "[test cc] $@ ($<)"
|
|
||||||
$(_@)mkdir -p $(OUT_DIR)
|
|
||||||
$(_@)$(CC) $(TEST_C_FLAGS) -o $@ $< -MD -MF $(@:=.d)
|
|
||||||
$(_@)$(MACOS_ADJUST_TEST_DYLIB) $@
|
|
||||||
|
|
||||||
$(OUT_DIR)/test_%: $(TEST_DIR)/%.cc $(INSTALL_SH)
|
|
||||||
@echo "[test cxx] $@ ($<)"
|
|
||||||
$(_@)mkdir -p $(OUT_DIR)
|
|
||||||
$(_@)$(CXX) $(TEST_CXX_FLAGS) -o $@ $< -MD -MF $(@:=.d)
|
|
||||||
$(_@)$(MACOS_ADJUST_TEST_DYLIB) $@
|
|
||||||
|
|
||||||
-include $(wildcard $(OUT_DIR)/*.d)
|
|
||||||
|
|
||||||
PROGRAM_NAMES := $(notdir $(basename $(wildcard $(SRC_DIR)/*.c $(SRC_DIR)/*.cc)))
|
|
||||||
TEST_NAMES := $(addprefix test_,$(notdir $(basename $(wildcard $(TEST_DIR)/*.c))))
|
|
||||||
|
|
||||||
define \n
|
define \n
|
||||||
|
|
||||||
@ -189,11 +203,44 @@ endef
|
|||||||
|
|
||||||
all: $(PROGRAM_NAMES)
|
all: $(PROGRAM_NAMES)
|
||||||
|
|
||||||
test: $(TEST_NAMES)
|
.PHONY: $(PROGRAM_NAMES)
|
||||||
$(foreach test, $(TEST_NAMES), $(OUT_DIR)/$(test)$(\n))
|
$(PROGRAM_NAMES): $(INSTALL_SH)
|
||||||
|
$(PROGRAM_NAMES): %: $(addprefix $(OUT_DIR)/, %.so)
|
||||||
|
|
||||||
$(PROGRAM_NAMES): %: $(addprefix $(OUT_DIR)/, %.so) ;
|
$(foreach PROGRAM, $(PROGRAM_NAMES), \
|
||||||
$(TEST_NAMES): %: $(addprefix $(OUT_DIR)/, %) ;
|
$(eval -include $(wildcard $(OUT_DIR)/$(PROGRAM)/*.d)) \
|
||||||
|
\
|
||||||
|
$(eval $(PROGRAM)_SRCS := \
|
||||||
|
$(addprefix $(SRC_DIR)/$(PROGRAM)/, \
|
||||||
|
$(filter-out test_%,$(notdir $(wildcard $(SRC_DIR)/$(PROGRAM)/*.c $(SRC_DIR)/$(PROGRAM)/*.cc))))) \
|
||||||
|
$(eval $(PROGRAM)_OBJS := $(subst $(SRC_DIR), $(OUT_DIR), \
|
||||||
|
$(patsubst %.c,%.o, \
|
||||||
|
$(patsubst %.cc,%.o,$($(PROGRAM)_SRCS))))) \
|
||||||
|
$(eval $(call SO_RULE,$(OUT_DIR)/$(PROGRAM).so,$($(PROGRAM)_OBJS))) \
|
||||||
|
$(foreach _,$(filter %.c,$($(PROGRAM)_SRCS)), \
|
||||||
|
$(eval $(call C_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%.o)),$_))) \
|
||||||
|
$(foreach _,$(filter %.cc,$($(PROGRAM)_SRCS)), \
|
||||||
|
$(eval $(call CC_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.cc=%.o)),$_))) \
|
||||||
|
\
|
||||||
|
$(eval TESTS := $(notdir $(basename $(wildcard $(SRC_DIR)/$(PROGRAM)/test_*.c)))) \
|
||||||
|
$(eval $(TESTS): %: $(addprefix $(OUT_DIR)/$(PROGRAM)/, %)) \
|
||||||
|
$(eval TEST_NAMES := $(TEST_NAMES) $(TESTS)) \
|
||||||
|
$(foreach TEST, $(TESTS), \
|
||||||
|
$(eval $(TEST)_SRCS := \
|
||||||
|
$(addprefix $(SRC_DIR)/$(PROGRAM)/, \
|
||||||
|
$(notdir $(wildcard $(SRC_DIR)/$(PROGRAM)/test_*.c $(SRC_DIR)/$(PROGRAM)/test_*.cc)))) \
|
||||||
|
$(foreach _,$(filter %.c,$($(TEST)_SRCS)), \
|
||||||
|
$(eval $(call TEST_C_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.c=%)),$_))) \
|
||||||
|
$(foreach _,$(filter %.cc, $($(TEST)_SRCS)), \
|
||||||
|
$(eval $(call TEST_CC_RULE,$(subst $(SRC_DIR),$(OUT_DIR),$(_:%.cc=%)),$_))) \
|
||||||
|
) \
|
||||||
|
)
|
||||||
|
|
||||||
|
test: $(TEST_NAMES)
|
||||||
|
$(foreach test, $(TEST_NAMES), $(OUT_DIR)/bench_alu/$(test)$(\n))
|
||||||
|
|
||||||
|
.PHONY: $(TEST_NAMES)
|
||||||
|
$(TEST_NAMES): $(INSTALL_SH)
|
||||||
|
|
||||||
dump_%: %
|
dump_%: %
|
||||||
$(_@)$(OBJ_DUMP) $(OBJ_DUMP_FLAGS) $(addprefix $(OUT_DIR)/, $(addsuffix .so, $<))
|
$(_@)$(OBJ_DUMP) $(OBJ_DUMP_FLAGS) $(addprefix $(OUT_DIR)/, $(addsuffix .so, $<))
|
||||||
|
@ -300,11 +300,11 @@ fn test_program_bpf_c() {
|
|||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
|
||||||
let programs = [
|
let programs = [
|
||||||
|
"multiple_static",
|
||||||
"noop",
|
"noop",
|
||||||
"noop++",
|
"noop++",
|
||||||
"struct_pass",
|
"struct_pass",
|
||||||
"struct_ret",
|
"struct_ret",
|
||||||
"multiple_static",
|
|
||||||
];
|
];
|
||||||
for program in programs.iter() {
|
for program in programs.iter() {
|
||||||
println!("Test program: {:?}", program);
|
println!("Test program: {:?}", program);
|
||||||
|
Reference in New Issue
Block a user