123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- //===-- 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
|