-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[BPF] Generate BTF DebugInfo under BPF target
This patch implements BTF (BPF Type Format). The BTF is the debug info format for BPF, introduced in the below linux patch: torvalds/linux@69b693f#diff-06fb1c8825f653d7e539058b72c83332 and further extended several times, e.g., https://www.spinics.net/lists/netdev/msg534640.html https://www.spinics.net/lists/netdev/msg538464.html https://www.spinics.net/lists/netdev/msg540246.html The main advantage of implementing in LLVM is: . better integration/deployment as no extra tools are needed. . bpf JIT based compilation (like bcc, bpftrace, etc.) can get BTF without much extra effort. . BTF line_info needs selective source codes, which can be easily retrieved when inside the compiler. This patch implemented BTF generation by registering a BPF specific DebugHandler in BPFAsmPrinter. Signed-off-by: Yonghong Song <yhs@fb.com> Differential Revision: https://reviews.llvm.org/D55752 llvm-svn: 349640
- Loading branch information
1 parent
8d221b4
commit 7b410ac
Showing
43 changed files
with
3,916 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,33 @@ | ||
| //===- BTF.def - BTF definitions --------------------------------*- C++ -*-===// | ||
| // | ||
| // The LLVM Compiler Infrastructure | ||
| // | ||
| // This file is distributed under the University of Illinois Open Source | ||
| // License. See LICENSE.TXT for details. | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
| // | ||
| // Macros for BTF. | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #if !defined(HANDLE_BTF_KIND) | ||
| #error "Missing macro definition of HANDLE_BTF_*" | ||
| #endif | ||
|
|
||
| HANDLE_BTF_KIND(0, UNKN) | ||
| HANDLE_BTF_KIND(1, INT) | ||
| HANDLE_BTF_KIND(2, PTR) | ||
| HANDLE_BTF_KIND(3, ARRAY) | ||
| HANDLE_BTF_KIND(4, STRUCT) | ||
| HANDLE_BTF_KIND(5, UNION) | ||
| HANDLE_BTF_KIND(6, ENUM) | ||
| HANDLE_BTF_KIND(7, FWD) | ||
| HANDLE_BTF_KIND(8, TYPEDEF) | ||
| HANDLE_BTF_KIND(9, VOLATILE) | ||
| HANDLE_BTF_KIND(10, CONST) | ||
| HANDLE_BTF_KIND(11, RESTRICT) | ||
| HANDLE_BTF_KIND(12, FUNC) | ||
| HANDLE_BTF_KIND(13, FUNC_PROTO) | ||
|
|
||
| #undef HANDLE_BTF_KIND |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,209 @@ | ||
| //===-- BTF.h --------------------------------------------------*- C++ -*-===// | ||
| // | ||
| // The LLVM Compiler Infrastructure | ||
| // | ||
| // This file is distributed under the University of Illinois Open Source | ||
| // License. See LICENSE.TXT for details. | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
| /// | ||
| /// \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 and LineInfo 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 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 | ||
|
|
||
| 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 = 24, | ||
| CommonTypeSize = 12, | ||
| BTFArraySize = 12, | ||
| BTFEnumSize = 8, | ||
| BTFMemberSize = 12, | ||
| BTFParamSize = 8, | ||
| SecFuncInfoSize = 8, | ||
| SecLineInfoSize = 8, | ||
| BPFFuncInfoSize = 8, | ||
| BPFLineInfoSize = 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 and FUNC_PROTO. | ||
| /// "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_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; | ||
| }; | ||
|
|
||
| /// 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 | ||
| }; | ||
|
|
||
| /// 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 tble | ||
| uint32_t NumLineInfo; ///< Number of line info's in this section | ||
| }; | ||
|
|
||
| } // End namespace BTF. | ||
| } // End namespace llvm. | ||
|
|
||
| #endif |
Oops, something went wrong.