diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 | 
| commit | 71d5a2540a98c81f5bcaeb48805e0e2881f530ef (patch) | |
| tree | 5343938942df402b49ec7300a1c25a2d4ccd5821 /include/llvm/DebugInfo/DWARF/DWARFUnit.h | |
| parent | 31bbf64f3a4974a2d6c8b3b27ad2f519caf74057 (diff) | |
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 | 
