X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FDebugInfo%2FDWARFContext.h;h=9bac69d6e5225ccada077d2cec1334f131f20c13;hb=27276437ae2169640633f9961620a8d0b19deb39;hp=0c3eb30a64cae209e64f8cd7fbcb94246d62db95;hpb=82de10a34c9432029040ced17129079a7d80904e;p=oota-llvm.git diff --git a/lib/DebugInfo/DWARFContext.h b/lib/DebugInfo/DWARFContext.h index 0c3eb30a64c..9bac69d6e52 100644 --- a/lib/DebugInfo/DWARFContext.h +++ b/lib/DebugInfo/DWARFContext.h @@ -12,8 +12,12 @@ #include "DWARFCompileUnit.h" #include "DWARFDebugAranges.h" +#include "DWARFDebugFrame.h" #include "DWARFDebugLine.h" +#include "DWARFDebugLoc.h" #include "DWARFDebugRangeList.h" +#include "DWARFTypeUnit.h" +#include "llvm/ADT/MapVector.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallVector.h" #include "llvm/DebugInfo/DIContext.h" @@ -25,12 +29,16 @@ namespace llvm { /// information parsing. The actual data is supplied through pure virtual /// methods that a concrete implementation provides. class DWARFContext : public DIContext { - SmallVector CUs; + SmallVector CUs; + SmallVector TUs; OwningPtr Abbrev; + OwningPtr Loc; OwningPtr Aranges; OwningPtr Line; + OwningPtr DebugFrame; - SmallVector DWOCUs; + SmallVector DWOCUs; + SmallVector DWOTUs; OwningPtr AbbrevDWO; DWARFContext(DWARFContext &) LLVM_DELETED_FUNCTION; @@ -39,13 +47,31 @@ class DWARFContext : public DIContext { /// Read compile units from the debug_info section and store them in CUs. void parseCompileUnits(); + /// Read type units from the debug_types sections and store them in CUs. + void parseTypeUnits(); + /// Read compile units from the debug_info.dwo section and store them in /// DWOCUs. void parseDWOCompileUnits(); + /// Read type units from the debug_types.dwo section and store them in + /// DWOTUs. + void parseDWOTypeUnits(); + public: - DWARFContext() {} - virtual void dump(raw_ostream &OS); + struct Section { + StringRef Data; + RelocAddrMap Relocs; + }; + + DWARFContext() : DIContext(CK_DWARF) {} + virtual ~DWARFContext(); + + static bool classof(const DIContext *DICtx) { + return DICtx->getKind() == CK_DWARF; + } + + virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All); /// Get the number of compile units in this context. unsigned getNumCompileUnits() { @@ -54,6 +80,13 @@ public: return CUs.size(); } + /// Get the number of compile units in this context. + unsigned getNumTypeUnits() { + if (TUs.empty()) + parseTypeUnits(); + return TUs.size(); + } + /// Get the number of compile units in the DWO context. unsigned getNumDWOCompileUnits() { if (DWOCUs.empty()) @@ -61,56 +94,96 @@ public: return DWOCUs.size(); } + /// Get the number of compile units in the DWO context. + unsigned getNumDWOTypeUnits() { + if (DWOTUs.empty()) + parseDWOTypeUnits(); + return DWOTUs.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 CUs[index]; + } + + /// Get the type unit at the specified index for this compile unit. + DWARFTypeUnit *getTypeUnitAtIndex(unsigned index) { + if (TUs.empty()) + parseTypeUnits(); + return TUs[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]; + return DWOCUs[index]; + } + + /// Get the type unit at the specified index for the DWO type units. + DWARFTypeUnit *getDWOTypeUnitAtIndex(unsigned index) { + if (DWOTUs.empty()) + parseDWOTypeUnits(); + return DWOTUs[index]; } /// Get a pointer to the parsed DebugAbbrev object. const DWARFDebugAbbrev *getDebugAbbrev(); + /// Get a pointer to the parsed DebugLoc object. + const DWARFDebugLoc *getDebugLoc(); + /// 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 const RelocAddrMap &infoRelocMap() const = 0; - virtual StringRef getInfoSection() = 0; + virtual uint8_t getAddressSize() const = 0; + virtual const Section &getInfoSection() = 0; + typedef MapVector > TypeSectionMap; + virtual const TypeSectionMap &getTypesSections() = 0; virtual StringRef getAbbrevSection() = 0; + virtual const Section &getLocSection() = 0; virtual StringRef getARangeSection() = 0; - virtual StringRef getLineSection() = 0; + virtual StringRef getDebugFrameSection() = 0; + virtual const Section &getLineSection() = 0; virtual StringRef getStringSection() = 0; virtual StringRef getRangeSection() = 0; + virtual StringRef getPubNamesSection() = 0; + virtual StringRef getPubTypesSection() = 0; + virtual StringRef getGnuPubNamesSection() = 0; + virtual StringRef getGnuPubTypesSection() = 0; // Sections for DWARF5 split dwarf proposal. - virtual StringRef getInfoDWOSection() = 0; + virtual const Section &getInfoDWOSection() = 0; + virtual const TypeSectionMap &getTypesDWOSections() = 0; virtual StringRef getAbbrevDWOSection() = 0; virtual StringRef getStringDWOSection() = 0; + virtual StringRef getStringOffsetDWOSection() = 0; virtual StringRef getRangeDWOSection() = 0; - virtual const RelocAddrMap &infoDWORelocMap() const = 0; + virtual StringRef getAddrSection() = 0; static bool isSupportedVersion(unsigned version) { - return version == 2 || version == 3; + return version == 2 || version == 3 || version == 4; } private: /// Return the compile unit that includes an offset (relative to .debug_info). @@ -127,38 +200,65 @@ private: class DWARFContextInMemory : public DWARFContext { virtual void anchor(); bool IsLittleEndian; - RelocAddrMap InfoRelocMap; - StringRef InfoSection; + uint8_t AddressSize; + Section InfoSection; + TypeSectionMap TypesSections; StringRef AbbrevSection; + Section LocSection; StringRef ARangeSection; - StringRef LineSection; + StringRef DebugFrameSection; + Section LineSection; StringRef StringSection; StringRef RangeSection; + StringRef PubNamesSection; + StringRef PubTypesSection; + StringRef GnuPubNamesSection; + StringRef GnuPubTypesSection; // Sections for DWARF5 split dwarf proposal. - RelocAddrMap InfoDWORelocMap; - StringRef InfoDWOSection; + Section InfoDWOSection; + TypeSectionMap TypesDWOSections; StringRef AbbrevDWOSection; StringRef StringDWOSection; + StringRef StringOffsetDWOSection; StringRef RangeDWOSection; + StringRef AddrSection; + + SmallVector UncompressedSections; public: DWARFContextInMemory(object::ObjectFile *); + ~DWARFContextInMemory(); virtual bool isLittleEndian() const { return IsLittleEndian; } - virtual const RelocAddrMap &infoRelocMap() const { return InfoRelocMap; } - virtual StringRef getInfoSection() { return InfoSection; } + virtual uint8_t getAddressSize() const { return AddressSize; } + virtual const Section &getInfoSection() { return InfoSection; } + virtual const TypeSectionMap &getTypesSections() { return TypesSections; } virtual StringRef getAbbrevSection() { return AbbrevSection; } + virtual const Section &getLocSection() { return LocSection; } virtual StringRef getARangeSection() { return ARangeSection; } - virtual StringRef getLineSection() { return LineSection; } + virtual StringRef getDebugFrameSection() { return DebugFrameSection; } + virtual const Section &getLineSection() { return LineSection; } virtual StringRef getStringSection() { return StringSection; } virtual StringRef getRangeSection() { return RangeSection; } + virtual StringRef getPubNamesSection() { return PubNamesSection; } + virtual StringRef getPubTypesSection() { return PubTypesSection; } + virtual StringRef getGnuPubNamesSection() { return GnuPubNamesSection; } + virtual StringRef getGnuPubTypesSection() { return GnuPubTypesSection; } // Sections for DWARF5 split dwarf proposal. - virtual StringRef getInfoDWOSection() { return InfoDWOSection; } + virtual const Section &getInfoDWOSection() { return InfoDWOSection; } + virtual const TypeSectionMap &getTypesDWOSections() { + return TypesDWOSections; + } virtual StringRef getAbbrevDWOSection() { return AbbrevDWOSection; } virtual StringRef getStringDWOSection() { return StringDWOSection; } + virtual StringRef getStringOffsetDWOSection() { + return StringOffsetDWOSection; + } virtual StringRef getRangeDWOSection() { return RangeDWOSection; } - virtual const RelocAddrMap &infoDWORelocMap() const { return InfoDWORelocMap; } + virtual StringRef getAddrSection() { + return AddrSection; + } }; }