| //===-- BTF.h --------------------------------------------------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file | |
| /// This file contains the layout of .BTF and .BTF.ext ELF sections. | |
| /// | |
| /// The binary layout for .BTF section: | |
| /// struct Header | |
| /// Type and Str subsections | |
| /// The Type subsection is a collection of types with type id starting with 1. | |
| /// The Str subsection is simply a collection of strings. | |
| /// | |
| /// The binary layout for .BTF.ext section: | |
| /// struct ExtHeader | |
| /// FuncInfo, LineInfo, FieldReloc and ExternReloc subsections | |
| /// The FuncInfo subsection is defined as below: | |
| /// BTFFuncInfo Size | |
| /// struct SecFuncInfo for ELF section #1 | |
| /// A number of struct BPFFuncInfo for ELF section #1 | |
| /// struct SecFuncInfo for ELF section #2 | |
| /// A number of struct BPFFuncInfo for ELF section #2 | |
| /// ... | |
| /// The LineInfo subsection is defined as below: | |
| /// BPFLineInfo Size | |
| /// struct SecLineInfo for ELF section #1 | |
| /// A number of struct BPFLineInfo for ELF section #1 | |
| /// struct SecLineInfo for ELF section #2 | |
| /// A number of struct BPFLineInfo for ELF section #2 | |
| /// ... | |
| /// The FieldReloc subsection is defined as below: | |
| /// BPFFieldReloc Size | |
| /// struct SecFieldReloc for ELF section #1 | |
| /// A number of struct BPFFieldReloc for ELF section #1 | |
| /// struct SecFieldReloc for ELF section #2 | |
| /// A number of struct BPFFieldReloc for ELF section #2 | |
| /// ... | |
| /// | |
| /// The section formats are also defined at | |
| /// https://github.com/torvalds/linux/blob/master/include/uapi/linux/btf.h | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_LIB_TARGET_BPF_BTF_H | |
| #define LLVM_LIB_TARGET_BPF_BTF_H | |
| #include <cstdint> | |
| namespace llvm { | |
| namespace BTF { | |
| enum : uint32_t { MAGIC = 0xeB9F, VERSION = 1 }; | |
| /// Sizes in bytes of various things in the BTF format. | |
| enum { | |
| HeaderSize = 24, | |
| ExtHeaderSize = 32, | |
| CommonTypeSize = 12, | |
| BTFArraySize = 12, | |
| BTFEnumSize = 8, | |
| BTFEnum64Size = 12, | |
| BTFMemberSize = 12, | |
| BTFParamSize = 8, | |
| BTFDataSecVarSize = 12, | |
| SecFuncInfoSize = 8, | |
| SecLineInfoSize = 8, | |
| SecFieldRelocSize = 8, | |
| BPFFuncInfoSize = 8, | |
| BPFLineInfoSize = 16, | |
| BPFFieldRelocSize = 16, | |
| }; | |
| /// The .BTF section header definition. | |
| struct Header { | |
| uint16_t Magic; ///< Magic value | |
| uint8_t Version; ///< Version number | |
| uint8_t Flags; ///< Extra flags | |
| uint32_t HdrLen; ///< Length of this header | |
| /// All offsets are in bytes relative to the end of this header. | |
| uint32_t TypeOff; ///< Offset of type section | |
| uint32_t TypeLen; ///< Length of type section | |
| uint32_t StrOff; ///< Offset of string section | |
| uint32_t StrLen; ///< Length of string section | |
| }; | |
| enum : uint32_t { | |
| MAX_VLEN = 0xffff ///< Max # of struct/union/enum members or func args | |
| }; | |
| enum TypeKinds : uint8_t { | |
| #define HANDLE_BTF_KIND(ID, NAME) BTF_KIND_##NAME = ID, | |
| #include "BTF.def" | |
| }; | |
| /// The BTF common type definition. Different kinds may have | |
| /// additional information after this structure data. | |
| struct CommonType { | |
| /// Type name offset in the string table. | |
| uint32_t NameOff; | |
| /// "Info" bits arrangement: | |
| /// Bits 0-15: vlen (e.g. # of struct's members) | |
| /// Bits 16-23: unused | |
| /// Bits 24-27: kind (e.g. int, ptr, array...etc) | |
| /// Bits 28-30: unused | |
| /// Bit 31: kind_flag, currently used by | |
| /// struct, union and fwd | |
| uint32_t Info; | |
| /// "Size" is used by INT, ENUM, STRUCT and UNION. | |
| /// "Size" tells the size of the type it is describing. | |
| /// | |
| /// "Type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, | |
| /// FUNC, FUNC_PROTO, VAR, DECL_TAG and TYPE_TAG. | |
| /// "Type" is a type_id referring to another type. | |
| union { | |
| uint32_t Size; | |
| uint32_t Type; | |
| }; | |
| }; | |
| // For some specific BTF_KIND, "struct CommonType" is immediately | |
| // followed by extra data. | |
| // BTF_KIND_INT is followed by a u32 and the following | |
| // is the 32 bits arrangement: | |
| // BTF_INT_ENCODING(VAL) : (((VAL) & 0x0f000000) >> 24) | |
| // BTF_INT_OFFSET(VAL) : (((VAL & 0x00ff0000)) >> 16) | |
| // BTF_INT_BITS(VAL) : ((VAL) & 0x000000ff) | |
| /// Attributes stored in the INT_ENCODING. | |
| enum : uint8_t { | |
| INT_SIGNED = (1 << 0), | |
| INT_CHAR = (1 << 1), | |
| INT_BOOL = (1 << 2) | |
| }; | |
| /// BTF_KIND_ENUM is followed by multiple "struct BTFEnum". | |
| /// The exact number of btf_enum is stored in the vlen (of the | |
| /// info in "struct CommonType"). | |
| struct BTFEnum { | |
| uint32_t NameOff; ///< Enum name offset in the string table | |
| int32_t Val; ///< Enum member value | |
| }; | |
| /// BTF_KIND_ENUM64 is followed by multiple "struct BTFEnum64". | |
| /// The exact number of BTFEnum64 is stored in the vlen (of the | |
| /// info in "struct CommonType"). | |
| struct BTFEnum64 { | |
| uint32_t NameOff; ///< Enum name offset in the string table | |
| uint32_t Val_Lo32; ///< Enum member lo32 value | |
| uint32_t Val_Hi32; ///< Enum member hi32 value | |
| }; | |
| /// BTF_KIND_ARRAY is followed by one "struct BTFArray". | |
| struct BTFArray { | |
| uint32_t ElemType; ///< Element type | |
| uint32_t IndexType; ///< Index type | |
| uint32_t Nelems; ///< Number of elements for this array | |
| }; | |
| /// BTF_KIND_STRUCT and BTF_KIND_UNION are followed | |
| /// by multiple "struct BTFMember". The exact number | |
| /// of BTFMember is stored in the vlen (of the info in | |
| /// "struct CommonType"). | |
| /// | |
| /// If the struct/union contains any bitfield member, | |
| /// the Offset below represents BitOffset (bits 0 - 23) | |
| /// and BitFieldSize(bits 24 - 31) with BitFieldSize = 0 | |
| /// for non bitfield members. Otherwise, the Offset | |
| /// represents the BitOffset. | |
| struct BTFMember { | |
| uint32_t NameOff; ///< Member name offset in the string table | |
| uint32_t Type; ///< Member type | |
| uint32_t Offset; ///< BitOffset or BitFieldSize+BitOffset | |
| }; | |
| /// BTF_KIND_FUNC_PROTO are followed by multiple "struct BTFParam". | |
| /// The exist number of BTFParam is stored in the vlen (of the info | |
| /// in "struct CommonType"). | |
| struct BTFParam { | |
| uint32_t NameOff; | |
| uint32_t Type; | |
| }; | |
| /// BTF_KIND_FUNC can be global, static or extern. | |
| enum : uint8_t { | |
| FUNC_STATIC = 0, | |
| FUNC_GLOBAL = 1, | |
| FUNC_EXTERN = 2, | |
| }; | |
| /// Variable scoping information. | |
| enum : uint8_t { | |
| VAR_STATIC = 0, ///< Linkage: InternalLinkage | |
| VAR_GLOBAL_ALLOCATED = 1, ///< Linkage: ExternalLinkage | |
| VAR_GLOBAL_EXTERNAL = 2, ///< Linkage: ExternalLinkage | |
| }; | |
| /// BTF_KIND_DATASEC are followed by multiple "struct BTFDataSecVar". | |
| /// The exist number of BTFDataSec is stored in the vlen (of the info | |
| /// in "struct CommonType"). | |
| struct BTFDataSec { | |
| uint32_t Type; ///< A BTF_KIND_VAR type | |
| uint32_t Offset; ///< In-section offset | |
| uint32_t Size; ///< Occupied memory size | |
| }; | |
| /// The .BTF.ext section header definition. | |
| struct ExtHeader { | |
| uint16_t Magic; | |
| uint8_t Version; | |
| uint8_t Flags; | |
| uint32_t HdrLen; | |
| uint32_t FuncInfoOff; ///< Offset of func info section | |
| uint32_t FuncInfoLen; ///< Length of func info section | |
| uint32_t LineInfoOff; ///< Offset of line info section | |
| uint32_t LineInfoLen; ///< Length of line info section | |
| uint32_t FieldRelocOff; ///< Offset of offset reloc section | |
| uint32_t FieldRelocLen; ///< Length of offset reloc section | |
| }; | |
| /// Specifying one function info. | |
| struct BPFFuncInfo { | |
| uint32_t InsnOffset; ///< Byte offset in the section | |
| uint32_t TypeId; ///< Type id referring to .BTF type section | |
| }; | |
| /// Specifying function info's in one section. | |
| struct SecFuncInfo { | |
| uint32_t SecNameOff; ///< Section name index in the .BTF string table | |
| uint32_t NumFuncInfo; ///< Number of func info's in this section | |
| }; | |
| /// Specifying one line info. | |
| struct BPFLineInfo { | |
| uint32_t InsnOffset; ///< Byte offset in this section | |
| uint32_t FileNameOff; ///< File name index in the .BTF string table | |
| uint32_t LineOff; ///< Line index in the .BTF string table | |
| uint32_t LineCol; ///< Line num: line_col >> 10, | |
| /// col num: line_col & 0x3ff | |
| }; | |
| /// Specifying line info's in one section. | |
| struct SecLineInfo { | |
| uint32_t SecNameOff; ///< Section name index in the .BTF string table | |
| uint32_t NumLineInfo; ///< Number of line info's in this section | |
| }; | |
| /// Specifying one offset relocation. | |
| struct BPFFieldReloc { | |
| uint32_t InsnOffset; ///< Byte offset in this section | |
| uint32_t TypeID; ///< TypeID for the relocation | |
| uint32_t OffsetNameOff; ///< The string to traverse types | |
| uint32_t RelocKind; ///< What to patch the instruction | |
| }; | |
| /// Specifying offset relocation's in one section. | |
| struct SecFieldReloc { | |
| uint32_t SecNameOff; ///< Section name index in the .BTF string table | |
| uint32_t NumFieldReloc; ///< Number of offset reloc's in this section | |
| }; | |
| } // End namespace BTF. | |
| } // End namespace llvm. | |
| #endif |