diff --git a/esy.lock/index.json b/esy.lock/index.json index 930b6122..f13e4132 100644 --- a/esy.lock/index.json +++ b/esy.lock/index.json @@ -1,5 +1,5 @@ { - "checksum": "94dcdf2b9ce6e193ba96ec8ad7774625", + "checksum": "92ac0393b9f25c78bc13a716d35a5a66", "root": "@grain/binaryen.ml@link-dev:./package.json", "node": { "ocaml@5.3.0@d41d8cd9": { @@ -1934,14 +1934,14 @@ [ "windows", "x86_64" ] ] }, - "@grain/libbinaryen@git:https://github.com/grain-lang/libbinaryen.git#f795f89bcb8acfa33320ced2f9721de3823858ba@d41d8cd9": { - "id": "@grain/libbinaryen@git:https://github.com/grain-lang/libbinaryen.git#f795f89bcb8acfa33320ced2f9721de3823858ba@d41d8cd9", + "@grain/libbinaryen@git:https://github.com/grain-lang/libbinaryen.git#e06fac15ef19f9b9bb784b2be980f03618a27ced@d41d8cd9": { + "id": "@grain/libbinaryen@git:https://github.com/grain-lang/libbinaryen.git#e06fac15ef19f9b9bb784b2be980f03618a27ced@d41d8cd9", "name": "@grain/libbinaryen", - "version": "git:https://github.com/grain-lang/libbinaryen.git#f795f89bcb8acfa33320ced2f9721de3823858ba", + "version": "git:https://github.com/grain-lang/libbinaryen.git#e06fac15ef19f9b9bb784b2be980f03618a27ced", "source": { "type": "install", "source": [ - "git:https://github.com/grain-lang/libbinaryen.git#f795f89bcb8acfa33320ced2f9721de3823858ba" + "git:https://github.com/grain-lang/libbinaryen.git#e06fac15ef19f9b9bb784b2be980f03618a27ced" ] }, "overrides": [], @@ -1974,7 +1974,7 @@ "ocaml@5.3.0@d41d8cd9", "@opam/dune-configurator@opam:3.24.2@7928eaef", "@opam/dune@opam:3.24.2@dc9091c2", - "@grain/libbinaryen@git:https://github.com/grain-lang/libbinaryen.git#f795f89bcb8acfa33320ced2f9721de3823858ba@d41d8cd9" + "@grain/libbinaryen@git:https://github.com/grain-lang/libbinaryen.git#e06fac15ef19f9b9bb784b2be980f03618a27ced@d41d8cd9" ], "devDependencies": [ "@opam/ocamlformat@opam:0.29.0@966c16ee", diff --git a/package.json b/package.json index a1b83a72..7003413a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "resolutions": { "@opam/ocp-indent": "1.9.0", "@opam/ocamlfind": "1.9.8", - "@grain/libbinaryen": "git+https://github.com/grain-lang/libbinaryen.git#f795f89bcb8acfa33320ced2f9721de3823858ba" + "@grain/libbinaryen": "git+https://github.com/grain-lang/libbinaryen.git#e06fac15ef19f9b9bb784b2be980f03618a27ced" }, "esy": { "build": "dune build -p binaryen" diff --git a/src/module.c b/src/module.c index 9ccc0080..ef908a5d 100644 --- a/src/module.c +++ b/src/module.c @@ -29,6 +29,16 @@ caml_binaryen_module_parse(value _text) { CAMLreturn(alloc_BinaryenModuleRef(module)); } + +CAMLprim value +caml_binaryen_module_parse_with_features(value _text, value _features) { + CAMLparam2(_text, _features); + const char* text = Safe_String_val(_text); + BinaryenFeatures features = Int_val(_features); + BinaryenModuleRef module = BinaryenModuleParseWithFeatures(text, features); + CAMLreturn(alloc_BinaryenModuleRef(module)); +} + CAMLprim value caml_binaryen_module_print(value module) { CAMLparam1(module); diff --git a/src/module.js b/src/module.js index 8de9ce30..00aa8bb7 100644 --- a/src/module.js +++ b/src/module.js @@ -16,6 +16,13 @@ function caml_binaryen_module_parse(text) { return Binaryen.parseText(caml_jsstring_of_string(text)); } +//Provides: caml_binaryen_module_parse_with_features +//Requires: Binaryen +//Requires: caml_jsstring_of_string +function caml_binaryen_module_parse_with_features(text, features) { + return Binaryen.parseText(caml_jsstring_of_string(text), features); +} + //Provides: caml_binaryen_module_print //Requires: caml_ml_output_str_stdout function caml_binaryen_module_print(wasm_mod) { diff --git a/src/module.ml b/src/module.ml index 389b7a25..e2fb4449 100644 --- a/src/module.ml +++ b/src/module.ml @@ -115,6 +115,10 @@ module Feature = struct let wide_arithmetic = wide_arithmetic () + external compact_imports : unit -> t = "caml_binaryen_feature_compact_imports" + + let compact_imports = compact_imports () + external all : unit -> t = "caml_binaryen_feature_all" let all = all () @@ -127,6 +131,10 @@ external add_custom_section : t -> string -> string -> unit = "caml_binaryen_add_custom_section" external parse : string -> t = "caml_binaryen_module_parse" + +external parse_with_features : string -> Feature.t -> t + = "caml_binaryen_module_parse_with_features" + external print : t -> unit = "caml_binaryen_module_print" external print_asmjs : t -> unit = "caml_binaryen_module_print_asmjs" external print_stack_ir : t -> unit = "caml_binaryen_module_print_stack_ir" diff --git a/src/module.mli b/src/module.mli index 858fefe9..f0754142 100644 --- a/src/module.mli +++ b/src/module.mli @@ -29,6 +29,7 @@ module Feature : sig val multibyte : t val custom_page_sizes : t val wide_arithmetic : t + val compact_imports : t val all : t end @@ -36,6 +37,7 @@ val create : unit -> t val dispose : t -> unit val add_custom_section : t -> string -> string -> unit val parse : string -> t +val parse_with_features : string -> Feature.t -> t val print : t -> unit val print_asmjs : t -> unit val print_stack_ir : t -> unit diff --git a/src/module_feature.c b/src/module_feature.c index aa24bb39..45d72f7f 100644 --- a/src/module_feature.c +++ b/src/module_feature.c @@ -179,6 +179,12 @@ caml_binaryen_feature_wide_arithmetic(value unit) { CAMLreturn(Val_int(BinaryenFeatureWideArithmetic())); } +CAMLprim value +caml_binaryen_feature_compact_imports(value unit) { + CAMLparam1(unit); + CAMLreturn(Val_int(BinaryenFeatureCompactImports())); +} + CAMLprim value caml_binaryen_feature_all(value unit) { CAMLparam1(unit); diff --git a/src/module_feature.js b/src/module_feature.js index f8982ec6..b74501f3 100644 --- a/src/module_feature.js +++ b/src/module_feature.js @@ -164,6 +164,12 @@ function caml_binaryen_feature_wide_arithmetic() { return Binaryen.Features.WideArithmetic; } +//Provides: caml_binaryen_feature_compact_imports +//Requires: Binaryen +function caml_binaryen_feature_compact_imports() { + return Binaryen.Features.CompactImports; +} + //Provides: caml_binaryen_feature_all //Requires: Binaryen function caml_binaryen_feature_all() { diff --git a/src/passes.ml b/src/passes.ml index 37be50c1..9ad2cb70 100644 --- a/src/passes.ml +++ b/src/passes.ml @@ -43,6 +43,9 @@ let cfp = "cfp" (** propagate constant struct field values, using ref.test *) let cfp_reftest = "cfp-reftest" +(** finds and uses mathematical constraints on locals *) +let constraint_analysis = "constraint-analysis" + (** removes unreachable code *) let dce = "dce" diff --git a/src/passes.mli b/src/passes.mli index c77b35ce..c85e539c 100644 --- a/src/passes.mli +++ b/src/passes.mli @@ -43,6 +43,9 @@ val cfp : t val cfp_reftest : t (** propagate constant struct field values, using ref.test *) +val constraint_analysis : t +(** finds and uses mathematical constraints on locals *) + val dce : t (** removes unreachable code *)