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