Skip to content

Commit 745be05

Browse files
committed
cranelift: Fuzz IshlI64 libcall
1 parent d8c2c38 commit 745be05

File tree

4 files changed

+17
-7
lines changed

4 files changed

+17
-7
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cranelift/fuzzgen/src/function_generator.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -833,12 +833,11 @@ where
833833
let signature = self.generate_signature()?;
834834
(name, signature)
835835
} else {
836-
// Use udivi64 as an example of a libcall function.
837-
let mut signature = Signature::new(CallConv::Fast);
838-
signature.params.push(AbiParam::new(I64));
839-
signature.params.push(AbiParam::new(I64));
840-
signature.returns.push(AbiParam::new(I64));
841-
(ExternalName::LibCall(LibCall::UdivI64), signature)
836+
// Use ishli64 as an example of a libcall function.
837+
// TODO: Expand this to more libcall's
838+
let libcall = LibCall::IshlI64;
839+
let signature = libcall.signature(CallConv::Fast);
840+
(ExternalName::LibCall(libcall), signature)
842841
};
843842

844843
let sig_ref = builder.import_signature(sig.clone());

fuzz/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ cranelift-interpreter = { path = "../cranelift/interpreter" }
1919
cranelift-fuzzgen = { path = "../cranelift/fuzzgen" }
2020
libfuzzer-sys = "0.4.0"
2121
target-lexicon = "0.12"
22+
smallvec = "1.6.1"
2223
wasmtime = { path = "../crates/wasmtime" }
2324
wasmtime-fuzzing = { path = "../crates/fuzzing" }
2425
component-test-util = { path = "../crates/misc/component-test-util" }

fuzz/fuzz_targets/cranelift-fuzzgen.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use libfuzzer_sys::fuzz_target;
44

55
use cranelift_codegen::data_value::DataValue;
6+
use cranelift_codegen::ir::LibCall;
67
use cranelift_codegen::settings;
78
use cranelift_codegen::settings::Configurable;
89
use cranelift_filetests::function_runner::{CompiledFunction, SingleFunctionCompiler};
@@ -12,6 +13,8 @@ use cranelift_interpreter::environment::FunctionStore;
1213
use cranelift_interpreter::interpreter::{Interpreter, InterpreterError, InterpreterState};
1314
use cranelift_interpreter::step::ControlFlow;
1415
use cranelift_interpreter::step::CraneliftTrap;
16+
use smallvec::smallvec;
17+
use std::ops::Shl;
1518

1619
const INTERPRETER_FUEL: u64 = 4096;
1720

@@ -56,7 +59,13 @@ fuzz_target!(|testcase: TestCase| {
5659
let mut env = FunctionStore::default();
5760
env.add(testcase.func.name.to_string(), &testcase.func);
5861

59-
let state = InterpreterState::default().with_function_store(env);
62+
let state = InterpreterState::default()
63+
.with_function_store(env)
64+
.with_libcall(LibCall::IshlI64, &|args| match &args[..] {
65+
[DataValue::I64(_), DataValue::I64(b)] if *b >= 63 => smallvec![DataValue::I64(0)],
66+
[DataValue::I64(a), DataValue::I64(b)] => smallvec![DataValue::I64(a.shl(b))],
67+
_ => unreachable!(),
68+
});
6069
let interpreter = Interpreter::new(state).with_fuel(Some(INTERPRETER_FUEL));
6170
interpreter
6271
};

0 commit comments

Comments
 (0)