pub const ConstantsBlock = struct {
pub const id: BlockId = .CONSTANTS;
pub const abbrevs = [_]type{
ModuleBlock.ConstantsBlock.SetType,
ModuleBlock.ConstantsBlock.Null,
ModuleBlock.ConstantsBlock.Undef,
ModuleBlock.ConstantsBlock.Poison,
ModuleBlock.ConstantsBlock.Integer,
ModuleBlock.ConstantsBlock.Half,
ModuleBlock.ConstantsBlock.Float,
ModuleBlock.ConstantsBlock.Double,
ModuleBlock.ConstantsBlock.Fp80,
ModuleBlock.ConstantsBlock.Fp128,
ModuleBlock.ConstantsBlock.Aggregate,
ModuleBlock.ConstantsBlock.String,
ModuleBlock.ConstantsBlock.CString,
ModuleBlock.ConstantsBlock.Cast,
ModuleBlock.ConstantsBlock.Binary,
ModuleBlock.ConstantsBlock.Cmp,
ModuleBlock.ConstantsBlock.ExtractElement,
ModuleBlock.ConstantsBlock.InsertElement,
ModuleBlock.ConstantsBlock.ShuffleVector,
ModuleBlock.ConstantsBlock.ShuffleVectorEx,
ModuleBlock.ConstantsBlock.BlockAddress,
ModuleBlock.ConstantsBlock.DsoLocalEquivalentOrNoCfi,
};
pub const Code = enum(u6) {
/// SETTYPE: [typeid]
SETTYPE = 1,
/// NULL
NULL = 2,
/// UNDEF
UNDEF = 3,
/// INTEGER: [intval]
INTEGER = 4,
/// WIDE_INTEGER: [n x intval]
WIDE_INTEGER = 5,
/// FLOAT: [fpval]
FLOAT = 6,
/// AGGREGATE: [n x value number]
AGGREGATE = 7,
/// STRING: [values]
STRING = 8,
/// CSTRING: [values]
CSTRING = 9,
/// CE_BINOP: [opcode, opval, opval]
CE_BINOP = 10,
/// CE_CAST: [opcode, opty, opval]
CE_CAST = 11,
/// CE_GEP: [n x operands]
CE_GEP_OLD = 12,
/// CE_SELECT: [opval, opval, opval]
CE_SELECT = 13,
/// CE_EXTRACTELT: [opty, opval, opval]
CE_EXTRACTELT = 14,
/// CE_INSERTELT: [opval, opval, opval]
CE_INSERTELT = 15,
/// CE_SHUFFLEVEC: [opval, opval, opval]
CE_SHUFFLEVEC = 16,
/// CE_CMP: [opty, opval, opval, pred]
CE_CMP = 17,
/// INLINEASM: [sideeffect|alignstack,asmstr,conststr]
INLINEASM_OLD = 18,
/// SHUFVEC_EX: [opty, opval, opval, opval]
CE_SHUFVEC_EX = 19,
/// INBOUNDS_GEP: [n x operands]
CE_INBOUNDS_GEP = 20,
/// BLOCKADDRESS: [fnty, fnval, bb#]
BLOCKADDRESS = 21,
/// DATA: [n x elements]
DATA = 22,
/// INLINEASM: [sideeffect|alignstack|asmdialect,asmstr,conststr]
INLINEASM_OLD2 = 23,
/// [opty, flags, n x operands]
CE_GEP_WITH_INRANGE_INDEX_OLD = 24,
/// CE_UNOP: [opcode, opval]
CE_UNOP = 25,
/// POISON
POISON = 26,
/// DSO_LOCAL_EQUIVALENT [gvty, gv]
DSO_LOCAL_EQUIVALENT = 27,
/// INLINEASM: [sideeffect|alignstack|asmdialect|unwind,asmstr,
/// conststr]
INLINEASM_OLD3 = 28,
/// NO_CFI [ fty, f ]
NO_CFI_VALUE = 29,
/// INLINEASM: [fnty,sideeffect|alignstack|asmdialect|unwind,
/// asmstr,conststr]
INLINEASM = 30,
/// [opty, flags, range, n x operands]
CE_GEP_WITH_INRANGE = 31,
/// [opty, flags, n x operands]
CE_GEP = 32,
/// [ptr, key, disc, addrdisc]
PTRAUTH = 33,
};
pub const SetType = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.SETTYPE) },
.{ .fixed_runtime = Builder.Type },
};
type_id: Builder.Type,
};
pub const Null = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.NULL) },
};
};
pub const Undef = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.UNDEF) },
};
};
pub const Poison = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.POISON) },
};
};
pub const Integer = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.INTEGER) },
.{ .vbr = 16 },
};
value: u64,
};
pub const Half = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.FLOAT) },
.{ .fixed = 16 },
};
value: u16,
};
pub const Float = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.FLOAT) },
.{ .fixed = 32 },
};
value: u32,
};
pub const Double = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.FLOAT) },
.{ .vbr = 6 },
};
value: u64,
};
pub const Fp80 = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.FLOAT) },
.{ .vbr = 6 },
.{ .vbr = 6 },
};
hi: u64,
lo: u16,
};
pub const Fp128 = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.FLOAT) },
.{ .vbr = 6 },
.{ .vbr = 6 },
};
lo: u64,
hi: u64,
};
pub const Aggregate = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.AGGREGATE) },
.{ .array_fixed = 32 },
};
values: []const Builder.Constant,
};
pub const String = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.STRING) },
.{ .array_fixed = 8 },
};
string: []const u8,
};
pub const CString = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CSTRING) },
.{ .array_fixed = 8 },
};
string: []const u8,
};
pub const Cast = struct {
const CastOpcode = Builder.CastOpcode;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CE_CAST) },
.{ .fixed = @bitSizeOf(CastOpcode) },
.{ .fixed_runtime = Builder.Type },
ConstantAbbrev,
};
opcode: CastOpcode,
type_index: Builder.Type,
val: Builder.Constant,
};
pub const Binary = struct {
const BinaryOpcode = Builder.BinaryOpcode;
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CE_BINOP) },
.{ .fixed = @bitSizeOf(BinaryOpcode) },
ConstantAbbrev,
ConstantAbbrev,
};
opcode: BinaryOpcode,
lhs: Builder.Constant,
rhs: Builder.Constant,
};
pub const Cmp = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CE_CMP) },
.{ .fixed_runtime = Builder.Type },
ConstantAbbrev,
ConstantAbbrev,
.{ .vbr = 6 },
};
ty: Builder.Type,
lhs: Builder.Constant,
rhs: Builder.Constant,
pred: u32,
};
pub const ExtractElement = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CE_EXTRACTELT) },
.{ .fixed_runtime = Builder.Type },
ConstantAbbrev,
.{ .fixed_runtime = Builder.Type },
ConstantAbbrev,
};
val_type: Builder.Type,
val: Builder.Constant,
index_type: Builder.Type,
index: Builder.Constant,
};
pub const InsertElement = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CE_INSERTELT) },
ConstantAbbrev,
ConstantAbbrev,
.{ .fixed_runtime = Builder.Type },
ConstantAbbrev,
};
val: Builder.Constant,
elem: Builder.Constant,
index_type: Builder.Type,
index: Builder.Constant,
};
pub const ShuffleVector = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CE_SHUFFLEVEC) },
ValueAbbrev,
ValueAbbrev,
ValueAbbrev,
};
lhs: Builder.Constant,
rhs: Builder.Constant,
mask: Builder.Constant,
};
pub const ShuffleVectorEx = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.CE_SHUFVEC_EX) },
.{ .fixed_runtime = Builder.Type },
ValueAbbrev,
ValueAbbrev,
ValueAbbrev,
};
ty: Builder.Type,
lhs: Builder.Constant,
rhs: Builder.Constant,
mask: Builder.Constant,
};
pub const BlockAddress = struct {
pub const ops = [_]AbbrevOp{
.{ .literal = @backingInt(ModuleBlock.ConstantsBlock.Code.BLOCKADDRESS) },
.{ .fixed_runtime = Builder.Type },
ConstantAbbrev,
BlockAbbrev,
};
type_id: Builder.Type,
function: u32,
block: u32,
};
pub const DsoLocalEquivalentOrNoCfi = struct {
pub const ops = [_]AbbrevOp{
.{ .fixed = 5 },
.{ .fixed_runtime = Builder.Type },
ConstantAbbrev,
};
code: ModuleBlock.ConstantsBlock.Code,
type_id: Builder.Type,
function: u32,
};
}
The constants block (CONSTANTS_BLOCK_ID) describes emission for each constant and maintains an implicit current type value.