Home | History | Annotate | Download | only in DebugInfo
      1 //===-- DWARFCompileUnit.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_DWARFCOMPILEUNIT_H
     11 #define LLVM_DEBUGINFO_DWARFCOMPILEUNIT_H
     12 
     13 #include "DWARFDebugAbbrev.h"
     14 #include "DWARFDebugInfoEntry.h"
     15 #include "DWARFDebugRangeList.h"
     16 #include "DWARFRelocMap.h"
     17 #include <vector>
     18 
     19 namespace llvm {
     20 
     21 class DWARFDebugAbbrev;
     22 class StringRef;
     23 class raw_ostream;
     24 
     25 class DWARFCompileUnit {
     26   const DWARFDebugAbbrev *Abbrev;
     27   StringRef InfoSection;
     28   StringRef AbbrevSection;
     29   StringRef RangeSection;
     30   StringRef StringSection;
     31   StringRef StringOffsetSection;
     32   StringRef AddrOffsetSection;
     33   const RelocAddrMap *RelocMap;
     34   bool isLittleEndian;
     35 
     36   uint32_t Offset;
     37   uint32_t Length;
     38   uint16_t Version;
     39   const DWARFAbbreviationDeclarationSet *Abbrevs;
     40   uint8_t AddrSize;
     41   uint64_t BaseAddr;
     42   // The compile unit debug information entry item.
     43   std::vector<DWARFDebugInfoEntryMinimal> DieArray;
     44 public:
     45 
     46   DWARFCompileUnit(const DWARFDebugAbbrev *DA, StringRef IS, StringRef AS,
     47                    StringRef RS, StringRef SS, StringRef SOS, StringRef AOS,
     48                    const RelocAddrMap *M, bool LE) :
     49     Abbrev(DA), InfoSection(IS), AbbrevSection(AS),
     50     RangeSection(RS), StringSection(SS), StringOffsetSection(SOS),
     51     AddrOffsetSection(AOS), RelocMap(M), isLittleEndian(LE) {
     52     clear();
     53   }
     54 
     55   StringRef getStringSection() const { return StringSection; }
     56   StringRef getStringOffsetSection() const { return StringOffsetSection; }
     57   StringRef getAddrOffsetSection() const { return AddrOffsetSection; }
     58   const RelocAddrMap *getRelocMap() const { return RelocMap; }
     59   DataExtractor getDebugInfoExtractor() const;
     60 
     61   bool extract(DataExtractor debug_info, uint32_t* offset_ptr);
     62   uint32_t extract(uint32_t offset, DataExtractor debug_info_data,
     63                    const DWARFAbbreviationDeclarationSet *abbrevs);
     64 
     65   /// extractDIEsIfNeeded - Parses a compile unit and indexes its DIEs if it
     66   /// hasn't already been done. Returns the number of DIEs parsed at this call.
     67   size_t extractDIEsIfNeeded(bool cu_die_only);
     68   /// extractRangeList - extracts the range list referenced by this compile
     69   /// unit from .debug_ranges section. Returns true on success.
     70   /// Requires that compile unit is already extracted.
     71   bool extractRangeList(uint32_t RangeListOffset,
     72                         DWARFDebugRangeList &RangeList) const;
     73   void clear();
     74   void dump(raw_ostream &OS);
     75   uint32_t getOffset() const { return Offset; }
     76   /// Size in bytes of the compile unit header.
     77   uint32_t getSize() const { return 11; }
     78   bool containsDIEOffset(uint32_t die_offset) const {
     79     return die_offset >= getFirstDIEOffset() &&
     80       die_offset < getNextCompileUnitOffset();
     81   }
     82   uint32_t getFirstDIEOffset() const { return Offset + getSize(); }
     83   uint32_t getNextCompileUnitOffset() const { return Offset + Length + 4; }
     84   /// Size in bytes of the .debug_info data associated with this compile unit.
     85   size_t getDebugInfoSize() const { return Length + 4 - getSize(); }
     86   uint32_t getLength() const { return Length; }
     87   uint16_t getVersion() const { return Version; }
     88   const DWARFAbbreviationDeclarationSet *getAbbreviations() const {
     89     return Abbrevs;
     90   }
     91   uint8_t getAddressByteSize() const { return AddrSize; }
     92   uint64_t getBaseAddress() const { return BaseAddr; }
     93 
     94   void setBaseAddress(uint64_t base_addr) {
     95     BaseAddr = base_addr;
     96   }
     97 
     98   const DWARFDebugInfoEntryMinimal *
     99   getCompileUnitDIE(bool extract_cu_die_only = true) {
    100     extractDIEsIfNeeded(extract_cu_die_only);
    101     if (DieArray.empty())
    102       return NULL;
    103     return &DieArray[0];
    104   }
    105 
    106   const char *getCompilationDir();
    107 
    108   /// setDIERelations - We read in all of the DIE entries into our flat list
    109   /// of DIE entries and now we need to go back through all of them and set the
    110   /// parent, sibling and child pointers for quick DIE navigation.
    111   void setDIERelations();
    112 
    113   void addDIE(DWARFDebugInfoEntryMinimal &die) {
    114     // The average bytes per DIE entry has been seen to be
    115     // around 14-20 so lets pre-reserve the needed memory for
    116     // our DIE entries accordingly. Search forward for "Compute
    117     // average bytes per DIE" to see #if'ed out code that does
    118     // that determination.
    119 
    120     // Only reserve the memory if we are adding children of
    121     // the main compile unit DIE. The compile unit DIE is always
    122     // the first entry, so if our size is 1, then we are adding
    123     // the first compile unit child DIE and should reserve
    124     // the memory.
    125     if (DieArray.empty())
    126       DieArray.reserve(getDebugInfoSize() / 14);
    127     DieArray.push_back(die);
    128   }
    129 
    130   void clearDIEs(bool keep_compile_unit_die);
    131 
    132   void buildAddressRangeTable(DWARFDebugAranges *debug_aranges,
    133                               bool clear_dies_if_already_not_parsed);
    134 
    135   /// getInlinedChainForAddress - fetches inlined chain for a given address.
    136   /// Returns empty chain if there is no subprogram containing address.
    137   DWARFDebugInfoEntryMinimal::InlinedChain getInlinedChainForAddress(
    138       uint64_t Address);
    139 };
    140 
    141 }
    142 
    143 #endif
    144