diff --git a/programs/bpf/c/src/bench_alu.c b/programs/bpf/c/src/bench_alu.c index 1099a65f17..5d804934e1 100644 --- a/programs/bpf/c/src/bench_alu.c +++ b/programs/bpf/c/src/bench_alu.c @@ -7,7 +7,8 @@ #include extern bool entrypoint(const uint8_t *input) { - uint64_t x = *(uint64_t *)input; + uint64_t x = *(uint64_t *) input; + uint64_t *result = (uint64_t *) input + 1; uint64_t count = 0; for (int i = 1; i <= x; i++) { @@ -23,5 +24,6 @@ extern bool entrypoint(const uint8_t *input) { } } - return count; + *result = count; + return true; } diff --git a/programs/native/bpf_loader/benches/bpf_loader.rs b/programs/native/bpf_loader/benches/bpf_loader.rs index 84aed99e8d..a4e5f9e4b0 100644 --- a/programs/native/bpf_loader/benches/bpf_loader.rs +++ b/programs/native/bpf_loader/benches/bpf_loader.rs @@ -5,12 +5,13 @@ extern crate solana_bpf_loader; extern crate solana_rbpf; extern crate test; -use byteorder::{LittleEndian, WriteBytesExt}; +use byteorder::{ByteOrder, LittleEndian, WriteBytesExt}; use solana_rbpf::EbpfVmRaw; use std::env; use std::fs::File; use std::io::Error; use std::io::Read; +use std::mem; use std::path::PathBuf; use test::Bencher; @@ -73,6 +74,7 @@ fn bench_program_alu(bencher: &mut Bencher) { inner_iter .write_u64::(ARMSTRONG_LIMIT) .unwrap(); + inner_iter.write_u64::(0).unwrap(); let mut file = File::open(create_bpf_path("bench_alu")).expect("file open failed"); let mut elf = Vec::new(); @@ -81,9 +83,15 @@ fn bench_program_alu(bencher: &mut Bencher) { println!("Interpreted:"); assert_eq!( - ARMSTRONG_EXPECTED, + 1, /*true*/ vm.execute_program(&mut inner_iter).unwrap() ); + assert_eq!(ARMSTRONG_LIMIT, LittleEndian::read_u64(&inner_iter)); + assert_eq!( + ARMSTRONG_EXPECTED, + LittleEndian::read_u64(&inner_iter[mem::size_of::()..]) + ); + bencher.iter(|| { vm.execute_program(&mut inner_iter).unwrap(); }); @@ -100,10 +108,16 @@ fn bench_program_alu(bencher: &mut Bencher) { vm.jit_compile().unwrap(); unsafe { assert_eq!( - ARMSTRONG_EXPECTED, + 1, /*true*/ vm.execute_program_jit(&mut inner_iter).unwrap() ); } + assert_eq!(ARMSTRONG_LIMIT, LittleEndian::read_u64(&inner_iter)); + assert_eq!( + ARMSTRONG_EXPECTED, + LittleEndian::read_u64(&inner_iter[mem::size_of::()..]) + ); + bencher.iter(|| unsafe { vm.execute_program_jit(&mut inner_iter).unwrap(); });