#include "bolt/Core/DebugData.h"
#include "bolt/Core/BinaryContext.h"
#include "bolt/Core/DIEBuilder.h"
#include "bolt/Utils/Utils.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/CodeGen/DIE.h"
#include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugAddr.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/EndianStream.h"
#include "llvm/Support/LEB128.h"
#include "llvm/Support/SHA1.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <functional>
#include <memory>
#include <optional>
#include <unordered_map>
#include <vector>
#define DEBUG_TYPE …
namespace opts {
extern llvm::cl::opt<unsigned> Verbosity;
}
namespace llvm {
class MCSymbol;
namespace bolt {
static void replaceLocValbyForm(DIEBuilder &DIEBldr, DIE &Die, DIEValue DIEVal,
dwarf::Form Format, uint64_t NewVal) { … }
std::optional<AttrInfo>
findAttributeInfo(const DWARFDie DIE,
const DWARFAbbreviationDeclaration *AbbrevDecl,
uint32_t Index) { … }
std::optional<AttrInfo> findAttributeInfo(const DWARFDie DIE,
dwarf::Attribute Attr) { … }
const DebugLineTableRowRef DebugLineTableRowRef::NULL_ROW{ … };
LLVM_ATTRIBUTE_UNUSED
static void printLE64(const std::string &S) { … }
static uint64_t
writeAddressRanges(raw_svector_ostream &Stream,
const DebugAddressRangesVector &AddressRanges,
const bool WriteRelativeRanges = false) { … }
DebugRangesSectionWriter::DebugRangesSectionWriter() { … }
void DebugRangesSectionWriter::initSection() { … }
uint64_t DebugRangesSectionWriter::addRanges(
DebugAddressRangesVector &&Ranges,
std::map<DebugAddressRangesVector, uint64_t> &CachedRanges) { … }
uint64_t DebugRangesSectionWriter::addRanges(DebugAddressRangesVector &Ranges) { … }
uint64_t DebugRangesSectionWriter::getSectionOffset() { … }
void DebugRangesSectionWriter::appendToRangeBuffer(
const DebugBufferVector &CUBuffer) { … }
uint64_t DebugRangeListsSectionWriter::addRanges(
DebugAddressRangesVector &&Ranges,
std::map<DebugAddressRangesVector, uint64_t> &CachedRanges) { … }
struct LocListsRangelistsHeader { … };
static std::unique_ptr<DebugBufferVector>
getDWARF5Header(const LocListsRangelistsHeader &Header) { … }
struct OffsetEntry { … };
template <typename DebugVector, typename ListEntry, typename DebugAddressEntry>
static bool emitWithBase(raw_ostream &OS, const DebugVector &Entries,
DebugAddrWriter &AddrWriter, DWARFUnit &CU,
uint32_t &Index, const ListEntry BaseAddressx,
const ListEntry OffsetPair,
const std::function<void(uint32_t)> &Func) { … }
uint64_t
DebugRangeListsSectionWriter::addRanges(DebugAddressRangesVector &Ranges) { … }
void DebugRangeListsSectionWriter::finalizeSection() { … }
void DebugRangeListsSectionWriter::initSection(DWARFUnit &Unit) { … }
void DebugARangesSectionWriter::addCURanges(uint64_t CUOffset,
DebugAddressRangesVector &&Ranges) { … }
void DebugARangesSectionWriter::writeARangesSection(
raw_svector_ostream &RangesStream, const CUOffsetMap &CUMap) const { … }
DebugAddrWriter::DebugAddrWriter(BinaryContext *BC,
const uint8_t AddressByteSize)
: … { … }
void DebugAddrWriter::AddressForDWOCU::dump() { … }
uint32_t DebugAddrWriter::getIndexFromAddress(uint64_t Address, DWARFUnit &CU) { … }
static void updateAddressBase(DIEBuilder &DIEBlder, DebugAddrWriter &AddrWriter,
DWARFUnit &CU, const uint64_t Offset) { … }
void DebugAddrWriter::updateAddrBase(DIEBuilder &DIEBlder, DWARFUnit &CU,
const uint64_t Offset) { … }
std::optional<uint64_t> DebugAddrWriter::finalize(const size_t BufferSize) { … }
void DebugAddrWriterDwarf5::updateAddrBase(DIEBuilder &DIEBlder, DWARFUnit &CU,
const uint64_t Offset) { … }
DenseMap<uint64_t, uint64_t> DebugAddrWriter::UnmodifiedAddressOffsets;
std::optional<uint64_t>
DebugAddrWriterDwarf5::finalize(const size_t BufferSize) { … }
void DebugLocWriter::init() { … }
uint32_t DebugLocWriter::LocSectionOffset = …;
void DebugLocWriter::addList(DIEBuilder &DIEBldr, DIE &Die, DIEValue &AttrInfo,
DebugLocationsVector &LocList) { … }
std::unique_ptr<DebugBufferVector> DebugLocWriter::getBuffer() { … }
void DebugLocWriter::finalize(DIEBuilder &DIEBldr, DIE &Die) { … }
static void writeEmptyListDwarf5(raw_svector_ostream &Stream) { … }
static void writeLegacyLocList(DIEValue &AttrInfo,
DebugLocationsVector &LocList,
DIEBuilder &DIEBldr, DIE &Die,
DebugAddrWriter &AddrWriter,
DebugBufferVector &LocBuffer, DWARFUnit &CU,
raw_svector_ostream &LocStream) { … }
static void writeDWARF5LocList(uint32_t &NumberOfEntries, DIEValue &AttrInfo,
DebugLocationsVector &LocList, DIE &Die,
DIEBuilder &DIEBldr, DebugAddrWriter &AddrWriter,
DebugBufferVector &LocBodyBuffer,
std::vector<uint32_t> &RelativeLocListOffsets,
DWARFUnit &CU,
raw_svector_ostream &LocBodyStream) { … }
void DebugLoclistWriter::addList(DIEBuilder &DIEBldr, DIE &Die,
DIEValue &AttrInfo,
DebugLocationsVector &LocList) { … }
uint32_t DebugLoclistWriter::LoclistBaseOffset = …;
void DebugLoclistWriter::finalizeDWARF5(DIEBuilder &DIEBldr, DIE &Die) { … }
void DebugLoclistWriter::finalize(DIEBuilder &DIEBldr, DIE &Die) { … }
static std::string encodeLE(size_t ByteSize, uint64_t NewValue) { … }
void SimpleBinaryPatcher::addBinaryPatch(uint64_t Offset,
std::string &&NewValue,
uint32_t OldValueSize) { … }
void SimpleBinaryPatcher::addBytePatch(uint64_t Offset, uint8_t Value) { … }
void SimpleBinaryPatcher::addLEPatch(uint64_t Offset, uint64_t NewValue,
size_t ByteSize) { … }
void SimpleBinaryPatcher::addUDataPatch(uint64_t Offset, uint64_t Value,
uint32_t OldValueSize) { … }
void SimpleBinaryPatcher::addLE64Patch(uint64_t Offset, uint64_t NewValue) { … }
void SimpleBinaryPatcher::addLE32Patch(uint64_t Offset, uint32_t NewValue,
uint32_t OldValueSize) { … }
std::string SimpleBinaryPatcher::patchBinary(StringRef BinaryContents) { … }
void DebugStrOffsetsWriter::initialize(DWARFUnit &Unit) { … }
void DebugStrOffsetsWriter::updateAddressMap(uint32_t Index, uint32_t Address,
const DWARFUnit &Unit) { … }
void DebugStrOffsetsWriter::finalizeSection(DWARFUnit &Unit,
DIEBuilder &DIEBldr) { … }
void DebugStrWriter::create() { … }
void DebugStrWriter::initialize() { … }
uint32_t DebugStrWriter::addString(StringRef Str) { … }
static void emitDwarfSetLineAddrAbs(MCStreamer &OS,
MCDwarfLineTableParams Params,
int64_t LineDelta, uint64_t Address,
int PointerSize) { … }
static inline void emitBinaryDwarfLineTable(
MCStreamer *MCOS, MCDwarfLineTableParams Params,
const DWARFDebugLine::LineTable *Table,
const std::vector<DwarfLineTable::RowSequence> &InputSequences) { … }
static inline void emitDwarfLineTable(
MCStreamer *MCOS, MCSection *Section,
const MCLineSection::MCDwarfLineEntryCollection &LineEntries) { … }
void DwarfLineTable::emitCU(MCStreamer *MCOS, MCDwarfLineTableParams Params,
std::optional<MCDwarfLineStr> &LineStr,
BinaryContext &BC) const { … }
static void parseAndPopulateDebugLineStr(BinarySection &LineStrSection,
MCDwarfLineStr &LineStr,
BinaryContext &BC) { … }
void DwarfLineTable::emit(BinaryContext &BC, MCStreamer &Streamer) { … }
}
}