llvm_constants/enums.rs
1//! Enum constants for `llvm-constants`.
2
3use num_enum::TryFromPrimitive;
4
5use crate::constants::FIRST_APPLICATION_BLOCK_ID;
6
7/// Block IDs that are reserved by LLVM.
8// NOTE(ww): Block IDs 0 through 7 are reserved, but only 0 (BLOCKINFO)
9// is actually currently used.
10#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, TryFromPrimitive)]
11#[repr(u64)]
12pub enum ReservedBlockId {
13 /// The `BLOCKINFO` block ID.
14 BlockInfo = 0,
15 /// Reserved; no semantics.
16 Reserved1 = 1,
17 /// Reserved; no semantics.
18 Reserved2 = 2,
19 /// Reserved; no semantics.
20 Reserved3 = 3,
21 /// Reserved; no semantics.
22 Reserved4 = 4,
23 /// Reserved; no semantics.
24 Reserved5 = 5,
25 /// Reserved; no semantics.
26 Reserved6 = 6,
27 /// Reserved; no semantics.
28 Reserved7 = 7,
29}
30
31/// Block IDs that are used by LLVM for bitcode (i.e., IR bitstreams).
32/// See: `enum BlockIDs` in `Bitcode/LLVMBitCodes.h`,
33#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, TryFromPrimitive)]
34#[repr(u64)]
35pub enum IrBlockId {
36 /// `MODULE_BLOCK_ID`
37 Module = FIRST_APPLICATION_BLOCK_ID,
38 /// `PARAM_ATTR_BLOCK_ID`
39 ParamAttr,
40 /// `PARAM_ATTR_GROUP_BLOCK_ID`
41 ParamAttrGroup,
42 /// `CONSTANTS_BLOCK_ID`
43 Constants,
44 /// `FUNCTION_BLOCK_ID`
45 Function,
46 /// `IDENTIFICATION_BLOCK_ID`.
47 Identification,
48 /// `VALUE_SYMTAB_BLOCK_ID`.
49 ValueSymtab,
50 /// `METADATA_BLOCK_ID`.
51 Metadata,
52 /// `METADATA_ATTACHMENT_BLOCK_ID`.
53 MetadataAttachment,
54 /// `TYPE_BLOCK_ID_NEW`.
55 Type,
56 /// `USELIST_BLOCK_ID`.
57 Uselist,
58 /// `MODULE_STRTAB_BLOCK_ID`.
59 ModuleStrtab,
60 /// `GLOBAL_VAL_SUMMARY_BLOCK_ID`.
61 GlobalValSummary,
62 /// `OPERAND_BUNDLE_TAGS_BLOCK_ID`.
63 OperandBundleTags,
64 /// `METADATA_KIND_BLOCK_ID`.
65 MetadataKind,
66 /// `STRTAB_BLOCK_ID`.
67 Strtab,
68 /// `FULL_LTO_GLOBAL_VAL_SUMMARY_BLOCK_ID`.
69 FullLtoGlobalValSummary,
70 /// `SYMTAB_BLOCK_ID`.
71 Symtab,
72 /// `SYNC_SCOPE_NAMES_BLOCK_ID`.
73 SyncScopeNames,
74}
75
76/// Abbreviation IDs that are reserved by LLVM.
77#[derive(Clone, Copy, Debug, PartialEq, TryFromPrimitive)]
78#[repr(u64)]
79pub enum ReservedAbbrevId {
80 /// Identifies an `END_BLOCK` record.
81 EndBlock = 0,
82 /// Identifies an `ENTER_SUBBLOCK` record.
83 EnterSubBlock,
84 /// Identifies a `DEFINE_ABBREV` record.
85 DefineAbbrev,
86 /// Identifies an `UNABBREV_RECORD` record.
87 UnabbrevRecord,
88}
89
90/// Codes for each operand encoding type supported by `DEFINE_ABBREV`.
91#[derive(Clone, Copy, Debug, PartialEq, TryFromPrimitive)]
92#[repr(u64)]
93pub enum AbbrevOpEnc {
94 /// A fixed-length, unsigned operand.
95 Fixed = 1,
96 /// A variable-length, unsigned operand.
97 Vbr,
98 /// An array of values.
99 Array,
100 /// A single 6-bit-encoded character.
101 Char6,
102 /// A blob of bytes.
103 Blob,
104}
105
106/// Calling conventions supported by LLVM.
107#[non_exhaustive]
108#[derive(Debug, PartialEq, TryFromPrimitive)]
109#[repr(u64)]
110#[allow(missing_docs)]
111pub enum CallingConvention {
112 C = 0,
113 Fast = 8,
114 Cold = 9,
115 GHC = 10,
116 HiPE = 11,
117 WebKitJS = 12,
118 AnyReg = 13,
119 PreserveMost = 14,
120 PreserveAll = 15,
121 Swift = 16,
122 CXXFASTTLS = 17,
123 X86Stdcall = 64,
124 X86Fastcall = 65,
125 ARMAPCS = 66,
126 ARMAAPCS = 67,
127 ARMAAPCSVFP = 68,
128 MSP430INTR = 69,
129 X86ThisCall = 70,
130 PTXKernel = 71,
131 PTXDevice = 72,
132 SPIRFUNC = 75,
133 SPIRKERNEL = 76,
134 IntelOCLBI = 77,
135 X8664SysV = 78,
136 Win64 = 79,
137 X86VectorCall = 80,
138 HHVM = 81,
139 HHVMC = 82,
140 X86INTR = 83,
141 AVRINTR = 84,
142 AVRSIGNAL = 85,
143 AVRBUILTIN = 86,
144 AMDGPUVS = 87,
145 AMDGPUGS = 88,
146 AMDGPUPS = 89,
147 AMDGPUCS = 90,
148 AMDGPUKERNEL = 91,
149 X86RegCall = 92,
150 AMDGPUHS = 93,
151 MSP430BUILTIN = 94,
152 AMDGPULS = 95,
153 AMDGPUES = 96,
154}
155
156/// Codes for each `UNABBREV_RECORD` in `BLOCKINFO`.
157#[non_exhaustive]
158#[derive(Debug, PartialEq, TryFromPrimitive)]
159#[repr(u64)]
160pub enum BlockInfoCode {
161 /// SETBID: `[blockid]`
162 SetBid = 1,
163 /// BLOCKNAME: `[...name...]`
164 BlockName,
165 /// SETRECORDNAME: `[recordid, ...name...]`
166 SetRecordName,
167}
168
169/// Codes for each record in `IDENTIFICATION_BLOCK`.
170#[non_exhaustive]
171#[derive(Debug, PartialEq, TryFromPrimitive)]
172#[repr(u64)]
173pub enum IdentificationCode {
174 /// IDENTIFICATION_CODE_STRING: `[...string...]`
175 ProducerString = 1,
176 /// IDENTIFICATION_CODE_EPOCH: `[epoch]`
177 Epoch,
178}
179
180/// Codes for each record in `MODULE_BLOCK`.
181#[non_exhaustive]
182#[derive(Debug, PartialEq, TryFromPrimitive)]
183#[repr(u64)]
184pub enum ModuleCode {
185 /// MODULE_CODE_VERSION: `[version#]`
186 Version = 1,
187 /// MODULE_CODE_TRIPLE: `[...string...]`
188 Triple,
189 /// MODULE_CODE_DATALAYOUT: `[...string...]`
190 DataLayout,
191 /// MODULE_CODE_ASM: `[...string...]`
192 Asm,
193 /// MODULE_CODE_SECTIONNAME: `[...string...]`
194 SectionName,
195 /// MODULE_CODE_DEPLIB: `[...string...]`
196 DepLib,
197 /// MODULE_CODE_GLOBALVAR: `[...fields...]`
198 /// See: <https://llvm.org/docs/BitCodeFormat.html#module-code-globalvar-record>
199 GlobalVar,
200 /// MODULE_CODE_FUNCTION: `[...fields...]`
201 /// See: <https://llvm.org/docs/BitCodeFormat.html#module-code-function-record>
202 Function,
203 /// MODULE_CODE_ALIAS: `[...fields...]`
204 /// See: <https://llvm.org/docs/BitCodeFormat.html#module-code-alias-record>
205 AliasOld,
206 /// MODULE_CODE_GCNAME: `[...string...]`
207 GcName,
208 /// MODULE_CODE_COMDAT
209 /// v1: `[selection_kind, name]`
210 /// v2: `[strtab_offset, strtab_size, selection_kind]`
211 /// Only `v2` is currently supported.
212 Comdat,
213 /// MODULE_CODE_VSTOFFSET: `[offset]`
214 VstOffset,
215 /// MODULE_CODE_ALIAS: `[...fields...]`
216 /// Not well documented; see `ModuleCodes` in `Bitcode/LLVMBitCodes.h`.
217 Alias,
218 /// MODULE_CODE_METADATA_VALUES_UNUSED
219 /// Not documented at all; see `ModuleCodes` in `Bitcode/LLVMBitCodes.h`.
220 MetadataValuesUnused,
221 /// MODULE_CODE_SOURCE_FILENAME: `[...string...]`
222 SourceFilename,
223 /// MODULE_CODE_HASH: `[5*i32]`
224 Hash,
225 /// MODULE_CODE_IFUNC: `[...fields...]`
226 /// Not well documented; see `ModuleCodes` in `Bitcode/LLVMBitCodes.h`.
227 IFunc,
228}
229
230/// Codes for each record in `TYPE_BLOCK` (i.e., `TYPE_BLOCK_ID_NEW`).
231#[non_exhaustive]
232#[derive(Debug, PartialEq, TryFromPrimitive)]
233#[repr(u64)]
234pub enum TypeCode {
235 /// TYPE_CODE_NUMENTRY: `[numentries]`
236 NumEntry = 1,
237 /// TYPE_CODE_VOID
238 Void,
239 /// TYPE_CODE_FLOAT
240 Float,
241 /// TYPE_CODE_DOUBLE
242 Double,
243 /// TYPE_CODE_LABEL
244 Label,
245 /// TYPE_CODE_OPAQUE
246 Opaque,
247 /// TYPE_CODE_INTEGER: `[width]`
248 Integer,
249 /// TYPE_CODE_POINTER: `[pointee type]`
250 Pointer,
251 /// TYPE_CODE_FUNCTION_OLD: `[vararg, attrid, retty, paramty x N]`
252 FunctionOld,
253 /// TYPE_CODE_HALF
254 Half,
255 /// TYPE_CODE_ARRAY: `[numelts, eltty]`
256 Array,
257 /// TYPE_CODE_VECTOR: `[numelts, eltty]`
258 Vector,
259 /// TYPE_CODE_X86_FP80
260 X86Fp80,
261 /// TYPE_CODE_FP128
262 Fp128,
263 /// TYPE_CODE_PPC_FP128
264 PpcFp128,
265 /// TYPE_CODE_METADATA,
266 Metadata,
267 /// TYPE_CODE_X86_MMX
268 X86Mmx,
269 /// TYPE_CODE_STRUCT_ANON: `[ispacked, eltty x N]`
270 StructAnon,
271 /// TYPE_CODE_STRUCT_NAME: `[strchr x N]`
272 StructName,
273 /// TYPE_CODE_STRUCT_NAMED: `[ispacked, eltty x N]`
274 StructNamed,
275 /// TYPE_CODE_FUNCTION: `[vararg, retty, paramty x N]`
276 Function,
277 /// TYPE_CODE_TOKEN
278 Token,
279 /// TYPE_CODE_BFLOAT
280 BFloat,
281 /// TYPE_CODE_X86_AMX
282 X86Amx,
283 /// TYPE_CODE_OPAQUE_POINTER: `[addrspace]`
284 OpaquePointer,
285}
286
287/// Codes for each record in `STRTAB_BLOCK`.
288#[non_exhaustive]
289#[derive(Debug, PartialEq, TryFromPrimitive)]
290#[repr(u64)]
291pub enum StrtabCode {
292 /// STRTAB_BLOB: `[...string...]`
293 Blob = 1,
294}
295
296/// Codes for each record in `SYMTAB_BLOCK`.
297#[non_exhaustive]
298#[derive(Debug, PartialEq, TryFromPrimitive)]
299#[repr(u64)]
300pub enum SymtabCode {
301 /// SYMTAB_BLOB: `[...data...]`
302 Blob = 1,
303}
304
305/// Codes for each record in `PARAMATTR_BLOCK` or `PARAMATTR_GROUP_BLOCK`.
306// NOTE(ww): For whatever reason, these two blocks share the same enum for
307// record codes.
308#[non_exhaustive]
309#[derive(Debug, PartialEq, TryFromPrimitive)]
310#[repr(u64)]
311pub enum AttributeCode {
312 /// PARAMATTR_CODE_ENTRY_OLD: `[paramidx0, attr0, paramidx1, attr1...]`
313 EntryOld = 1,
314 /// PARAMATTR_CODE_ENTRY: `[attrgrp0, attrgrp1, ...]`
315 Entry,
316 /// PARAMATTR_GRP_CODE_ENTRY: `[grpid, idx, attr0, attr1, ...]`
317 GroupCodeEntry,
318}