diff options
Diffstat (limited to 'include/llvm/DebugInfo/DWARF/DWARFUnit.h')
| -rw-r--r-- | include/llvm/DebugInfo/DWARF/DWARFUnit.h | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/include/llvm/DebugInfo/DWARF/DWARFUnit.h index db7b59be90c2..40eb4434bd61 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ b/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -1,4 +1,4 @@ -//===-- DWARFUnit.h ---------------------------------------------*- C++ -*-===// +//===- DWARFUnit.h ----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,32 +7,37 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_LIB_DEBUGINFO_DWARFUNIT_H -#define LLVM_LIB_DEBUGINFO_DWARFUNIT_H +#ifndef LLVM_DEBUGINFO_DWARF_DWARFUNIT_H +#define LLVM_DEBUGINFO_DWARF_DWARFUNIT_H -#include "llvm/ADT/Optional.h" #include "llvm/ADT/iterator_range.h" +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h" +#include "llvm/ADT/StringRef.h" #include "llvm/DebugInfo/DWARF/DWARFDebugInfoEntry.h" #include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h" #include "llvm/DebugInfo/DWARF/DWARFDie.h" #include "llvm/DebugInfo/DWARF/DWARFRelocMap.h" #include "llvm/DebugInfo/DWARF/DWARFSection.h" #include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h" +#include "llvm/Object/Binary.h" +#include "llvm/Object/ObjectFile.h" +#include "llvm/Support/DataExtractor.h" +#include "llvm/Support/Dwarf.h" +#include <algorithm> +#include <cassert> +#include <cstddef> +#include <cstdint> +#include <memory> #include <vector> namespace llvm { -namespace object { -class ObjectFile; -} - +class DWARFAbbreviationDeclarationSet; class DWARFContext; class DWARFDebugAbbrev; class DWARFUnit; -class StringRef; -class raw_ostream; /// Base class for all DWARFUnitSection classes. This provides the /// functionality common to all unit types. @@ -47,12 +52,12 @@ public: DWARFUnitIndex *Index = nullptr); protected: + ~DWARFUnitSectionBase() = default; + virtual void parseImpl(DWARFContext &Context, const DWARFSection &Section, const DWARFDebugAbbrev *DA, StringRef RS, StringRef SS, StringRef SOS, StringRef AOS, StringRef LS, bool isLittleEndian, bool isDWO) = 0; - - ~DWARFUnitSectionBase() = default; }; const DWARFUnitIndex &getDWARFUnitIndex(DWARFContext &Context, @@ -65,7 +70,7 @@ class DWARFUnitSection final : public SmallVector<std::unique_ptr<UnitType>, 1>, bool Parsed = false; public: - typedef llvm::SmallVectorImpl<std::unique_ptr<UnitType>> UnitVector; + typedef SmallVectorImpl<std::unique_ptr<UnitType>> UnitVector; typedef typename UnitVector::iterator iterator; typedef llvm::iterator_range<typename UnitVector::iterator> iterator_range; @@ -122,8 +127,9 @@ class DWARFUnit { uint32_t Offset; uint32_t Length; - uint16_t Version; const DWARFAbbreviationDeclarationSet *Abbrevs; + uint16_t Version; + uint8_t UnitType; uint8_t AddrSize; uint64_t BaseAddr; // The compile unit debug information entry items. @@ -134,9 +140,11 @@ class DWARFUnit { class DWOHolder { object::OwningBinary<object::ObjectFile> DWOFile; std::unique_ptr<DWARFContext> DWOContext; - DWARFUnit *DWOU; + DWARFUnit *DWOU = nullptr; + public: DWOHolder(StringRef DWOPath); + DWARFUnit *getUnit() const { return DWOU; } }; std::unique_ptr<DWOHolder> DWO; @@ -151,8 +159,9 @@ class DWARFUnit { protected: virtual bool extractImpl(DataExtractor debug_info, uint32_t *offset_ptr); + /// Size in bytes of the unit header. - virtual uint32_t getHeaderSize() const { return 11; } + virtual uint32_t getHeaderSize() const { return Version <= 4 ? 11 : 12; } public: DWARFUnit(DWARFContext &Context, const DWARFSection &Section, @@ -168,10 +177,12 @@ public: StringRef getLineSection() const { return LineSection; } StringRef getStringSection() const { return StringSection; } StringRef getStringOffsetSection() const { return StringOffsetSection; } + void setAddrOffsetSection(StringRef AOS, uint32_t Base) { AddrOffsetSection = AOS; AddrOffsetSectionBase = Base; } + void setRangesSection(StringRef RS, uint32_t Base) { RangeSection = RS; RangeSectionBase = Base; @@ -184,6 +195,7 @@ public: DataExtractor getDebugInfoExtractor() const { return DataExtractor(InfoSection.Data, isLittleEndian, AddrSize); } + DataExtractor getStringExtractor() const { return DataExtractor(StringSection, false, 0); } @@ -202,23 +214,30 @@ public: uint32_t getNextUnitOffset() const { return Offset + Length + 4; } uint32_t getLength() const { return Length; } uint16_t getVersion() const { return Version; } + dwarf::DwarfFormat getFormat() const { return dwarf::DwarfFormat::DWARF32; // FIXME: Support DWARF64. } + const DWARFAbbreviationDeclarationSet *getAbbreviations() const { return Abbrevs; } + + uint8_t getUnitType() const { return UnitType; } uint8_t getAddressByteSize() const { return AddrSize; } + uint8_t getRefAddrByteSize() const { if (Version == 2) return AddrSize; return getDwarfOffsetByteSize(); } + uint8_t getDwarfOffsetByteSize() const { if (getFormat() == dwarf::DwarfFormat::DWARF64) return 8; return 4; } + uint64_t getBaseAddress() const { return BaseAddr; } void setBaseAddress(uint64_t base_addr) { @@ -308,9 +327,11 @@ private: /// extractDIEsIfNeeded - Parses a compile unit and indexes its DIEs if it /// hasn't already been done. Returns the number of DIEs parsed at this call. size_t extractDIEsIfNeeded(bool CUDieOnly); + /// extractDIEsToVector - Appends all parsed DIEs to a vector. void extractDIEsToVector(bool AppendCUDie, bool AppendNonCUDIEs, std::vector<DWARFDebugInfoEntry> &DIEs) const; + /// clearDIEs - Clear parsed DIEs to keep memory usage low. void clearDIEs(bool KeepCUDie); @@ -324,6 +345,6 @@ private: DWARFDie getSubprogramForAddress(uint64_t Address); }; -} +} // end namespace llvm -#endif +#endif // LLVM_DEBUGINFO_DWARF_DWARFUNIT_H |
