cranelift_codegen_meta/shared/entities.rs
1use crate::cdsl::operands::{OperandKind, OperandKindFields};
2
3/// Small helper to initialize an OperandBuilder with the right kind, for a given name and doc.
4fn new(format_field_name: &'static str, rust_type: &'static str, doc: &'static str) -> OperandKind {
5 OperandKind::new(
6 format_field_name,
7 rust_type,
8 OperandKindFields::EntityRef,
9 doc,
10 )
11}
12
13pub(crate) struct EntityRefs {
14 /// A reference to a basic block in the same function, with its arguments provided.
15 /// This is primarily used in control flow instructions.
16 pub(crate) block_call: OperandKind,
17
18 /// A reference to a basic block in the same function, with its arguments provided.
19 /// This is primarily used in control flow instructions.
20 pub(crate) block_then: OperandKind,
21
22 /// A reference to a basic block in the same function, with its arguments provided.
23 /// This is primarily used in control flow instructions.
24 pub(crate) block_else: OperandKind,
25
26 /// A reference to a basic block in the same function, without any arguments.
27 /// This is primarily used to refer to block `try_call` terminators to get
28 /// exception metadata (e.g., resume PCs) as first-class values.
29 pub(crate) raw_block: OperandKind,
30
31 /// A reference to a stack slot declared in the function preamble.
32 pub(crate) stack_slot: OperandKind,
33
34 /// A reference to a dynamic_stack slot declared in the function preamble.
35 pub(crate) dynamic_stack_slot: OperandKind,
36
37 /// A reference to a global value.
38 pub(crate) global_value: OperandKind,
39
40 /// A reference to a function signature declared in the function preamble.
41 /// This is used to provide the call signature in a call_indirect instruction.
42 pub(crate) sig_ref: OperandKind,
43
44 /// A reference to an external function declared in the function preamble.
45 /// This is used to provide the callee and signature in a call instruction.
46 pub(crate) func_ref: OperandKind,
47
48 /// A reference to a jump table declared in the function preamble.
49 pub(crate) jump_table: OperandKind,
50
51 /// A reference to an exception table declared in the function preamble.
52 pub(crate) exception_table: OperandKind,
53
54 /// A variable-sized list of value operands. Use for Block and function call arguments.
55 pub(crate) varargs: OperandKind,
56
57 /// A constant stored in the constant pool.
58 ///
59 /// This operand is used to pass constants to instructions like `vconst`
60 /// while storing the actual bytes in the constant pool.
61 pub(crate) pool_constant: OperandKind,
62
63 /// An unsigned 128-bit immediate integer operand, stored out-of-line in the
64 /// `DataFlowGraph::immediates` pool.
65 ///
66 /// This operand is used to pass entire 128-bit vectors as immediates to instructions like
67 /// `shuffle` and `mask`.
68 pub(crate) uimm128: OperandKind,
69}
70
71impl EntityRefs {
72 pub fn new() -> Self {
73 Self {
74 block_call: new(
75 "destination",
76 "ir::BlockCall",
77 "a basic block in the same function, with its arguments provided.",
78 ),
79
80 block_then: new(
81 "block_then",
82 "ir::BlockCall",
83 "a basic block in the same function, with its arguments provided.",
84 ),
85
86 block_else: new(
87 "block_else",
88 "ir::BlockCall",
89 "a basic block in the same function, with its arguments provided.",
90 ),
91
92 raw_block: new(
93 "raw_block",
94 "ir::Block",
95 "a basic block in the same function, with no arguments provided.",
96 ),
97
98 stack_slot: new("stack_slot", "ir::StackSlot", "A stack slot"),
99
100 dynamic_stack_slot: new(
101 "dynamic_stack_slot",
102 "ir::DynamicStackSlot",
103 "A dynamic stack slot",
104 ),
105
106 global_value: new("global_value", "ir::GlobalValue", "A global value."),
107
108 sig_ref: new("sig_ref", "ir::SigRef", "A function signature."),
109
110 func_ref: new("func_ref", "ir::FuncRef", "An external function."),
111
112 jump_table: new("table", "ir::JumpTable", "A jump table."),
113
114 exception_table: new("exception", "ir::ExceptionTable", "An exception table."),
115
116 varargs: OperandKind::new(
117 "",
118 "&[Value]",
119 OperandKindFields::VariableArgs,
120 r#"
121 A variable size list of `value` operands.
122
123 Use this to represent arguments passed to a function call, arguments
124 passed to a basic block, or a variable number of results
125 returned from an instruction.
126 "#,
127 ),
128
129 pool_constant: new(
130 "constant_handle",
131 "ir::Constant",
132 "A constant stored in the constant pool.",
133 ),
134
135 uimm128: new(
136 "imm",
137 "ir::Immediate",
138 "A 128-bit immediate unsigned integer.",
139 ),
140 }
141 }
142}