Home | History | Annotate | Download | only in Native
      1 //===- DbiModuleList.h - PDB module information list ------------*- 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_PDB_RAW_DBIMODULELIST_H
     11 #define LLVM_DEBUGINFO_PDB_RAW_DBIMODULELIST_H
     12 
     13 #include "llvm/ADT/StringRef.h"
     14 #include "llvm/ADT/iterator.h"
     15 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
     16 #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
     17 #include "llvm/Support/BinaryStreamArray.h"
     18 #include "llvm/Support/BinaryStreamRef.h"
     19 #include "llvm/Support/Endian.h"
     20 #include "llvm/Support/Error.h"
     21 #include <cstdint>
     22 #include <vector>
     23 
     24 namespace llvm {
     25 namespace codeview {}
     26 namespace pdb {
     27 
     28 class DbiModuleList;
     29 struct FileInfoSubstreamHeader;
     30 
     31 class DbiModuleSourceFilesIterator
     32     : public iterator_facade_base<DbiModuleSourceFilesIterator,
     33                                   std::random_access_iterator_tag, StringRef> {
     34   typedef iterator_facade_base<DbiModuleSourceFilesIterator,
     35                                std::random_access_iterator_tag, StringRef>
     36       BaseType;
     37 
     38 public:
     39   DbiModuleSourceFilesIterator(const DbiModuleList &Modules, uint32_t Modi,
     40                                uint16_t Filei);
     41   DbiModuleSourceFilesIterator() = default;
     42   DbiModuleSourceFilesIterator &
     43   operator=(const DbiModuleSourceFilesIterator &R) = default;
     44 
     45   bool operator==(const DbiModuleSourceFilesIterator &R) const;
     46 
     47   const StringRef &operator*() const { return ThisValue; }
     48   StringRef &operator*() { return ThisValue; }
     49 
     50   bool operator<(const DbiModuleSourceFilesIterator &RHS) const;
     51   std::ptrdiff_t operator-(const DbiModuleSourceFilesIterator &R) const;
     52   DbiModuleSourceFilesIterator &operator+=(std::ptrdiff_t N);
     53   DbiModuleSourceFilesIterator &operator-=(std::ptrdiff_t N);
     54 
     55 private:
     56   void setValue();
     57 
     58   bool isEnd() const;
     59   bool isCompatible(const DbiModuleSourceFilesIterator &R) const;
     60   bool isUniversalEnd() const;
     61 
     62   StringRef ThisValue;
     63   const DbiModuleList *Modules{nullptr};
     64   uint32_t Modi{0};
     65   uint16_t Filei{0};
     66 };
     67 
     68 class DbiModuleList {
     69   friend DbiModuleSourceFilesIterator;
     70 
     71 public:
     72   Error initialize(BinaryStreamRef ModInfo, BinaryStreamRef FileInfo);
     73 
     74   Expected<StringRef> getFileName(uint32_t Index) const;
     75   uint32_t getModuleCount() const;
     76   uint32_t getSourceFileCount() const;
     77   uint16_t getSourceFileCount(uint32_t Modi) const;
     78 
     79   iterator_range<DbiModuleSourceFilesIterator>
     80   source_files(uint32_t Modi) const;
     81 
     82   DbiModuleDescriptor getModuleDescriptor(uint32_t Modi) const;
     83 
     84 private:
     85   Error initializeModInfo(BinaryStreamRef ModInfo);
     86   Error initializeFileInfo(BinaryStreamRef FileInfo);
     87 
     88   VarStreamArray<DbiModuleDescriptor> Descriptors;
     89 
     90   FixedStreamArray<support::little32_t> FileNameOffsets;
     91   FixedStreamArray<support::ulittle16_t> ModFileCountArray;
     92 
     93   // For each module, there are multiple filenames, which can be obtained by
     94   // knowing the index of the file.  Given the index of the file, one can use
     95   // that as an offset into the FileNameOffsets array, which contains the
     96   // absolute offset of the file name in NamesBuffer.  Thus, for each module
     97   // we store the first index in the FileNameOffsets array for this module.
     98   // The number of files for the corresponding module is stored in
     99   // ModFileCountArray.
    100   std::vector<uint32_t> ModuleInitialFileIndex;
    101 
    102   // In order to provide random access into the Descriptors array, we iterate it
    103   // once up front to find the offsets of the individual items and store them in
    104   // this array.
    105   std::vector<uint32_t> ModuleDescriptorOffsets;
    106 
    107   const FileInfoSubstreamHeader *FileInfoHeader = nullptr;
    108 
    109   BinaryStreamRef ModInfoSubstream;
    110   BinaryStreamRef FileInfoSubstream;
    111   BinaryStreamRef NamesBuffer;
    112 };
    113 }
    114 }
    115 
    116 #endif // LLVM_DEBUGINFO_PDB_RAW_DBIMODULELIST_H