1317948Sdim//===- DbiModuleList.h - PDB module information list ------------*- C++ -*-===// 2317948Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6317948Sdim// 7317948Sdim//===----------------------------------------------------------------------===// 8317948Sdim 9320572Sdim#ifndef LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULELIST_H 10320572Sdim#define LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULELIST_H 11317948Sdim 12317948Sdim#include "llvm/ADT/StringRef.h" 13317948Sdim#include "llvm/ADT/iterator.h" 14320572Sdim#include "llvm/ADT/iterator_range.h" 15317948Sdim#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h" 16317948Sdim#include "llvm/Support/BinaryStreamArray.h" 17317948Sdim#include "llvm/Support/BinaryStreamRef.h" 18317948Sdim#include "llvm/Support/Endian.h" 19317948Sdim#include "llvm/Support/Error.h" 20320572Sdim#include <cstddef> 21317948Sdim#include <cstdint> 22320572Sdim#include <iterator> 23317948Sdim#include <vector> 24317948Sdim 25317948Sdimnamespace llvm { 26317948Sdimnamespace pdb { 27317948Sdim 28317948Sdimclass DbiModuleList; 29317948Sdimstruct FileInfoSubstreamHeader; 30317948Sdim 31317948Sdimclass DbiModuleSourceFilesIterator 32317948Sdim : public iterator_facade_base<DbiModuleSourceFilesIterator, 33317948Sdim std::random_access_iterator_tag, StringRef> { 34320572Sdim using BaseType = 35320572Sdim iterator_facade_base<DbiModuleSourceFilesIterator, 36320572Sdim std::random_access_iterator_tag, StringRef>; 37317948Sdim 38317948Sdimpublic: 39317948Sdim DbiModuleSourceFilesIterator(const DbiModuleList &Modules, uint32_t Modi, 40317948Sdim uint16_t Filei); 41317948Sdim DbiModuleSourceFilesIterator() = default; 42360784Sdim DbiModuleSourceFilesIterator(const DbiModuleSourceFilesIterator &R) = default; 43317948Sdim DbiModuleSourceFilesIterator & 44317948Sdim operator=(const DbiModuleSourceFilesIterator &R) = default; 45317948Sdim 46317948Sdim bool operator==(const DbiModuleSourceFilesIterator &R) const; 47317948Sdim 48317948Sdim const StringRef &operator*() const { return ThisValue; } 49317948Sdim StringRef &operator*() { return ThisValue; } 50317948Sdim 51317948Sdim bool operator<(const DbiModuleSourceFilesIterator &RHS) const; 52317948Sdim std::ptrdiff_t operator-(const DbiModuleSourceFilesIterator &R) const; 53317948Sdim DbiModuleSourceFilesIterator &operator+=(std::ptrdiff_t N); 54317948Sdim DbiModuleSourceFilesIterator &operator-=(std::ptrdiff_t N); 55317948Sdim 56317948Sdimprivate: 57317948Sdim void setValue(); 58317948Sdim 59317948Sdim bool isEnd() const; 60317948Sdim bool isCompatible(const DbiModuleSourceFilesIterator &R) const; 61317948Sdim bool isUniversalEnd() const; 62317948Sdim 63317948Sdim StringRef ThisValue; 64317948Sdim const DbiModuleList *Modules{nullptr}; 65317948Sdim uint32_t Modi{0}; 66317948Sdim uint16_t Filei{0}; 67317948Sdim}; 68317948Sdim 69317948Sdimclass DbiModuleList { 70317948Sdim friend DbiModuleSourceFilesIterator; 71317948Sdim 72317948Sdimpublic: 73317948Sdim Error initialize(BinaryStreamRef ModInfo, BinaryStreamRef FileInfo); 74317948Sdim 75317948Sdim Expected<StringRef> getFileName(uint32_t Index) const; 76317948Sdim uint32_t getModuleCount() const; 77317948Sdim uint32_t getSourceFileCount() const; 78317948Sdim uint16_t getSourceFileCount(uint32_t Modi) const; 79317948Sdim 80317948Sdim iterator_range<DbiModuleSourceFilesIterator> 81317948Sdim source_files(uint32_t Modi) const; 82317948Sdim 83317948Sdim DbiModuleDescriptor getModuleDescriptor(uint32_t Modi) const; 84317948Sdim 85317948Sdimprivate: 86317948Sdim Error initializeModInfo(BinaryStreamRef ModInfo); 87317948Sdim Error initializeFileInfo(BinaryStreamRef FileInfo); 88317948Sdim 89317948Sdim VarStreamArray<DbiModuleDescriptor> Descriptors; 90317948Sdim 91317948Sdim FixedStreamArray<support::little32_t> FileNameOffsets; 92317948Sdim FixedStreamArray<support::ulittle16_t> ModFileCountArray; 93317948Sdim 94317948Sdim // For each module, there are multiple filenames, which can be obtained by 95317948Sdim // knowing the index of the file. Given the index of the file, one can use 96317948Sdim // that as an offset into the FileNameOffsets array, which contains the 97317948Sdim // absolute offset of the file name in NamesBuffer. Thus, for each module 98317948Sdim // we store the first index in the FileNameOffsets array for this module. 99317948Sdim // The number of files for the corresponding module is stored in 100317948Sdim // ModFileCountArray. 101317948Sdim std::vector<uint32_t> ModuleInitialFileIndex; 102317948Sdim 103317948Sdim // In order to provide random access into the Descriptors array, we iterate it 104317948Sdim // once up front to find the offsets of the individual items and store them in 105317948Sdim // this array. 106317948Sdim std::vector<uint32_t> ModuleDescriptorOffsets; 107317948Sdim 108317948Sdim const FileInfoSubstreamHeader *FileInfoHeader = nullptr; 109317948Sdim 110317948Sdim BinaryStreamRef ModInfoSubstream; 111317948Sdim BinaryStreamRef FileInfoSubstream; 112317948Sdim BinaryStreamRef NamesBuffer; 113317948Sdim}; 114317948Sdim 115320572Sdim} // end namespace pdb 116320572Sdim} // end namespace llvm 117320572Sdim 118320572Sdim#endif // LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULELIST_H 119