| //===-- DWARFContext.h ------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===/ |
| |
| #ifndef LLVM_DEBUGINFO_DWARFCONTEXT_H |
| #define LLVM_DEBUGINFO_DWARFCONTEXT_H |
| |
| #include "DWARFCompileUnit.h" |
| #include "DWARFDebugAranges.h" |
| #include "DWARFDebugLine.h" |
| #include "llvm/DebugInfo/DIContext.h" |
| #include "llvm/ADT/OwningPtr.h" |
| #include "llvm/ADT/SmallVector.h" |
| |
| namespace llvm { |
| |
| /// DWARFContext |
| /// This data structure is the top level entity that deals with dwarf debug |
| /// information parsing. The actual data is supplied through pure virtual |
| /// methods that a concrete implementation provides. |
| class DWARFContext : public DIContext { |
| bool IsLittleEndian; |
| |
| SmallVector<DWARFCompileUnit, 1> CUs; |
| OwningPtr<DWARFDebugAbbrev> Abbrev; |
| OwningPtr<DWARFDebugAranges> Aranges; |
| OwningPtr<DWARFDebugLine> Line; |
| |
| DWARFContext(DWARFContext &); // = delete |
| DWARFContext &operator=(DWARFContext &); // = delete |
| |
| /// Read compile units from the debug_info section and store them in CUs. |
| void parseCompileUnits(); |
| protected: |
| DWARFContext(bool isLittleEndian) : IsLittleEndian(isLittleEndian) {} |
| public: |
| virtual void dump(raw_ostream &OS); |
| /// Get the number of compile units in this context. |
| unsigned getNumCompileUnits() { |
| if (CUs.empty()) |
| parseCompileUnits(); |
| return CUs.size(); |
| } |
| /// Get the compile unit at the specified index for this compile unit. |
| DWARFCompileUnit *getCompileUnitAtIndex(unsigned index) { |
| if (CUs.empty()) |
| parseCompileUnits(); |
| return &CUs[index]; |
| } |
| |
| /// Return the compile unit that includes an offset (relative to .debug_info). |
| DWARFCompileUnit *getCompileUnitForOffset(uint32_t offset); |
| |
| /// Get a pointer to the parsed DebugAbbrev object. |
| const DWARFDebugAbbrev *getDebugAbbrev(); |
| |
| /// Get a pointer to the parsed DebugAranges object. |
| const DWARFDebugAranges *getDebugAranges(); |
| |
| /// Get a pointer to a parsed line table corresponding to a compile unit. |
| const DWARFDebugLine::LineTable * |
| getLineTableForCompileUnit(DWARFCompileUnit *cu); |
| |
| virtual DILineInfo getLineInfoForAddress(uint64_t address); |
| |
| bool isLittleEndian() const { return IsLittleEndian; } |
| |
| virtual StringRef getInfoSection() = 0; |
| virtual StringRef getAbbrevSection() = 0; |
| virtual StringRef getARangeSection() = 0; |
| virtual StringRef getLineSection() = 0; |
| virtual StringRef getStringSection() = 0; |
| |
| static bool isSupportedVersion(unsigned version) { |
| return version == 2 || version == 3; |
| } |
| }; |
| |
| |
| /// DWARFContextInMemory is the simplest possible implementation of a |
| /// DWARFContext. It assumes all content is available in memory and stores |
| /// pointers to it. |
| class DWARFContextInMemory : public DWARFContext { |
| StringRef InfoSection; |
| StringRef AbbrevSection; |
| StringRef ARangeSection; |
| StringRef LineSection; |
| StringRef StringSection; |
| public: |
| DWARFContextInMemory(bool isLittleEndian, |
| StringRef infoSection, |
| StringRef abbrevSection, |
| StringRef aRangeSection, |
| StringRef lineSection, |
| StringRef stringSection) |
| : DWARFContext(isLittleEndian), |
| InfoSection(infoSection), |
| AbbrevSection(abbrevSection), |
| ARangeSection(aRangeSection), |
| LineSection(lineSection), |
| StringSection(stringSection) |
| {} |
| |
| virtual StringRef getInfoSection() { return InfoSection; } |
| virtual StringRef getAbbrevSection() { return AbbrevSection; } |
| virtual StringRef getARangeSection() { return ARangeSection; } |
| virtual StringRef getLineSection() { return LineSection; } |
| virtual StringRef getStringSection() { return StringSection; } |
| }; |
| |
| } |
| |
| #endif |