10b57cec5SDimitry Andric //===- DbiModuleList.h - PDB module information list ------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULELIST_H 100b57cec5SDimitry Andric #define LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULELIST_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 130b57cec5SDimitry Andric #include "llvm/ADT/iterator.h" 140b57cec5SDimitry Andric #include "llvm/ADT/iterator_range.h" 150b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h" 160b57cec5SDimitry Andric #include "llvm/Support/BinaryStreamArray.h" 170b57cec5SDimitry Andric #include "llvm/Support/BinaryStreamRef.h" 180b57cec5SDimitry Andric #include "llvm/Support/Endian.h" 190b57cec5SDimitry Andric #include "llvm/Support/Error.h" 200b57cec5SDimitry Andric #include <cstddef> 210b57cec5SDimitry Andric #include <cstdint> 220b57cec5SDimitry Andric #include <iterator> 230b57cec5SDimitry Andric #include <vector> 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace llvm { 260b57cec5SDimitry Andric namespace pdb { 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric class DbiModuleList; 290b57cec5SDimitry Andric struct FileInfoSubstreamHeader; 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric class DbiModuleSourceFilesIterator 320b57cec5SDimitry Andric : public iterator_facade_base<DbiModuleSourceFilesIterator, 330b57cec5SDimitry Andric std::random_access_iterator_tag, StringRef> { 34349cc55cSDimitry Andric using BaseType = typename DbiModuleSourceFilesIterator::iterator_facade_base; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric public: 370b57cec5SDimitry Andric DbiModuleSourceFilesIterator(const DbiModuleList &Modules, uint32_t Modi, 380b57cec5SDimitry Andric uint16_t Filei); 390b57cec5SDimitry Andric DbiModuleSourceFilesIterator() = default; 40480093f4SDimitry Andric DbiModuleSourceFilesIterator(const DbiModuleSourceFilesIterator &R) = default; 410b57cec5SDimitry Andric DbiModuleSourceFilesIterator & 420b57cec5SDimitry Andric operator=(const DbiModuleSourceFilesIterator &R) = default; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric bool operator==(const DbiModuleSourceFilesIterator &R) const; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric const StringRef &operator*() const { return ThisValue; } 470b57cec5SDimitry Andric StringRef &operator*() { return ThisValue; } 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric bool operator<(const DbiModuleSourceFilesIterator &RHS) const; 500b57cec5SDimitry Andric std::ptrdiff_t operator-(const DbiModuleSourceFilesIterator &R) const; 510b57cec5SDimitry Andric DbiModuleSourceFilesIterator &operator+=(std::ptrdiff_t N); 520b57cec5SDimitry Andric DbiModuleSourceFilesIterator &operator-=(std::ptrdiff_t N); 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric private: 550b57cec5SDimitry Andric void setValue(); 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric bool isEnd() const; 580b57cec5SDimitry Andric bool isCompatible(const DbiModuleSourceFilesIterator &R) const; 590b57cec5SDimitry Andric bool isUniversalEnd() const; 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric StringRef ThisValue; 620b57cec5SDimitry Andric const DbiModuleList *Modules{nullptr}; 630b57cec5SDimitry Andric uint32_t Modi{0}; 640b57cec5SDimitry Andric uint16_t Filei{0}; 650b57cec5SDimitry Andric }; 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric class DbiModuleList { 680b57cec5SDimitry Andric friend DbiModuleSourceFilesIterator; 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric public: 710b57cec5SDimitry Andric Error initialize(BinaryStreamRef ModInfo, BinaryStreamRef FileInfo); 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric Expected<StringRef> getFileName(uint32_t Index) const; 740b57cec5SDimitry Andric uint32_t getModuleCount() const; 750b57cec5SDimitry Andric uint32_t getSourceFileCount() const; 760b57cec5SDimitry Andric uint16_t getSourceFileCount(uint32_t Modi) const; 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric iterator_range<DbiModuleSourceFilesIterator> 790b57cec5SDimitry Andric source_files(uint32_t Modi) const; 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric DbiModuleDescriptor getModuleDescriptor(uint32_t Modi) const; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric private: 840b57cec5SDimitry Andric Error initializeModInfo(BinaryStreamRef ModInfo); 850b57cec5SDimitry Andric Error initializeFileInfo(BinaryStreamRef FileInfo); 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric VarStreamArray<DbiModuleDescriptor> Descriptors; 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric FixedStreamArray<support::little32_t> FileNameOffsets; 900b57cec5SDimitry Andric FixedStreamArray<support::ulittle16_t> ModFileCountArray; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric // For each module, there are multiple filenames, which can be obtained by 930b57cec5SDimitry Andric // knowing the index of the file. Given the index of the file, one can use 940b57cec5SDimitry Andric // that as an offset into the FileNameOffsets array, which contains the 950b57cec5SDimitry Andric // absolute offset of the file name in NamesBuffer. Thus, for each module 960b57cec5SDimitry Andric // we store the first index in the FileNameOffsets array for this module. 970b57cec5SDimitry Andric // The number of files for the corresponding module is stored in 980b57cec5SDimitry Andric // ModFileCountArray. 990b57cec5SDimitry Andric std::vector<uint32_t> ModuleInitialFileIndex; 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric // In order to provide random access into the Descriptors array, we iterate it 1020b57cec5SDimitry Andric // once up front to find the offsets of the individual items and store them in 1030b57cec5SDimitry Andric // this array. 1040b57cec5SDimitry Andric std::vector<uint32_t> ModuleDescriptorOffsets; 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric const FileInfoSubstreamHeader *FileInfoHeader = nullptr; 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric BinaryStreamRef ModInfoSubstream; 1090b57cec5SDimitry Andric BinaryStreamRef FileInfoSubstream; 1100b57cec5SDimitry Andric BinaryStreamRef NamesBuffer; 1110b57cec5SDimitry Andric }; 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric } // end namespace pdb 1140b57cec5SDimitry Andric } // end namespace llvm 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric #endif // LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULELIST_H 117