|  | //===-- 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 "DWARFDebugFrame.h" | 
|  | #include "DWARFDebugLine.h" | 
|  | #include "DWARFDebugRangeList.h" | 
|  | #include "llvm/ADT/OwningPtr.h" | 
|  | #include "llvm/ADT/SmallVector.h" | 
|  | #include "llvm/DebugInfo/DIContext.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 { | 
|  | SmallVector<DWARFCompileUnit, 1> CUs; | 
|  | OwningPtr<DWARFDebugAbbrev> Abbrev; | 
|  | OwningPtr<DWARFDebugAranges> Aranges; | 
|  | OwningPtr<DWARFDebugLine> Line; | 
|  | OwningPtr<DWARFDebugFrame> DebugFrame; | 
|  |  | 
|  | SmallVector<DWARFCompileUnit, 1> DWOCUs; | 
|  | OwningPtr<DWARFDebugAbbrev> AbbrevDWO; | 
|  |  | 
|  | DWARFContext(DWARFContext &) LLVM_DELETED_FUNCTION; | 
|  | DWARFContext &operator=(DWARFContext &) LLVM_DELETED_FUNCTION; | 
|  |  | 
|  | /// Read compile units from the debug_info section and store them in CUs. | 
|  | void parseCompileUnits(); | 
|  |  | 
|  | /// Read compile units from the debug_info.dwo section and store them in | 
|  | /// DWOCUs. | 
|  | void parseDWOCompileUnits(); | 
|  |  | 
|  | public: | 
|  | DWARFContext() {} | 
|  | virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All); | 
|  |  | 
|  | /// Get the number of compile units in this context. | 
|  | unsigned getNumCompileUnits() { | 
|  | if (CUs.empty()) | 
|  | parseCompileUnits(); | 
|  | return CUs.size(); | 
|  | } | 
|  |  | 
|  | /// Get the number of compile units in the DWO context. | 
|  | unsigned getNumDWOCompileUnits() { | 
|  | if (DWOCUs.empty()) | 
|  | parseDWOCompileUnits(); | 
|  | return DWOCUs.size(); | 
|  | } | 
|  |  | 
|  | /// Get the compile unit at the specified index for this compile unit. | 
|  | DWARFCompileUnit *getCompileUnitAtIndex(unsigned index) { | 
|  | if (CUs.empty()) | 
|  | parseCompileUnits(); | 
|  | return &CUs[index]; | 
|  | } | 
|  |  | 
|  | /// Get the compile unit at the specified index for the DWO compile units. | 
|  | DWARFCompileUnit *getDWOCompileUnitAtIndex(unsigned index) { | 
|  | if (DWOCUs.empty()) | 
|  | parseDWOCompileUnits(); | 
|  | return &DWOCUs[index]; | 
|  | } | 
|  |  | 
|  | /// Get a pointer to the parsed DebugAbbrev object. | 
|  | const DWARFDebugAbbrev *getDebugAbbrev(); | 
|  |  | 
|  | /// Get a pointer to the parsed dwo abbreviations object. | 
|  | const DWARFDebugAbbrev *getDebugAbbrevDWO(); | 
|  |  | 
|  | /// Get a pointer to the parsed DebugAranges object. | 
|  | const DWARFDebugAranges *getDebugAranges(); | 
|  |  | 
|  | /// Get a pointer to the parsed frame information object. | 
|  | const DWARFDebugFrame *getDebugFrame(); | 
|  |  | 
|  | /// 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, | 
|  | DILineInfoSpecifier Specifier = DILineInfoSpecifier()); | 
|  | virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address, | 
|  | uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier()); | 
|  | virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address, | 
|  | DILineInfoSpecifier Specifier = DILineInfoSpecifier()); | 
|  |  | 
|  | virtual bool isLittleEndian() const = 0; | 
|  | virtual uint8_t getAddressSize() const = 0; | 
|  | virtual const RelocAddrMap &infoRelocMap() const = 0; | 
|  | virtual const RelocAddrMap &lineRelocMap() const = 0; | 
|  | virtual StringRef getInfoSection() = 0; | 
|  | virtual StringRef getAbbrevSection() = 0; | 
|  | virtual StringRef getARangeSection() = 0; | 
|  | virtual StringRef getDebugFrameSection() = 0; | 
|  | virtual StringRef getLineSection() = 0; | 
|  | virtual StringRef getStringSection() = 0; | 
|  | virtual StringRef getRangeSection() = 0; | 
|  | virtual StringRef getPubNamesSection() = 0; | 
|  |  | 
|  | // Sections for DWARF5 split dwarf proposal. | 
|  | virtual StringRef getInfoDWOSection() = 0; | 
|  | virtual StringRef getAbbrevDWOSection() = 0; | 
|  | virtual StringRef getStringDWOSection() = 0; | 
|  | virtual StringRef getStringOffsetDWOSection() = 0; | 
|  | virtual StringRef getRangeDWOSection() = 0; | 
|  | virtual StringRef getAddrSection() = 0; | 
|  | virtual const RelocAddrMap &infoDWORelocMap() const = 0; | 
|  |  | 
|  | static bool isSupportedVersion(unsigned version) { | 
|  | return version == 2 || version == 3; | 
|  | } | 
|  | private: | 
|  | /// Return the compile unit that includes an offset (relative to .debug_info). | 
|  | DWARFCompileUnit *getCompileUnitForOffset(uint32_t Offset); | 
|  |  | 
|  | /// Return the compile unit which contains instruction with provided | 
|  | /// address. | 
|  | DWARFCompileUnit *getCompileUnitForAddress(uint64_t Address); | 
|  | }; | 
|  |  | 
|  | /// 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 { | 
|  | virtual void anchor(); | 
|  | bool IsLittleEndian; | 
|  | uint8_t AddressSize; | 
|  | RelocAddrMap InfoRelocMap; | 
|  | RelocAddrMap LineRelocMap; | 
|  | StringRef InfoSection; | 
|  | StringRef AbbrevSection; | 
|  | StringRef ARangeSection; | 
|  | StringRef DebugFrameSection; | 
|  | StringRef LineSection; | 
|  | StringRef StringSection; | 
|  | StringRef RangeSection; | 
|  | StringRef PubNamesSection; | 
|  |  | 
|  | // Sections for DWARF5 split dwarf proposal. | 
|  | RelocAddrMap InfoDWORelocMap; | 
|  | StringRef InfoDWOSection; | 
|  | StringRef AbbrevDWOSection; | 
|  | StringRef StringDWOSection; | 
|  | StringRef StringOffsetDWOSection; | 
|  | StringRef RangeDWOSection; | 
|  | StringRef AddrSection; | 
|  |  | 
|  | public: | 
|  | DWARFContextInMemory(object::ObjectFile *); | 
|  | virtual bool isLittleEndian() const { return IsLittleEndian; } | 
|  | virtual uint8_t getAddressSize() const { return AddressSize; } | 
|  | virtual const RelocAddrMap &infoRelocMap() const { return InfoRelocMap; } | 
|  | virtual const RelocAddrMap &lineRelocMap() const { return LineRelocMap; } | 
|  | virtual StringRef getInfoSection() { return InfoSection; } | 
|  | virtual StringRef getAbbrevSection() { return AbbrevSection; } | 
|  | virtual StringRef getARangeSection() { return ARangeSection; } | 
|  | virtual StringRef getDebugFrameSection() { return DebugFrameSection; } | 
|  | virtual StringRef getLineSection() { return LineSection; } | 
|  | virtual StringRef getStringSection() { return StringSection; } | 
|  | virtual StringRef getRangeSection() { return RangeSection; } | 
|  | virtual StringRef getPubNamesSection() { return PubNamesSection; } | 
|  |  | 
|  | // Sections for DWARF5 split dwarf proposal. | 
|  | virtual StringRef getInfoDWOSection() { return InfoDWOSection; } | 
|  | virtual StringRef getAbbrevDWOSection() { return AbbrevDWOSection; } | 
|  | virtual StringRef getStringDWOSection() { return StringDWOSection; } | 
|  | virtual StringRef getStringOffsetDWOSection() { | 
|  | return StringOffsetDWOSection; | 
|  | } | 
|  | virtual StringRef getRangeDWOSection() { return RangeDWOSection; } | 
|  | virtual StringRef getAddrSection() { | 
|  | return AddrSection; | 
|  | } | 
|  | virtual const RelocAddrMap &infoDWORelocMap() const { | 
|  | return InfoDWORelocMap; | 
|  | } | 
|  | }; | 
|  |  | 
|  | } | 
|  |  | 
|  | #endif |