Skip to content

Commit c9ff0b4

Browse files
committed
Wat file preprocessor
1 parent fb9ecc0 commit c9ff0b4

File tree

10 files changed

+467
-83
lines changed

10 files changed

+467
-83
lines changed

compiler/bin-wasm_of_ocaml/compile.ml

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,32 @@ let output_gen output_file f =
7373
Code.Var.set_stable (Config.Flag.stable_var ());
7474
Filename.gen_file output_file f
7575

76+
let build_runtime ~runtime_file =
77+
let variables = [ "use-js-string", Config.Flag.use_js_string () ] in
78+
List.fold_left
79+
~f:(fun cont (name, contents) ->
80+
fun inputs ->
81+
Fs.with_intermediate_file (Filename.temp_file name ".wat")
82+
@@ fun filename ->
83+
Fs.write_file
84+
~name:filename
85+
~contents:(Wat_preprocess.f ~variables ~filename ~contents);
86+
cont ((filename, name) :: inputs))
87+
~init:(fun inputs ->
88+
Fs.with_intermediate_file (Filename.temp_file "runtime-merged" ".wasm")
89+
@@ fun merge_file ->
90+
Binaryen.link ~opt_output_sourcemap:None ~inputs ~output_file:merge_file;
91+
Binaryen.optimize
92+
~profile:None
93+
~options:[ "-O2" ]
94+
~opt_input_sourcemap:None
95+
~input_file:merge_file
96+
~opt_output_sourcemap:None
97+
~output_file:runtime_file
98+
())
99+
Runtime_files.wat_files
100+
[]
101+
76102
let link_and_optimize
77103
~profile
78104
~sourcemap_root
@@ -91,7 +117,7 @@ let link_and_optimize
91117
let enable_source_maps = Option.is_some opt_sourcemap_file in
92118
Fs.with_intermediate_file (Filename.temp_file "runtime" ".wasm")
93119
@@ fun runtime_file ->
94-
Fs.write_file ~name:runtime_file ~contents:Runtime_files.wasm_runtime;
120+
build_runtime ~runtime_file;
95121
Fs.with_intermediate_file (Filename.temp_file "wasm-merged" ".wasm")
96122
@@ fun temp_file ->
97123
opt_with
@@ -101,8 +127,9 @@ let link_and_optimize
101127
else None)
102128
@@ fun opt_temp_sourcemap ->
103129
Binaryen.link
104-
~runtime_files:(runtime_file :: runtime_wasm_files)
105-
~input_files:wat_files
130+
~inputs:
131+
(List.map ~f:(fun f -> f, "env") (runtime_file :: runtime_wasm_files)
132+
@ List.map ~f:(fun f -> f, "OCaml") wat_files)
106133
~opt_output_sourcemap:opt_temp_sourcemap
107134
~output_file:temp_file;
108135
Fs.with_intermediate_file (Filename.temp_file "wasm-dce" ".wasm")
@@ -124,7 +151,8 @@ let link_and_optimize
124151
~opt_input_sourcemap:opt_temp_sourcemap'
125152
~opt_output_sourcemap:opt_sourcemap
126153
~input_file:temp_file'
127-
~output_file;
154+
~output_file
155+
();
128156
Option.iter
129157
~f:(update_sourcemap ~sourcemap_root ~sourcemap_don't_inline_content)
130158
opt_sourcemap_file;
@@ -133,20 +161,20 @@ let link_and_optimize
133161
let link_runtime ~profile runtime_wasm_files output_file =
134162
Fs.with_intermediate_file (Filename.temp_file "runtime" ".wasm")
135163
@@ fun runtime_file ->
136-
Fs.write_file ~name:runtime_file ~contents:Runtime_files.wasm_runtime;
164+
build_runtime ~runtime_file;
137165
Fs.with_intermediate_file (Filename.temp_file "wasm-merged" ".wasm")
138166
@@ fun temp_file ->
139167
Binaryen.link
168+
~inputs:(List.map ~f:(fun f -> f, "env") (runtime_file :: runtime_wasm_files))
140169
~opt_output_sourcemap:None
141-
~runtime_files:(runtime_file :: runtime_wasm_files)
142-
~input_files:[]
143170
~output_file:temp_file;
144171
Binaryen.optimize
145172
~profile
146173
~opt_input_sourcemap:None
147174
~opt_output_sourcemap:None
148175
~input_file:temp_file
149176
~output_file
177+
()
150178

151179
let generate_prelude ~out_file =
152180
Filename.gen_file out_file
@@ -186,7 +214,8 @@ let build_prelude z =
186214
~input_file:prelude_file
187215
~output_file:tmp_prelude_file
188216
~opt_input_sourcemap:None
189-
~opt_output_sourcemap:None;
217+
~opt_output_sourcemap:None
218+
();
190219
Zip.add_file z ~name:"prelude.wasm" ~file:tmp_prelude_file;
191220
info
192221

@@ -419,7 +448,8 @@ let run
419448
~opt_input_sourcemap:None
420449
~opt_output_sourcemap:opt_tmp_map_file
421450
~input_file:wat_file
422-
~output_file:tmp_wasm_file;
451+
~output_file:tmp_wasm_file
452+
();
423453
{ Link.unit_name; unit_info; strings; fragments }
424454
in
425455
cont unit_data unit_name tmp_wasm_file opt_tmp_map_file

compiler/bin-wasm_of_ocaml/dune

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
(target runtime_files.ml)
2626
(deps
2727
gen/gen.exe
28-
../../runtime/wasm/runtime.wasm
2928
../../runtime/wasm/runtime.js
30-
../../runtime/wasm/deps.json)
29+
../../runtime/wasm/deps.json
30+
(glob_files ../../runtime/wasm/*.wat))
3131
(action
3232
(with-stdout-to
3333
%{target}

compiler/bin-wasm_of_ocaml/gen/gen.ml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@ let read_file ic = really_input_string ic (in_channel_length ic)
33
let () =
44
let () = set_binary_mode_out stdout true in
55
Format.printf
6-
"let wasm_runtime = \"%s\"@."
6+
"let js_runtime = \"%s\"@."
77
(String.escaped (read_file (open_in_bin Sys.argv.(1))));
88
Format.printf
9-
"let js_runtime = \"%s\"@."
9+
"let dependencies = \"%s\"@."
1010
(String.escaped (read_file (open_in_bin Sys.argv.(2))));
11+
let a = Array.sub Sys.argv 3 (Array.length Sys.argv - 3) in
1112
Format.printf
12-
"let dependencies = \"%s\"@."
13-
(String.escaped (read_file (open_in_bin Sys.argv.(3))))
13+
"let wat_files = [%a]@."
14+
(Format.pp_print_list (fun f file ->
15+
Format.fprintf
16+
f
17+
"\"%s\", \"%s\"; "
18+
Filename.(chop_suffix (basename file) ".wat")
19+
(String.escaped (read_file (open_in_bin file)))))
20+
(Array.to_list a)

compiler/lib-wasm/binaryen.ml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,12 @@ let opt_flag flag v =
4545
| None -> []
4646
| Some v -> [ flag; Filename.quote v ]
4747

48-
let link ~runtime_files ~input_files ~opt_output_sourcemap ~output_file =
48+
let link ~inputs ~opt_output_sourcemap ~output_file =
4949
command
5050
("wasm-merge"
5151
:: (common_options ()
5252
@ List.flatten
53-
(List.map
54-
~f:(fun runtime_file -> [ Filename.quote runtime_file; "env" ])
55-
runtime_files)
56-
@ List.flatten
57-
(List.map
58-
~f:(fun input_file -> [ Filename.quote input_file; "OCaml" ])
59-
input_files)
53+
(List.map ~f:(fun (file, name) -> [ Filename.quote file; name ]) inputs)
6054
@ [ "-o"; Filename.quote output_file ]
6155
@ opt_flag "--output-source-map" opt_output_sourcemap))
6256

@@ -114,8 +108,14 @@ let optimization_options =
114108
; [ "-O3"; "--skip-pass=inlining-optimizing"; "--traps-never-happen" ]
115109
|]
116110

117-
let optimize ~profile ~opt_input_sourcemap ~input_file ~opt_output_sourcemap ~output_file
118-
=
111+
let optimize
112+
~profile
113+
?options
114+
~opt_input_sourcemap
115+
~input_file
116+
~opt_output_sourcemap
117+
~output_file
118+
() =
119119
let level =
120120
match profile with
121121
| None -> 1
@@ -124,7 +124,7 @@ let optimize ~profile ~opt_input_sourcemap ~input_file ~opt_output_sourcemap ~ou
124124
command
125125
("wasm-opt"
126126
:: (common_options ()
127-
@ optimization_options.(level - 1)
127+
@ Option.value ~default:optimization_options.(level - 1) options
128128
@ [ Filename.quote input_file; "-o"; Filename.quote output_file ])
129129
@ opt_flag "--input-source-map" opt_input_sourcemap
130130
@ opt_flag "--output-source-map" opt_output_sourcemap)

compiler/lib-wasm/binaryen.mli

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
*)
1818

1919
val link :
20-
runtime_files:string list
21-
-> input_files:string list
20+
inputs:(string * string (*file, module name*)) list
2221
-> opt_output_sourcemap:string option
2322
-> output_file:string
2423
-> unit
@@ -33,8 +32,10 @@ val dead_code_elimination :
3332

3433
val optimize :
3534
profile:Driver.profile option
35+
-> ?options:string list
3636
-> opt_input_sourcemap:string option
3737
-> input_file:string
3838
-> opt_output_sourcemap:string option
3939
-> output_file:string
4040
-> unit
41+
-> unit

compiler/lib-wasm/dune

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
(synopsis "Wasm_of_ocaml compiler library")
55
(libraries js_of_ocaml_compiler)
66
(flags
7-
(:standard -w -7-37 -safe-string -open Js_of_ocaml_compiler)))
7+
(:standard -w -7-37 -safe-string -open Js_of_ocaml_compiler))
8+
(preprocess
9+
(pps sedlex.ppx)))

0 commit comments

Comments
 (0)