-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrimOp-MVar.dl
98 lines (89 loc) · 2.88 KB
/
PrimOp-MVar.dl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
HINT: is interpreted -/+
primop effectful
+ "newMVar#" :: {"State#" %s} -> {"GHC.Prim.Unit#" {"MVar#" %s %a}}
+ "takeMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.Unit#" %a}
+ "tryTakeMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.(#,#)" T_Int64 %a}
+ "putMVar#" :: {"MVar#" %s %a} -> %a -> {"State#" %s} -> {"GHC.Prim.(##)"}
+ "tryPutMVar#" :: {"MVar#" %s %a} -> %a -> {"State#" %s} -> {"GHC.Prim.Unit#" T_Int64}
+ "readMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.Unit#" %a}
+ "tryReadMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.(#,#)" T_Int64 %a}
primop pure
- "sameMVar#" :: {"MVar#" %s %a} -> {"MVar#" %s %a} -> T_Int64
primop effectful
- "isEmptyMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.Unit#" T_Int64}
*/
.decl MVar(ext_result:Variable, ty_node:Variable, item:Variable)
.output MVar
.decl MVarDef(ext_result:Variable, ty_node:Variable)
.output MVarDef
// "newMVar#" :: {"State#" %s} -> {"GHC.Prim.Unit#" {"MVar#" %s %a}}
// new mvar
USED("PrimOp-MVar-01")
//Called(r, op),
MVarDef(r, ty_node) :-
op = "newMVar#",
Call(r, op, _),
// extract result node
RetTup1Node0(op, ty_node),
NEW_REACHABLE(r)
.
// CHECKED
// "takeMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.Unit#" %a}
// "readMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.Unit#" %a}
USED("PrimOp-MVar-02")
//Called(r, op),
TypeVarPointsTo(r, ty_node, item) :-
( op = "takeMVar#"
; op = "readMVar#"
),
Call(r, op, _),
// lookup mvar items
CallArgument(r, 0, arr),
ExternalOrigin(arr, ext_result, arr_node),
MVarDef(ext_result, arr_node),
MVar(ext_result, arr_node, item),
// lookup result node
RetTup1Node0(op, ty_node),
NEW_REACHABLE(r)
.
// CHECKED
// "tryTakeMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.(#,#)" T_Int64 %a}
// "tryReadMVar#" :: {"MVar#" %s %a} -> {"State#" %s} -> {"GHC.Prim.(#,#)" T_Int64 %a}
USED("PrimOp-MVar-03")
//Called(r, op),
TypeVarPointsTo(r, ty_node, item) :-
( op = "tryTakeMVar#"
; op = "tryReadMVar#"
),
Call(r, op, _),
// lookup mvar items
CallArgument(r, 0, arr),
ExternalOrigin(arr, ext_result, arr_node),
MVarDef(ext_result, arr_node),
MVar(ext_result, arr_node, item),
// lookup result node
RetTup(op, "GHC.Prim.(#,#)", 1, ty_node),
NEW_REACHABLE(r)
.
// CHECKED
// "putMVar#" :: {"MVar#" %s %a} -> %a -> {"State#" %s} -> {"GHC.Prim.(##)"}
// "tryPutMVar#" :: {"MVar#" %s %a} -> %a -> {"State#" %s} -> {"GHC.Prim.Unit#" T_Int64}
// extend mvar
USED("PrimOp-MVar-04")
//Called(r, op),
MVar(ext_result, ty_node, item) :-
( op = "putMVar#"
; op = "tryPutMVar#"
),
Call(r, op, _),
// item to write
CallArgument(r, 1, item),
// lookup mvar
CallArgument(r, 0, arr),
ExternalOrigin(arr, ext_result, ty_node),
// validation
MVarDef(ext_result, ty_node),
NEW_REACHABLE(r)
.
// CHECKED