LLVM: lib/DebugInfo/PDB/Native/DbiModuleList.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
16#include
17#include
18#include
19
20using namespace llvm;
22
25 : Modules(&Modules), Modi(Modi), Filei(Filei) {
26 setValue();
27}
28
31
32 if (!isCompatible(R))
33 return false;
34
35
36 if (isEnd() && R.isEnd())
37 return true;
38
39
40 if (isEnd() != R.isEnd())
41 return false;
42
43
44
45
46
47
48
49 assert(Modules == R.Modules);
50 assert(Modi == R.Modi);
53
54 return (Filei == R.Filei);
55}
56
59 assert(isCompatible(R));
60
61
62
63
64 if (*this == R)
65 return false;
66
67 return Filei < R.Filei;
68}
69
72 assert(isCompatible(R));
74
75
76 if (isEnd() && R.isEnd())
77 return 0;
78
80
81
82
83
84
86 if (isEnd()) {
88 Thisi = R.Modules->getSourceFileCount(RealModi);
89 }
90
91 assert(Thisi >= R.Filei);
92 return Thisi - R.Filei;
93}
94
98
99 Filei += N;
100 assert(Filei <= Modules->getSourceFileCount(Modi));
101 setValue();
102 return *this;
103}
104
107
108
109 assert(!isUniversalEnd());
110
112
113 Filei -= N;
114 return *this;
115}
116
117void DbiModuleSourceFilesIterator::setValue() {
118 if (isEnd()) {
119 ThisValue = "";
120 return;
121 }
122
123 uint32_t Off = Modules->ModuleInitialFileIndex[Modi] + Filei;
124 auto ExpectedValue = Modules->getFileName(Off);
125 if (!ExpectedValue) {
128 } else
129 ThisValue = *ExpectedValue;
130}
131
132bool DbiModuleSourceFilesIterator::isEnd() const {
133 if (isUniversalEnd())
134 return true;
135
137 assert(Modi <= Modules->getModuleCount());
138 assert(Filei <= Modules->getSourceFileCount(Modi));
139
140 if (Modi == Modules->getModuleCount())
141 return true;
142 if (Filei == Modules->getSourceFileCount(Modi))
143 return true;
144 return false;
145}
146
147bool DbiModuleSourceFilesIterator::isUniversalEnd() const { return !Modules; }
148
149bool DbiModuleSourceFilesIterator::isCompatible(
151
152 if (isUniversalEnd() || R.isUniversalEnd())
153 return true;
154
155
156
157
158
159 return Modi == R.Modi;
160}
161
164 if (auto EC = initializeModInfo(ModInfo))
165 return EC;
166 if (auto EC = initializeFileInfo(FileInfo))
167 return EC;
168
170}
171
173 ModInfoSubstream = ModInfo;
174
177
179
180 if (auto EC = Reader.readArray(Descriptors, ModInfo.getLength()))
181 return EC;
182
184}
185
187 FileInfoSubstream = FileInfo;
188
189 if (FileInfo.getLength() == 0)
191
193 if (auto EC = FISR.readObject(FileInfoHeader))
194 return EC;
195
196
197
199 if (auto EC = FISR.readArray(ModuleIndices, FileInfoHeader->NumModules))
200 return EC;
201 if (auto EC = FISR.readArray(ModFileCountArray, FileInfoHeader->NumModules))
202 return EC;
203
204
205
206
207
209 for (auto Count : ModFileCountArray)
210 NumSourceFiles += Count;
211
212
213
214
215
216 if (auto EC = FISR.readArray(FileNameOffsets, NumSourceFiles))
217 return EC;
218
219 if (auto EC = FISR.readStreamRef(NamesBuffer))
220 return EC;
221
222 auto DescriptorIter = Descriptors.begin();
224 ModuleInitialFileIndex.resize(FileInfoHeader->NumModules);
225 ModuleDescriptorOffsets.resize(FileInfoHeader->NumModules);
226 for (size_t I = 0; I < FileInfoHeader->NumModules; ++I) {
227 assert(DescriptorIter != Descriptors.end());
228 ModuleInitialFileIndex[I] = NextFileIndex;
229 ModuleDescriptorOffsets[I] = DescriptorIter.offset();
230
231 NextFileIndex += ModFileCountArray[I];
232 ++DescriptorIter;
233 }
234
235 assert(DescriptorIter == Descriptors.end());
236 assert(NextFileIndex == NumSourceFiles);
237
239}
240
242
243
244 return FileInfoHeader ? FileInfoHeader->NumModules : 0;
245}
246
248 return FileNameOffsets.size();
249}
250
252 return ModFileCountArray[Modi];
253}
254
258 auto Iter = Descriptors.at(Offset);
259 assert(Iter != Descriptors.end());
260 return *Iter;
261}
262
266 DbiModuleSourceFilesIterator(*this, Modi, 0),
267 DbiModuleSourceFilesIterator());
268}
269
274
275 uint32_t FileOffset = FileNameOffsets[Index];
279 return std::move(EC);
280 return Name;
281}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Provides read only access to a subclass of BinaryStream.
LLVM_ABI Error readCString(StringRef &Dest)
Read a null terminated string from Dest.
void setOffset(uint64_t Off)
uint64_t getLength() const
BinaryStreamRef is to BinaryStream what ArrayRef is to an Array.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
FixedStreamArray is similar to VarStreamArray, except with each record having a fixed-length.
StringRef - Represent a constant reference to a string, i.e.
A range adaptor for a pair of iterators.
LLVM_ABI DbiModuleDescriptor getModuleDescriptor(uint32_t Modi) const
Definition DbiModuleList.cpp:255
LLVM_ABI uint32_t getModuleCount() const
Definition DbiModuleList.cpp:241
LLVM_ABI Error initialize(BinaryStreamRef ModInfo, BinaryStreamRef FileInfo)
Definition DbiModuleList.cpp:162
LLVM_ABI uint32_t getSourceFileCount() const
Definition DbiModuleList.cpp:247
LLVM_ABI iterator_range< DbiModuleSourceFilesIterator > source_files(uint32_t Modi) const
Definition DbiModuleList.cpp:264
LLVM_ABI Expected< StringRef > getFileName(uint32_t Index) const
Definition DbiModuleList.cpp:270
DbiModuleSourceFilesIterator()=default
LLVM_ABI DbiModuleSourceFilesIterator & operator-=(std::ptrdiff_t N)
Definition DbiModuleList.cpp:106
LLVM_ABI DbiModuleSourceFilesIterator(const DbiModuleList &Modules, uint32_t Modi, uint16_t Filei)
Definition DbiModuleList.cpp:23
LLVM_ABI std::ptrdiff_t operator-(const DbiModuleSourceFilesIterator &R) const
Definition DbiModuleList.cpp:71
LLVM_ABI bool operator==(const DbiModuleSourceFilesIterator &R) const
Definition DbiModuleList.cpp:30
LLVM_ABI DbiModuleSourceFilesIterator & operator+=(std::ptrdiff_t N)
Definition DbiModuleList.cpp:96
LLVM_ABI bool operator<(const DbiModuleSourceFilesIterator &RHS) const
Definition DbiModuleList.cpp:58
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
FunctionAddr VTableAddr Count
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
void consumeError(Error Err)
Consume a Error without doing anything.