Skip to content

Commit 366eb06

Browse files
committed
Output a Wasm binary module rather than a text file
1 parent a7030d2 commit 366eb06

File tree

6 files changed

+63
-31
lines changed

6 files changed

+63
-31
lines changed

compiler/bin-wasm_of_ocaml/compile.ml

+49-22
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ let opt_with action x f =
7474
| None -> f None
7575
| Some x -> action x (fun y -> f (Some y))
7676

77-
let output_gen output_file f = Filename.gen_file output_file f
78-
7977
let with_runtime_files ~runtime_wasm_files f =
8078
let inputs =
8179
List.map
@@ -163,8 +161,12 @@ let link_and_optimize
163161
@@ fun runtime_inputs ->
164162
Binaryen.link
165163
~inputs:
166-
(({ Binaryen.module_name = "env"; file = runtime_file } :: runtime_inputs)
167-
@ List.map ~f:(fun file -> { Binaryen.module_name = "OCaml"; file }) wat_files)
164+
({ Binaryen.module_name = "env"; file = runtime_file; source_map_file = None }
165+
:: runtime_inputs
166+
@ List.map
167+
~f:(fun (file, source_map_file) ->
168+
{ Binaryen.module_name = "OCaml"; file; source_map_file })
169+
wat_files)
168170
~opt_output_sourcemap:opt_temp_sourcemap
169171
~output_file:temp_file
170172
());
@@ -223,7 +225,7 @@ let link_runtime ~profile runtime_wasm_files output_file =
223225
~opt_output_sourcemap:None
224226
~inputs:
225227
(List.map
226-
~f:(fun file -> { Binaryen.module_name = "env"; file })
228+
~f:(fun file -> { Binaryen.module_name = "env"; file; source_map_file = None })
227229
[ runtime_file; extra_runtime ])
228230
~output_file
229231
()
@@ -381,7 +383,7 @@ let run
381383
| Some p -> p
382384
| None -> Profile.O1
383385
in
384-
let output (one : Parse_bytecode.one) ~unit_name ch =
386+
let output (one : Parse_bytecode.one) ~unit_name ~wat_file ~file ~opt_source_map_file =
385387
check_debug one;
386388
let code = one.code in
387389
let standalone = Option.is_none unit_name in
@@ -399,7 +401,14 @@ let run
399401
program
400402
in
401403
if standalone then Generate.add_start_function ~context toplevel_name;
402-
Generate.output ch ~enable_source_maps ~context;
404+
let ch = open_out_bin file in
405+
Generate.wasm_output ch ~opt_source_map_file ~context;
406+
close_out ch;
407+
if debug_wat ()
408+
then (
409+
let ch = open_out_bin wat_file in
410+
Generate.output ch ~context;
411+
close_out ch);
403412
if times () then Format.eprintf "compilation: %a@." Timer.print t;
404413
generated_js
405414
in
@@ -458,20 +467,28 @@ let run
458467
else None)
459468
@@ fun opt_tmp_map_file ->
460469
let unit_data =
461-
(if debug_wat ()
462-
then
463-
fun f ->
464-
f (Filename.concat (Filename.dirname output_file) (unit_name ^ ".wat"))
465-
else Fs.with_intermediate_file (Filename.temp_file unit_name ".wat"))
466-
@@ fun wat_file ->
470+
Fs.with_intermediate_file (Filename.temp_file unit_name ".wasm")
471+
@@ fun input_file ->
472+
opt_with
473+
Fs.with_intermediate_file
474+
(if enable_source_maps
475+
then Some (Filename.temp_file unit_name ".wasm.map")
476+
else None)
477+
@@ fun opt_input_sourcemap ->
467478
let strings, fragments =
468-
output_gen wat_file (output code ~unit_name:(Some unit_name))
479+
output
480+
code
481+
~wat_file:
482+
(Filename.concat (Filename.dirname output_file) (unit_name ^ ".wat"))
483+
~unit_name:(Some unit_name)
484+
~file:input_file
485+
~opt_source_map_file:opt_input_sourcemap
469486
in
470487
Binaryen.optimize
471488
~profile
472-
~opt_input_sourcemap:None
489+
~opt_input_sourcemap
473490
~opt_output_sourcemap:opt_tmp_map_file
474-
~input_file:wat_file
491+
~input_file
475492
~output_file:tmp_wasm_file
476493
();
477494
{ Link.unit_name; unit_info; strings; fragments }
@@ -491,10 +508,8 @@ let run
491508
ic
492509
in
493510
if times () then Format.eprintf " parsing: %a@." Timer.print t1;
494-
(if debug_wat ()
495-
then fun f -> f (Filename.chop_extension output_file ^ ".wat")
496-
else Fs.with_intermediate_file (Filename.temp_file "code" ".wat"))
497-
@@ fun wat_file ->
511+
Fs.with_intermediate_file (Filename.temp_file "code" ".wasm")
512+
@@ fun input_wasm_file ->
498513
let dir = Filename.chop_extension output_file ^ ".assets" in
499514
Link.gen_dir dir
500515
@@ fun tmp_dir ->
@@ -504,7 +519,19 @@ let run
504519
then Some (Filename.concat tmp_dir "code.wasm.map")
505520
else None
506521
in
507-
let generated_js = output_gen wat_file (output code ~unit_name:None) in
522+
let opt_source_map_file =
523+
if enable_source_maps
524+
then Some (Filename.temp_file "code" ".wasm.map")
525+
else None
526+
in
527+
let generated_js =
528+
output
529+
code
530+
~unit_name:None
531+
~wat_file:(Filename.chop_extension output_file ^ ".wat")
532+
~file:input_wasm_file
533+
~opt_source_map_file
534+
in
508535
let tmp_wasm_file = Filename.concat tmp_dir "code.wasm" in
509536
let primitives =
510537
link_and_optimize
@@ -513,7 +540,7 @@ let run
513540
~sourcemap_don't_inline_content
514541
~opt_sourcemap
515542
runtime_wasm_files
516-
[ wat_file ]
543+
[ input_wasm_file, opt_source_map_file ]
517544
tmp_wasm_file
518545
in
519546
let wasm_name =

