diff --git a/programs/bpf/build.rs b/programs/bpf/build.rs index 2d025c2f09..1c4f271cf1 100644 --- a/programs/bpf/build.rs +++ b/programs/bpf/build.rs @@ -67,7 +67,7 @@ fn main() { .expect("Unable to create BPF install directory") .success()); - let rust_programs = ["alloc", "dep_crate", "iter", "noop", "panic"]; + let rust_programs = ["alloc", "dep_crate", "iter", "many_args", "noop", "panic"]; for program in rust_programs.iter() { println!( "cargo:warning=(not a warning) Building Rust-based BPF programs: solana_bpf_rust_{}", diff --git a/programs/bpf/rust/many_args/.gitignore b/programs/bpf/rust/many_args/.gitignore new file mode 100644 index 0000000000..e13de17f65 --- /dev/null +++ b/programs/bpf/rust/many_args/.gitignore @@ -0,0 +1,3 @@ +/target/ + +Cargo.lock diff --git a/programs/bpf/rust/many_args/Cargo.toml b/programs/bpf/rust/many_args/Cargo.toml new file mode 100644 index 0000000000..48f027b1a3 --- /dev/null +++ b/programs/bpf/rust/many_args/Cargo.toml @@ -0,0 +1,23 @@ + +# Note: This crate must be built using build.sh + +[package] +name = "solana-bpf-rust-many-args" +version = "0.16.0" +description = "Solana BPF many-args program written in Rust" +authors = ["Solana Maintainers "] +repository = "https://github.com/solana-labs/solana" +license = "Apache-2.0" +homepage = "https://solana.com/" +edition = "2018" + +[dependencies] +solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust-utils", version = "0.16.0" } +solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "0.16.0" } + +[workspace] +members = [] + +[lib] +crate-type = ["cdylib"] +name = "solana_bpf_rust_many_args" diff --git a/programs/bpf/rust/many_args/Xargo.toml b/programs/bpf/rust/many_args/Xargo.toml new file mode 100644 index 0000000000..480d86ea29 --- /dev/null +++ b/programs/bpf/rust/many_args/Xargo.toml @@ -0,0 +1,6 @@ +[dependencies.compiler_builtins] +path = "../../../../sdk/bpf/rust-bpf-sysroot/src/compiler-builtins" +features = ["c", "mem"] + +[target.bpfel-unknown-unknown.dependencies] +alloc = { path = "../../../../sdk/bpf/rust-bpf-sysroot/src/liballoc" } \ No newline at end of file diff --git a/programs/bpf/rust/many_args/src/helper.rs b/programs/bpf/rust/many_args/src/helper.rs new file mode 100644 index 0000000000..46b888c277 --- /dev/null +++ b/programs/bpf/rust/many_args/src/helper.rs @@ -0,0 +1,22 @@ +//! @brief Example Rust-based BPF program tests loop iteration + +extern crate solana_sdk_bpf_utils; + +use solana_sdk_bpf_utils::log::*; + +pub fn many_args( + arg1: u64, + arg2: u64, + arg3: u64, + arg4: u64, + arg5: u64, + arg6: u64, + arg7: u64, + arg8: u64, + arg9: u64, +) -> u64 { + sol_log("same package"); + sol_log_64(arg1, arg2, arg3, arg4, arg5); + sol_log_64(arg6, arg7, arg8, arg9, 0); + arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9 +} diff --git a/programs/bpf/rust/many_args/src/lib.rs b/programs/bpf/rust/many_args/src/lib.rs new file mode 100644 index 0000000000..b3b758957d --- /dev/null +++ b/programs/bpf/rust/many_args/src/lib.rs @@ -0,0 +1,23 @@ +//! @brief Example Rust-based BPF program tests loop iteration + +#![no_std] + +mod helper; + +extern crate solana_sdk_bpf_utils; + +use solana_sdk_bpf_utils::log::*; + +#[no_mangle] +pub extern "C" fn entrypoint(_input: *mut u8) -> bool { + sol_log("call same package"); + assert_eq!(crate::helper::many_args(1, 2, 3, 4, 5, 6, 7, 8, 9), 45); + sol_log("call another package"); + assert_eq!( + solana_bpf_rust_many_args_dep::many_args(1, 2, 3, 4, 5, 6, 7, 8, 9), + 45 + ); + + sol_log("Success"); + true +} diff --git a/programs/bpf/rust/many_args_dep/.gitignore b/programs/bpf/rust/many_args_dep/.gitignore new file mode 100644 index 0000000000..e13de17f65 --- /dev/null +++ b/programs/bpf/rust/many_args_dep/.gitignore @@ -0,0 +1,3 @@ +/target/ + +Cargo.lock diff --git a/programs/bpf/rust/many_args_dep/Cargo.toml b/programs/bpf/rust/many_args_dep/Cargo.toml new file mode 100644 index 0000000000..fbb1239089 --- /dev/null +++ b/programs/bpf/rust/many_args_dep/Cargo.toml @@ -0,0 +1,19 @@ + +# Note: This crate must be built using build.sh + +[package] +name = "solana-bpf-rust-many-args-dep" +version = "0.16.0" +description = "Solana BPF many-args-dep program written in Rust" +authors = ["Solana Maintainers "] +repository = "https://github.com/solana-labs/solana" +license = "Apache-2.0" +homepage = "https://solana.com/" +edition = "2018" + +[dependencies] +solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust-utils", version = "0.16.0" } + +[workspace] +members = [] + diff --git a/programs/bpf/rust/many_args_dep/src/lib.rs b/programs/bpf/rust/many_args_dep/src/lib.rs new file mode 100644 index 0000000000..8f24671365 --- /dev/null +++ b/programs/bpf/rust/many_args_dep/src/lib.rs @@ -0,0 +1,24 @@ +//! @brief Solana Rust-based BPF program utility functions and types + +#![no_std] + +extern crate solana_sdk_bpf_utils; + +use solana_sdk_bpf_utils::log::*; + +pub fn many_args( + arg1: u64, + arg2: u64, + arg3: u64, + arg4: u64, + arg5: u64, + arg6: u64, + arg7: u64, + arg8: u64, + arg9: u64, +) -> u64 { + sol_log("another package"); + sol_log_64(arg1, arg2, arg3, arg4, arg5); + sol_log_64(arg6, arg7, arg8, arg9, 0); + arg1 + arg2 + arg3 + arg4 + arg5 + arg6 + arg7 + arg8 + arg9 +} diff --git a/programs/bpf/tests/programs.rs b/programs/bpf/tests/programs.rs index 23428f7446..56e4102cfb 100644 --- a/programs/bpf/tests/programs.rs +++ b/programs/bpf/tests/programs.rs @@ -86,6 +86,7 @@ mod bpf { let programs = [ ("solana_bpf_rust_alloc", true), ("solana_bpf_rust_iter", true), + // ("solana_bpf_rust_many_args", true), // Issue #3099 ("solana_bpf_rust_noop", true), ("solana_bpf_rust_dep_crate", true), ("solana_bpf_rust_panic", false),