@@ -13,6 +13,7 @@ this keeps documentation close to the code (a lesson learned from Simon PJ).
13
13
open Ir_def
14
14
open As_values
15
15
open As_types
16
+ open As_config
16
17
17
18
open Wasm.Ast
18
19
open Wasm.Types
@@ -106,9 +107,6 @@ The fields fall into the following categories:
106
107
107
108
(* Before we can define the environment, we need some auxillary types *)
108
109
109
- type mode = WasmMode | AncientMode | ICMode
110
-
111
-
112
110
module E = struct
113
111
114
112
(* Utilities, internal to E *)
@@ -136,7 +134,7 @@ module E = struct
136
134
type t = {
137
135
(* Global fields *)
138
136
(* Static *)
139
- mode : mode ;
137
+ mode : Flags .compile_mode ;
140
138
prelude : Ir .prog ; (* The prelude. Re-used when compiling actors *)
141
139
rts : Wasm_exts.CustomModule .extended_module option ; (* The rts. Re-used when compiling actors *)
142
140
trap_with : t -> string -> G .t ;
@@ -233,7 +231,7 @@ module E = struct
233
231
ignore (reg env.exports e)
234
232
235
233
let add_dfinity_type (env : t ) e =
236
- assert (mode env = AncientMode );
234
+ assert (mode env = Flags. AncientMode );
237
235
ignore (reg env.dfinity_types e)
238
236
239
237
let add_global (env : t ) name g =
@@ -678,14 +676,14 @@ module RTS = struct
678
676
let get_len = G. i (LocalGet (nr 1l )) in
679
677
get_str ^^ get_len ^^
680
678
match E. mode env with
681
- | AncientMode ->
679
+ | Flags. AncientMode ->
682
680
E. call_import env " data" " externalize" ^^
683
681
E. call_import env " test" " print" ^^
684
682
G. i Unreachable
685
- | ICMode ->
683
+ | Flags. ICMode ->
686
684
E. call_import env " debug" " print" ^^
687
685
G. i Unreachable
688
- | WasmMode -> G. i Unreachable
686
+ | Flags. WasmMode -> G. i Unreachable
689
687
)
690
688
) in
691
689
E. add_export env (nr {
@@ -718,7 +716,7 @@ module Heap = struct
718
716
(* Page allocation. Ensures that the memory up to the given unskewed pointer is allocated. *)
719
717
let grow_memory env =
720
718
(* No growing of memory on drun yet *)
721
- if E. mode env = ICMode
719
+ if E. mode env = Flags. ICMode
722
720
then G. i Drop
723
721
else Func. share_code1 env " grow_memory" (" ptr" , I32Type ) [] (fun env get_ptr ->
724
722
let (set_pages_needed, get_pages_needed) = new_local env " pages_needed" in
@@ -2970,14 +2968,14 @@ module Dfinity = struct
2970
2968
2971
2969
let system_imports env =
2972
2970
match E. mode env with
2973
- | ICMode ->
2971
+ | Flags. ICMode ->
2974
2972
E. add_func_import env " debug" " print" [I32Type ; I32Type ] [] ;
2975
2973
E. add_func_import env " msg" " arg_data_size" [I64Type ] [I32Type ];
2976
2974
E. add_func_import env " msg" " arg_data_copy" [I64Type ; I32Type ; I32Type ; I32Type ] [] ;
2977
2975
E. add_func_import env " msg" " reply" [I64Type ; I32Type ; I32Type ] [] ;
2978
2976
E. add_func_import env " msg" " reject" [I64Type ; I32Type ] [] ;
2979
2977
E. add_func_import env " msg" " error_code" [I64Type ] [I32Type ]
2980
- | AncientMode ->
2978
+ | Flags. AncientMode ->
2981
2979
E. add_func_import env " test" " print" [I32Type ] [] ;
2982
2980
E. add_func_import env " test" " show_i32" [I32Type ] [I32Type ];
2983
2981
E. add_func_import env " data" " externalize" [I32Type ; I32Type ] [I32Type ];
@@ -3016,14 +3014,14 @@ module Dfinity = struct
3016
3014
3017
3015
let prim_print env =
3018
3016
match E. mode env with
3019
- | WasmMode -> G. i Drop
3020
- | ICMode ->
3017
+ | Flags. WasmMode -> G. i Drop
3018
+ | Flags. ICMode ->
3021
3019
Func. share_code1 env " print_text" (" str" , I32Type ) [] (fun env get_str ->
3022
3020
get_str ^^ Text. payload_ptr_unskewed ^^
3023
3021
get_str ^^ Heap. load_field (Text. len_field) ^^
3024
3022
system_call env " debug" " print"
3025
3023
)
3026
- | AncientMode ->
3024
+ | Flags. AncientMode ->
3027
3025
compile_databuf_of_text env ^^
3028
3026
system_call env " test" " print"
3029
3027
@@ -3037,7 +3035,7 @@ module Dfinity = struct
3037
3035
compile_static_print env " \n "
3038
3036
3039
3037
let trap_with env s =
3040
- if E. mode env = WasmMode
3038
+ if E. mode env = Flags. WasmMode
3041
3039
then G. i Unreachable
3042
3040
else compile_static_print env (s ^ " \n " ) ^^ G. i Unreachable
3043
3041
@@ -3054,7 +3052,7 @@ module Dfinity = struct
3054
3052
})
3055
3053
3056
3054
let export_start_stub env =
3057
- assert (E. mode env = AncientMode );
3055
+ assert (E. mode env = Flags. AncientMode );
3058
3056
let empty_f = Func. of_body env [] [] (fun env1 ->
3059
3057
(* Set up memory *)
3060
3058
G. i (Call (nr (E. built_in env1 " restore_mem" ))) ^^
@@ -3071,7 +3069,7 @@ module Dfinity = struct
3071
3069
E. add_dfinity_type env (fi, [] )
3072
3070
3073
3071
let export_start env start_fi =
3074
- assert (E. mode env = ICMode );
3072
+ assert (E. mode env = Flags. ICMode );
3075
3073
(* Create an empty message *)
3076
3074
let empty_f = Func. of_body env [" api_nonce" ,I64Type ] [] (fun env1 ->
3077
3075
G. i (Call (nr start_fi)) ^^
@@ -3141,7 +3139,7 @@ module OrthogonalPersistence = struct
3141
3139
*)
3142
3140
3143
3141
let register_globals env =
3144
- assert (E. mode env = AncientMode );
3142
+ assert (E. mode env = Flags. AncientMode );
3145
3143
(* We want to put all persistent globals first:
3146
3144
The index in the persist annotation refers to the index in the
3147
3145
list of *exported* globals, not all globals (at least with v8/dvm) *)
@@ -3153,7 +3151,7 @@ module OrthogonalPersistence = struct
3153
3151
E. persist env (E. get_global env " elemstore" ) Wasm_exts.CustomModule. ElemBuf
3154
3152
3155
3153
let register env start_funid =
3156
- assert (E. mode env = AncientMode );
3154
+ assert (E. mode env = Flags. AncientMode );
3157
3155
let mem_global = E. get_global env " datastore" in
3158
3156
let elem_global = E. get_global env " elemstore" in
3159
3157
@@ -3213,11 +3211,11 @@ module OrthogonalPersistence = struct
3213
3211
)
3214
3212
3215
3213
let save_mem env =
3216
- assert (E. mode env = AncientMode );
3214
+ assert (E. mode env = Flags. AncientMode );
3217
3215
G. i (Call (nr (E. built_in env " save_mem" )))
3218
3216
3219
3217
let restore_mem env =
3220
- assert (E. mode env = AncientMode );
3218
+ assert (E. mode env = Flags. AncientMode );
3221
3219
G. i (Call (nr (E. built_in env " restore_mem" )))
3222
3220
3223
3221
end (* OrthogonalPersistence *)
@@ -4038,9 +4036,9 @@ module Serialization = struct
4038
4036
let serialize env ts : G.t =
4039
4037
let ts_name = String. concat " ," (List. map typ_id ts) in
4040
4038
let name = " @serialize<" ^ ts_name ^ " >" in
4041
- if E. mode env = ICMode then assert (List. for_all has_no_references ts);
4039
+ if E. mode env = Flags. ICMode then assert (List. for_all has_no_references ts);
4042
4040
(* On ancient API returns databuf/elembuf, on new API returns nothing *)
4043
- let ret_tys = if E. mode env = ICMode then [] else [I32Type ; I32Type ] in
4041
+ let ret_tys = if E. mode env = Flags. ICMode then [] else [I32Type ; I32Type ] in
4044
4042
Func. share_code1 env name (" x" , I32Type ) ret_tys (fun env get_x ->
4045
4043
let (set_data_size, get_data_size) = new_local env " data_size" in
4046
4044
let (set_refs_size, get_refs_size) = new_local env " refs_size" in
@@ -4085,15 +4083,15 @@ module Serialization = struct
4085
4083
E. else_trap_with env " data buffer not filled " ^^
4086
4084
4087
4085
match E. mode env with
4088
- | AncientMode ->
4086
+ | Flags. AncientMode ->
4089
4087
(* Store it all in a databuf and an elembuf *)
4090
4088
get_data_start ^^ get_data_size ^^
4091
4089
Dfinity. system_call env " data" " externalize" ^^
4092
4090
4093
4091
get_refs_start ^^ get_refs_size ^^
4094
4092
Dfinity. system_call env " elem" " externalize"
4095
4093
4096
- | ICMode ->
4094
+ | Flags. ICMode ->
4097
4095
get_refs_size ^^
4098
4096
compile_unboxed_const 0l ^^
4099
4097
G. i (Compare (Wasm.Values. I32 I32Op. Eq )) ^^
@@ -4102,22 +4100,22 @@ module Serialization = struct
4102
4100
(* Copy out the bytes *)
4103
4101
reply_with_data env get_data_start get_data_size
4104
4102
4105
- | WasmMode -> assert false
4103
+ | Flags. WasmMode -> assert false
4106
4104
)
4107
4105
4108
4106
let deserialize env ts =
4109
- if E. mode env = ICMode then assert (List. for_all has_no_references ts);
4107
+ if E. mode env = Flags. ICMode then assert (List. for_all has_no_references ts);
4110
4108
let ts_name = String. concat " ," (List. map typ_id ts) in
4111
4109
let name = " @deserialize<" ^ ts_name ^ " >" in
4112
- let args = if E. mode env = ICMode then [] else [(" databuf" ,I32Type );(" elembuf" , I32Type )] in
4110
+ let args = if E. mode env = Flags. ICMode then [] else [(" databuf" ,I32Type );(" elembuf" , I32Type )] in
4113
4111
Func. share_code env name args (List. map (fun _ -> I32Type ) ts) (fun env ->
4114
4112
let (set_data_size, get_data_size) = new_local env " data_size" in
4115
4113
let (set_refs_size, get_refs_size) = new_local env " refs_size" in
4116
4114
let (set_data_start, get_data_start) = new_local env " data_start" in
4117
4115
let (set_refs_start, get_refs_start) = new_local env " refs_start" in
4118
4116
4119
4117
begin match E. mode env with
4120
- | AncientMode ->
4118
+ | Flags. AncientMode ->
4121
4119
let get_databuf = G. i (LocalGet (nr 0l )) in
4122
4120
let get_elembuf = G. i (LocalGet (nr 1l )) in
4123
4121
@@ -4132,7 +4130,7 @@ module Serialization = struct
4132
4130
get_refs_size ^^ compile_mul_const Heap. word_size ^^ Text. dyn_alloc_scratch env ^^ set_refs_start ^^
4133
4131
get_refs_start ^^ get_refs_size ^^ get_elembuf ^^ compile_unboxed_const 0l ^^
4134
4132
Dfinity. system_call env " elem" " internalize"
4135
- | ICMode ->
4133
+ | Flags. ICMode ->
4136
4134
(* Allocate space for the data buffer and copy it *)
4137
4135
argument_data_size env ^^ set_data_size ^^
4138
4136
get_data_size ^^ Text. dyn_alloc_scratch env ^^ set_data_start ^^
@@ -4762,7 +4760,7 @@ module FuncDec = struct
4762
4760
- Fake orthogonal persistence
4763
4761
*)
4764
4762
let compile_message outer_env outer_ae cc restore_env args mk_body at =
4765
- assert (E. mode outer_env = AncientMode );
4763
+ assert (E. mode outer_env = Flags. AncientMode );
4766
4764
assert (cc.Call_conv. n_res = 0 );
4767
4765
let ae0 = ASEnv. mk_fun_ae outer_ae in
4768
4766
Func. of_body outer_env [" clos" , I32Type ; " databuf" , I32Type ; " elembuf" , I32Type ] [] (fun env -> G. with_region at (
@@ -4800,7 +4798,7 @@ module FuncDec = struct
4800
4798
4801
4799
let compile_static_message outer_env outer_ae cc args mk_body ret_tys at : E.func_with_names =
4802
4800
match E. mode outer_env with
4803
- | AncientMode ->
4801
+ | Flags. AncientMode ->
4804
4802
assert (cc.Call_conv. n_res = 0 );
4805
4803
let ae0 = ASEnv. mk_fun_ae outer_ae in
4806
4804
Func. of_body outer_env [" databuf" , I32Type ; " elembuf" , I32Type ] [] (fun env -> G. with_region at (
@@ -4825,7 +4823,7 @@ module FuncDec = struct
4825
4823
(* Save memory *)
4826
4824
OrthogonalPersistence. save_mem env
4827
4825
))
4828
- | ICMode ->
4826
+ | Flags. ICMode ->
4829
4827
let ae0 = ASEnv. mk_fun_ae outer_ae in
4830
4828
Func. of_body outer_env [" api_nonce" , I64Type ] [] (fun env -> G. with_region at (
4831
4829
G. i (LocalGet (nr 0l )) ^^ Dfinity. set_api_nonce env ^^
@@ -4841,10 +4839,10 @@ module FuncDec = struct
4841
4839
(* Collect garbage *)
4842
4840
G. i (Call (nr (E. built_in env " collect" )))
4843
4841
))
4844
- | WasmMode -> assert false
4842
+ | Flags. WasmMode -> assert false
4845
4843
4846
4844
let declare_dfinity_type env has_closure fi =
4847
- if E. mode env = AncientMode then
4845
+ if E. mode env = Flags. AncientMode then
4848
4846
E. add_dfinity_type env (fi,
4849
4847
(if has_closure then [ Wasm_exts.CustomModule. I32 ] else [] ) @
4850
4848
[ Wasm_exts.CustomModule. DataBuf ; Wasm_exts.CustomModule. ElemBuf ]
@@ -6167,17 +6165,17 @@ and compile_exp (env : E.t) ae exp =
6167
6165
Error. compile_make_error (compile_exp_vanilla env ae e1) (compile_exp_vanilla env ae e2)
6168
6166
6169
6167
| ICReplyPrim t , [e] ->
6170
- assert (E. mode env = ICMode );
6168
+ assert (E. mode env = Flags. ICMode );
6171
6169
SR. unit ,
6172
6170
compile_exp_vanilla env ae e ^^
6173
6171
Serialization. serialize env [t]
6174
6172
6175
6173
| ICRejectPrim , [e] ->
6176
- assert (E. mode env = ICMode );
6174
+ assert (E. mode env = Flags. ICMode );
6177
6175
Dfinity. reject env (compile_exp_vanilla env ae e)
6178
6176
6179
6177
| ICErrorCodePrim , [] ->
6180
- assert (E. mode env = ICMode );
6178
+ assert (E. mode env = Flags. ICMode );
6181
6179
Dfinity. error_code env
6182
6180
6183
6181
(* Unknown prim *)
@@ -6724,8 +6722,8 @@ and export_actor_field env ae (f : Ir.field) =
6724
6722
FuncDec. declare_dfinity_type env false fi;
6725
6723
E. add_export env (nr {
6726
6724
name = Wasm.Utf8. decode (match E. mode env with
6727
- | AncientMode -> f.it.name
6728
- | ICMode -> " canister_update " ^ f.it.name
6725
+ | Flags. AncientMode -> f.it.name
6726
+ | Flags. ICMode -> " canister_update " ^ f.it.name
6729
6727
| _ -> assert false );
6730
6728
edesc = nr (FuncExport (nr fi))
6731
6729
})
@@ -6740,7 +6738,7 @@ and actor_lit outer_env this ds fs at =
6740
6738
(E. get_trap_with outer_env)
6741
6739
ClosureTable. table_end in
6742
6740
6743
- if E. mode mod_env = AncientMode then OrthogonalPersistence. register_globals mod_env;
6741
+ if E. mode mod_env = Flags. AncientMode then OrthogonalPersistence. register_globals mod_env;
6744
6742
Heap. register_globals mod_env;
6745
6743
ElemHeap. register_globals mod_env;
6746
6744
Stack. register_globals mod_env;
@@ -6769,8 +6767,8 @@ and actor_lit outer_env this ds fs at =
6769
6767
prelude_code ^^ decls_code) in
6770
6768
let start_fi = E. add_fun mod_env " start" start_fun in
6771
6769
6772
- if E. mode mod_env = ICMode then Dfinity. export_start mod_env start_fi;
6773
- if E. mode mod_env = AncientMode then OrthogonalPersistence. register mod_env start_fi;
6770
+ if E. mode mod_env = Flags. ICMode then Dfinity. export_start mod_env start_fi;
6771
+ if E. mode mod_env = Flags. AncientMode then OrthogonalPersistence. register mod_env start_fi;
6774
6772
6775
6773
let m = conclude_module mod_env this None in
6776
6774
let (_map, wasm_binary) = Wasm_exts.CustomModuleEncode. encode m in
@@ -6876,7 +6874,7 @@ and conclude_module env module_name start_fi_o =
6876
6874
let compile mode module_name rts (prelude : Ir.prog ) (progs : Ir.prog list ) : Wasm_exts.CustomModule.extended_module =
6877
6875
let env = E. mk_global mode rts prelude Dfinity. trap_with ClosureTable. table_end in
6878
6876
6879
- if E. mode env = AncientMode then OrthogonalPersistence. register_globals env;
6877
+ if E. mode env = Flags. AncientMode then OrthogonalPersistence. register_globals env;
6880
6878
Heap. register_globals env;
6881
6879
ElemHeap. register_globals env;
6882
6880
Stack. register_globals env;
@@ -6889,11 +6887,11 @@ let compile mode module_name rts (prelude : Ir.prog) (progs : Ir.prog list) : Wa
6889
6887
let start_fun = compile_start_func env (prelude :: progs) in
6890
6888
let start_fi = E. add_fun env " start" start_fun in
6891
6889
let start_fi_o = match E. mode env with
6892
- | AncientMode ->
6890
+ | Flags. AncientMode ->
6893
6891
OrthogonalPersistence. register env start_fi;
6894
6892
Dfinity. export_start_stub env;
6895
6893
None
6896
- | ICMode -> Dfinity. export_start env start_fi; None
6897
- | WasmMode -> Some (nr start_fi) in
6894
+ | Flags. ICMode -> Dfinity. export_start env start_fi; None
6895
+ | Flags. WasmMode -> Some (nr start_fi) in
6898
6896
6899
6897
conclude_module env module_name start_fi_o
0 commit comments