mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
LLVM: Add Metadata/Debug bitcode IR
This commit is contained in:
parent
c11c7a28a3
commit
d35080b792
@ -12,6 +12,12 @@ const ValueArrayAbbrev = AbbrevOp{ .array_vbr = 6 };
|
||||
const ConstantAbbrev = AbbrevOp{ .vbr = 6 };
|
||||
const ConstantArrayAbbrev = AbbrevOp{ .array_vbr = 6 };
|
||||
|
||||
const MetadataAbbrev = AbbrevOp{ .vbr = 16 };
|
||||
const MetadataArrayAbbrev = AbbrevOp{ .array_vbr = 16 };
|
||||
|
||||
const LineAbbrev = AbbrevOp{ .vbr = 8 };
|
||||
const ColumnAbbrev = AbbrevOp{ .vbr = 8 };
|
||||
|
||||
const BlockAbbrev = AbbrevOp{ .vbr = 6 };
|
||||
|
||||
pub const Identification = struct {
|
||||
@ -574,6 +580,446 @@ pub const Constants = struct {
|
||||
};
|
||||
};
|
||||
|
||||
pub const MetadataBlock = struct {
|
||||
pub const id = 15;
|
||||
|
||||
pub const abbrevs = [_]type{
|
||||
Strings,
|
||||
File,
|
||||
CompileUnit,
|
||||
Subprogram,
|
||||
LexicalBlock,
|
||||
Location,
|
||||
BasicType,
|
||||
CompositeType,
|
||||
DerivedType,
|
||||
SubroutineType,
|
||||
Enumerator,
|
||||
Subrange,
|
||||
Expression,
|
||||
Node,
|
||||
LocalVar,
|
||||
Parameter,
|
||||
GlobalVar,
|
||||
GlobalVarExpression,
|
||||
Constant,
|
||||
Name,
|
||||
NamedNode,
|
||||
};
|
||||
|
||||
pub const Strings = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 35 },
|
||||
.{ .vbr = 6 },
|
||||
.{ .vbr = 6 },
|
||||
.blob,
|
||||
};
|
||||
num_strings: u32,
|
||||
strings_offset: u32,
|
||||
blob: []const u8,
|
||||
};
|
||||
|
||||
pub const File = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 16 },
|
||||
.{ .literal = 1 }, // is distinct
|
||||
MetadataAbbrev, // name
|
||||
MetadataAbbrev, // path
|
||||
.{ .literal = 0 }, // checksum
|
||||
.{ .literal = 0 }, // checksum
|
||||
};
|
||||
|
||||
name: Builder.MetadataString,
|
||||
path: Builder.MetadataString,
|
||||
};
|
||||
|
||||
pub const CompileUnit = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 20 },
|
||||
.{ .literal = 1 }, // is distinct
|
||||
.{ .literal = std.dwarf.LANG.C99 }, // source language
|
||||
MetadataAbbrev, // file
|
||||
MetadataAbbrev, // producer
|
||||
.{ .fixed = 1 }, // is optimized
|
||||
.{ .literal = 0 }, // raw flags
|
||||
.{ .literal = 0 }, // runtime version
|
||||
.{ .literal = 0 }, // split debug file name
|
||||
.{ .literal = 1 }, // emission kind
|
||||
MetadataAbbrev, // enum types
|
||||
.{ .literal = 0 }, // retained types
|
||||
.{ .literal = 0 }, // subprograms
|
||||
MetadataAbbrev, // global variables
|
||||
.{ .literal = 0 }, // imported entities
|
||||
.{ .literal = 0 }, // DWO ID
|
||||
.{ .literal = 0 }, // macros
|
||||
.{ .literal = 0 }, // split debug inlining
|
||||
.{ .literal = 0 }, // debug info profiling
|
||||
.{ .literal = 0 }, // name table kind
|
||||
.{ .literal = 0 }, // ranges base address
|
||||
.{ .literal = 0 }, // raw sysroot
|
||||
.{ .literal = 0 }, // raw SDK
|
||||
};
|
||||
|
||||
file: Builder.Metadata,
|
||||
producer: Builder.MetadataString,
|
||||
is_optimized: bool,
|
||||
enums: Builder.Metadata,
|
||||
globals: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const Subprogram = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 21 },
|
||||
.{ .literal = 0b111 }, // is distinct | has sp flags | has flags
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // name
|
||||
MetadataAbbrev, // linkage name
|
||||
MetadataAbbrev, // file
|
||||
LineAbbrev, // line
|
||||
MetadataAbbrev, // type
|
||||
LineAbbrev, // scope line
|
||||
.{ .literal = 0 }, // containing type
|
||||
.{ .fixed = 32 }, // sp flags
|
||||
.{ .literal = 0 }, // virtual index
|
||||
.{ .fixed = 32 }, // flags
|
||||
MetadataAbbrev, // compile unit
|
||||
.{ .literal = 0 }, // template params
|
||||
.{ .literal = 0 }, // declaration
|
||||
.{ .literal = 0 }, // retained nodes
|
||||
.{ .literal = 0 }, // this adjustment
|
||||
.{ .literal = 0 }, // thrown types
|
||||
.{ .literal = 0 }, // annotations
|
||||
.{ .literal = 0 }, // target function name
|
||||
};
|
||||
|
||||
scope: Builder.Metadata,
|
||||
name: Builder.MetadataString,
|
||||
linkage_name: Builder.MetadataString,
|
||||
file: Builder.Metadata,
|
||||
line: u32,
|
||||
ty: Builder.Metadata,
|
||||
scope_line: u32,
|
||||
sp_flags: u32,
|
||||
flags: u32,
|
||||
compile_unit: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const LexicalBlock = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 22 },
|
||||
.{ .literal = 1 }, // is distinct
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // file
|
||||
LineAbbrev, // line
|
||||
ColumnAbbrev, // column
|
||||
};
|
||||
|
||||
scope: Builder.Metadata,
|
||||
file: Builder.Metadata,
|
||||
line: u32,
|
||||
column: u32,
|
||||
};
|
||||
|
||||
pub const Location = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 7 },
|
||||
.{ .literal = 0 }, // is distinct
|
||||
LineAbbrev, // line
|
||||
ColumnAbbrev, // column
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // inlined at
|
||||
.{ .literal = 0 }, // is implicit code
|
||||
};
|
||||
|
||||
line: u32,
|
||||
column: u32,
|
||||
scope: u32,
|
||||
inlined_at: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const BasicType = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 15 },
|
||||
.{ .literal = 1 }, // is distinct
|
||||
.{ .literal = std.dwarf.TAG.base_type }, // tag
|
||||
MetadataAbbrev, // name
|
||||
.{ .vbr = 6 }, // size in bits
|
||||
.{ .literal = 0 }, // align in bits
|
||||
.{ .vbr = 8 }, // encoding
|
||||
.{ .literal = 0 }, // flags
|
||||
};
|
||||
|
||||
name: Builder.MetadataString,
|
||||
size_in_bits: u64,
|
||||
encoding: u32,
|
||||
};
|
||||
|
||||
pub const CompositeType = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 18 },
|
||||
.{ .literal = 1 | 0x2 }, // is distinct | is not used in old type ref
|
||||
.{ .fixed = 32 }, // tag
|
||||
MetadataAbbrev, // name
|
||||
MetadataAbbrev, // file
|
||||
LineAbbrev, // line
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // underlying type
|
||||
.{ .vbr = 6 }, // size in bits
|
||||
.{ .vbr = 6 }, // align in bits
|
||||
.{ .literal = 0 }, // offset in bits
|
||||
.{ .literal = 0 }, // flags
|
||||
MetadataAbbrev, // elements
|
||||
.{ .literal = 0 }, // runtime lang
|
||||
.{ .literal = 0 }, // vtable holder
|
||||
.{ .literal = 0 }, // template params
|
||||
.{ .literal = 0 }, // raw id
|
||||
.{ .literal = 0 }, // discriminator
|
||||
.{ .literal = 0 }, // data location
|
||||
.{ .literal = 0 }, // associated
|
||||
.{ .literal = 0 }, // allocated
|
||||
.{ .literal = 0 }, // rank
|
||||
.{ .literal = 0 }, // annotations
|
||||
};
|
||||
|
||||
tag: u32,
|
||||
name: Builder.MetadataString,
|
||||
file: Builder.Metadata,
|
||||
line: u32,
|
||||
scope: Builder.Metadata,
|
||||
underlying_type: Builder.Metadata,
|
||||
size_in_bits: u64,
|
||||
align_in_bits: u64,
|
||||
elements: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const DerivedType = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 17 },
|
||||
.{ .literal = 1 }, // is distinct
|
||||
.{ .fixed = 32 }, // tag
|
||||
MetadataAbbrev, // name
|
||||
MetadataAbbrev, // file
|
||||
LineAbbrev, // line
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // underlying type
|
||||
.{ .vbr = 6 }, // size in bits
|
||||
.{ .vbr = 6 }, // align in bits
|
||||
.{ .vbr = 6 }, // offset in bits
|
||||
.{ .literal = 0 }, // flags
|
||||
.{ .literal = 0 }, // extra data
|
||||
};
|
||||
|
||||
tag: u32,
|
||||
name: Builder.MetadataString,
|
||||
file: Builder.Metadata,
|
||||
line: u32,
|
||||
scope: Builder.Metadata,
|
||||
underlying_type: Builder.Metadata,
|
||||
size_in_bits: u64,
|
||||
align_in_bits: u64,
|
||||
offset_in_bits: u64,
|
||||
};
|
||||
|
||||
pub const SubroutineType = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 19 },
|
||||
.{ .literal = 1 | 0x2 }, // is distinct | has no old type refs
|
||||
.{ .literal = 0 }, // flags
|
||||
MetadataAbbrev, // types
|
||||
.{ .literal = 0 }, // cc
|
||||
};
|
||||
|
||||
types: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const Enumerator = struct {
|
||||
pub const id = 14;
|
||||
|
||||
pub const Flags = packed struct(u3) {
|
||||
distinct: bool = true,
|
||||
unsigned: bool,
|
||||
bigint: bool,
|
||||
};
|
||||
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = Enumerator.id },
|
||||
.{ .fixed = @bitSizeOf(Flags) }, // flags
|
||||
.{ .vbr = 6 }, // bit width
|
||||
MetadataAbbrev, // name
|
||||
.{ .vbr = 16 }, // integer value
|
||||
};
|
||||
|
||||
flags: Flags,
|
||||
bit_width: u32,
|
||||
name: Builder.MetadataString,
|
||||
value: std.math.big.Limb,
|
||||
};
|
||||
|
||||
pub const Subrange = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 0b11 },
|
||||
MetadataAbbrev, // count
|
||||
MetadataAbbrev, // lower bound
|
||||
.{ .literal = 0 }, // upper bound
|
||||
.{ .literal = 0 }, // stride
|
||||
};
|
||||
|
||||
count: Builder.Metadata,
|
||||
lower_bound: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const Expression = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 29 },
|
||||
.{ .literal = 0 | (3 << 1) }, // is distinct | version
|
||||
MetadataArrayAbbrev, // elements
|
||||
};
|
||||
|
||||
elements: []const u32,
|
||||
};
|
||||
|
||||
pub const Node = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 3 },
|
||||
MetadataArrayAbbrev, // elements
|
||||
};
|
||||
|
||||
elements: []const Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const LocalVar = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 28 },
|
||||
.{ .literal = 0b11 }, // is distinct | has alignment
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // name
|
||||
MetadataAbbrev, // file
|
||||
LineAbbrev, // line
|
||||
MetadataAbbrev, // type
|
||||
.{ .literal = 0 }, // arg
|
||||
.{ .literal = 0 }, // flags
|
||||
.{ .literal = 0 }, // align bits
|
||||
.{ .literal = 0 }, // annotations
|
||||
};
|
||||
|
||||
scope: Builder.Metadata,
|
||||
name: Builder.MetadataString,
|
||||
file: Builder.Metadata,
|
||||
line: u32,
|
||||
ty: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const Parameter = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 28 },
|
||||
.{ .literal = 0b11 }, // is distinct | has alignment
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // name
|
||||
MetadataAbbrev, // file
|
||||
LineAbbrev, // line
|
||||
MetadataAbbrev, // type
|
||||
.{ .vbr = 4 }, // arg
|
||||
.{ .literal = 0 }, // flags
|
||||
.{ .literal = 0 }, // align bits
|
||||
.{ .literal = 0 }, // annotations
|
||||
};
|
||||
|
||||
scope: Builder.Metadata,
|
||||
name: Builder.MetadataString,
|
||||
file: Builder.Metadata,
|
||||
line: u32,
|
||||
ty: Builder.Metadata,
|
||||
arg: u32,
|
||||
};
|
||||
|
||||
pub const GlobalVar = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 27 },
|
||||
.{ .literal = 0b101 }, // is distinct | version
|
||||
MetadataAbbrev, // scope
|
||||
MetadataAbbrev, // name
|
||||
MetadataAbbrev, // linkage name
|
||||
MetadataAbbrev, // file
|
||||
LineAbbrev, // line
|
||||
MetadataAbbrev, // type
|
||||
.{ .fixed = 1 }, // local
|
||||
.{ .literal = 1 }, // defined
|
||||
.{ .literal = 0 }, // static data members declaration
|
||||
.{ .literal = 0 }, // template params
|
||||
.{ .literal = 0 }, // align in bits
|
||||
.{ .literal = 0 }, // annotations
|
||||
};
|
||||
|
||||
scope: Builder.Metadata,
|
||||
name: Builder.MetadataString,
|
||||
linkage_name: Builder.MetadataString,
|
||||
file: Builder.Metadata,
|
||||
line: u32,
|
||||
ty: Builder.Metadata,
|
||||
local: bool,
|
||||
};
|
||||
|
||||
pub const GlobalVarExpression = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 37 },
|
||||
.{ .literal = 1 }, // is distinct
|
||||
MetadataAbbrev, // variable
|
||||
MetadataAbbrev, // expression
|
||||
};
|
||||
|
||||
variable: Builder.Metadata,
|
||||
expression: Builder.Metadata,
|
||||
};
|
||||
|
||||
pub const Constant = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 2 },
|
||||
MetadataAbbrev, // type
|
||||
MetadataAbbrev, // value
|
||||
};
|
||||
|
||||
ty: Builder.Type,
|
||||
constant: Builder.Constant,
|
||||
};
|
||||
|
||||
pub const Name = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 4 },
|
||||
.{ .array_fixed = 8 }, // name
|
||||
};
|
||||
|
||||
name: []const u8,
|
||||
};
|
||||
|
||||
pub const NamedNode = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 10 },
|
||||
MetadataArrayAbbrev, // elements
|
||||
};
|
||||
|
||||
elements: []const Builder.Metadata,
|
||||
};
|
||||
};
|
||||
|
||||
pub const FunctionMetadataBlock = struct {
|
||||
pub const id = 15;
|
||||
|
||||
pub const abbrevs = [_]type{
|
||||
Value,
|
||||
};
|
||||
|
||||
pub const Value = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 2 },
|
||||
.{ .fixed = 32 }, // variable
|
||||
.{ .fixed = 32 }, // expression
|
||||
};
|
||||
|
||||
ty: Builder.Type,
|
||||
value: Builder.Value,
|
||||
};
|
||||
};
|
||||
|
||||
pub const FunctionBlock = struct {
|
||||
pub const id = 12;
|
||||
|
||||
@ -610,6 +1056,8 @@ pub const FunctionBlock = struct {
|
||||
AtomicRmw,
|
||||
CmpXchg,
|
||||
Fence,
|
||||
DebugLoc,
|
||||
DebugLocAgain,
|
||||
};
|
||||
|
||||
pub const DeclareBlocks = struct {
|
||||
@ -1067,6 +1515,28 @@ pub const FunctionBlock = struct {
|
||||
ordering: Builder.AtomicOrdering,
|
||||
sync_scope: Builder.SyncScope,
|
||||
};
|
||||
|
||||
pub const DebugLoc = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 35 },
|
||||
.{ .fixed = 32 },
|
||||
.{ .fixed = 32 },
|
||||
.{ .fixed = 32 },
|
||||
.{ .fixed = 32 },
|
||||
.{ .fixed = 1 },
|
||||
};
|
||||
line: u32,
|
||||
column: u32,
|
||||
scope: Builder.Metadata,
|
||||
inlined_at: Builder.Metadata,
|
||||
is_implicit: bool,
|
||||
};
|
||||
|
||||
pub const DebugLocAgain = struct {
|
||||
pub const ops = [_]AbbrevOp{
|
||||
.{ .literal = 33 },
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pub const FunctionValueSymbolTable = struct {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user