Home | History | Annotate | Download | only in DWARF
      1 //===- DWARFUnitIndex.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_DWARF_DWARFUNITINDEX_H
     11 #define LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H
     12 
     13 #include "llvm/ADT/ArrayRef.h"
     14 #include "llvm/ADT/StringRef.h"
     15 #include "llvm/Support/DataExtractor.h"
     16 #include <cstdint>
     17 #include <memory>
     18 
     19 namespace llvm {
     20 
     21 class raw_ostream;
     22 
     23 enum DWARFSectionKind {
     24   DW_SECT_INFO = 1,
     25   DW_SECT_TYPES,
     26   DW_SECT_ABBREV,
     27   DW_SECT_LINE,
     28   DW_SECT_LOC,
     29   DW_SECT_STR_OFFSETS,
     30   DW_SECT_MACINFO,
     31   DW_SECT_MACRO,
     32 };
     33 
     34 class DWARFUnitIndex {
     35   struct Header {
     36     uint32_t Version;
     37     uint32_t NumColumns;
     38     uint32_t NumUnits;
     39     uint32_t NumBuckets = 0;
     40 
     41     bool parse(DataExtractor IndexData, uint32_t *OffsetPtr);
     42     void dump(raw_ostream &OS) const;
     43   };
     44 
     45 public:
     46   class Entry {
     47   public:
     48     struct SectionContribution {
     49       uint32_t Offset;
     50       uint32_t Length;
     51     };
     52 
     53   private:
     54     const DWARFUnitIndex *Index;
     55     uint64_t Signature;
     56     std::unique_ptr<SectionContribution[]> Contributions;
     57     friend class DWARFUnitIndex;
     58 
     59   public:
     60     const SectionContribution *getOffset(DWARFSectionKind Sec) const;
     61     const SectionContribution *getOffset() const;
     62 
     63     const SectionContribution *getOffsets() const {
     64       return Contributions.get();
     65     }
     66 
     67     uint64_t getSignature() const { return Signature; }
     68   };
     69 
     70 private:
     71   struct Header Header;
     72 
     73   DWARFSectionKind InfoColumnKind;
     74   int InfoColumn = -1;
     75   std::unique_ptr<DWARFSectionKind[]> ColumnKinds;
     76   std::unique_ptr<Entry[]> Rows;
     77 
     78   static StringRef getColumnHeader(DWARFSectionKind DS);
     79 
     80   bool parseImpl(DataExtractor IndexData);
     81 
     82 public:
     83   DWARFUnitIndex(DWARFSectionKind InfoColumnKind)
     84       : InfoColumnKind(InfoColumnKind) {}
     85 
     86   explicit operator bool() const { return Header.NumBuckets; }
     87 
     88   bool parse(DataExtractor IndexData);
     89   void dump(raw_ostream &OS) const;
     90 
     91   const Entry *getFromOffset(uint32_t Offset) const;
     92   const Entry *getFromHash(uint64_t Offset) const;
     93 
     94   ArrayRef<DWARFSectionKind> getColumnKinds() const {
     95     return makeArrayRef(ColumnKinds.get(), Header.NumColumns);
     96   }
     97 
     98   ArrayRef<Entry> getRows() const {
     99     return makeArrayRef(Rows.get(), Header.NumBuckets);
    100   }
    101 };
    102 
    103 } // end namespace llvm
    104 
    105 #endif // LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H
    106