master
1const std = @import("../../../std.zig");
2
3pub const magic = 0xeb9f;
4pub const version = 1;
5
6pub const ext = @import("btf_ext.zig");
7
8/// All offsets are in bytes relative to the end of this header
9pub const Header = extern struct {
10 magic: u16,
11 version: u8,
12 flags: u8,
13 hdr_len: u32,
14
15 /// offset of type section
16 type_off: u32,
17
18 /// length of type section
19 type_len: u32,
20
21 /// offset of string section
22 str_off: u32,
23
24 /// length of string section
25 str_len: u32,
26};
27
28/// Max number of type identifiers
29pub const max_type = 0xfffff;
30
31/// Max offset into string section
32pub const max_name_offset = 0xffffff;
33
34/// Max number of struct/union/enum member of func args
35pub const max_vlen = 0xffff;
36
37pub const Type = extern struct {
38 name_off: u32,
39 info: packed struct(u32) {
40 /// number of struct's members
41 vlen: u16,
42
43 unused_1: u8,
44 kind: Kind,
45 unused_2: u2,
46
47 /// used by Struct, Union, and Fwd
48 kind_flag: bool,
49 },
50
51 /// size is used by Int, Enum, Struct, Union, and DataSec, it tells the size
52 /// of the type it is describing
53 ///
54 /// type is used by Ptr, Typedef, Volatile, Const, Restrict, Func,
55 /// FuncProto, and Var. It is a type_id referring to another type
56 size_type: extern union { size: u32, typ: u32 },
57};
58
59/// For some kinds, Type is immediately followed by extra data
60pub const Kind = enum(u5) {
61 unknown,
62 int,
63 ptr,
64 array,
65 @"struct",
66 @"union",
67 @"enum",
68 fwd,
69 typedef,
70 @"volatile",
71 @"const",
72 restrict,
73 func,
74 func_proto,
75 @"var",
76 datasec,
77 float,
78 decl_tag,
79 type_tag,
80 enum64,
81};
82
83/// int kind is followed by this struct
84pub const IntInfo = packed struct(u32) {
85 bits: u8,
86 reserved_1: u8,
87 offset: u8,
88 encoding: enum(u4) {
89 signed = 1 << 0,
90 char = 1 << 1,
91 boolean = 1 << 2,
92 },
93 reserved_2: u4,
94};
95
96test "IntInfo is 32 bits" {
97 try std.testing.expectEqual(@bitSizeOf(IntInfo), 32);
98}
99
100/// enum kind is followed by this struct
101pub const Enum = extern struct {
102 name_off: u32,
103 val: i32,
104};
105
106/// enum64 kind is followed by this struct
107pub const Enum64 = extern struct {
108 name_off: u32,
109 val_lo32: i32,
110 val_hi32: i32,
111};
112
113/// array kind is followed by this struct
114pub const Array = extern struct {
115 typ: u32,
116 index_type: u32,
117 nelems: u32,
118};
119
120/// struct and union kinds are followed by multiple Member structs. The exact
121/// number is stored in vlen
122pub const Member = extern struct {
123 name_off: u32,
124 typ: u32,
125
126 /// if the kind_flag is set, offset contains both member bitfield size and
127 /// bit offset, the bitfield size is set for bitfield members. If the type
128 /// info kind_flag is not set, the offset contains only bit offset
129 offset: packed struct(u32) {
130 bit: u24,
131 bitfield_size: u8,
132 },
133};
134
135/// func_proto is followed by multiple Params, the exact number is stored in vlen
136pub const Param = extern struct {
137 name_off: u32,
138 typ: u32,
139};
140
141pub const VarLinkage = enum {
142 static,
143 global_allocated,
144 global_extern,
145};
146
147pub const FuncLinkage = enum {
148 static,
149 global,
150 external,
151};
152
153/// var kind is followed by a single Var struct to describe additional
154/// information related to the variable such as its linkage
155pub const Var = extern struct {
156 linkage: u32,
157};
158
159/// datasec kind is followed by multiple VarSecInfo to describe all Var kind
160/// types it contains along with it's in-section offset as well as size.
161pub const VarSecInfo = extern struct {
162 typ: u32,
163 offset: u32,
164 size: u32,
165};
166
167// decl_tag kind is followed by a single DeclTag struct to describe
168// additional information related to the tag applied location.
169// If component_idx == -1, the tag is applied to a struct, union,
170// variable or function. Otherwise, it is applied to a struct/union
171// member or a func argument, and component_idx indicates which member
172// or argument (0 ... vlen-1).
173pub const DeclTag = extern struct {
174 component_idx: u32,
175};