blob: a78814662e57da4e6d2ae785dfc1196bf5de6bed [file] [log] [blame] [edit]
;;
;; Validation of Modules
;;
;; Definitions
relation Type_ok: context |- type : deftype* hint(name "T-type") hint(macro "%type")
relation Tag_ok: context |- tag : tagtype hint(name "T-tag") hint(macro "%tag")
relation Global_ok: context |- global : globaltype hint(name "T-global") hint(macro "%global")
relation Mem_ok: context |- mem : memtype hint(name "T-mem") hint(macro "%mem")
relation Table_ok: context |- table : tabletype hint(name "T-table") hint(macro "%table")
relation Func_ok: context |- func : deftype hint(name "T-func") hint(macro "%func")
relation Data_ok: context |- data : datatype hint(name "T-data") hint(macro "%data") hint(prosepp "")
relation Elem_ok: context |- elem : elemtype hint(name "T-elem") hint(macro "%elem")
relation Datamode_ok: context |- datamode : datatype hint(name "T-datamode") hint(macro "%datamode") hint(prosepp "")
relation Elemmode_ok: context |- elemmode : elemtype hint(name "T-elemmode") hint(macro "%elemmode")
relation Start_ok: context |- start : OK hint(name "T-start") hint(macro "%start")
relation Local_ok: context |- local : localtype hint(name "T-local") hint(macro "%local")
rule Type_ok:
C |- TYPE rectype : dt*
-- if x = |C.TYPES|
-- if dt* = $rolldt(x, rectype)
-- Rectype_ok: C ++ {TYPES dt*} |- rectype : OK(x)
rule Tag_ok:
C |- TAG tagtype : $clos_tagtype(C, tagtype)
-- Tagtype_ok: C |- tagtype : OK
rule Global_ok:
C |- GLOBAL globaltype expr : globaltype
-- Globaltype_ok: C |- globaltype : OK
-- if globaltype = MUT? t
-- Expr_ok_const: C |- expr : t CONST
rule Mem_ok:
C |- MEMORY memtype : memtype
-- Memtype_ok: C |- memtype : OK
rule Table_ok:
C |- TABLE tabletype expr : tabletype
-- Tabletype_ok: C |- tabletype : OK
-- if tabletype = at lim rt
-- Expr_ok_const: C |- expr : rt CONST
rule Local_ok/set:
C |- LOCAL t : SET t
-- Defaultable: |- t DEFAULTABLE
rule Local_ok/unset:
C |- LOCAL t : UNSET t
-- Nondefaultable: |- t NONDEFAULTABLE
rule Func_ok:
C |- FUNC x local* expr : C.TYPES[x]
-- Expand: C.TYPES[x] ~~ FUNC t_1* -> t_2*
-- (Local_ok: C |- local : lct)*
----
-- Expr_ok: C ++ {LOCALS (SET t_1)* lct*, LABELS (t_2*), RETURN (t_2*)} |- expr : t_2*
rule Data_ok:
C |- DATA b* datamode : OK
-- Datamode_ok: C |- datamode : OK
rule Elem_ok:
C |- ELEM elemtype expr* elemmode : elemtype
-- Reftype_ok: C |- elemtype : OK
-- (Expr_ok_const: C |- expr : elemtype CONST)*
-- Elemmode_ok: C |- elemmode : elemtype
rule Datamode_ok/passive:
C |- PASSIVE : OK
rule Datamode_ok/active:
C |- ACTIVE x expr : OK
-- if C.MEMS[x] = at lim PAGE
-- Expr_ok_const: C |- expr : at CONST
rule Elemmode_ok/passive:
C |- PASSIVE : rt
rule Elemmode_ok/declare:
C |- DECLARE : rt
rule Elemmode_ok/active:
C |- ACTIVE x expr : rt
-- if C.TABLES[x] = at lim rt'
-- Reftype_sub: C |- rt <: rt'
-- Expr_ok_const: C |- expr : at CONST
rule Start_ok:
C |- START x : OK
-- Expand: C.FUNCS[x] ~~ FUNC eps -> eps
;; Im/exports
relation Import_ok: context |- import : externtype hint(name "T-import") hint(macro "%import")
relation Export_ok: context |- export : name externtype hint(name "T-export") hint(macro "%export")
relation Externidx_ok: context |- externidx : externtype hint(name "T-externidx") hint(macro "%externidx")
rule Import_ok:
C |- IMPORT name_1 name_2 xt : $clos_externtype(C, xt)
-- Externtype_ok: C |- xt : OK
rule Export_ok:
C |- EXPORT name externidx : name xt
-- Externidx_ok: C |- externidx : xt
rule Externidx_ok/tag:
C |- TAG x : TAG jt
-- if C.TAGS[x] = jt
rule Externidx_ok/global:
C |- GLOBAL x : GLOBAL gt
-- if C.GLOBALS[x] = gt
rule Externidx_ok/mem:
C |- MEM x : MEM mt
-- if C.MEMS[x] = mt
rule Externidx_ok/table:
C |- TABLE x : TABLE tt
-- if C.TABLES[x] = tt
rule Externidx_ok/func:
C |- FUNC x : FUNC dt
-- if C.FUNCS[x] = dt
;; Modules
relation Module_ok: |- module : moduletype hint(name "T-module") hint(macro "%module")
relation Types_ok: context |- type* : deftype* hint(name "T-types") hint(macro "%types")
relation Globals_ok: context |- global* : globaltype* hint(name "T-globals") hint(macro "%globals")
;; HACK for notation
syntax nonfuncs = global* mem* table* elem*
def $funcidx_nonfuncs(nonfuncs) : funcidx* hint(show $funcidx(%)) hint(macro "freefuncidx")
def $funcidx_nonfuncs(global* mem* table* elem*) = $funcidx_module(MODULE eps eps eps global* mem* table* eps eps elem* eps eps)
rule Module_ok:
|- MODULE type* import* tag* global* mem* table* func* data* elem* start? export* : $clos_moduletype(C, xt_I* -> xt_E*)
-- Types_ok: {} |- type* : dt'*
-- (Import_ok: {TYPES dt'*} |- import : xt_I)*
----
-- (Tag_ok: C' |- tag : jt)*
-- Globals_ok: C' |- global* : gt*
-- (Mem_ok: C' |- mem : mt)*
-- (Table_ok: C' |- table : tt)*
-- (Func_ok: C |- func : dt)*
----
-- (Data_ok: C |- data : ok)*
-- (Elem_ok: C |- elem : rt)*
-- (Start_ok: C |- start : OK)?
-- (Export_ok: C |- export : nm xt_E)*
-- if $disjoint_(name, nm*)
----
-- if C = C' ++ {TAGS jt_I* jt*, GLOBALS gt*, MEMS mt_I* mt*, TABLES tt_I* tt*, DATAS ok*, ELEMS rt*}
----
-- if C' = {TYPES dt'*, GLOBALS gt_I*, FUNCS dt_I* dt*, REFS x*}
-- if x* = $funcidx_nonfuncs(global* mem* table* elem*)
----
-- if jt_I* = $tagsxt(xt_I*)
-- if gt_I* = $globalsxt(xt_I*)
-- if mt_I* = $memsxt(xt_I*)
-- if tt_I* = $tablesxt(xt_I*)
-- if dt_I* = $funcsxt(xt_I*)
rule Types_ok/empty:
C |- eps : eps
rule Types_ok/cons:
C |- type_1 type* : dt_1* dt*
-- Type_ok: C |- type_1 : dt_1*
-- Types_ok: C ++ {TYPES dt_1*} |- type* : dt*
rule Globals_ok/empty:
C |- eps : eps
rule Globals_ok/cons:
C |- global_1 global* : gt_1 gt*
-- Global_ok: C |- global_1 : gt_1
-- Globals_ok: C ++ {GLOBALS gt_1} |- global* : gt*