blob: 36977aad7e111927042a2b1c34157820887c47c2 (
plain)
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
|
open Identifiers
open Types
open Values
open Expressions
module FunDefId = IdGen ()
type assumed_fun_id = BoxNew | BoxDeref | BoxDerefMut | BoxFree
[@@deriving show]
type fun_id = Local of FunDefId.id | Assumed of assumed_fun_id
[@@deriving show]
type assertion = { cond : operand; expected : bool } [@@deriving show]
type fun_sig = {
region_params : region_var list;
num_early_bound_regions : int;
type_params : type_var list;
inputs : rty list;
output : rty;
}
[@@deriving show]
type call = {
func : fun_id;
region_params : erased_region list;
type_params : ety list;
args : operand list;
dest : place;
}
[@@deriving show]
type statement =
| Assign of place * rvalue
| FakeRead of place
| SetDiscriminant of place * VariantId.id
| Drop of place
| Assert of assertion
| Call of call
| Panic
| Return
| Break of int
(** Break to (outer) loop. The [int] identifies the loop to break to:
* 0: break to the first outer loop (the current loop)
* 1: break to the second outer loop
* ...
*)
| Continue of int
(** Continue to (outer) loop. The loop identifier works
the same way as for [Break] *)
| Nop
[@@deriving show]
type expression =
| Statement of statement
| Sequence of expression * expression
| Switch of operand * switch_targets
| Loop of expression
[@@deriving show]
and switch_targets =
| If of expression * expression (** Gives the "if" and "else" blocks *)
| SwitchInt of integer_type * (scalar_value * expression) list * expression
(** The targets for a switch over an integer are:
- the list `(matched value, expression to execute)`
- the "otherwise" expression.
Also note that we precise the type of the integer (uint32, int64, etc.)
which we switch on. *)
[@@deriving show]
type fun_def = {
def_id : FunDefId.id;
name : name;
signature : fun_sig;
divergent : bool;
arg_count : int;
locals : var list;
body : expression;
}
[@@deriving show]
|