summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h')
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h79
1 files changed, 78 insertions, 1 deletions
diff --git a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h
index dd7e8709638..e575af2c29f 100644
--- a/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h
+++ b/llvm/unittests/DebugInfo/DWARF/DwarfGenerator.h
@@ -153,6 +153,74 @@ public:
void setLength(uint64_t Length) { DU.setLength(Length); }
};
+/// A DWARF line unit-like class used to generate DWARF line units.
+///
+/// Instances of this class are created by instances of the Generator class.
+class LineTable {
+public:
+ enum ValueLength { Byte = 1, Half = 2, Long = 4, Quad = 8, ULEB, SLEB };
+
+ struct ValueAndLength {
+ uint64_t Value;
+ ValueLength Length;
+ };
+
+ LineTable(Generator &DG, uint16_t Version, dwarf::DwarfFormat Format,
+ uint8_t AddrSize, uint8_t SegSize = 0)
+ : DG(DG), Version(Version), Format(Format), AddrSize(AddrSize),
+ SegSize(SegSize) {
+ assert(Version >= 2 && Version <= 5 && "unsupported version");
+ }
+
+ // Create a Prologue suitable to pass to setPrologue, with a single file and
+ // include directory entry.
+ DWARFDebugLine::Prologue createBasicPrologue() const;
+
+ // Set or replace the current prologue with the specified prologue. If no
+ // prologue is set, a default one will be used when generating.
+ void setPrologue(DWARFDebugLine::Prologue NewPrologue);
+ // Used to write an arbitrary payload instead of the standard prologue. This
+ // is useful if you wish to test handling of corrupt .debug_line sections.
+ void setCustomPrologue(ArrayRef<ValueAndLength> NewPrologue);
+
+ // Add a byte to the program, with the given value. This can be used to
+ // specify a special opcode, or to add arbitrary contents to the section.
+ void addByte(uint8_t Value);
+ // Add a standard opcode to the program. The opcode and operands do not have
+ // to be valid.
+ void addStandardOpcode(uint8_t Opcode, ArrayRef<ValueAndLength> Operands);
+ // Add an extended opcode to the program with the specified length, opcode,
+ // and operands. These values do not have to be valid.
+ void addExtendedOpcode(uint64_t Length, uint8_t Opcode,
+ ArrayRef<ValueAndLength> Operands);
+
+ // Write the contents of the LineUnit to the current section in the generator.
+ void generate(MCContext &MC, AsmPrinter &Asm) const;
+
+private:
+ void writeData(ArrayRef<ValueAndLength> Data, AsmPrinter &Asm) const;
+ MCSymbol *writeDefaultPrologue(AsmPrinter &Asm) const;
+ void writePrologue(AsmPrinter &Asm) const;
+
+ void writeProloguePayload(const DWARFDebugLine::Prologue &Prologue,
+ AsmPrinter &Asm) const;
+
+ Generator &DG;
+ llvm::Optional<DWARFDebugLine::Prologue> Prologue;
+ std::vector<ValueAndLength> CustomPrologue;
+ std::vector<ValueAndLength> Contents;
+
+ // The Version field is used for determining how to write the Prologue, if a
+ // non-custom prologue is used. The version value actually written, will be
+ // that specified in the Prologue, if a custom prologue has been passed in.
+ // Otherwise, it will be this value.
+ uint16_t Version;
+
+ dwarf::DwarfFormat Format;
+ uint8_t AddrSize;
+ uint8_t SegSize;
+};
+
/// A DWARF generator.
///
/// Generate DWARF for unit tests by creating any instance of this class and
@@ -173,6 +241,7 @@ class Generator {
BumpPtrAllocator Allocator;
std::unique_ptr<DwarfStringPool> StringPool; // Entries owned by Allocator.
std::vector<std::unique_ptr<CompileUnit>> CompileUnits;
+ std::vector<std::unique_ptr<LineTable>> LineTables;
DIEAbbrevSet Abbreviations;
SmallString<4096> FileBytes;
@@ -210,9 +279,17 @@ public:
///
/// \returns a dwarfgen::CompileUnit that can be used to retrieve the compile
/// unit dwarfgen::DIE that can be used to add attributes and add child DIE
- /// objedts to.
+ /// objects to.
dwarfgen::CompileUnit &addCompileUnit();
+ /// Add a line table unit to be generated.
+ /// \param Format the DWARF format to use (DWARF32 or DWARF64).
+ ///
+ /// \returns a dwarfgen::LineTable that can be used to customise the contents
+ /// of the line table.
+ LineTable &
+ addLineTable(dwarf::DwarfFormat DwarfFormat = dwarf::DwarfFormat::DWARF32);
+
BumpPtrAllocator &getAllocator() { return Allocator; }
AsmPrinter *getAsmPrinter() const { return Asm.get(); }
MCContext *getMCContext() const { return MC.get(); }
OpenPOWER on IntegriCloud