X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FDebugInfo%2FDWARFContext.h;h=f4c05c7d57361ec9f39d509037c05a6a7bfe96c1;hb=78f686d37cc3b4e70bbfc2acdfcfec8443fd3250;hp=823e98a6b31e64960c0f1f888fa28a3fd2e4bc7d;hpb=01394fb9e4d4fcf401e98116c02866d64047008d;p=oota-llvm.git diff --git a/lib/DebugInfo/DWARFContext.h b/lib/DebugInfo/DWARFContext.h index 823e98a6b31..f4c05c7d573 100644 --- a/lib/DebugInfo/DWARFContext.h +++ b/lib/DebugInfo/DWARFContext.h @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===/ -#ifndef LLVM_DEBUGINFO_DWARFCONTEXT_H -#define LLVM_DEBUGINFO_DWARFCONTEXT_H +#ifndef LLVM_LIB_DEBUGINFO_DWARFCONTEXT_H +#define LLVM_LIB_DEBUGINFO_DWARFCONTEXT_H #include "DWARFCompileUnit.h" #include "DWARFDebugAranges.h" @@ -18,7 +18,6 @@ #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" @@ -29,33 +28,39 @@ 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 TUs; - OwningPtr Abbrev; - OwningPtr Loc; - OwningPtr Aranges; - OwningPtr Line; - OwningPtr DebugFrame; - - SmallVector DWOCUs; - SmallVector DWOTUs; - OwningPtr AbbrevDWO; + typedef SmallVector, 1> CUVector; + typedef SmallVector, 1> TUVector; + + CUVector CUs; + TUVector TUs; + std::unique_ptr Abbrev; + std::unique_ptr Loc; + std::unique_ptr Aranges; + std::unique_ptr Line; + std::unique_ptr DebugFrame; + + CUVector DWOCUs; + TUVector DWOTUs; + std::unique_ptr AbbrevDWO; + std::unique_ptr LocDWO; DWARFContext(DWARFContext &) LLVM_DELETED_FUNCTION; DWARFContext &operator=(DWARFContext &) LLVM_DELETED_FUNCTION; - /// Read compile units from the debug_info section and store them in CUs. + /// Read compile units from the debug_info section (if necessary) + /// and store them in CUs. void parseCompileUnits(); - /// Read type units from the debug_types sections and store them in CUs. + /// Read type units from the debug_types sections (if necessary) + /// and store them in TUs. void parseTypeUnits(); - /// Read compile units from the debug_info.dwo section and store them in - /// DWOCUs. + /// Read compile units from the debug_info.dwo section (if necessary) + /// and store them in DWOCUs. void parseDWOCompileUnits(); - /// Read type units from the debug_types.dwo section and store them in - /// DWOTUs. + /// Read type units from the debug_types.dwo section (if necessary) + /// and store them in DWOTUs. void parseDWOTypeUnits(); public: @@ -65,7 +70,6 @@ public: }; DWARFContext() : DIContext(CK_DWARF) {} - virtual ~DWARFContext(); static bool classof(const DIContext *DICtx) { return DICtx->getKind() == CK_DWARF; @@ -73,60 +77,67 @@ public: void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All) override; + typedef iterator_range cu_iterator_range; + typedef iterator_range tu_iterator_range; + + /// Get compile units in this context. + cu_iterator_range compile_units() { + parseCompileUnits(); + return cu_iterator_range(CUs.begin(), CUs.end()); + } + + /// Get type units in this context. + tu_iterator_range type_units() { + parseTypeUnits(); + return tu_iterator_range(TUs.begin(), TUs.end()); + } + + /// Get compile units in the DWO context. + cu_iterator_range dwo_compile_units() { + parseDWOCompileUnits(); + return cu_iterator_range(DWOCUs.begin(), DWOCUs.end()); + } + + /// Get type units in the DWO context. + tu_iterator_range dwo_type_units() { + parseDWOTypeUnits(); + return tu_iterator_range(DWOTUs.begin(), DWOTUs.end()); + } + /// Get the number of compile units in this context. unsigned getNumCompileUnits() { - if (CUs.empty()) - parseCompileUnits(); + parseCompileUnits(); return CUs.size(); } /// Get the number of compile units in this context. unsigned getNumTypeUnits() { - if (TUs.empty()) - parseTypeUnits(); + parseTypeUnits(); return TUs.size(); } /// Get the number of compile units in the DWO context. unsigned getNumDWOCompileUnits() { - if (DWOCUs.empty()) - parseDWOCompileUnits(); + parseDWOCompileUnits(); return DWOCUs.size(); } /// Get the number of compile units in the DWO context. unsigned getNumDWOTypeUnits() { - if (DWOTUs.empty()) - parseDWOTypeUnits(); + 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]; - } - - /// Get the type unit at the specified index for this compile unit. - DWARFTypeUnit *getTypeUnitAtIndex(unsigned index) { - if (TUs.empty()) - parseTypeUnits(); - return TUs[index]; + parseCompileUnits(); + return CUs[index].get(); } /// 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 the type unit at the specified index for the DWO type units. - DWARFTypeUnit *getDWOTypeUnitAtIndex(unsigned index) { - if (DWOTUs.empty()) - parseDWOTypeUnits(); - return DWOTUs[index]; + parseDWOCompileUnits(); + return DWOCUs[index].get(); } /// Get a pointer to the parsed DebugAbbrev object. @@ -138,6 +149,9 @@ public: /// Get a pointer to the parsed dwo abbreviations object. const DWARFDebugAbbrev *getDebugAbbrevDWO(); + /// Get a pointer to the parsed DebugLoc object. + const DWARFDebugLocDWO *getDebugLocDWO(); + /// Get a pointer to the parsed DebugAranges object. const DWARFDebugAranges *getDebugAranges(); @@ -163,6 +177,7 @@ public: virtual const TypeSectionMap &getTypesSections() = 0; virtual StringRef getAbbrevSection() = 0; virtual const Section &getLocSection() = 0; + virtual const Section &getLocDWOSection() = 0; virtual StringRef getARangeSection() = 0; virtual StringRef getDebugFrameSection() = 0; virtual const Section &getLineSection() = 0; @@ -206,6 +221,7 @@ class DWARFContextInMemory : public DWARFContext { TypeSectionMap TypesSections; StringRef AbbrevSection; Section LocSection; + Section LocDWOSection; StringRef ARangeSection; StringRef DebugFrameSection; Section LineSection; @@ -226,17 +242,17 @@ class DWARFContextInMemory : public DWARFContext { StringRef RangeDWOSection; StringRef AddrSection; - SmallVector UncompressedSections; + SmallVector, 4> UncompressedSections; public: - DWARFContextInMemory(object::ObjectFile *); - ~DWARFContextInMemory(); + DWARFContextInMemory(object::ObjectFile &); bool isLittleEndian() const override { return IsLittleEndian; } uint8_t getAddressSize() const override { return AddressSize; } const Section &getInfoSection() override { return InfoSection; } const TypeSectionMap &getTypesSections() override { return TypesSections; } StringRef getAbbrevSection() override { return AbbrevSection; } const Section &getLocSection() override { return LocSection; } + const Section &getLocDWOSection() override { return LocDWOSection; } StringRef getARangeSection() override { return ARangeSection; } StringRef getDebugFrameSection() override { return DebugFrameSection; } const Section &getLineSection() override { return LineSection; }