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}