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