From 0ea7916e3a870419bc66507069193dfafc1e7ee0 Mon Sep 17 00:00:00 2001 From: Olivier Nicole Date: Thu, 12 Sep 2024 18:23:27 +0200 Subject: [PATCH] Handle primitives that depend on the OCaml version --- runtime/wasm/domain.wat | 22 ++------ runtime/wasm/dune | 96 ++++++++++++++++++++++++++++++++- runtime/wasm/post-5.2.wat | 57 ++++++++++++++++++++ runtime/wasm/pre-5.2.wat | 43 +++++++++++++++ runtime/wasm/runtime_events.wat | 4 -- 5 files changed, 197 insertions(+), 25 deletions(-) create mode 100644 runtime/wasm/post-5.2.wat create mode 100644 runtime/wasm/pre-5.2.wat diff --git a/runtime/wasm/domain.wat b/runtime/wasm/domain.wat index 2ba72bcf9..d07d70053 100644 --- a/runtime/wasm/domain.wat +++ b/runtime/wasm/domain.wat @@ -19,11 +19,6 @@ (type $block (array (mut (ref eq)))) (type $function_1 (func (param (ref eq) (ref eq)) (result (ref eq)))) (type $closure (sub (struct (;(field i32);) (field (ref $function_1))))) - (import "sync" "caml_ml_mutex_unlock" - (func $caml_ml_mutex_unlock (param (ref eq)) (result (ref eq)))) - (import "obj" "caml_callback_1" - (func $caml_callback_1 - (param (ref eq)) (param (ref eq)) (result (ref eq)))) (func (export "caml_atomic_cas") (param $ref (ref eq)) (param $o (ref eq)) (param $n (ref eq)) @@ -96,20 +91,9 @@ (param (ref eq)) (result (ref eq)) (ref.i31 (i32.const 1))) - (global $caml_domain_id (mut i32) (i32.const 0)) - (global $caml_domain_latest_id (mut i32) (i32.const 1)) - - (func (export "caml_domain_spawn") - (param $f (ref eq)) (param $mutex (ref eq)) (result (ref eq)) - (local $id i32) (local $old i32) - (local.set $id (global.get $caml_domain_latest_id)) - (global.set $caml_domain_latest_id - (i32.add (local.get $id) (i32.const 1))) - (local.set $old (global.get $caml_domain_id)) - (drop (call $caml_callback_1 (local.get $f) (ref.i31 (i32.const 0)))) - (global.set $caml_domain_id (local.get $old)) - (drop (call $caml_ml_mutex_unlock (local.get $mutex))) - (ref.i31 (local.get $id))) + (global $caml_domain_id (export "caml_domain_id") (mut i32) (i32.const 0)) + (global $caml_domain_latest_id (export "caml_domain_latest_id") (mut i32) + (i32.const 1)) (func (export "caml_ml_domain_id") (param (ref eq)) (result (ref eq)) (ref.i31 (global.get $caml_domain_id))) diff --git a/runtime/wasm/dune b/runtime/wasm/dune index 2923b1ac9..cf759a62b 100644 --- a/runtime/wasm/dune +++ b/runtime/wasm/dune @@ -3,11 +3,64 @@ (package wasm_of_ocaml-compiler) (files runtime.wasm runtime.js)) +(rule + (target version-dependent.wat) + (deps post-5.2.wat) + (enabled_if (>= %{ocaml_version} 5.2.0)) + (action + (copy %{deps} %{target}))) + +(rule + (target version-dependent.wat) + (deps pre-5.2.wat) + (enabled_if (< %{ocaml_version} 5.2.0)) + (action + (copy %{deps} %{target}))) + (rule (target runtime.wasm) (deps args - (glob_files *.wat)) + array.wat + backtrace.wat + bigarray.wat + bigstring.wat + compare.wat + custom.wat + domain.wat + dynlink.wat + effect.wat + fail.wat + float.wat + fs.wat + gc.wat + hash.wat + int32.wat + int64.wat + ints.wat + io.wat + jslib.wat + jslib_js_of_ocaml.wat + jsstring.wat + lexing.wat + marshal.wat + md5.wat + nat.wat + obj.wat + parsing.wat + printexc.wat + prng.wat + runtime_events.wat + stdlib.wat + str.wat + string.wat + sync.wat + sys.wat + toplevel.wat + unix.wat + version-dependent.wat + weak.wat + zstd.wat) (action (progn (system @@ -47,7 +100,46 @@ (target args) (deps args.ml - (glob_files *.wat)) + array.wat + backtrace.wat + bigarray.wat + bigstring.wat + compare.wat + custom.wat + domain.wat + dynlink.wat + effect.wat + fail.wat + float.wat + fs.wat + gc.wat + hash.wat + int32.wat + int64.wat + ints.wat + io.wat + jslib.wat + jslib_js_of_ocaml.wat + jsstring.wat + lexing.wat + marshal.wat + md5.wat + nat.wat + obj.wat + parsing.wat + printexc.wat + prng.wat + runtime_events.wat + stdlib.wat + str.wat + string.wat + sync.wat + sys.wat + toplevel.wat + unix.wat + version-dependent.wat + weak.wat + zstd.wat) (action (with-stdout-to %{target} diff --git a/runtime/wasm/post-5.2.wat b/runtime/wasm/post-5.2.wat new file mode 100644 index 000000000..cd99832f1 --- /dev/null +++ b/runtime/wasm/post-5.2.wat @@ -0,0 +1,57 @@ +;; Wasm_of_ocaml runtime support +;; http://www.ocsigen.org/js_of_ocaml/ +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU Lesser General Public License as published by +;; the Free Software Foundation, with linking exception; +;; either version 2.1 of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU Lesser General Public License for more details. +;; +;; You should have received a copy of the GNU Lesser General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +(module + (type $block (array (mut (ref eq)))) + (import "obj" "caml_callback_1" + (func $caml_callback_1 + (param (ref eq)) (param (ref eq)) (result (ref eq)))) + (import "sync" "caml_ml_mutex_unlock" + (func $caml_ml_mutex_unlock (param (ref eq)) (result (ref eq)))) + (import "domain" "caml_domain_latest_id" + (global $caml_domain_latest_id (mut i32))) + (import "domain" "caml_domain_id" + (global $caml_domain_id (mut i32))) + + (func (export "caml_runtime_events_user_write") + (param (ref eq)) (param (ref eq)) (param (ref eq)) (result (ref eq)) + (ref.i31 (i32.const 0))) + + (func (export "caml_domain_spawn") + (param $f (ref eq)) (param $term_sync_v (ref eq)) (result (ref eq)) + (local $id i32) (local $old i32) (local $ts (ref $block)) (local $res (ref eq)) + (local.set $id (global.get $caml_domain_latest_id)) + (global.set $caml_domain_latest_id + (i32.add (local.get $id) (i32.const 1))) + (local.set $old (global.get $caml_domain_id)) + (local.set $res + (call $caml_callback_1 (local.get $f) (ref.i31 (i32.const 0)))) + (global.set $caml_domain_id (local.get $old)) + (local.set $ts (ref.cast (ref $block) (local.get $term_sync_v))) + (drop (call $caml_ml_mutex_unlock (array.get $block (local.get $ts) (i32.const 2)))) + ;; TODO: fix exn case + (array.set + $block + (local.get $ts) + (i32.const 1) + (array.new_fixed + $block + 2 + (ref.i31 (i32.const 0)) + (array.new_fixed $block 2 (ref.i31 (i32.const 0)) (local.get $res)))) + (ref.i31 (local.get $id))) +) diff --git a/runtime/wasm/pre-5.2.wat b/runtime/wasm/pre-5.2.wat new file mode 100644 index 000000000..2fcbd6548 --- /dev/null +++ b/runtime/wasm/pre-5.2.wat @@ -0,0 +1,43 @@ +;; Wasm_of_ocaml runtime support +;; http://www.ocsigen.org/js_of_ocaml/ +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU Lesser General Public License as published by +;; the Free Software Foundation, with linking exception; +;; either version 2.1 of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU Lesser General Public License for more details. +;; +;; You should have received a copy of the GNU Lesser General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +(module + (import "obj" "caml_callback_1" + (func $caml_callback_1 + (param (ref eq)) (param (ref eq)) (result (ref eq)))) + (import "sync" "caml_ml_mutex_unlock" + (func $caml_ml_mutex_unlock (param (ref eq)) (result (ref eq)))) + (import "domain" "caml_domain_latest_id" + (global $caml_domain_latest_id (mut i32))) + + ;; XXX wrong, adapt for 5.2 + (func (export "caml_runtime_events_user_write") + (param (ref eq)) (param (ref eq)) (result (ref eq)) + (ref.i31 (i32.const 0))) + + (func (export "caml_domain_spawn") + (param $f (ref eq)) (param $mutex (ref eq)) (result (ref eq)) + (local $id i32) (local $old i32) + (local.set $id (global.get $caml_domain_latest_id)) + (global.set $caml_domain_latest_id + (i32.add (local.get $id) (i32.const 1))) + (local.set $old (global.get $caml_domain_id)) + (drop (call $caml_callback_1 (local.get $f) (ref.i31 (i32.const 0)))) + (global.set $caml_domain_id (local.get $old)) + (drop (call $caml_ml_mutex_unlock (local.get $mutex))) + (ref.i31 (local.get $id))) +) diff --git a/runtime/wasm/runtime_events.wat b/runtime/wasm/runtime_events.wat index ff77e5570..8a50583cd 100644 --- a/runtime/wasm/runtime_events.wat +++ b/runtime/wasm/runtime_events.wat @@ -33,10 +33,6 @@ (local.get $evtag) (local.get $evtype))) - (func (export "caml_runtime_events_user_write") - (param (ref eq)) (param (ref eq)) (param (ref eq)) (result (ref eq)) - (ref.i31 (i32.const 0))) - (func (export "caml_runtime_events_user_resolve") (param (ref eq)) (param (ref eq)) (param (ref eq)) (result (ref eq)) (ref.i31 (i32.const 0)))