Files
clang-r547379/include/llvm/DebugInfo/BTF/BTFParser.h
Ryan Prichard 6024e5c395 Update prebuilt Clang to r547379 (20.0.0).
clang 20.0.0 (based on r547379) from build 12806354.

Bug: http://b/379133546
Test: N/A
Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b

Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
2025-11-26 14:59:46 -05:00

133 lines
5.1 KiB
C++

//===- BTFParser.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
//
//===----------------------------------------------------------------------===//
//
// BTFParser reads .BTF and .BTF.ext ELF sections generated by LLVM
// BPF backend and provides introspection for the stored information.
// Currently the following information is accessible:
// - string table;
// - instruction offset to line information mapping;
// - types table;
// - CO-RE relocations table.
//
// See llvm/DebugInfo/BTF/BTF.h for some details about binary format
// and links to Linux Kernel documentation.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_DEBUGINFO_BTF_BTFPARSER_H
#define LLVM_DEBUGINFO_BTF_BTFPARSER_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/DebugInfo/BTF/BTF.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/DataExtractor.h"
namespace llvm {
using object::ObjectFile;
using object::SectionedAddress;
using object::SectionRef;
class BTFParser {
using BTFLinesVector = SmallVector<BTF::BPFLineInfo, 0>;
using BTFRelocVector = SmallVector<BTF::BPFFieldReloc, 0>;
// In BTF strings are stored as a continuous memory region with
// individual strings separated by 0 bytes. Strings are identified
// by an offset in such region.
// The `StringsTable` points to this region in the parsed ObjectFile.
StringRef StringsTable;
// A copy of types table from the object file but using native byte
// order. Should not be too big in practice, e.g. for ~250MiB vmlinux
// image it is ~4MiB.
OwningArrayRef<uint8_t> TypesBuffer;
// Maps ELF section number to instruction line number information.
// Each BTFLinesVector is sorted by `InsnOffset` to allow fast lookups.
DenseMap<uint64_t, BTFLinesVector> SectionLines;
// Maps ELF section number to CO-RE relocation information.
// Each BTFRelocVector is sorted by `InsnOffset` to allow fast lookups.
DenseMap<uint64_t, BTFRelocVector> SectionRelocs;
// Vector of pointers to all known types, index in this vector
// equals to logical type BTF id.
// Pointers point to memory owned by `TypesBuffer`
// (except pointer at index 0, which is statically allocated).
std::vector<const BTF::CommonType *> Types;
struct ParseContext;
Error parseBTF(ParseContext &Ctx, SectionRef BTF);
Error parseBTFExt(ParseContext &Ctx, SectionRef BTFExt);
Error parseLineInfo(ParseContext &Ctx, DataExtractor &Extractor,
uint64_t LineInfoStart, uint64_t LineInfoEnd);
Error parseRelocInfo(ParseContext &Ctx, DataExtractor &Extractor,
uint64_t RelocInfoStart, uint64_t RelocInfoEnd);
Error parseTypesInfo(ParseContext &Ctx, uint64_t TypesInfoStart,
StringRef RawData);
public:
// Looks-up a string in the .BTF section's string table.
// Offset is relative to string table start.
StringRef findString(uint32_t Offset) const;
// Search for line information for a specific address,
// address match is exact (contrary to DWARFContext).
// Return nullptr if no information found.
// If information is present, return a pointer to object
// owned by this class.
const BTF::BPFLineInfo *findLineInfo(SectionedAddress Address) const;
// Search for CO-RE relocation information for a specific address.
// Return nullptr if no information found.
// If information is present, return a pointer to object
// owned by this class.
const BTF::BPFFieldReloc *findFieldReloc(SectionedAddress Address) const;
// Return a human readable representation of the CO-RE relocation
// record, this is for display purpose only.
// See implementation for details.
void symbolize(const BTF::BPFFieldReloc *Reloc,
SmallVectorImpl<char> &Result) const;
// Lookup BTF type definition with a specific index.
// Return nullptr if no information found.
// If information is present, return a pointer to object
// owned by this class.
const BTF::CommonType *findType(uint32_t Id) const;
// Return total number of known BTF types.
size_t typesCount() const { return Types.size(); }
// Allow to selectively load BTF information.
struct ParseOptions {
bool LoadLines = false;
bool LoadTypes = false;
bool LoadRelocs = false;
};
// Fills instance of BTFParser with information stored in .BTF and
// .BTF.ext sections of the `Obj`. If this instance was already
// filled, old data is discarded.
//
// If information cannot be parsed:
// - return an error describing the failure;
// - state of the BTFParser might be incomplete but is not invalid,
// queries might be run against it, but some (or all) information
// might be unavailable;
Error parse(const ObjectFile &Obj, const ParseOptions &Opts);
Error parse(const ObjectFile &Obj) { return parse(Obj, {true, true, true}); }
// Return true if `Obj` has .BTF and .BTF.ext sections.
static bool hasBTFSections(const ObjectFile &Obj);
};
} // namespace llvm
#endif // LLVM_DEBUGINFO_BTF_BTFPARSER_H