Skip to content

make owi iso work with Binaryen's fuzzer #582

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/bin/owi.ml
Original file line number Diff line number Diff line change
Expand Up @@ -735,6 +735,7 @@ let exit_code =
| `Unbounded_quantification -> 77
| `Invalid_model _msg -> 78
| `Unknown_export _id -> 79
| `Unimplemented _msg -> 80
end
end
| Error e -> (
Expand Down
73 changes: 73 additions & 0 deletions src/cmd/cmd_iso.ml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,80 @@ let ( let*/ ) (t : 'a Result.t)
| Error e -> Symbolic_choice_with_memory.return (Error e)
| Ok x -> f x

let binaryen_fuzzing_support_module () =
let log_i32 x =
Symbolic_choice_with_memory.return
@@ Fmt.pr "%a@?" Symbolic.Value.pp_int32 x
in
let log_i64 x =
Symbolic_choice_with_memory.return
@@ Fmt.pr "%a@?" Symbolic.Value.pp_int64 x
in
let log_f32 x =
Symbolic_choice_with_memory.return
@@ Fmt.pr "%a@?" Symbolic.Value.pp_float32 x
in
let log_f64 x =
Symbolic_choice_with_memory.return
@@ Fmt.pr "%a@?" Symbolic.Value.pp_float64 x
in
let call_export _n1 _n2 = Symbolic_choice_with_memory.return () in
let call_export_catch _n =
Symbolic_choice_with_memory.return @@ Smtml.Expr.value (Smtml.Value.Int 0)
in
let sleep _ms id = Symbolic_choice_with_memory.return id in
let functions =
[ ( "log-i32"
, Symbolic.Extern_func.Extern_func (Func (Arg (I32, Res), R0), log_i32) )
; ( "log-i64"
, Symbolic.Extern_func.Extern_func (Func (Arg (I32, Res), R0), log_i64) )
; ( "log-f32"
, Symbolic.Extern_func.Extern_func (Func (Arg (F32, Res), R0), log_f32) )
; ( "log-f64"
, Symbolic.Extern_func.Extern_func (Func (Arg (F64, Res), R0), log_f64) )
; ( "call-export"
, Symbolic.Extern_func.Extern_func
(Func (Arg (I32, Arg (I32, Res)), R0), call_export) )
; ( "call-export-catch"
, Symbolic.Extern_func.Extern_func
(Func (Arg (I32, Res), R1 I32), call_export_catch) )
; ( "sleep"
, Symbolic.Extern_func.Extern_func
(Func (Arg (I32, Arg (I32, Res)), R1 I32), sleep) )
]
in
{ Link.functions }

let emscripten_fuzzing_support_module () =
let temp_ret_0 = ref (Smtml.Expr.value (Smtml.Value.Int 0)) in
let set_temp_ret_0 x =
temp_ret_0 := x;
Symbolic_choice_with_memory.return ()
in
let get_temp_ret_0 () = Symbolic_choice_with_memory.return !temp_ret_0 in
let functions =
[ ( "setTempRet0"
, Symbolic.Extern_func.Extern_func
(Func (Arg (I32, Res), R0), set_temp_ret_0) )
; ( "getTempRet0"
, Symbolic.Extern_func.Extern_func
(Func (UArg Res, R1 I32), get_temp_ret_0) )
]
in
{ Link.functions }

let check_iso ~unsafe export_name export_type module1 module2 =
let link_state = Cmd_sym.link_symbolic_modules Link.empty_state in
let link_state =
Link.extern_module' link_state ~name:"fuzzing-support"
~func_typ:Symbolic.Extern_func.extern_type
(binaryen_fuzzing_support_module ())
in
let link_state =
Link.extern_module' link_state ~name:"env"
~func_typ:Symbolic.Extern_func.extern_type
(emscripten_fuzzing_support_module ())
in
let*/ _module, link_state =
Compile.Binary.until_link ~name:(Some module_name1) ~unsafe ~optimize:false
link_state module1
Expand Down Expand Up @@ -74,6 +146,7 @@ let check_iso ~unsafe export_name export_type module1 module2 =
put_on_stack @ [ Types.Call (Raw idf1) ] @ put_on_stack
@ [ Types.Call (Raw idf2) ]
@ ( match snd export_type with
| [] -> [ Types.I32_const 1l ]
| [ Types.Num_type I32 ] -> [ Types.I_relop (S32, Eq) ]
| [ Types.Num_type I64 ] -> [ I_relop (S64, Eq) ]
| [ Types.Num_type F32 ] -> [ F_relop (S32, Eq) ]
Expand Down
Loading
Loading