pub const FunctionBlock = struct {
pub const id: BlockId = .FUNCTION;
pub const abbrevs = [_]type{
ModuleBlock.FunctionBlock.DeclareBlocks,
ModuleBlock.FunctionBlock.Call,
ModuleBlock.FunctionBlock.CallFast,
ModuleBlock.FunctionBlock.FNeg,
ModuleBlock.FunctionBlock.FNegFast,
ModuleBlock.FunctionBlock.Binary,
ModuleBlock.FunctionBlock.BinaryNoWrap,
ModuleBlock.FunctionBlock.BinaryExact,
ModuleBlock.FunctionBlock.BinaryFast,
ModuleBlock.FunctionBlock.Cmp,
ModuleBlock.FunctionBlock.CmpFast,
ModuleBlock.FunctionBlock.Select,
ModuleBlock.FunctionBlock.SelectFast,
ModuleBlock.FunctionBlock.Cast,
ModuleBlock.FunctionBlock.TruncNoWrap,
ModuleBlock.FunctionBlock.Alloca,
ModuleBlock.FunctionBlock.GetElementPtr,
ModuleBlock.FunctionBlock.ExtractValue,
ModuleBlock.FunctionBlock.InsertValue,
ModuleBlock.FunctionBlock.ExtractElement,
ModuleBlock.FunctionBlock.InsertElement,
ModuleBlock.FunctionBlock.ShuffleVector,
ModuleBlock.FunctionBlock.RetVoid,
ModuleBlock.FunctionBlock.Ret,
ModuleBlock.FunctionBlock.Unreachable,
ModuleBlock.FunctionBlock.Load,
ModuleBlock.FunctionBlock.LoadAtomic,
ModuleBlock.FunctionBlock.Store,
ModuleBlock.FunctionBlock.StoreAtomic,
ModuleBlock.FunctionBlock.BrUnconditional,
ModuleBlock.FunctionBlock.BrConditional,
ModuleBlock.FunctionBlock.VaArg,
ModuleBlock.FunctionBlock.AtomicRmw,
ModuleBlock.FunctionBlock.CmpXchg,
ModuleBlock.FunctionBlock.Fence,
ModuleBlock.FunctionBlock.DebugLoc,
ModuleBlock.FunctionBlock.DebugLocAgain,
ModuleBlock.FunctionBlock.ColdOperandBundle,
ModuleBlock.FunctionBlock.IndirectBr,
};
pub const Code = enum(u7) {
/// DECLAREBLOCKS: [n]
DECLAREBLOCKS = 1,
/// BINOP: [opcode, ty, opval, opval]
INST_BINOP = 2,
/// CAST: [opcode, ty, opty, opval]
INST_CAST = 3,
/// GEP: [n x operands]
INST_GEP_OLD = 4,
/// SELECT: [ty, opval, opval, opval]
INST_SELECT = 5,
/// EXTRACTELT: [opty, opval, opval]
INST_EXTRACTELT = 6,
/// INSERTELT: [ty, opval, opval, opval]
INST_INSERTELT = 7,
/// SHUFFLEVEC: [ty, opval, opval, opval]
INST_SHUFFLEVEC = 8,
/// CMP: [opty, opval, opval, pred]
INST_CMP = 9,
/// RET: [opty,opval<both optional>]
INST_RET = 10,
/// BR: [bb#, bb#, cond] or [bb#]
INST_BR = 11,
/// SWITCH: [opty, op0, op1, ...]
INST_SWITCH = 12,
/// INVOKE: [attr, fnty, op0,op1, ...]
INST_INVOKE = 13,
/// UNREACHABLE
INST_UNREACHABLE = 15,
/// PHI: [ty, val0,bb0, ...]
INST_PHI = 16,
/// ALLOCA: [instty, opty, op, align]
INST_ALLOCA = 19,
/// LOAD: [opty, op, align, vol]
INST_LOAD = 20,
/// VAARG: [valistty, valist, instty]
/// This store code encodes the pointer type, rather than the value type
/// this is so information only available in the pointer type (e.g. address
/// spaces) is retained.
INST_VAARG = 23,
/// STORE: [ptrty,ptr,val, align, vol]
INST_STORE_OLD = 24,
/// EXTRACTVAL: [n x operands]
INST_EXTRACTVAL = 26,
/// INSERTVAL: [n x operands]
INST_INSERTVAL = 27,
/// fcmp/icmp returning Int1TY or vector of Int1Ty. Same as CMP, exists to
/// support legacy vicmp/vfcmp instructions.
/// CMP2: [opty, opval, opval, pred]
INST_CMP2 = 28,
/// new select on i1 or [N x i1]
/// VSELECT: [ty,opval,opval,predty,pred]
INST_VSELECT = 29,
/// INBOUNDS_GEP: [n x operands]
INST_INBOUNDS_GEP_OLD = 30,
/// INDIRECTBR: [opty, op0, op1, ...]
INST_INDIRECTBR = 31,
/// DEBUG_LOC_AGAIN
DEBUG_LOC_AGAIN = 33,
/// CALL: [attr, cc, fnty, fnid, args...]
INST_CALL = 34,
/// DEBUG_LOC: [Line,Col,ScopeVal, IAVal]
DEBUG_LOC = 35,
/// FENCE: [ordering, synchscope]
INST_FENCE = 36,
/// CMPXCHG: [ptrty, ptr, cmp, val, vol,
/// ordering, synchscope,
/// failure_ordering?, weak?]
INST_CMPXCHG_OLD = 37,
/// ATOMICRMW: [ptrty,ptr,val, operation,
/// align, vol,
/// ordering, synchscope]
INST_ATOMICRMW_OLD = 38,
/// RESUME: [opval]
INST_RESUME = 39,
/// LANDINGPAD: [ty,val,val,num,id0,val0...]
INST_LANDINGPAD_OLD = 40,
/// LOAD: [opty, op, align, vol,
/// ordering, synchscope]
INST_LOADATOMIC = 41,
/// STORE: [ptrty,ptr,val, align, vol
/// ordering, synchscope]
INST_STOREATOMIC_OLD = 42,
/// GEP: [inbounds, n x operands]
INST_GEP = 43,
/// STORE: [ptrty,ptr,valty,val, align, vol]
INST_STORE = 44,
/// STORE: [ptrty,ptr,val, align, vol
INST_STOREATOMIC = 45,
/// CMPXCHG: [ptrty, ptr, cmp, val, vol,
/// success_ordering, synchscope,
/// failure_ordering, weak]
INST_CMPXCHG = 46,
/// LANDINGPAD: [ty,val,num,id0,val0...]
INST_LANDINGPAD = 47,
/// CLEANUPRET: [val] or [val,bb#]
INST_CLEANUPRET = 48,
/// CATCHRET: [val,bb#]
INST_CATCHRET = 49,
/// CATCHPAD: [bb#,bb#,num,args...]
INST_CATCHPAD = 50,
/// CLEANUPPAD: [num,args...]
INST_CLEANUPPAD = 51,
/// CATCHSWITCH: [num,args...] or [num,args...,bb]
INST_CATCHSWITCH = 52,
/// OPERAND_BUNDLE: [tag#, value...]
OPERAND_BUNDLE = 55,
/// UNOP: [opcode, ty, opval]
INST_UNOP = 56,
/// CALLBR: [attr, cc, norm, transfs,
/// fnty, fnid, args...]
INST_CALLBR = 57,
/// FREEZE: [opty, opval]
INST_FREEZE = 58,
/// ATOMICRMW: [ptrty, ptr, valty, val,
/// operation, align, vol,
/// ordering, synchscope]
INST_ATOMICRMW = 59,
/// BLOCKADDR_USERS: [value...]
BLOCKADDR_USERS = 60,
/// [DILocation, DILocalVariable, DIExpression, ValueAsMetadata]
DEBUG_RECORD_VALUE = 61,
/// [DILocation, DILocalVariable, DIExpression, ValueAsMetadata]
DEBUG_RECORD_DECLARE = 62,
/// [DILocation, DILocalVariable, DIExpression, ValueAsMetadata,
/// DIAssignID, DIExpression (addr), ValueAsMetadata (addr)]
DEBUG_RECORD_ASSIGN = 63,
/// [DILocation, DILocalVariable, DIExpression, Value]
DEBUG_RECORD_VALUE_SIMPLE = 64,
/// [DILocation, DILabel]
DEBUG_RECORD_LABEL = 65,
};
pub const DeclareBlocks = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.DECLAREBLOCKS) },
.{ .vbr = 8 },
};
num_blocks: usize,
};
pub const Call = struct {
pub const CallType = packed struct(u17) {
tail: bool = false,
call_conv: Builder.CallConv,
reserved: u3 = 0,
must_tail: bool = false,
// We always use the explicit type version as that is what LLVM does
explicit_type: bool = true,
no_tail: bool = false,
};
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_CALL) },
.{ .fixed_runtime = Builder.FunctionAttributes },
.{ .fixed = @bitSizeOf(CallType) },
.{ .fixed_runtime = Builder.Type },
ValueAbbrev, // Callee
ValueArrayAbbrev, // Args
};
attributes: Builder.FunctionAttributes,
call_type: CallType,
type_id: Builder.Type,
callee: Builder.Value,
args: []const Builder.Value,
};
pub const CallFast = struct {
const CallType = packed struct(u18) {
tail: bool = false,
call_conv: Builder.CallConv,
reserved: u3 = 0,
must_tail: bool = false,
// We always use the explicit type version as that is what LLVM does
explicit_type: bool = true,
no_tail: bool = false,
fast: bool = true,
};
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_CALL) },
.{ .fixed_runtime = Builder.FunctionAttributes },
.{ .fixed = @bitSizeOf(CallType) },
.{ .fixed = @bitSizeOf(Builder.FastMath) },
.{ .fixed_runtime = Builder.Type },
ValueAbbrev, // Callee
ValueArrayAbbrev, // Args
};
attributes: Builder.FunctionAttributes,
call_type: CallType,
fast_math: Builder.FastMath,
type_id: Builder.Type,
callee: Builder.Value,
args: []const Builder.Value,
};
pub const FNeg = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_UNOP) },
ValueAbbrev,
.{ .literal = 0 },
};
val: u32,
};
pub const FNegFast = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_UNOP) },
ValueAbbrev,
.{ .literal = 0 },
.{ .fixed = @bitSizeOf(Builder.FastMath) },
};
val: u32,
fast_math: Builder.FastMath,
};
pub const Binary = struct {
const BinaryOpcode = Builder.BinaryOpcode;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_BINOP) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(BinaryOpcode) },
};
lhs: u32,
rhs: u32,
opcode: BinaryOpcode,
};
pub const BinaryNoWrap = struct {
const BinaryOpcode = Builder.BinaryOpcode;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_BINOP) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(BinaryOpcode) },
.{ .fixed = 2 },
};
lhs: u32,
rhs: u32,
opcode: BinaryOpcode,
flags: packed struct(u2) {
no_unsigned_wrap: bool,
no_signed_wrap: bool,
},
};
pub const BinaryExact = struct {
const BinaryOpcode = Builder.BinaryOpcode;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_BINOP) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(BinaryOpcode) },
.{ .literal = 1 },
};
lhs: u32,
rhs: u32,
opcode: BinaryOpcode,
};
pub const BinaryFast = struct {
const BinaryOpcode = Builder.BinaryOpcode;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_BINOP) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(BinaryOpcode) },
.{ .fixed = @bitSizeOf(Builder.FastMath) },
};
lhs: u32,
rhs: u32,
opcode: BinaryOpcode,
fast_math: Builder.FastMath,
};
pub const Cmp = struct {
const CmpPredicate = Builder.CmpPredicate;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_CMP2) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(CmpPredicate) },
};
lhs: u32,
rhs: u32,
pred: CmpPredicate,
};
pub const CmpFast = struct {
const CmpPredicate = Builder.CmpPredicate;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_CMP2) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(CmpPredicate) },
.{ .fixed = @bitSizeOf(Builder.FastMath) },
};
lhs: u32,
rhs: u32,
pred: CmpPredicate,
fast_math: Builder.FastMath,
};
pub const Select = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_VSELECT) },
ValueAbbrev,
ValueAbbrev,
ValueAbbrev,
};
lhs: u32,
rhs: u32,
cond: u32,
};
pub const SelectFast = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_VSELECT) },
ValueAbbrev,
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(Builder.FastMath) },
};
lhs: u32,
rhs: u32,
cond: u32,
fast_math: Builder.FastMath,
};
pub const Cast = struct {
const CastOpcode = Builder.CastOpcode;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_CAST) },
ValueAbbrev,
.{ .fixed_runtime = Builder.Type },
.{ .fixed = @bitSizeOf(CastOpcode) },
};
val: u32,
type_index: Builder.Type,
opcode: CastOpcode,
};
pub const TruncNoWrap = struct {
pub const Flags = packed struct(u2) {
no_unsigned_wrap: bool,
no_signed_wrap: bool,
};
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_CAST) },
ValueAbbrev,
.{ .fixed_runtime = Builder.Type },
.{ .literal = @backingInt(Builder.CastOpcode.trunc) },
.{ .fixed = @bitSizeOf(Flags) },
};
val: u32,
type_index: Builder.Type,
flags: Flags,
};
pub const Alloca = struct {
pub const Flags = packed struct(u11) {
align_lower: u5,
inalloca: bool,
explicit_type: bool,
swift_error: bool,
align_upper: u3,
};
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_ALLOCA) },
.{ .fixed_runtime = Builder.Type },
.{ .fixed_runtime = Builder.Type },
ValueAbbrev,
.{ .fixed = @bitSizeOf(Flags) },
};
inst_type: Builder.Type,
len_type: Builder.Type,
len_value: u32,
flags: Flags,
};
pub const RetVoid = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_RET) },
};
};
pub const Ret = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_RET) },
ValueAbbrev,
};
val: u32,
};
pub const GetElementPtr = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_GEP) },
.{ .fixed = 1 },
.{ .fixed_runtime = Builder.Type },
ValueAbbrev,
ValueArrayAbbrev,
};
is_inbounds: bool,
type_index: Builder.Type,
base: Builder.Value,
indices: []const Builder.Value,
};
pub const ExtractValue = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_EXTRACTVAL) },
ValueAbbrev,
ValueArrayAbbrev,
};
val: u32,
indices: []const u32,
};
pub const InsertValue = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_INSERTVAL) },
ValueAbbrev,
ValueAbbrev,
ValueArrayAbbrev,
};
val: u32,
elem: u32,
indices: []const u32,
};
pub const ExtractElement = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_EXTRACTELT) },
ValueAbbrev,
ValueAbbrev,
};
val: u32,
index: u32,
};
pub const InsertElement = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_INSERTELT) },
ValueAbbrev,
ValueAbbrev,
ValueAbbrev,
};
val: u32,
elem: u32,
index: u32,
};
pub const ShuffleVector = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_SHUFFLEVEC) },
ValueAbbrev,
ValueAbbrev,
ValueAbbrev,
};
lhs: u32,
rhs: u32,
mask: u32,
};
pub const Unreachable = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_UNREACHABLE) },
};
};
pub const Load = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_LOAD) },
ValueAbbrev,
.{ .fixed_runtime = Builder.Type },
.{ .fixed = @bitSizeOf(Builder.Alignment) },
.{ .fixed = 1 },
};
ptr: u32,
ty: Builder.Type,
alignment: @Int(.unsigned, @bitSizeOf(Builder.Alignment)),
is_volatile: bool,
};
pub const LoadAtomic = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_LOADATOMIC) },
ValueAbbrev,
.{ .fixed_runtime = Builder.Type },
.{ .fixed = @bitSizeOf(Builder.Alignment) },
.{ .fixed = 1 },
.{ .fixed = @bitSizeOf(Builder.AtomicOrdering) },
.{ .fixed = @bitSizeOf(Builder.SyncScope) },
};
ptr: u32,
ty: Builder.Type,
alignment: @Int(.unsigned, @bitSizeOf(Builder.Alignment)),
is_volatile: bool,
success_ordering: Builder.AtomicOrdering,
sync_scope: Builder.SyncScope,
};
pub const Store = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_STORE) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(Builder.Alignment) },
.{ .fixed = 1 },
};
ptr: u32,
val: u32,
alignment: @Int(.unsigned, @bitSizeOf(Builder.Alignment)),
is_volatile: bool,
};
pub const StoreAtomic = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_STOREATOMIC) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(Builder.Alignment) },
.{ .fixed = 1 },
.{ .fixed = @bitSizeOf(Builder.AtomicOrdering) },
.{ .fixed = @bitSizeOf(Builder.SyncScope) },
};
ptr: u32,
val: u32,
alignment: @Int(.unsigned, @bitSizeOf(Builder.Alignment)),
is_volatile: bool,
success_ordering: Builder.AtomicOrdering,
sync_scope: Builder.SyncScope,
};
pub const BrUnconditional = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_BR) },
BlockAbbrev,
};
block: u32,
};
pub const BrConditional = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_BR) },
BlockAbbrev,
BlockAbbrev,
BlockAbbrev,
};
then_block: u32,
else_block: u32,
condition: u32,
};
pub const VaArg = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_VAARG) },
.{ .fixed_runtime = Builder.Type },
ValueAbbrev,
.{ .fixed_runtime = Builder.Type },
};
list_type: Builder.Type,
list: u32,
type: Builder.Type,
};
pub const AtomicRmw = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_ATOMICRMW) },
ValueAbbrev,
ValueAbbrev,
.{ .fixed = @bitSizeOf(Builder.Function.Instruction.AtomicRmw.Operation) },
.{ .fixed = 1 },
.{ .fixed = @bitSizeOf(Builder.AtomicOrdering) },
.{ .fixed = @bitSizeOf(Builder.SyncScope) },
.{ .fixed = @bitSizeOf(Builder.Alignment) },
};
ptr: u32,
val: u32,
operation: Builder.Function.Instruction.AtomicRmw.Operation,
is_volatile: bool,
success_ordering: Builder.AtomicOrdering,
sync_scope: Builder.SyncScope,
alignment: @Int(.unsigned, @bitSizeOf(Builder.Alignment)),
};
pub const CmpXchg = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_CMPXCHG) },
ValueAbbrev,
ValueAbbrev,
ValueAbbrev,
.{ .fixed = 1 },
.{ .fixed = @bitSizeOf(Builder.AtomicOrdering) },
.{ .fixed = @bitSizeOf(Builder.SyncScope) },
.{ .fixed = @bitSizeOf(Builder.AtomicOrdering) },
.{ .fixed = 1 },
.{ .fixed = @bitSizeOf(Builder.Alignment) },
};
ptr: u32,
cmp: u32,
new: u32,
is_volatile: bool,
success_ordering: Builder.AtomicOrdering,
sync_scope: Builder.SyncScope,
failure_ordering: Builder.AtomicOrdering,
is_weak: bool,
alignment: @Int(.unsigned, @bitSizeOf(Builder.Alignment)),
};
pub const Fence = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_FENCE) },
.{ .fixed = @bitSizeOf(Builder.AtomicOrdering) },
.{ .fixed = @bitSizeOf(Builder.SyncScope) },
};
ordering: Builder.AtomicOrdering,
sync_scope: Builder.SyncScope,
};
pub const DebugLoc = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.DEBUG_LOC) },
LineAbbrev,
ColumnAbbrev,
MetadataAbbrev,
MetadataAbbrev,
.{ .literal = 0 },
};
line: u32,
column: u32,
scope: Builder.Metadata.Optional,
inlined_at: Builder.Metadata.Optional,
};
pub const DebugLocAgain = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.DEBUG_LOC_AGAIN) },
};
};
pub const ColdOperandBundle = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.OPERAND_BUNDLE) },
.{ .literal = 0 },
};
};
pub const IndirectBr = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.Code.INST_INDIRECTBR) },
.{ .fixed_runtime = Builder.Type },
ValueAbbrev,
BlockArrayAbbrev,
};
ty: Builder.Type,
addr: Builder.Value,
targets: []const Builder.Function.Block.Index,
};
pub const ValueSymtabBlock = struct {
pub const id: BlockId = .VALUE_SYMTAB;
pub const abbrevs = [_]type{
ModuleBlock.FunctionBlock.ValueSymtabBlock.BlockEntry,
};
/// Value symbol table codes.
pub const Code = enum(u3) {
/// VST_ENTRY: [valueid, namechar x N]
ENTRY = 1,
/// VST_BBENTRY: [bbid, namechar x N]
BBENTRY = 2,
/// VST_FNENTRY: [valueid, offset, namechar x N]
FNENTRY = 3,
/// VST_COMBINED_ENTRY: [valueid, refguid]
COMBINED_ENTRY = 5,
};
pub const BlockEntry = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.FunctionBlock.ValueSymtabBlock.Code.BBENTRY) },
ValueAbbrev,
.{ .array_fixed = 8 },
};
value_id: u32,
string: []const u8,
};
};
pub const MetadataBlock = struct {
pub const id: BlockId = .METADATA;
pub const abbrevs = [_]type{
ModuleBlock.FunctionBlock.MetadataBlock.Value,
};
pub const Value = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.MetadataBlock.Code.VALUE) },
.{ .fixed = 32 }, // variable
.{ .fixed = 32 }, // expression
};
ty: Builder.Type,
value: Builder.Value,
};
};
pub const MetadataAttachmentBlock = struct {
pub const id: BlockId = .METADATA_ATTACHMENT;
pub const abbrevs = [_]type{
ModuleBlock.FunctionBlock.MetadataAttachmentBlock.AttachmentGlobalSingle,
ModuleBlock.FunctionBlock.MetadataAttachmentBlock.AttachmentInstructionSingle,
};
pub const AttachmentGlobalSingle = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.MetadataBlock.Code.ATTACHMENT) },
.{ .fixed = 1 },
MetadataAbbrev,
};
kind: FixedMetadataKind,
metadata: Builder.Metadata,
};
pub const AttachmentInstructionSingle = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.MetadataBlock.Code.ATTACHMENT) },
ValueAbbrev,
.{ .fixed = 5 },
MetadataAbbrev,
};
inst: u32,
kind: FixedMetadataKind,
metadata: Builder.Metadata,
};
};
}
The function body block (FUNCTION_BLOCK_ID) describes function bodies. It can contain a constant block (CONSTANTS_BLOCK_ID).