Home | History | Annotate | Download | only in DebugInfo
      1 //===-- DWARFContext.h ------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===/
      9 
     10 #ifndef LLVM_DEBUGINFO_DWARFCONTEXT_H
     11 #define LLVM_DEBUGINFO_DWARFCONTEXT_H
     12 
     13 #include "DWARFCompileUnit.h"
     14 #include "DWARFDebugAranges.h"
     15 #include "DWARFDebugFrame.h"
     16 #include "DWARFDebugLine.h"
     17 #include "DWARFDebugRangeList.h"
     18 #include "llvm/ADT/OwningPtr.h"
     19 #include "llvm/ADT/SmallVector.h"
     20 #include "llvm/DebugInfo/DIContext.h"
     21 
     22 namespace llvm {
     23 
     24 /// DWARFContext
     25 /// This data structure is the top level entity that deals with dwarf debug
     26 /// information parsing. The actual data is supplied through pure virtual
     27 /// methods that a concrete implementation provides.
     28 class DWARFContext : public DIContext {
     29   SmallVector<DWARFCompileUnit, 1> CUs;
     30   OwningPtr<DWARFDebugAbbrev> Abbrev;
     31   OwningPtr<DWARFDebugAranges> Aranges;
     32   OwningPtr<DWARFDebugLine> Line;
     33   OwningPtr<DWARFDebugFrame> DebugFrame;
     34 
     35   SmallVector<DWARFCompileUnit, 1> DWOCUs;
     36   OwningPtr<DWARFDebugAbbrev> AbbrevDWO;
     37 
     38   DWARFContext(DWARFContext &) LLVM_DELETED_FUNCTION;
     39   DWARFContext &operator=(DWARFContext &) LLVM_DELETED_FUNCTION;
     40 
     41   /// Read compile units from the debug_info section and store them in CUs.
     42   void parseCompileUnits();
     43 
     44   /// Read compile units from the debug_info.dwo section and store them in
     45   /// DWOCUs.
     46   void parseDWOCompileUnits();
     47 
     48 public:
     49   DWARFContext() {}
     50   virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All);
     51 
     52   /// Get the number of compile units in this context.
     53   unsigned getNumCompileUnits() {
     54     if (CUs.empty())
     55       parseCompileUnits();
     56     return CUs.size();
     57   }
     58 
     59   /// Get the number of compile units in the DWO context.
     60   unsigned getNumDWOCompileUnits() {
     61     if (DWOCUs.empty())
     62       parseDWOCompileUnits();
     63     return DWOCUs.size();
     64   }
     65 
     66   /// Get the compile unit at the specified index for this compile unit.
     67   DWARFCompileUnit *getCompileUnitAtIndex(unsigned index) {
     68     if (CUs.empty())
     69       parseCompileUnits();
     70     return &CUs[index];
     71   }
     72 
     73   /// Get the compile unit at the specified index for the DWO compile units.
     74   DWARFCompileUnit *getDWOCompileUnitAtIndex(unsigned index) {
     75     if (DWOCUs.empty())
     76       parseDWOCompileUnits();
     77     return &DWOCUs[index];
     78   }
     79 
     80   /// Get a pointer to the parsed DebugAbbrev object.
     81   const DWARFDebugAbbrev *getDebugAbbrev();
     82 
     83   /// Get a pointer to the parsed dwo abbreviations object.
     84   const DWARFDebugAbbrev *getDebugAbbrevDWO();
     85 
     86   /// Get a pointer to the parsed DebugAranges object.
     87   const DWARFDebugAranges *getDebugAranges();
     88 
     89   /// Get a pointer to the parsed frame information object.
     90   const DWARFDebugFrame *getDebugFrame();
     91 
     92   /// Get a pointer to a parsed line table corresponding to a compile unit.
     93   const DWARFDebugLine::LineTable *
     94   getLineTableForCompileUnit(DWARFCompileUnit *cu);
     95 
     96   virtual DILineInfo getLineInfoForAddress(uint64_t Address,
     97       DILineInfoSpecifier Specifier = DILineInfoSpecifier());
     98   virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address,
     99       uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier());
    100   virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address,
    101       DILineInfoSpecifier Specifier = DILineInfoSpecifier());
    102 
    103   virtual bool isLittleEndian() const = 0;
    104   virtual uint8_t getAddressSize() const = 0;
    105   virtual const RelocAddrMap &infoRelocMap() const = 0;
    106   virtual const RelocAddrMap &lineRelocMap() const = 0;
    107   virtual StringRef getInfoSection() = 0;
    108   virtual StringRef getAbbrevSection() = 0;
    109   virtual StringRef getARangeSection() = 0;
    110   virtual StringRef getDebugFrameSection() = 0;
    111   virtual StringRef getLineSection() = 0;
    112   virtual StringRef getStringSection() = 0;
    113   virtual StringRef getRangeSection() = 0;
    114   virtual StringRef getPubNamesSection() = 0;
    115 
    116   // Sections for DWARF5 split dwarf proposal.
    117   virtual StringRef getInfoDWOSection() = 0;
    118   virtual StringRef getAbbrevDWOSection() = 0;
    119   virtual StringRef getStringDWOSection() = 0;
    120   virtual StringRef getStringOffsetDWOSection() = 0;
    121   virtual StringRef getRangeDWOSection() = 0;
    122   virtual StringRef getAddrSection() = 0;
    123   virtual const RelocAddrMap &infoDWORelocMap() const = 0;
    124 
    125   static bool isSupportedVersion(unsigned version) {
    126     return version == 2 || version == 3;
    127   }
    128 private:
    129   /// Return the compile unit that includes an offset (relative to .debug_info).
    130   DWARFCompileUnit *getCompileUnitForOffset(uint32_t Offset);
    131 
    132   /// Return the compile unit which contains instruction with provided
    133   /// address.
    134   DWARFCompileUnit *getCompileUnitForAddress(uint64_t Address);
    135 };
    136 
    137 /// DWARFContextInMemory is the simplest possible implementation of a
    138 /// DWARFContext. It assumes all content is available in memory and stores
    139 /// pointers to it.
    140 class DWARFContextInMemory : public DWARFContext {
    141   virtual void anchor();
    142   bool IsLittleEndian;
    143   uint8_t AddressSize;
    144   RelocAddrMap InfoRelocMap;
    145   RelocAddrMap LineRelocMap;
    146   StringRef InfoSection;
    147   StringRef AbbrevSection;
    148   StringRef ARangeSection;
    149   StringRef DebugFrameSection;
    150   StringRef LineSection;
    151   StringRef StringSection;
    152   StringRef RangeSection;
    153   StringRef PubNamesSection;
    154 
    155   // Sections for DWARF5 split dwarf proposal.
    156   RelocAddrMap InfoDWORelocMap;
    157   StringRef InfoDWOSection;
    158   StringRef AbbrevDWOSection;
    159   StringRef StringDWOSection;
    160   StringRef StringOffsetDWOSection;
    161   StringRef RangeDWOSection;
    162   StringRef AddrSection;
    163 
    164 public:
    165   DWARFContextInMemory(object::ObjectFile *);
    166   virtual bool isLittleEndian() const { return IsLittleEndian; }
    167   virtual uint8_t getAddressSize() const { return AddressSize; }
    168   virtual const RelocAddrMap &infoRelocMap() const { return InfoRelocMap; }
    169   virtual const RelocAddrMap &lineRelocMap() const { return LineRelocMap; }
    170   virtual StringRef getInfoSection() { return InfoSection; }
    171   virtual StringRef getAbbrevSection() { return AbbrevSection; }
    172   virtual StringRef getARangeSection() { return ARangeSection; }
    173   virtual StringRef getDebugFrameSection() { return DebugFrameSection; }
    174   virtual StringRef getLineSection() { return LineSection; }
    175   virtual StringRef getStringSection() { return StringSection; }
    176   virtual StringRef getRangeSection() { return RangeSection; }
    177   virtual StringRef getPubNamesSection() { return PubNamesSection; }
    178 
    179   // Sections for DWARF5 split dwarf proposal.
    180   virtual StringRef getInfoDWOSection() { return InfoDWOSection; }
    181   virtual StringRef getAbbrevDWOSection() { return AbbrevDWOSection; }
    182   virtual StringRef getStringDWOSection() { return StringDWOSection; }
    183   virtual StringRef getStringOffsetDWOSection() {
    184     return StringOffsetDWOSection;
    185   }
    186   virtual StringRef getRangeDWOSection() { return RangeDWOSection; }
    187   virtual StringRef getAddrSection() {
    188     return AddrSection;
    189   }
    190   virtual const RelocAddrMap &infoDWORelocMap() const {
    191     return InfoDWORelocMap;
    192   }
    193 };
    194 
    195 }
    196 
    197 #endif
    198