compiler/lib-wasm/binaryen.ml

+8-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ let opt_flag flag v =
4848
type link_input =
4949
{ module_name : string
5050
; file : string
51+
; source_map_file : string option
5152
}
5253

5354
let link ?options ~inputs ~opt_output_sourcemap ~output_file () =
@@ -57,7 +58,13 @@ let link ?options ~inputs ~opt_output_sourcemap ~output_file () =
5758
@ Option.value ~default:[] options
5859
@ List.flatten
5960
(List.map
60-
~f:(fun { file; module_name } -> [ Filename.quote file; module_name ])
61+
~f:(fun { file; module_name; source_map_file } ->
62+
Filename.quote file
63+
:: module_name
64+
::
65+
(match source_map_file with
66+
| None -> []
67+
| Some file -> [ "--input-source-map"; Filename.quote file ]))
6168
inputs)
6269
@ [ "-o"; Filename.quote output_file ]
6370
@ opt_flag "--output-source-map" opt_output_sourcemap))

compiler/lib-wasm/binaryen.mli

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
type link_input =
2020
{ module_name : string (** Name under which the module is imported in other modules *)
2121
; file : string (** File containing the Wasm module *)
22+
; source_map_file : string option
2223
}
2324

2425
val link :

compiler/lib-wasm/generate.ml

+2-4
Original file line numberDiff line numberDiff line change
@@ -1315,12 +1315,10 @@ let add_start_function = G.add_start_function
13151315

13161316
let add_init_function = G.add_init_function
13171317

1318-
let output ch ~enable_source_maps ~context =
1318+
let output ch ~context =
13191319
let t = Timer.make () in
13201320
let fields = G.output ~context in
1321-
if enable_source_maps || Debug.find "wat" ()
1322-
then Wat_output.f ch fields
1323-
else Wasm_output.f ch ~opt_source_map_file:None fields;
1321+
Wat_output.f ch fields;
13241322
if times () then Format.eprintf " output: %a@." Timer.print t
13251323

13261324
let wasm_output ch ~opt_source_map_file ~context =

compiler/lib-wasm/generate.mli

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ val add_start_function : context:Code_generation.context -> Wasm_ast.var -> unit
3333

3434
val add_init_function : context:Code_generation.context -> to_link:string list -> unit
3535

36-
val output :
37-
out_channel -> enable_source_maps:bool -> context:Code_generation.context -> unit
36+
val output : out_channel -> context:Code_generation.context -> unit
3837

3938
val wasm_output :
4039
out_channel

compiler/lib-wasm/wat_preprocess.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ let with_preprocessed_files ~variables ~inputs action =
626626
if Link.Wasm_binary.check_file ~file then None else Some (Fs.read_file file)
627627
| Contents contents -> Some contents
628628
with
629-
| None -> cont ({ Binaryen.module_name; file } :: inputs)
629+
| None -> cont ({ Binaryen.module_name; file; source_map_file = None } :: inputs)
630630
| Some contents ->
631631
let source_file = file in
632632
Fs.with_intermediate_file (Filename.temp_file module_name ".wat")
@@ -637,7 +637,7 @@ let with_preprocessed_files ~variables ~inputs action =
637637
(if Link.Wasm_binary.check ~contents
638638
then contents
639639
else f ~variables ~filename:source_file ~contents);
640-
cont ({ Binaryen.module_name; file } :: inputs))
640+
cont ({ Binaryen.module_name; file; source_map_file = None } :: inputs))
641641
~init:action
642642
inputs
643643
[]

0 commit comments

Comments
 (0)