diff --git a/programs/bpf/c/src/float/float.c b/programs/bpf/c/src/float/float.c new file mode 100644 index 0000000000..d20e63b49d --- /dev/null +++ b/programs/bpf/c/src/float/float.c @@ -0,0 +1,19 @@ +/** + * @brief Example C based BPF program that performs operations + * on floating point values. The test fails if floating point + * emulation functions were not linked to the module. + */ +#include + +extern uint64_t entrypoint(const uint8_t *input) { + SolAccountInfo ka[1]; + SolParameters params = (SolParameters) { .ka = ka }; + + if (!sol_deserialize(input, ¶ms, SOL_ARRAY_SIZE(ka))) { + return ERROR_INVALID_ARGUMENT; + } + uint32_t *data = (uint32_t *)(params.ka[0].data); + *data += 1.5; + + return SUCCESS; +} diff --git a/programs/bpf/tests/programs.rs b/programs/bpf/tests/programs.rs index c350c763aa..13cb6e21b6 100644 --- a/programs/bpf/tests/programs.rs +++ b/programs/bpf/tests/programs.rs @@ -431,6 +431,7 @@ fn test_program_bpf_sanity() { programs.extend_from_slice(&[ ("alloc", true), ("bpf_to_bpf", true), + ("float", true), ("multiple_static", true), ("noop", true), ("noop++", true), diff --git a/sdk/bpf/c/bpf.mk b/sdk/bpf/c/bpf.mk index 5ca3648f63..076cd5e6c6 100644 --- a/sdk/bpf/c/bpf.mk +++ b/sdk/bpf/c/bpf.mk @@ -15,7 +15,8 @@ OUT_DIR ?= ./out OS := $(shell uname) LLVM_DIR = $(LOCAL_PATH)../dependencies/bpf-tools/llvm -LLVM_SYSTEM_INC_DIRS := $(LLVM_DIR)/lib/clang/11.0.1/include +LLVM_SYSTEM_INC_DIRS := $(LLVM_DIR)/lib/clang/12.0.1/include +COMPILER_RT_DIR = $(LOCAL_PATH)../dependencies/bpf-tools/rust/lib/rustlib/bpfel-unknown-unknown/lib ifdef LLVM_DIR CC := $(LLVM_DIR)/bin/clang @@ -167,7 +168,7 @@ define SO_RULE $1: $2 @echo "[lld] $1 ($2)" $(_@)mkdir -p $(dir $1) - $(_@)$(LLD) $(BPF_LLD_FLAGS) -o $1 $2 + $(_@)$(LLD) $(BPF_LLD_FLAGS) -o $1 $2 $(COMPILER_RT_DIR)/libcompiler_builtins-*.rlib ifeq (,$(wildcard $(subst .so,-keypair.json,$1))) $(_@)solana-keygen new --no-passphrase --silent -o $(subst .so,-keypair.json,$1) endif