1
1
#![ no_main]
2
+ #![ deny( unused_variables) ]
2
3
3
4
use anyhow:: Result ;
4
5
use libfuzzer_sys:: { arbitrary, arbitrary:: Arbitrary , fuzz_target} ;
5
6
use wasm_smith:: { Config , ConfiguredModule } ;
6
7
use wasmer:: { imports, CompilerConfig , Instance , Module , Store , Val } ;
8
+ #[ cfg( feature = "cranelift" ) ]
7
9
use wasmer_compiler_cranelift:: Cranelift ;
10
+ #[ cfg( feature = "llvm" ) ]
8
11
use wasmer_compiler_llvm:: LLVM ;
12
+ #[ cfg( feature = "singlepass" ) ]
9
13
use wasmer_compiler_singlepass:: Singlepass ;
10
14
use wasmer_engine_jit:: JIT ;
11
15
@@ -27,6 +31,7 @@ impl Config for ExportedFunctionConfig {
27
31
}
28
32
}
29
33
34
+ #[ cfg( feature = "singlepass" ) ]
30
35
fn maybe_instantiate_singlepass ( wasm_bytes : & [ u8 ] ) -> Result < Option < Instance > > {
31
36
let compiler = Singlepass :: default ( ) ;
32
37
let store = Store :: new ( & JIT :: new ( compiler) . engine ( ) ) ;
@@ -45,6 +50,7 @@ fn maybe_instantiate_singlepass(wasm_bytes: &[u8]) -> Result<Option<Instance>> {
45
50
Ok ( Some ( instance) )
46
51
}
47
52
53
+ #[ cfg( feature = "cranelift" ) ]
48
54
fn maybe_instantiate_cranelift ( wasm_bytes : & [ u8 ] ) -> Result < Option < Instance > > {
49
55
let mut compiler = Cranelift :: default ( ) ;
50
56
compiler. canonicalize_nans ( true ) ;
@@ -55,6 +61,7 @@ fn maybe_instantiate_cranelift(wasm_bytes: &[u8]) -> Result<Option<Instance>> {
55
61
Ok ( Some ( instance) )
56
62
}
57
63
64
+ #[ cfg( feature = "llvm" ) ]
58
65
fn maybe_instantiate_llvm ( wasm_bytes : & [ u8 ] ) -> Result < Option < Instance > > {
59
66
let mut compiler = LLVM :: default ( ) ;
60
67
compiler. canonicalize_nans ( true ) ;
@@ -78,15 +85,14 @@ impl PartialEq for InstanceResult {
78
85
if let InstanceResult :: Error ( other_message) = other {
79
86
return self_message == other_message;
80
87
}
81
- return false ;
82
88
}
83
89
InstanceResult :: Values ( self_values) => {
84
90
if let InstanceResult :: Values ( other_values) = other {
85
91
return self_values == other_values;
86
92
}
87
- return false ;
88
93
}
89
94
}
95
+ false
90
96
}
91
97
}
92
98
@@ -109,8 +115,7 @@ fn evaluate_instance(instance: Result<Instance>) -> Vec<InstanceResult> {
109
115
// TODO: support functions which take params.
110
116
if f. ty ( ) . params ( ) . is_empty ( ) {
111
117
let result = f. call ( & [ ] ) ;
112
- let result = if result. is_ok ( ) {
113
- let values = result. unwrap ( ) ;
118
+ let result = if let Ok ( values) = result {
114
119
InstanceResult :: Values ( values. into ( ) )
115
120
} else {
116
121
let err = result. unwrap_err ( ) ;
@@ -129,16 +134,28 @@ fuzz_target!(|module: ConfiguredModule<ExportedFunctionConfig>| {
129
134
module. ensure_termination( 100000 ) ;
130
135
let wasm_bytes = module. to_bytes( ) ;
131
136
132
- let singlepass = maybe_instantiate_singlepass( & wasm_bytes) . transpose( ) . map( evaluate_instance) ;
133
- let cranelift = maybe_instantiate_cranelift( & wasm_bytes) . transpose( ) . map( evaluate_instance) ;
134
- let llvm = maybe_instantiate_llvm( & wasm_bytes) . transpose( ) . map( evaluate_instance) ;
137
+ #[ cfg( feature = "singlepass" ) ]
138
+ let singlepass = maybe_instantiate_singlepass( & wasm_bytes)
139
+ . transpose( )
140
+ . map( evaluate_instance) ;
141
+ #[ cfg( feature = "cranelift" ) ]
142
+ let cranelift = maybe_instantiate_cranelift( & wasm_bytes)
143
+ . transpose( )
144
+ . map( evaluate_instance) ;
145
+ #[ cfg( feature = "llvm" ) ]
146
+ let llvm = maybe_instantiate_llvm( & wasm_bytes)
147
+ . transpose( )
148
+ . map( evaluate_instance) ;
135
149
150
+ #[ cfg( all( feature = "singlepass" , feature = "cranelift" ) ) ]
136
151
if singlepass. is_some( ) && cranelift. is_some( ) {
137
152
assert_eq!( singlepass. as_ref( ) . unwrap( ) , cranelift. as_ref( ) . unwrap( ) ) ;
138
153
}
154
+ #[ cfg( all( feature = "singlepass" , feature = "llvm" ) ) ]
139
155
if singlepass. is_some( ) && llvm. is_some( ) {
140
156
assert_eq!( singlepass. as_ref( ) . unwrap( ) , llvm. as_ref( ) . unwrap( ) ) ;
141
157
}
158
+ #[ cfg( all( feature = "cranelift" , feature = "llvm" ) ) ]
142
159
if cranelift. is_some( ) && llvm. is_some( ) {
143
160
assert_eq!( cranelift. as_ref( ) . unwrap( ) , llvm. as_ref( ) . unwrap( ) ) ;
144
161
}
0 commit comments