aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h')
-rw-r--r--contrib/llvm-project/llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h324
1 files changed, 324 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h b/contrib/llvm-project/llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h
new file mode 100644
index 000000000000..f010c348f121
--- /dev/null
+++ b/contrib/llvm-project/llvm/include/llvm/DWARFLinker/Classic/DWARFStreamer.h
@@ -0,0 +1,324 @@
+//===- DwarfStreamer.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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DWARFLINKER_CLASSIC_DWARFSTREAMER_H
+#define LLVM_DWARFLINKER_CLASSIC_DWARFSTREAMER_H
+
+#include "DWARFLinker.h"
+#include "llvm/BinaryFormat/Swift.h"
+#include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCObjectFileInfo.h"
+#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Target/TargetMachine.h"
+
+namespace llvm {
+template <typename DataT> class AccelTable;
+
+class MCCodeEmitter;
+class DWARFDebugMacro;
+
+namespace dwarf_linker {
+namespace classic {
+
+/// User of DwarfStreamer should call initialization code
+/// for AsmPrinter:
+///
+/// InitializeAllTargetInfos();
+/// InitializeAllTargetMCs();
+/// InitializeAllTargets();
+/// InitializeAllAsmPrinters();
+
+/// The Dwarf streaming logic.
+///
+/// All interactions with the MC layer that is used to build the debug
+/// information binary representation are handled in this class.
+class DwarfStreamer : public DwarfEmitter {
+public:
+ DwarfStreamer(DWARFLinkerBase::OutputFileType OutFileType,
+ raw_pwrite_stream &OutFile,
+ std::function<StringRef(StringRef Input)> Translator,
+ DWARFLinkerBase::MessageHandlerTy Warning)
+ : OutFile(OutFile), OutFileType(OutFileType), Translator(Translator),
+ WarningHandler(Warning) {}
+ virtual ~DwarfStreamer() = default;
+
+ Error init(Triple TheTriple, StringRef Swift5ReflectionSegmentName);
+
+ /// Dump the file to the disk.
+ void finish() override;
+
+ AsmPrinter &getAsmPrinter() const override { return *Asm; }
+
+ /// Set the current output section to debug_info and change
+ /// the MC Dwarf version to \p DwarfVersion.
+ void switchToDebugInfoSection(unsigned DwarfVersion);
+
+ /// Emit the compilation unit header for \p Unit in the
+ /// debug_info section.
+ ///
+ /// As a side effect, this also switches the current Dwarf version
+ /// of the MC layer to the one of U.getOrigUnit().
+ void emitCompileUnitHeader(CompileUnit &Unit, unsigned DwarfVersion) override;
+
+ /// Recursively emit the DIE tree rooted at \p Die.
+ void emitDIE(DIE &Die) override;
+
+ /// Emit the abbreviation table \p Abbrevs to the debug_abbrev section.
+ void emitAbbrevs(const std::vector<std::unique_ptr<DIEAbbrev>> &Abbrevs,
+ unsigned DwarfVersion) override;
+
+ /// Emit contents of section SecName From Obj.
+ void emitSectionContents(StringRef SecData, StringRef SecName) override;
+
+ /// Emit the string table described by \p Pool into .debug_str table.
+ void emitStrings(const NonRelocatableStringpool &Pool) override;
+
+ /// Emit the debug string offset table described by \p StringOffsets into the
+ /// .debug_str_offsets table.
+ void emitStringOffsets(const SmallVector<uint64_t> &StringOffset,
+ uint16_t TargetDWARFVersion) override;
+
+ /// Emit the string table described by \p Pool into .debug_line_str table.
+ void emitLineStrings(const NonRelocatableStringpool &Pool) override;
+
+ /// Emit the swift_ast section stored in \p Buffer.
+ void emitSwiftAST(StringRef Buffer) override;
+
+ /// Emit the swift reflection section stored in \p Buffer.
+ void emitSwiftReflectionSection(
+ llvm::binaryformat::Swift5ReflectionSectionKind ReflSectionKind,
+ StringRef Buffer, uint32_t Alignment, uint32_t Size) override;
+
+ /// Emit debug ranges(.debug_ranges, .debug_rnglists) header.
+ MCSymbol *emitDwarfDebugRangeListHeader(const CompileUnit &Unit) override;
+
+ /// Emit debug ranges(.debug_ranges, .debug_rnglists) fragment.
+ void emitDwarfDebugRangeListFragment(const CompileUnit &Unit,
+ const AddressRanges &LinkedRanges,
+ PatchLocation Patch,
+ DebugDieValuePool &AddrPool) override;
+
+ /// Emit debug ranges(.debug_ranges, .debug_rnglists) footer.
+ void emitDwarfDebugRangeListFooter(const CompileUnit &Unit,
+ MCSymbol *EndLabel) override;
+
+ /// Emit debug locations(.debug_loc, .debug_loclists) header.
+ MCSymbol *emitDwarfDebugLocListHeader(const CompileUnit &Unit) override;
+
+ /// Emit .debug_addr header.
+ MCSymbol *emitDwarfDebugAddrsHeader(const CompileUnit &Unit) override;
+
+ /// Emit the addresses described by \p Addrs into .debug_addr table.
+ void emitDwarfDebugAddrs(const SmallVector<uint64_t> &Addrs,
+ uint8_t AddrSize) override;
+
+ /// Emit .debug_addr footer.
+ void emitDwarfDebugAddrsFooter(const CompileUnit &Unit,
+ MCSymbol *EndLabel) override;
+
+ /// Emit debug ranges(.debug_loc, .debug_loclists) fragment.
+ void emitDwarfDebugLocListFragment(
+ const CompileUnit &Unit,
+ const DWARFLocationExpressionsVector &LinkedLocationExpression,
+ PatchLocation Patch, DebugDieValuePool &AddrPool) override;
+
+ /// Emit debug ranges(.debug_loc, .debug_loclists) footer.
+ void emitDwarfDebugLocListFooter(const CompileUnit &Unit,
+ MCSymbol *EndLabel) override;
+
+ /// Emit .debug_aranges entries for \p Unit
+ void emitDwarfDebugArangesTable(const CompileUnit &Unit,
+ const AddressRanges &LinkedRanges) override;
+
+ uint64_t getRangesSectionSize() const override { return RangesSectionSize; }
+
+ uint64_t getRngListsSectionSize() const override {
+ return RngListsSectionSize;
+ }
+
+ /// Emit .debug_line table entry for specified \p LineTable
+ void emitLineTableForUnit(const DWARFDebugLine::LineTable &LineTable,
+ const CompileUnit &Unit,
+ OffsetsStringPool &DebugStrPool,
+ OffsetsStringPool &DebugLineStrPool) override;
+
+ uint64_t getLineSectionSize() const override { return LineSectionSize; }
+
+ /// Emit the .debug_pubnames contribution for \p Unit.
+ void emitPubNamesForUnit(const CompileUnit &Unit) override;
+
+ /// Emit the .debug_pubtypes contribution for \p Unit.
+ void emitPubTypesForUnit(const CompileUnit &Unit) override;
+
+ /// Emit a CIE.
+ void emitCIE(StringRef CIEBytes) override;
+
+ /// Emit an FDE with data \p Bytes.
+ void emitFDE(uint32_t CIEOffset, uint32_t AddreSize, uint64_t Address,
+ StringRef Bytes) override;
+
+ /// Emit DWARF debug names.
+ void emitDebugNames(DWARF5AccelTable &Table) override;
+
+ /// Emit Apple namespaces accelerator table.
+ void emitAppleNamespaces(
+ AccelTable<AppleAccelTableStaticOffsetData> &Table) override;
+
+ /// Emit Apple names accelerator table.
+ void
+ emitAppleNames(AccelTable<AppleAccelTableStaticOffsetData> &Table) override;
+
+ /// Emit Apple Objective-C accelerator table.
+ void
+ emitAppleObjc(AccelTable<AppleAccelTableStaticOffsetData> &Table) override;
+
+ /// Emit Apple type accelerator table.
+ void
+ emitAppleTypes(AccelTable<AppleAccelTableStaticTypeData> &Table) override;
+
+ uint64_t getFrameSectionSize() const override { return FrameSectionSize; }
+
+ uint64_t getDebugInfoSectionSize() const override {
+ return DebugInfoSectionSize;
+ }
+
+ uint64_t getDebugMacInfoSectionSize() const override {
+ return MacInfoSectionSize;
+ }
+
+ uint64_t getDebugMacroSectionSize() const override {
+ return MacroSectionSize;
+ }
+
+ uint64_t getLocListsSectionSize() const override {
+ return LocListsSectionSize;
+ }
+
+ uint64_t getDebugAddrSectionSize() const override { return AddrSectionSize; }
+
+ void emitMacroTables(DWARFContext *Context,
+ const Offset2UnitMap &UnitMacroMap,
+ OffsetsStringPool &StringPool) override;
+
+private:
+ inline void warn(const Twine &Warning, StringRef Context = "") {
+ if (WarningHandler)
+ WarningHandler(Warning, Context, nullptr);
+ }
+
+ void emitMacroTableImpl(const DWARFDebugMacro *MacroTable,
+ const Offset2UnitMap &UnitMacroMap,
+ OffsetsStringPool &StringPool, uint64_t &OutOffset);
+
+ /// Emit piece of .debug_ranges for \p LinkedRanges.
+ void emitDwarfDebugRangesTableFragment(const CompileUnit &Unit,
+ const AddressRanges &LinkedRanges,
+ PatchLocation Patch);
+
+ /// Emit piece of .debug_rnglists for \p LinkedRanges.
+ void emitDwarfDebugRngListsTableFragment(const CompileUnit &Unit,
+ const AddressRanges &LinkedRanges,
+ PatchLocation Patch,
+ DebugDieValuePool &AddrPool);
+
+ /// Emit piece of .debug_loc for \p LinkedRanges.
+ void emitDwarfDebugLocTableFragment(
+ const CompileUnit &Unit,
+ const DWARFLocationExpressionsVector &LinkedLocationExpression,
+ PatchLocation Patch);
+
+ /// Emit piece of .debug_loclists for \p LinkedRanges.
+ void emitDwarfDebugLocListsTableFragment(
+ const CompileUnit &Unit,
+ const DWARFLocationExpressionsVector &LinkedLocationExpression,
+ PatchLocation Patch, DebugDieValuePool &AddrPool);
+
+ /// \defgroup Line table emission
+ /// @{
+ void emitLineTablePrologue(const DWARFDebugLine::Prologue &P,
+ OffsetsStringPool &DebugStrPool,
+ OffsetsStringPool &DebugLineStrPool);
+ void emitLineTableString(const DWARFDebugLine::Prologue &P,
+ const DWARFFormValue &String,
+ OffsetsStringPool &DebugStrPool,
+ OffsetsStringPool &DebugLineStrPool);
+ void emitLineTableProloguePayload(const DWARFDebugLine::Prologue &P,
+ OffsetsStringPool &DebugStrPool,
+ OffsetsStringPool &DebugLineStrPool);
+ void emitLineTablePrologueV2IncludeAndFileTable(
+ const DWARFDebugLine::Prologue &P, OffsetsStringPool &DebugStrPool,
+ OffsetsStringPool &DebugLineStrPool);
+ void emitLineTablePrologueV5IncludeAndFileTable(
+ const DWARFDebugLine::Prologue &P, OffsetsStringPool &DebugStrPool,
+ OffsetsStringPool &DebugLineStrPool);
+ void emitLineTableRows(const DWARFDebugLine::LineTable &LineTable,
+ MCSymbol *LineEndSym, unsigned AddressByteSize);
+ void emitIntOffset(uint64_t Offset, dwarf::DwarfFormat Format,
+ uint64_t &SectionSize);
+ void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
+ dwarf::DwarfFormat Format, uint64_t &SectionSize);
+ /// @}
+
+ /// \defgroup MCObjects MC layer objects constructed by the streamer
+ /// @{
+ std::unique_ptr<MCRegisterInfo> MRI;
+ std::unique_ptr<MCAsmInfo> MAI;
+ std::unique_ptr<MCObjectFileInfo> MOFI;
+ std::unique_ptr<MCContext> MC;
+ MCAsmBackend *MAB; // Owned by MCStreamer
+ std::unique_ptr<MCInstrInfo> MII;
+ std::unique_ptr<MCSubtargetInfo> MSTI;
+ MCInstPrinter *MIP; // Owned by AsmPrinter
+ MCCodeEmitter *MCE; // Owned by MCStreamer
+ MCStreamer *MS; // Owned by AsmPrinter
+ std::unique_ptr<TargetMachine> TM;
+ std::unique_ptr<AsmPrinter> Asm;
+ /// @}
+
+ /// The output file we stream the linked Dwarf to.
+ raw_pwrite_stream &OutFile;
+ DWARFLinker::OutputFileType OutFileType = DWARFLinker::OutputFileType::Object;
+ std::function<StringRef(StringRef Input)> Translator;
+
+ uint64_t RangesSectionSize = 0;
+ uint64_t RngListsSectionSize = 0;
+ uint64_t LocSectionSize = 0;
+ uint64_t LocListsSectionSize = 0;
+ uint64_t LineSectionSize = 0;
+ uint64_t FrameSectionSize = 0;
+ uint64_t DebugInfoSectionSize = 0;
+ uint64_t MacInfoSectionSize = 0;
+ uint64_t MacroSectionSize = 0;
+ uint64_t AddrSectionSize = 0;
+ uint64_t StrOffsetSectionSize = 0;
+
+ /// Keep track of emitted CUs and their Unique ID.
+ struct EmittedUnit {
+ unsigned ID;
+ MCSymbol *LabelBegin;
+ };
+ std::vector<EmittedUnit> EmittedUnits;
+
+ /// Emit the pubnames or pubtypes section contribution for \p
+ /// Unit into \p Sec. The data is provided in \p Names.
+ void emitPubSectionForUnit(MCSection *Sec, StringRef Name,
+ const CompileUnit &Unit,
+ const std::vector<CompileUnit::AccelInfo> &Names);
+
+ DWARFLinkerBase::MessageHandlerTy WarningHandler = nullptr;
+};
+
+} // end of namespace classic
+} // end of namespace dwarf_linker
+} // end of namespace llvm
+
+#endif // LLVM_DWARFLINKER_CLASSIC_DWARFSTREAMER_H