1 //===-- BTF.h --------------------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// This file contains the layout of .BTF and .BTF.ext ELF sections.
12 /// The binary layout for .BTF section:
14 /// Type and Str subsections
15 /// The Type subsection is a collection of types with type id starting with 1.
16 /// The Str subsection is simply a collection of strings.
18 /// The binary layout for .BTF.ext section:
20 /// FuncInfo, LineInfo, OffsetReloc and ExternReloc subsections
21 /// The FuncInfo subsection is defined as below:
23 /// struct SecFuncInfo for ELF section #1
24 /// A number of struct BPFFuncInfo for ELF section #1
25 /// struct SecFuncInfo for ELF section #2
26 /// A number of struct BPFFuncInfo for ELF section #2
28 /// The LineInfo subsection is defined as below:
30 /// struct SecLineInfo for ELF section #1
31 /// A number of struct BPFLineInfo for ELF section #1
32 /// struct SecLineInfo for ELF section #2
33 /// A number of struct BPFLineInfo for ELF section #2
35 /// The OffsetReloc subsection is defined as below:
36 /// BPFOffsetReloc Size
37 /// struct SecOffsetReloc for ELF section #1
38 /// A number of struct BPFOffsetReloc for ELF section #1
39 /// struct SecOffsetReloc for ELF section #2
40 /// A number of struct BPFOffsetReloc for ELF section #2
42 /// The ExternReloc subsection is defined as below:
43 /// BPFExternReloc Size
44 /// struct SecExternReloc for ELF section #1
45 /// A number of struct BPFExternReloc for ELF section #1
46 /// struct SecExternReloc for ELF section #2
47 /// A number of struct BPFExternReloc for ELF section #2
50 /// The section formats are also defined at
51 /// https://github.com/torvalds/linux/blob/master/include/uapi/linux/btf.h
53 //===----------------------------------------------------------------------===//
55 #ifndef LLVM_LIB_TARGET_BPF_BTF_H
56 #define LLVM_LIB_TARGET_BPF_BTF_H
61 enum : uint32_t { MAGIC
= 0xeB9F, VERSION
= 1 };
63 /// Sizes in bytes of various things in the BTF format.
72 BTFDataSecVarSize
= 12,
75 SecOffsetRelocSize
= 8,
76 SecExternRelocSize
= 8,
79 BPFOffsetRelocSize
= 12,
80 BPFExternRelocSize
= 8,
83 /// The .BTF section header definition.
85 uint16_t Magic
; ///< Magic value
86 uint8_t Version
; ///< Version number
87 uint8_t Flags
; ///< Extra flags
88 uint32_t HdrLen
; ///< Length of this header
90 /// All offsets are in bytes relative to the end of this header.
91 uint32_t TypeOff
; ///< Offset of type section
92 uint32_t TypeLen
; ///< Length of type section
93 uint32_t StrOff
; ///< Offset of string section
94 uint32_t StrLen
; ///< Length of string section
98 MAX_VLEN
= 0xffff ///< Max # of struct/union/enum members or func args
101 enum TypeKinds
: uint8_t {
102 #define HANDLE_BTF_KIND(ID, NAME) BTF_KIND_##NAME = ID,
106 /// The BTF common type definition. Different kinds may have
107 /// additional information after this structure data.
109 /// Type name offset in the string table.
112 /// "Info" bits arrangement:
113 /// Bits 0-15: vlen (e.g. # of struct's members)
114 /// Bits 16-23: unused
115 /// Bits 24-27: kind (e.g. int, ptr, array...etc)
116 /// Bits 28-30: unused
117 /// Bit 31: kind_flag, currently used by
118 /// struct, union and fwd
121 /// "Size" is used by INT, ENUM, STRUCT and UNION.
122 /// "Size" tells the size of the type it is describing.
124 /// "Type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT,
125 /// FUNC, FUNC_PROTO and VAR.
126 /// "Type" is a type_id referring to another type.
133 // For some specific BTF_KIND, "struct CommonType" is immediately
134 // followed by extra data.
136 // BTF_KIND_INT is followed by a u32 and the following
137 // is the 32 bits arrangement:
138 // BTF_INT_ENCODING(VAL) : (((VAL) & 0x0f000000) >> 24)
139 // BTF_INT_OFFSET(VAL) : (((VAL & 0x00ff0000)) >> 16)
140 // BTF_INT_BITS(VAL) : ((VAL) & 0x000000ff)
142 /// Attributes stored in the INT_ENCODING.
144 INT_SIGNED
= (1 << 0),
149 /// BTF_KIND_ENUM is followed by multiple "struct BTFEnum".
150 /// The exact number of btf_enum is stored in the vlen (of the
151 /// info in "struct CommonType").
153 uint32_t NameOff
; ///< Enum name offset in the string table
154 int32_t Val
; ///< Enum member value
157 /// BTF_KIND_ARRAY is followed by one "struct BTFArray".
159 uint32_t ElemType
; ///< Element type
160 uint32_t IndexType
; ///< Index type
161 uint32_t Nelems
; ///< Number of elements for this array
164 /// BTF_KIND_STRUCT and BTF_KIND_UNION are followed
165 /// by multiple "struct BTFMember". The exact number
166 /// of BTFMember is stored in the vlen (of the info in
167 /// "struct CommonType").
169 /// If the struct/union contains any bitfield member,
170 /// the Offset below represents BitOffset (bits 0 - 23)
171 /// and BitFieldSize(bits 24 - 31) with BitFieldSize = 0
172 /// for non bitfield members. Otherwise, the Offset
173 /// represents the BitOffset.
175 uint32_t NameOff
; ///< Member name offset in the string table
176 uint32_t Type
; ///< Member type
177 uint32_t Offset
; ///< BitOffset or BitFieldSize+BitOffset
180 /// BTF_KIND_FUNC_PROTO are followed by multiple "struct BTFParam".
181 /// The exist number of BTFParam is stored in the vlen (of the info
182 /// in "struct CommonType").
188 /// Variable scoping information.
190 VAR_STATIC
= 0, ///< Linkage: InternalLinkage
191 VAR_GLOBAL_ALLOCATED
= 1, ///< Linkage: ExternalLinkage
192 VAR_GLOBAL_TENTATIVE
= 2, ///< Linkage: CommonLinkage
193 VAR_GLOBAL_EXTERNAL
= 3, ///< Linkage: ExternalLinkage
196 /// BTF_KIND_DATASEC are followed by multiple "struct BTFDataSecVar".
197 /// The exist number of BTFDataSec is stored in the vlen (of the info
198 /// in "struct CommonType").
200 uint32_t Type
; ///< A BTF_KIND_VAR type
201 uint32_t Offset
; ///< In-section offset
202 uint32_t Size
; ///< Occupied memory size
205 /// The .BTF.ext section header definition.
212 uint32_t FuncInfoOff
; ///< Offset of func info section
213 uint32_t FuncInfoLen
; ///< Length of func info section
214 uint32_t LineInfoOff
; ///< Offset of line info section
215 uint32_t LineInfoLen
; ///< Length of line info section
216 uint32_t OffsetRelocOff
; ///< Offset of offset reloc section
217 uint32_t OffsetRelocLen
; ///< Length of offset reloc section
218 uint32_t ExternRelocOff
; ///< Offset of extern reloc section
219 uint32_t ExternRelocLen
; ///< Length of extern reloc section
222 /// Specifying one function info.
224 uint32_t InsnOffset
; ///< Byte offset in the section
225 uint32_t TypeId
; ///< Type id referring to .BTF type section
228 /// Specifying function info's in one section.
230 uint32_t SecNameOff
; ///< Section name index in the .BTF string table
231 uint32_t NumFuncInfo
; ///< Number of func info's in this section
234 /// Specifying one line info.
236 uint32_t InsnOffset
; ///< Byte offset in this section
237 uint32_t FileNameOff
; ///< File name index in the .BTF string table
238 uint32_t LineOff
; ///< Line index in the .BTF string table
239 uint32_t LineCol
; ///< Line num: line_col >> 10,
240 /// col num: line_col & 0x3ff
243 /// Specifying line info's in one section.
245 uint32_t SecNameOff
; ///< Section name index in the .BTF string table
246 uint32_t NumLineInfo
; ///< Number of line info's in this section
249 /// Specifying one offset relocation.
250 struct BPFOffsetReloc
{
251 uint32_t InsnOffset
; ///< Byte offset in this section
252 uint32_t TypeID
; ///< TypeID for the relocation
253 uint32_t OffsetNameOff
; ///< The string to traverse types
256 /// Specifying offset relocation's in one section.
257 struct SecOffsetReloc
{
258 uint32_t SecNameOff
; ///< Section name index in the .BTF string table
259 uint32_t NumOffsetReloc
; ///< Number of offset reloc's in this section
262 /// Specifying one offset relocation.
263 struct BPFExternReloc
{
264 uint32_t InsnOffset
; ///< Byte offset in this section
265 uint32_t ExternNameOff
; ///< The string for external variable
268 /// Specifying extern relocation's in one section.
269 struct SecExternReloc
{
270 uint32_t SecNameOff
; ///< Section name index in the .BTF string table
271 uint32_t NumExternReloc
; ///< Number of extern reloc's in this section
274 } // End namespace BTF.
275 } // End namespace llvm.