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