1 //===--- ASTReader.cpp - AST File Reader ----------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the ASTReader class, which reads AST files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/Serialization/ASTReader.h"
15 #include "ASTCommon.h"
16 #include "ASTReaderInternals.h"
17 #include "clang/AST/ASTConsumer.h"
18 #include "clang/AST/ASTContext.h"
19 #include "clang/AST/DeclTemplate.h"
20 #include "clang/AST/Expr.h"
21 #include "clang/AST/ExprCXX.h"
22 #include "clang/AST/NestedNameSpecifier.h"
23 #include "clang/AST/Type.h"
24 #include "clang/AST/TypeLocVisitor.h"
25 #include "clang/Basic/DiagnosticOptions.h"
26 #include "clang/Basic/FileManager.h"
27 #include "clang/Basic/SourceManager.h"
28 #include "clang/Basic/SourceManagerInternals.h"
29 #include "clang/Basic/TargetInfo.h"
30 #include "clang/Basic/TargetOptions.h"
31 #include "clang/Basic/Version.h"
32 #include "clang/Basic/VersionTuple.h"
33 #include "clang/Frontend/Utils.h"
34 #include "clang/Lex/HeaderSearch.h"
35 #include "clang/Lex/HeaderSearchOptions.h"
36 #include "clang/Lex/MacroInfo.h"
37 #include "clang/Lex/PreprocessingRecord.h"
38 #include "clang/Lex/Preprocessor.h"
39 #include "clang/Lex/PreprocessorOptions.h"
40 #include "clang/Sema/Scope.h"
41 #include "clang/Sema/Sema.h"
42 #include "clang/Serialization/ASTDeserializationListener.h"
43 #include "clang/Serialization/GlobalModuleIndex.h"
44 #include "clang/Serialization/ModuleManager.h"
45 #include "clang/Serialization/SerializationDiagnostic.h"
46 #include "llvm/ADT/Hashing.h"
47 #include "llvm/ADT/StringExtras.h"
48 #include "llvm/Bitcode/BitstreamReader.h"
49 #include "llvm/Support/ErrorHandling.h"
50 #include "llvm/Support/FileSystem.h"
51 #include "llvm/Support/MemoryBuffer.h"
52 #include "llvm/Support/Path.h"
53 #include "llvm/Support/SaveAndRestore.h"
54 #include "llvm/Support/raw_ostream.h"
55 #include <algorithm>
56 #include <cstdio>
57 #include <iterator>
58 #include <system_error>
59
60 using namespace clang;
61 using namespace clang::serialization;
62 using namespace clang::serialization::reader;
63 using llvm::BitstreamCursor;
64
65
66 //===----------------------------------------------------------------------===//
67 // ChainedASTReaderListener implementation
68 //===----------------------------------------------------------------------===//
69
70 bool
ReadFullVersionInformation(StringRef FullVersion)71 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
74 }
ReadModuleName(StringRef ModuleName)75 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
76 First->ReadModuleName(ModuleName);
77 Second->ReadModuleName(ModuleName);
78 }
ReadModuleMapFile(StringRef ModuleMapPath)79 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
80 First->ReadModuleMapFile(ModuleMapPath);
81 Second->ReadModuleMapFile(ModuleMapPath);
82 }
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain)83 bool ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
84 bool Complain) {
85 return First->ReadLanguageOptions(LangOpts, Complain) ||
86 Second->ReadLanguageOptions(LangOpts, Complain);
87 }
88 bool
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain)89 ChainedASTReaderListener::ReadTargetOptions(const TargetOptions &TargetOpts,
90 bool Complain) {
91 return First->ReadTargetOptions(TargetOpts, Complain) ||
92 Second->ReadTargetOptions(TargetOpts, Complain);
93 }
ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,bool Complain)94 bool ChainedASTReaderListener::ReadDiagnosticOptions(
95 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
96 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
97 Second->ReadDiagnosticOptions(DiagOpts, Complain);
98 }
99 bool
ReadFileSystemOptions(const FileSystemOptions & FSOpts,bool Complain)100 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
101 bool Complain) {
102 return First->ReadFileSystemOptions(FSOpts, Complain) ||
103 Second->ReadFileSystemOptions(FSOpts, Complain);
104 }
105
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,bool Complain)106 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
107 const HeaderSearchOptions &HSOpts, bool Complain) {
108 return First->ReadHeaderSearchOptions(HSOpts, Complain) ||
109 Second->ReadHeaderSearchOptions(HSOpts, Complain);
110 }
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool Complain,std::string & SuggestedPredefines)111 bool ChainedASTReaderListener::ReadPreprocessorOptions(
112 const PreprocessorOptions &PPOpts, bool Complain,
113 std::string &SuggestedPredefines) {
114 return First->ReadPreprocessorOptions(PPOpts, Complain,
115 SuggestedPredefines) ||
116 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
117 }
ReadCounter(const serialization::ModuleFile & M,unsigned Value)118 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
119 unsigned Value) {
120 First->ReadCounter(M, Value);
121 Second->ReadCounter(M, Value);
122 }
needsInputFileVisitation()123 bool ChainedASTReaderListener::needsInputFileVisitation() {
124 return First->needsInputFileVisitation() ||
125 Second->needsInputFileVisitation();
126 }
needsSystemInputFileVisitation()127 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
128 return First->needsSystemInputFileVisitation() ||
129 Second->needsSystemInputFileVisitation();
130 }
visitModuleFile(StringRef Filename)131 void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
132 First->visitModuleFile(Filename);
133 Second->visitModuleFile(Filename);
134 }
visitInputFile(StringRef Filename,bool isSystem,bool isOverridden)135 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
136 bool isSystem,
137 bool isOverridden) {
138 bool Continue = false;
139 if (First->needsInputFileVisitation() &&
140 (!isSystem || First->needsSystemInputFileVisitation()))
141 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
142 if (Second->needsInputFileVisitation() &&
143 (!isSystem || Second->needsSystemInputFileVisitation()))
144 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
145 return Continue;
146 }
147
148 //===----------------------------------------------------------------------===//
149 // PCH validator implementation
150 //===----------------------------------------------------------------------===//
151
~ASTReaderListener()152 ASTReaderListener::~ASTReaderListener() {}
153
154 /// \brief Compare the given set of language options against an existing set of
155 /// language options.
156 ///
157 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
158 ///
159 /// \returns true if the languagae options mis-match, false otherwise.
checkLanguageOptions(const LangOptions & LangOpts,const LangOptions & ExistingLangOpts,DiagnosticsEngine * Diags)160 static bool checkLanguageOptions(const LangOptions &LangOpts,
161 const LangOptions &ExistingLangOpts,
162 DiagnosticsEngine *Diags) {
163 #define LANGOPT(Name, Bits, Default, Description) \
164 if (ExistingLangOpts.Name != LangOpts.Name) { \
165 if (Diags) \
166 Diags->Report(diag::err_pch_langopt_mismatch) \
167 << Description << LangOpts.Name << ExistingLangOpts.Name; \
168 return true; \
169 }
170
171 #define VALUE_LANGOPT(Name, Bits, Default, Description) \
172 if (ExistingLangOpts.Name != LangOpts.Name) { \
173 if (Diags) \
174 Diags->Report(diag::err_pch_langopt_value_mismatch) \
175 << Description; \
176 return true; \
177 }
178
179 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
180 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
181 if (Diags) \
182 Diags->Report(diag::err_pch_langopt_value_mismatch) \
183 << Description; \
184 return true; \
185 }
186
187 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
188 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
189 #include "clang/Basic/LangOptions.def"
190
191 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
192 if (Diags)
193 Diags->Report(diag::err_pch_langopt_value_mismatch)
194 << "target Objective-C runtime";
195 return true;
196 }
197
198 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
199 LangOpts.CommentOpts.BlockCommandNames) {
200 if (Diags)
201 Diags->Report(diag::err_pch_langopt_value_mismatch)
202 << "block command names";
203 return true;
204 }
205
206 return false;
207 }
208
209 /// \brief Compare the given set of target options against an existing set of
210 /// target options.
211 ///
212 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
213 ///
214 /// \returns true if the target options mis-match, false otherwise.
checkTargetOptions(const TargetOptions & TargetOpts,const TargetOptions & ExistingTargetOpts,DiagnosticsEngine * Diags)215 static bool checkTargetOptions(const TargetOptions &TargetOpts,
216 const TargetOptions &ExistingTargetOpts,
217 DiagnosticsEngine *Diags) {
218 #define CHECK_TARGET_OPT(Field, Name) \
219 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
220 if (Diags) \
221 Diags->Report(diag::err_pch_targetopt_mismatch) \
222 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
223 return true; \
224 }
225
226 CHECK_TARGET_OPT(Triple, "target");
227 CHECK_TARGET_OPT(CPU, "target CPU");
228 CHECK_TARGET_OPT(ABI, "target ABI");
229 #undef CHECK_TARGET_OPT
230
231 // Compare feature sets.
232 SmallVector<StringRef, 4> ExistingFeatures(
233 ExistingTargetOpts.FeaturesAsWritten.begin(),
234 ExistingTargetOpts.FeaturesAsWritten.end());
235 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
236 TargetOpts.FeaturesAsWritten.end());
237 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
238 std::sort(ReadFeatures.begin(), ReadFeatures.end());
239
240 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
241 unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
242 while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
243 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
244 ++ExistingIdx;
245 ++ReadIdx;
246 continue;
247 }
248
249 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
250 if (Diags)
251 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
252 << false << ReadFeatures[ReadIdx];
253 return true;
254 }
255
256 if (Diags)
257 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
258 << true << ExistingFeatures[ExistingIdx];
259 return true;
260 }
261
262 if (ExistingIdx < ExistingN) {
263 if (Diags)
264 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
265 << true << ExistingFeatures[ExistingIdx];
266 return true;
267 }
268
269 if (ReadIdx < ReadN) {
270 if (Diags)
271 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
272 << false << ReadFeatures[ReadIdx];
273 return true;
274 }
275
276 return false;
277 }
278
279 bool
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain)280 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
281 bool Complain) {
282 const LangOptions &ExistingLangOpts = PP.getLangOpts();
283 return checkLanguageOptions(LangOpts, ExistingLangOpts,
284 Complain? &Reader.Diags : nullptr);
285 }
286
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain)287 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
288 bool Complain) {
289 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
290 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
291 Complain? &Reader.Diags : nullptr);
292 }
293
294 namespace {
295 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
296 MacroDefinitionsMap;
297 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
298 DeclsMap;
299 }
300
checkDiagnosticGroupMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,bool Complain)301 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
302 DiagnosticsEngine &Diags,
303 bool Complain) {
304 typedef DiagnosticsEngine::Level Level;
305
306 // Check current mappings for new -Werror mappings, and the stored mappings
307 // for cases that were explicitly mapped to *not* be errors that are now
308 // errors because of options like -Werror.
309 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
310
311 for (DiagnosticsEngine *MappingSource : MappingSources) {
312 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
313 diag::kind DiagID = DiagIDMappingPair.first;
314 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
315 if (CurLevel < DiagnosticsEngine::Error)
316 continue; // not significant
317 Level StoredLevel =
318 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
319 if (StoredLevel < DiagnosticsEngine::Error) {
320 if (Complain)
321 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
322 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
323 return true;
324 }
325 }
326 }
327
328 return false;
329 }
330
isExtHandlingFromDiagsError(DiagnosticsEngine & Diags)331 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
332 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
333 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
334 return true;
335 return Ext >= diag::Severity::Error;
336 }
337
checkDiagnosticMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,bool IsSystem,bool Complain)338 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
339 DiagnosticsEngine &Diags,
340 bool IsSystem, bool Complain) {
341 // Top-level options
342 if (IsSystem) {
343 if (Diags.getSuppressSystemWarnings())
344 return false;
345 // If -Wsystem-headers was not enabled before, be conservative
346 if (StoredDiags.getSuppressSystemWarnings()) {
347 if (Complain)
348 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
349 return true;
350 }
351 }
352
353 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
354 if (Complain)
355 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
356 return true;
357 }
358
359 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
360 !StoredDiags.getEnableAllWarnings()) {
361 if (Complain)
362 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
363 return true;
364 }
365
366 if (isExtHandlingFromDiagsError(Diags) &&
367 !isExtHandlingFromDiagsError(StoredDiags)) {
368 if (Complain)
369 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
370 return true;
371 }
372
373 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
374 }
375
ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,bool Complain)376 bool PCHValidator::ReadDiagnosticOptions(
377 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
378 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
379 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
380 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
381 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
382 // This should never fail, because we would have processed these options
383 // before writing them to an ASTFile.
384 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
385
386 ModuleManager &ModuleMgr = Reader.getModuleManager();
387 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
388
389 // If the original import came from a file explicitly generated by the user,
390 // don't check the diagnostic mappings.
391 // FIXME: currently this is approximated by checking whether this is not a
392 // module import.
393 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
394 // the transitive closure of its imports, since unrelated modules cannot be
395 // imported until after this module finishes validation.
396 ModuleFile *TopImport = *ModuleMgr.rbegin();
397 while (!TopImport->ImportedBy.empty())
398 TopImport = TopImport->ImportedBy[0];
399 if (TopImport->Kind != MK_Module)
400 return false;
401
402 StringRef ModuleName = TopImport->ModuleName;
403 assert(!ModuleName.empty() && "diagnostic options read before module name");
404
405 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
406 assert(M && "missing module");
407
408 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
409 // contains the union of their flags.
410 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
411 }
412
413 /// \brief Collect the macro definitions provided by the given preprocessor
414 /// options.
415 static void
collectMacroDefinitions(const PreprocessorOptions & PPOpts,MacroDefinitionsMap & Macros,SmallVectorImpl<StringRef> * MacroNames=nullptr)416 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
417 MacroDefinitionsMap &Macros,
418 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
419 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
420 StringRef Macro = PPOpts.Macros[I].first;
421 bool IsUndef = PPOpts.Macros[I].second;
422
423 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
424 StringRef MacroName = MacroPair.first;
425 StringRef MacroBody = MacroPair.second;
426
427 // For an #undef'd macro, we only care about the name.
428 if (IsUndef) {
429 if (MacroNames && !Macros.count(MacroName))
430 MacroNames->push_back(MacroName);
431
432 Macros[MacroName] = std::make_pair("", true);
433 continue;
434 }
435
436 // For a #define'd macro, figure out the actual definition.
437 if (MacroName.size() == Macro.size())
438 MacroBody = "1";
439 else {
440 // Note: GCC drops anything following an end-of-line character.
441 StringRef::size_type End = MacroBody.find_first_of("\n\r");
442 MacroBody = MacroBody.substr(0, End);
443 }
444
445 if (MacroNames && !Macros.count(MacroName))
446 MacroNames->push_back(MacroName);
447 Macros[MacroName] = std::make_pair(MacroBody, false);
448 }
449 }
450
451 /// \brief Check the preprocessor options deserialized from the control block
452 /// against the preprocessor options in an existing preprocessor.
453 ///
454 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
checkPreprocessorOptions(const PreprocessorOptions & PPOpts,const PreprocessorOptions & ExistingPPOpts,DiagnosticsEngine * Diags,FileManager & FileMgr,std::string & SuggestedPredefines,const LangOptions & LangOpts)455 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
456 const PreprocessorOptions &ExistingPPOpts,
457 DiagnosticsEngine *Diags,
458 FileManager &FileMgr,
459 std::string &SuggestedPredefines,
460 const LangOptions &LangOpts) {
461 // Check macro definitions.
462 MacroDefinitionsMap ASTFileMacros;
463 collectMacroDefinitions(PPOpts, ASTFileMacros);
464 MacroDefinitionsMap ExistingMacros;
465 SmallVector<StringRef, 4> ExistingMacroNames;
466 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
467
468 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
469 // Dig out the macro definition in the existing preprocessor options.
470 StringRef MacroName = ExistingMacroNames[I];
471 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
472
473 // Check whether we know anything about this macro name or not.
474 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
475 = ASTFileMacros.find(MacroName);
476 if (Known == ASTFileMacros.end()) {
477 // FIXME: Check whether this identifier was referenced anywhere in the
478 // AST file. If so, we should reject the AST file. Unfortunately, this
479 // information isn't in the control block. What shall we do about it?
480
481 if (Existing.second) {
482 SuggestedPredefines += "#undef ";
483 SuggestedPredefines += MacroName.str();
484 SuggestedPredefines += '\n';
485 } else {
486 SuggestedPredefines += "#define ";
487 SuggestedPredefines += MacroName.str();
488 SuggestedPredefines += ' ';
489 SuggestedPredefines += Existing.first.str();
490 SuggestedPredefines += '\n';
491 }
492 continue;
493 }
494
495 // If the macro was defined in one but undef'd in the other, we have a
496 // conflict.
497 if (Existing.second != Known->second.second) {
498 if (Diags) {
499 Diags->Report(diag::err_pch_macro_def_undef)
500 << MacroName << Known->second.second;
501 }
502 return true;
503 }
504
505 // If the macro was #undef'd in both, or if the macro bodies are identical,
506 // it's fine.
507 if (Existing.second || Existing.first == Known->second.first)
508 continue;
509
510 // The macro bodies differ; complain.
511 if (Diags) {
512 Diags->Report(diag::err_pch_macro_def_conflict)
513 << MacroName << Known->second.first << Existing.first;
514 }
515 return true;
516 }
517
518 // Check whether we're using predefines.
519 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
520 if (Diags) {
521 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
522 }
523 return true;
524 }
525
526 // Detailed record is important since it is used for the module cache hash.
527 if (LangOpts.Modules &&
528 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
529 if (Diags) {
530 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
531 }
532 return true;
533 }
534
535 // Compute the #include and #include_macros lines we need.
536 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
537 StringRef File = ExistingPPOpts.Includes[I];
538 if (File == ExistingPPOpts.ImplicitPCHInclude)
539 continue;
540
541 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
542 != PPOpts.Includes.end())
543 continue;
544
545 SuggestedPredefines += "#include \"";
546 SuggestedPredefines +=
547 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
548 SuggestedPredefines += "\"\n";
549 }
550
551 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
552 StringRef File = ExistingPPOpts.MacroIncludes[I];
553 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
554 File)
555 != PPOpts.MacroIncludes.end())
556 continue;
557
558 SuggestedPredefines += "#__include_macros \"";
559 SuggestedPredefines +=
560 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
561 SuggestedPredefines += "\"\n##\n";
562 }
563
564 return false;
565 }
566
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool Complain,std::string & SuggestedPredefines)567 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
568 bool Complain,
569 std::string &SuggestedPredefines) {
570 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
571
572 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
573 Complain? &Reader.Diags : nullptr,
574 PP.getFileManager(),
575 SuggestedPredefines,
576 PP.getLangOpts());
577 }
578
ReadCounter(const ModuleFile & M,unsigned Value)579 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
580 PP.setCounterValue(Value);
581 }
582
583 //===----------------------------------------------------------------------===//
584 // AST reader implementation
585 //===----------------------------------------------------------------------===//
586
setDeserializationListener(ASTDeserializationListener * Listener,bool TakeOwnership)587 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
588 bool TakeOwnership) {
589 DeserializationListener = Listener;
590 OwnsDeserializationListener = TakeOwnership;
591 }
592
593
594
ComputeHash(Selector Sel)595 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
596 return serialization::ComputeHash(Sel);
597 }
598
599
600 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)601 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
602 using namespace llvm::support;
603 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
604 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
605 return std::make_pair(KeyLen, DataLen);
606 }
607
608 ASTSelectorLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)609 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
610 using namespace llvm::support;
611 SelectorTable &SelTable = Reader.getContext().Selectors;
612 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
613 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
614 F, endian::readNext<uint32_t, little, unaligned>(d));
615 if (N == 0)
616 return SelTable.getNullarySelector(FirstII);
617 else if (N == 1)
618 return SelTable.getUnarySelector(FirstII);
619
620 SmallVector<IdentifierInfo *, 16> Args;
621 Args.push_back(FirstII);
622 for (unsigned I = 1; I != N; ++I)
623 Args.push_back(Reader.getLocalIdentifier(
624 F, endian::readNext<uint32_t, little, unaligned>(d)));
625
626 return SelTable.getSelector(N, Args.data());
627 }
628
629 ASTSelectorLookupTrait::data_type
ReadData(Selector,const unsigned char * d,unsigned DataLen)630 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
631 unsigned DataLen) {
632 using namespace llvm::support;
633
634 data_type Result;
635
636 Result.ID = Reader.getGlobalSelectorID(
637 F, endian::readNext<uint32_t, little, unaligned>(d));
638 unsigned NumInstanceMethodsAndBits =
639 endian::readNext<uint16_t, little, unaligned>(d);
640 unsigned NumFactoryMethodsAndBits =
641 endian::readNext<uint16_t, little, unaligned>(d);
642 Result.InstanceBits = NumInstanceMethodsAndBits & 0x3;
643 Result.FactoryBits = NumFactoryMethodsAndBits & 0x3;
644 unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2;
645 unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2;
646
647 // Load instance methods
648 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
649 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
650 F, endian::readNext<uint32_t, little, unaligned>(d)))
651 Result.Instance.push_back(Method);
652 }
653
654 // Load factory methods
655 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
656 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
657 F, endian::readNext<uint32_t, little, unaligned>(d)))
658 Result.Factory.push_back(Method);
659 }
660
661 return Result;
662 }
663
ComputeHash(const internal_key_type & a)664 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
665 return llvm::HashString(a);
666 }
667
668 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)669 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
670 using namespace llvm::support;
671 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
672 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
673 return std::make_pair(KeyLen, DataLen);
674 }
675
676 ASTIdentifierLookupTraitBase::internal_key_type
ReadKey(const unsigned char * d,unsigned n)677 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
678 assert(n >= 2 && d[n-1] == '\0');
679 return StringRef((const char*) d, n-1);
680 }
681
682 /// \brief Whether the given identifier is "interesting".
isInterestingIdentifier(IdentifierInfo & II)683 static bool isInterestingIdentifier(IdentifierInfo &II) {
684 return II.isPoisoned() ||
685 II.isExtensionToken() ||
686 II.getObjCOrBuiltinID() ||
687 II.hasRevertedTokenIDToIdentifier() ||
688 II.hadMacroDefinition() ||
689 II.getFETokenInfo<void>();
690 }
691
ReadData(const internal_key_type & k,const unsigned char * d,unsigned DataLen)692 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
693 const unsigned char* d,
694 unsigned DataLen) {
695 using namespace llvm::support;
696 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
697 bool IsInteresting = RawID & 0x01;
698
699 // Wipe out the "is interesting" bit.
700 RawID = RawID >> 1;
701
702 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
703 if (!IsInteresting) {
704 // For uninteresting identifiers, just build the IdentifierInfo
705 // and associate it with the persistent ID.
706 IdentifierInfo *II = KnownII;
707 if (!II) {
708 II = &Reader.getIdentifierTable().getOwn(k);
709 KnownII = II;
710 }
711 Reader.SetIdentifierInfo(ID, II);
712 if (!II->isFromAST()) {
713 bool WasInteresting = isInterestingIdentifier(*II);
714 II->setIsFromAST();
715 if (WasInteresting)
716 II->setChangedSinceDeserialization();
717 }
718 Reader.markIdentifierUpToDate(II);
719 return II;
720 }
721
722 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
723 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
724 bool CPlusPlusOperatorKeyword = Bits & 0x01;
725 Bits >>= 1;
726 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
727 Bits >>= 1;
728 bool Poisoned = Bits & 0x01;
729 Bits >>= 1;
730 bool ExtensionToken = Bits & 0x01;
731 Bits >>= 1;
732 bool hasSubmoduleMacros = Bits & 0x01;
733 Bits >>= 1;
734 bool hadMacroDefinition = Bits & 0x01;
735 Bits >>= 1;
736
737 assert(Bits == 0 && "Extra bits in the identifier?");
738 DataLen -= 8;
739
740 // Build the IdentifierInfo itself and link the identifier ID with
741 // the new IdentifierInfo.
742 IdentifierInfo *II = KnownII;
743 if (!II) {
744 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
745 KnownII = II;
746 }
747 Reader.markIdentifierUpToDate(II);
748 if (!II->isFromAST()) {
749 bool WasInteresting = isInterestingIdentifier(*II);
750 II->setIsFromAST();
751 if (WasInteresting)
752 II->setChangedSinceDeserialization();
753 }
754
755 // Set or check the various bits in the IdentifierInfo structure.
756 // Token IDs are read-only.
757 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
758 II->RevertTokenIDToIdentifier();
759 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
760 assert(II->isExtensionToken() == ExtensionToken &&
761 "Incorrect extension token flag");
762 (void)ExtensionToken;
763 if (Poisoned)
764 II->setIsPoisoned(true);
765 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
766 "Incorrect C++ operator keyword flag");
767 (void)CPlusPlusOperatorKeyword;
768
769 // If this identifier is a macro, deserialize the macro
770 // definition.
771 if (hadMacroDefinition) {
772 uint32_t MacroDirectivesOffset =
773 endian::readNext<uint32_t, little, unaligned>(d);
774 DataLen -= 4;
775 SmallVector<uint32_t, 8> LocalMacroIDs;
776 if (hasSubmoduleMacros) {
777 while (uint32_t LocalMacroID =
778 endian::readNext<uint32_t, little, unaligned>(d)) {
779 DataLen -= 4;
780 LocalMacroIDs.push_back(LocalMacroID);
781 }
782 DataLen -= 4;
783 }
784
785 if (F.Kind == MK_Module) {
786 // Macro definitions are stored from newest to oldest, so reverse them
787 // before registering them.
788 llvm::SmallVector<unsigned, 8> MacroSizes;
789 for (SmallVectorImpl<uint32_t>::iterator
790 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
791 unsigned Size = 1;
792
793 static const uint32_t HasOverridesFlag = 0x80000000U;
794 if (I + 1 != E && (I[1] & HasOverridesFlag))
795 Size += 1 + (I[1] & ~HasOverridesFlag);
796
797 MacroSizes.push_back(Size);
798 I += Size;
799 }
800
801 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
802 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
803 SE = MacroSizes.rend();
804 SI != SE; ++SI) {
805 I -= *SI;
806
807 uint32_t LocalMacroID = *I;
808 ArrayRef<uint32_t> Overrides;
809 if (*SI != 1)
810 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
811 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
812 }
813 assert(I == LocalMacroIDs.begin());
814 } else {
815 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
816 }
817 }
818
819 Reader.SetIdentifierInfo(ID, II);
820
821 // Read all of the declarations visible at global scope with this
822 // name.
823 if (DataLen > 0) {
824 SmallVector<uint32_t, 4> DeclIDs;
825 for (; DataLen > 0; DataLen -= 4)
826 DeclIDs.push_back(Reader.getGlobalDeclID(
827 F, endian::readNext<uint32_t, little, unaligned>(d)));
828 Reader.SetGloballyVisibleDecls(II, DeclIDs);
829 }
830
831 return II;
832 }
833
834 unsigned
ComputeHash(const DeclNameKey & Key) const835 ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
836 llvm::FoldingSetNodeID ID;
837 ID.AddInteger(Key.Kind);
838
839 switch (Key.Kind) {
840 case DeclarationName::Identifier:
841 case DeclarationName::CXXLiteralOperatorName:
842 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
843 break;
844 case DeclarationName::ObjCZeroArgSelector:
845 case DeclarationName::ObjCOneArgSelector:
846 case DeclarationName::ObjCMultiArgSelector:
847 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
848 break;
849 case DeclarationName::CXXOperatorName:
850 ID.AddInteger((OverloadedOperatorKind)Key.Data);
851 break;
852 case DeclarationName::CXXConstructorName:
853 case DeclarationName::CXXDestructorName:
854 case DeclarationName::CXXConversionFunctionName:
855 case DeclarationName::CXXUsingDirective:
856 break;
857 }
858
859 return ID.ComputeHash();
860 }
861
862 ASTDeclContextNameLookupTrait::internal_key_type
GetInternalKey(const external_key_type & Name) const863 ASTDeclContextNameLookupTrait::GetInternalKey(
864 const external_key_type& Name) const {
865 DeclNameKey Key;
866 Key.Kind = Name.getNameKind();
867 switch (Name.getNameKind()) {
868 case DeclarationName::Identifier:
869 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
870 break;
871 case DeclarationName::ObjCZeroArgSelector:
872 case DeclarationName::ObjCOneArgSelector:
873 case DeclarationName::ObjCMultiArgSelector:
874 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
875 break;
876 case DeclarationName::CXXOperatorName:
877 Key.Data = Name.getCXXOverloadedOperator();
878 break;
879 case DeclarationName::CXXLiteralOperatorName:
880 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
881 break;
882 case DeclarationName::CXXConstructorName:
883 case DeclarationName::CXXDestructorName:
884 case DeclarationName::CXXConversionFunctionName:
885 case DeclarationName::CXXUsingDirective:
886 Key.Data = 0;
887 break;
888 }
889
890 return Key;
891 }
892
893 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)894 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
895 using namespace llvm::support;
896 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
897 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
898 return std::make_pair(KeyLen, DataLen);
899 }
900
901 ASTDeclContextNameLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)902 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
903 using namespace llvm::support;
904
905 DeclNameKey Key;
906 Key.Kind = (DeclarationName::NameKind)*d++;
907 switch (Key.Kind) {
908 case DeclarationName::Identifier:
909 Key.Data = (uint64_t)Reader.getLocalIdentifier(
910 F, endian::readNext<uint32_t, little, unaligned>(d));
911 break;
912 case DeclarationName::ObjCZeroArgSelector:
913 case DeclarationName::ObjCOneArgSelector:
914 case DeclarationName::ObjCMultiArgSelector:
915 Key.Data =
916 (uint64_t)Reader.getLocalSelector(
917 F, endian::readNext<uint32_t, little, unaligned>(
918 d)).getAsOpaquePtr();
919 break;
920 case DeclarationName::CXXOperatorName:
921 Key.Data = *d++; // OverloadedOperatorKind
922 break;
923 case DeclarationName::CXXLiteralOperatorName:
924 Key.Data = (uint64_t)Reader.getLocalIdentifier(
925 F, endian::readNext<uint32_t, little, unaligned>(d));
926 break;
927 case DeclarationName::CXXConstructorName:
928 case DeclarationName::CXXDestructorName:
929 case DeclarationName::CXXConversionFunctionName:
930 case DeclarationName::CXXUsingDirective:
931 Key.Data = 0;
932 break;
933 }
934
935 return Key;
936 }
937
938 ASTDeclContextNameLookupTrait::data_type
ReadData(internal_key_type,const unsigned char * d,unsigned DataLen)939 ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
940 const unsigned char* d,
941 unsigned DataLen) {
942 using namespace llvm::support;
943 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
944 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
945 const_cast<unsigned char *>(d));
946 return std::make_pair(Start, Start + NumDecls);
947 }
948
ReadDeclContextStorage(ModuleFile & M,BitstreamCursor & Cursor,const std::pair<uint64_t,uint64_t> & Offsets,DeclContextInfo & Info)949 bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
950 BitstreamCursor &Cursor,
951 const std::pair<uint64_t, uint64_t> &Offsets,
952 DeclContextInfo &Info) {
953 SavedStreamPosition SavedPosition(Cursor);
954 // First the lexical decls.
955 if (Offsets.first != 0) {
956 Cursor.JumpToBit(Offsets.first);
957
958 RecordData Record;
959 StringRef Blob;
960 unsigned Code = Cursor.ReadCode();
961 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
962 if (RecCode != DECL_CONTEXT_LEXICAL) {
963 Error("Expected lexical block");
964 return true;
965 }
966
967 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
968 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
969 }
970
971 // Now the lookup table.
972 if (Offsets.second != 0) {
973 Cursor.JumpToBit(Offsets.second);
974
975 RecordData Record;
976 StringRef Blob;
977 unsigned Code = Cursor.ReadCode();
978 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
979 if (RecCode != DECL_CONTEXT_VISIBLE) {
980 Error("Expected visible lookup table block");
981 return true;
982 }
983 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
984 (const unsigned char *)Blob.data() + Record[0],
985 (const unsigned char *)Blob.data() + sizeof(uint32_t),
986 (const unsigned char *)Blob.data(),
987 ASTDeclContextNameLookupTrait(*this, M));
988 }
989
990 return false;
991 }
992
Error(StringRef Msg)993 void ASTReader::Error(StringRef Msg) {
994 Error(diag::err_fe_pch_malformed, Msg);
995 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
996 Diag(diag::note_module_cache_path)
997 << PP.getHeaderSearchInfo().getModuleCachePath();
998 }
999 }
1000
Error(unsigned DiagID,StringRef Arg1,StringRef Arg2)1001 void ASTReader::Error(unsigned DiagID,
1002 StringRef Arg1, StringRef Arg2) {
1003 if (Diags.isDiagnosticInFlight())
1004 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1005 else
1006 Diag(DiagID) << Arg1 << Arg2;
1007 }
1008
1009 //===----------------------------------------------------------------------===//
1010 // Source Manager Deserialization
1011 //===----------------------------------------------------------------------===//
1012
1013 /// \brief Read the line table in the source manager block.
1014 /// \returns true if there was an error.
ParseLineTable(ModuleFile & F,SmallVectorImpl<uint64_t> & Record)1015 bool ASTReader::ParseLineTable(ModuleFile &F,
1016 SmallVectorImpl<uint64_t> &Record) {
1017 unsigned Idx = 0;
1018 LineTableInfo &LineTable = SourceMgr.getLineTable();
1019
1020 // Parse the file names
1021 std::map<int, int> FileIDs;
1022 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1023 // Extract the file name
1024 unsigned FilenameLen = Record[Idx++];
1025 std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
1026 Idx += FilenameLen;
1027 MaybeAddSystemRootToFilename(F, Filename);
1028 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1029 }
1030
1031 // Parse the line entries
1032 std::vector<LineEntry> Entries;
1033 while (Idx < Record.size()) {
1034 int FID = Record[Idx++];
1035 assert(FID >= 0 && "Serialized line entries for non-local file.");
1036 // Remap FileID from 1-based old view.
1037 FID += F.SLocEntryBaseID - 1;
1038
1039 // Extract the line entries
1040 unsigned NumEntries = Record[Idx++];
1041 assert(NumEntries && "Numentries is 00000");
1042 Entries.clear();
1043 Entries.reserve(NumEntries);
1044 for (unsigned I = 0; I != NumEntries; ++I) {
1045 unsigned FileOffset = Record[Idx++];
1046 unsigned LineNo = Record[Idx++];
1047 int FilenameID = FileIDs[Record[Idx++]];
1048 SrcMgr::CharacteristicKind FileKind
1049 = (SrcMgr::CharacteristicKind)Record[Idx++];
1050 unsigned IncludeOffset = Record[Idx++];
1051 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1052 FileKind, IncludeOffset));
1053 }
1054 LineTable.AddEntry(FileID::get(FID), Entries);
1055 }
1056
1057 return false;
1058 }
1059
1060 /// \brief Read a source manager block
ReadSourceManagerBlock(ModuleFile & F)1061 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1062 using namespace SrcMgr;
1063
1064 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1065
1066 // Set the source-location entry cursor to the current position in
1067 // the stream. This cursor will be used to read the contents of the
1068 // source manager block initially, and then lazily read
1069 // source-location entries as needed.
1070 SLocEntryCursor = F.Stream;
1071
1072 // The stream itself is going to skip over the source manager block.
1073 if (F.Stream.SkipBlock()) {
1074 Error("malformed block record in AST file");
1075 return true;
1076 }
1077
1078 // Enter the source manager block.
1079 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1080 Error("malformed source manager block record in AST file");
1081 return true;
1082 }
1083
1084 RecordData Record;
1085 while (true) {
1086 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1087
1088 switch (E.Kind) {
1089 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1090 case llvm::BitstreamEntry::Error:
1091 Error("malformed block record in AST file");
1092 return true;
1093 case llvm::BitstreamEntry::EndBlock:
1094 return false;
1095 case llvm::BitstreamEntry::Record:
1096 // The interesting case.
1097 break;
1098 }
1099
1100 // Read a record.
1101 Record.clear();
1102 StringRef Blob;
1103 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1104 default: // Default behavior: ignore.
1105 break;
1106
1107 case SM_SLOC_FILE_ENTRY:
1108 case SM_SLOC_BUFFER_ENTRY:
1109 case SM_SLOC_EXPANSION_ENTRY:
1110 // Once we hit one of the source location entries, we're done.
1111 return false;
1112 }
1113 }
1114 }
1115
1116 /// \brief If a header file is not found at the path that we expect it to be
1117 /// and the PCH file was moved from its original location, try to resolve the
1118 /// file by assuming that header+PCH were moved together and the header is in
1119 /// the same place relative to the PCH.
1120 static std::string
resolveFileRelativeToOriginalDir(const std::string & Filename,const std::string & OriginalDir,const std::string & CurrDir)1121 resolveFileRelativeToOriginalDir(const std::string &Filename,
1122 const std::string &OriginalDir,
1123 const std::string &CurrDir) {
1124 assert(OriginalDir != CurrDir &&
1125 "No point trying to resolve the file if the PCH dir didn't change");
1126 using namespace llvm::sys;
1127 SmallString<128> filePath(Filename);
1128 fs::make_absolute(filePath);
1129 assert(path::is_absolute(OriginalDir));
1130 SmallString<128> currPCHPath(CurrDir);
1131
1132 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1133 fileDirE = path::end(path::parent_path(filePath));
1134 path::const_iterator origDirI = path::begin(OriginalDir),
1135 origDirE = path::end(OriginalDir);
1136 // Skip the common path components from filePath and OriginalDir.
1137 while (fileDirI != fileDirE && origDirI != origDirE &&
1138 *fileDirI == *origDirI) {
1139 ++fileDirI;
1140 ++origDirI;
1141 }
1142 for (; origDirI != origDirE; ++origDirI)
1143 path::append(currPCHPath, "..");
1144 path::append(currPCHPath, fileDirI, fileDirE);
1145 path::append(currPCHPath, path::filename(Filename));
1146 return currPCHPath.str();
1147 }
1148
ReadSLocEntry(int ID)1149 bool ASTReader::ReadSLocEntry(int ID) {
1150 if (ID == 0)
1151 return false;
1152
1153 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1154 Error("source location entry ID out-of-range for AST file");
1155 return true;
1156 }
1157
1158 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1159 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1160 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1161 unsigned BaseOffset = F->SLocEntryBaseOffset;
1162
1163 ++NumSLocEntriesRead;
1164 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1165 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1166 Error("incorrectly-formatted source location entry in AST file");
1167 return true;
1168 }
1169
1170 RecordData Record;
1171 StringRef Blob;
1172 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1173 default:
1174 Error("incorrectly-formatted source location entry in AST file");
1175 return true;
1176
1177 case SM_SLOC_FILE_ENTRY: {
1178 // We will detect whether a file changed and return 'Failure' for it, but
1179 // we will also try to fail gracefully by setting up the SLocEntry.
1180 unsigned InputID = Record[4];
1181 InputFile IF = getInputFile(*F, InputID);
1182 const FileEntry *File = IF.getFile();
1183 bool OverriddenBuffer = IF.isOverridden();
1184
1185 // Note that we only check if a File was returned. If it was out-of-date
1186 // we have complained but we will continue creating a FileID to recover
1187 // gracefully.
1188 if (!File)
1189 return true;
1190
1191 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1192 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1193 // This is the module's main file.
1194 IncludeLoc = getImportLocation(F);
1195 }
1196 SrcMgr::CharacteristicKind
1197 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1198 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1199 ID, BaseOffset + Record[0]);
1200 SrcMgr::FileInfo &FileInfo =
1201 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1202 FileInfo.NumCreatedFIDs = Record[5];
1203 if (Record[3])
1204 FileInfo.setHasLineDirectives();
1205
1206 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1207 unsigned NumFileDecls = Record[7];
1208 if (NumFileDecls) {
1209 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1210 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1211 NumFileDecls));
1212 }
1213
1214 const SrcMgr::ContentCache *ContentCache
1215 = SourceMgr.getOrCreateContentCache(File,
1216 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1217 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1218 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1219 unsigned Code = SLocEntryCursor.ReadCode();
1220 Record.clear();
1221 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1222
1223 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1224 Error("AST record has invalid code");
1225 return true;
1226 }
1227
1228 llvm::MemoryBuffer *Buffer
1229 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
1230 SourceMgr.overrideFileContents(File, Buffer);
1231 }
1232
1233 break;
1234 }
1235
1236 case SM_SLOC_BUFFER_ENTRY: {
1237 const char *Name = Blob.data();
1238 unsigned Offset = Record[0];
1239 SrcMgr::CharacteristicKind
1240 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1241 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1242 if (IncludeLoc.isInvalid() && F->Kind == MK_Module) {
1243 IncludeLoc = getImportLocation(F);
1244 }
1245 unsigned Code = SLocEntryCursor.ReadCode();
1246 Record.clear();
1247 unsigned RecCode
1248 = SLocEntryCursor.readRecord(Code, Record, &Blob);
1249
1250 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1251 Error("AST record has invalid code");
1252 return true;
1253 }
1254
1255 llvm::MemoryBuffer *Buffer
1256 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
1257 SourceMgr.createFileID(Buffer, FileCharacter, ID, BaseOffset + Offset,
1258 IncludeLoc);
1259 break;
1260 }
1261
1262 case SM_SLOC_EXPANSION_ENTRY: {
1263 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1264 SourceMgr.createExpansionLoc(SpellingLoc,
1265 ReadSourceLocation(*F, Record[2]),
1266 ReadSourceLocation(*F, Record[3]),
1267 Record[4],
1268 ID,
1269 BaseOffset + Record[0]);
1270 break;
1271 }
1272 }
1273
1274 return false;
1275 }
1276
getModuleImportLoc(int ID)1277 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1278 if (ID == 0)
1279 return std::make_pair(SourceLocation(), "");
1280
1281 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1282 Error("source location entry ID out-of-range for AST file");
1283 return std::make_pair(SourceLocation(), "");
1284 }
1285
1286 // Find which module file this entry lands in.
1287 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1288 if (M->Kind != MK_Module)
1289 return std::make_pair(SourceLocation(), "");
1290
1291 // FIXME: Can we map this down to a particular submodule? That would be
1292 // ideal.
1293 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1294 }
1295
1296 /// \brief Find the location where the module F is imported.
getImportLocation(ModuleFile * F)1297 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1298 if (F->ImportLoc.isValid())
1299 return F->ImportLoc;
1300
1301 // Otherwise we have a PCH. It's considered to be "imported" at the first
1302 // location of its includer.
1303 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1304 // Main file is the importer.
1305 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1306 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1307 }
1308 return F->ImportedBy[0]->FirstLoc;
1309 }
1310
1311 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1312 /// specified cursor. Read the abbreviations that are at the top of the block
1313 /// and then leave the cursor pointing into the block.
ReadBlockAbbrevs(BitstreamCursor & Cursor,unsigned BlockID)1314 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1315 if (Cursor.EnterSubBlock(BlockID)) {
1316 Error("malformed block record in AST file");
1317 return Failure;
1318 }
1319
1320 while (true) {
1321 uint64_t Offset = Cursor.GetCurrentBitNo();
1322 unsigned Code = Cursor.ReadCode();
1323
1324 // We expect all abbrevs to be at the start of the block.
1325 if (Code != llvm::bitc::DEFINE_ABBREV) {
1326 Cursor.JumpToBit(Offset);
1327 return false;
1328 }
1329 Cursor.ReadAbbrevRecord();
1330 }
1331 }
1332
ReadToken(ModuleFile & F,const RecordDataImpl & Record,unsigned & Idx)1333 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1334 unsigned &Idx) {
1335 Token Tok;
1336 Tok.startToken();
1337 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1338 Tok.setLength(Record[Idx++]);
1339 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1340 Tok.setIdentifierInfo(II);
1341 Tok.setKind((tok::TokenKind)Record[Idx++]);
1342 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1343 return Tok;
1344 }
1345
ReadMacroRecord(ModuleFile & F,uint64_t Offset)1346 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1347 BitstreamCursor &Stream = F.MacroCursor;
1348
1349 // Keep track of where we are in the stream, then jump back there
1350 // after reading this macro.
1351 SavedStreamPosition SavedPosition(Stream);
1352
1353 Stream.JumpToBit(Offset);
1354 RecordData Record;
1355 SmallVector<IdentifierInfo*, 16> MacroArgs;
1356 MacroInfo *Macro = nullptr;
1357
1358 while (true) {
1359 // Advance to the next record, but if we get to the end of the block, don't
1360 // pop it (removing all the abbreviations from the cursor) since we want to
1361 // be able to reseek within the block and read entries.
1362 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1363 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1364
1365 switch (Entry.Kind) {
1366 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1367 case llvm::BitstreamEntry::Error:
1368 Error("malformed block record in AST file");
1369 return Macro;
1370 case llvm::BitstreamEntry::EndBlock:
1371 return Macro;
1372 case llvm::BitstreamEntry::Record:
1373 // The interesting case.
1374 break;
1375 }
1376
1377 // Read a record.
1378 Record.clear();
1379 PreprocessorRecordTypes RecType =
1380 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1381 switch (RecType) {
1382 case PP_MACRO_DIRECTIVE_HISTORY:
1383 return Macro;
1384
1385 case PP_MACRO_OBJECT_LIKE:
1386 case PP_MACRO_FUNCTION_LIKE: {
1387 // If we already have a macro, that means that we've hit the end
1388 // of the definition of the macro we were looking for. We're
1389 // done.
1390 if (Macro)
1391 return Macro;
1392
1393 unsigned NextIndex = 1; // Skip identifier ID.
1394 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
1395 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1396 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
1397 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1398 MI->setIsUsed(Record[NextIndex++]);
1399 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1400
1401 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1402 // Decode function-like macro info.
1403 bool isC99VarArgs = Record[NextIndex++];
1404 bool isGNUVarArgs = Record[NextIndex++];
1405 bool hasCommaPasting = Record[NextIndex++];
1406 MacroArgs.clear();
1407 unsigned NumArgs = Record[NextIndex++];
1408 for (unsigned i = 0; i != NumArgs; ++i)
1409 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1410
1411 // Install function-like macro info.
1412 MI->setIsFunctionLike();
1413 if (isC99VarArgs) MI->setIsC99Varargs();
1414 if (isGNUVarArgs) MI->setIsGNUVarargs();
1415 if (hasCommaPasting) MI->setHasCommaPasting();
1416 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1417 PP.getPreprocessorAllocator());
1418 }
1419
1420 // Remember that we saw this macro last so that we add the tokens that
1421 // form its body to it.
1422 Macro = MI;
1423
1424 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1425 Record[NextIndex]) {
1426 // We have a macro definition. Register the association
1427 PreprocessedEntityID
1428 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1429 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1430 PreprocessingRecord::PPEntityID
1431 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1432 MacroDefinition *PPDef =
1433 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1434 if (PPDef)
1435 PPRec.RegisterMacroDefinition(Macro, PPDef);
1436 }
1437
1438 ++NumMacrosRead;
1439 break;
1440 }
1441
1442 case PP_TOKEN: {
1443 // If we see a TOKEN before a PP_MACRO_*, then the file is
1444 // erroneous, just pretend we didn't see this.
1445 if (!Macro) break;
1446
1447 unsigned Idx = 0;
1448 Token Tok = ReadToken(F, Record, Idx);
1449 Macro->AddTokenToBody(Tok);
1450 break;
1451 }
1452 }
1453 }
1454 }
1455
1456 PreprocessedEntityID
getGlobalPreprocessedEntityID(ModuleFile & M,unsigned LocalID) const1457 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1458 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1459 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1460 assert(I != M.PreprocessedEntityRemap.end()
1461 && "Invalid index into preprocessed entity index remap");
1462
1463 return LocalID + I->second;
1464 }
1465
ComputeHash(internal_key_ref ikey)1466 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1467 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1468 }
1469
1470 HeaderFileInfoTrait::internal_key_type
GetInternalKey(const FileEntry * FE)1471 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1472 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
1473 FE->getName() };
1474 return ikey;
1475 }
1476
EqualKey(internal_key_ref a,internal_key_ref b)1477 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1478 if (a.Size != b.Size || a.ModTime != b.ModTime)
1479 return false;
1480
1481 if (strcmp(a.Filename, b.Filename) == 0)
1482 return true;
1483
1484 // Determine whether the actual files are equivalent.
1485 FileManager &FileMgr = Reader.getFileManager();
1486 const FileEntry *FEA = FileMgr.getFile(a.Filename);
1487 const FileEntry *FEB = FileMgr.getFile(b.Filename);
1488 return (FEA && FEA == FEB);
1489 }
1490
1491 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)1492 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1493 using namespace llvm::support;
1494 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1495 unsigned DataLen = (unsigned) *d++;
1496 return std::make_pair(KeyLen, DataLen);
1497 }
1498
1499 HeaderFileInfoTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)1500 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1501 using namespace llvm::support;
1502 internal_key_type ikey;
1503 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1504 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1505 ikey.Filename = (const char *)d;
1506 return ikey;
1507 }
1508
1509 HeaderFileInfoTrait::data_type
ReadData(internal_key_ref key,const unsigned char * d,unsigned DataLen)1510 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1511 unsigned DataLen) {
1512 const unsigned char *End = d + DataLen;
1513 using namespace llvm::support;
1514 HeaderFileInfo HFI;
1515 unsigned Flags = *d++;
1516 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1517 ((Flags >> 6) & 0x03);
1518 HFI.isImport = (Flags >> 5) & 0x01;
1519 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1520 HFI.DirInfo = (Flags >> 2) & 0x03;
1521 HFI.Resolved = (Flags >> 1) & 0x01;
1522 HFI.IndexHeaderMapHeader = Flags & 0x01;
1523 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1524 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1525 M, endian::readNext<uint32_t, little, unaligned>(d));
1526 if (unsigned FrameworkOffset =
1527 endian::readNext<uint32_t, little, unaligned>(d)) {
1528 // The framework offset is 1 greater than the actual offset,
1529 // since 0 is used as an indicator for "no framework name".
1530 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1531 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1532 }
1533
1534 if (d != End) {
1535 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1536 if (LocalSMID) {
1537 // This header is part of a module. Associate it with the module to enable
1538 // implicit module import.
1539 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1540 Module *Mod = Reader.getSubmodule(GlobalSMID);
1541 HFI.isModuleHeader = true;
1542 FileManager &FileMgr = Reader.getFileManager();
1543 ModuleMap &ModMap =
1544 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1545 ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole());
1546 }
1547 }
1548
1549 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1550 (void)End;
1551
1552 // This HeaderFileInfo was externally loaded.
1553 HFI.External = true;
1554 return HFI;
1555 }
1556
1557 void
addPendingMacroFromModule(IdentifierInfo * II,ModuleFile * M,GlobalMacroID GMacID,ArrayRef<SubmoduleID> Overrides)1558 ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1559 GlobalMacroID GMacID,
1560 ArrayRef<SubmoduleID> Overrides) {
1561 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1562 SubmoduleID *OverrideData = nullptr;
1563 if (!Overrides.empty()) {
1564 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1565 OverrideData[0] = Overrides.size();
1566 for (unsigned I = 0; I != Overrides.size(); ++I)
1567 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1568 }
1569 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
1570 }
1571
addPendingMacroFromPCH(IdentifierInfo * II,ModuleFile * M,uint64_t MacroDirectivesOffset)1572 void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1573 ModuleFile *M,
1574 uint64_t MacroDirectivesOffset) {
1575 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1576 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1577 }
1578
ReadDefinedMacros()1579 void ASTReader::ReadDefinedMacros() {
1580 // Note that we are loading defined macros.
1581 Deserializing Macros(this);
1582
1583 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1584 E = ModuleMgr.rend(); I != E; ++I) {
1585 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
1586
1587 // If there was no preprocessor block, skip this file.
1588 if (!MacroCursor.getBitStreamReader())
1589 continue;
1590
1591 BitstreamCursor Cursor = MacroCursor;
1592 Cursor.JumpToBit((*I)->MacroStartOffset);
1593
1594 RecordData Record;
1595 while (true) {
1596 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1597
1598 switch (E.Kind) {
1599 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1600 case llvm::BitstreamEntry::Error:
1601 Error("malformed block record in AST file");
1602 return;
1603 case llvm::BitstreamEntry::EndBlock:
1604 goto NextCursor;
1605
1606 case llvm::BitstreamEntry::Record:
1607 Record.clear();
1608 switch (Cursor.readRecord(E.ID, Record)) {
1609 default: // Default behavior: ignore.
1610 break;
1611
1612 case PP_MACRO_OBJECT_LIKE:
1613 case PP_MACRO_FUNCTION_LIKE:
1614 getLocalIdentifier(**I, Record[0]);
1615 break;
1616
1617 case PP_TOKEN:
1618 // Ignore tokens.
1619 break;
1620 }
1621 break;
1622 }
1623 }
1624 NextCursor: ;
1625 }
1626 }
1627
1628 namespace {
1629 /// \brief Visitor class used to look up identifirs in an AST file.
1630 class IdentifierLookupVisitor {
1631 StringRef Name;
1632 unsigned PriorGeneration;
1633 unsigned &NumIdentifierLookups;
1634 unsigned &NumIdentifierLookupHits;
1635 IdentifierInfo *Found;
1636
1637 public:
IdentifierLookupVisitor(StringRef Name,unsigned PriorGeneration,unsigned & NumIdentifierLookups,unsigned & NumIdentifierLookupHits)1638 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1639 unsigned &NumIdentifierLookups,
1640 unsigned &NumIdentifierLookupHits)
1641 : Name(Name), PriorGeneration(PriorGeneration),
1642 NumIdentifierLookups(NumIdentifierLookups),
1643 NumIdentifierLookupHits(NumIdentifierLookupHits),
1644 Found()
1645 {
1646 }
1647
visit(ModuleFile & M,void * UserData)1648 static bool visit(ModuleFile &M, void *UserData) {
1649 IdentifierLookupVisitor *This
1650 = static_cast<IdentifierLookupVisitor *>(UserData);
1651
1652 // If we've already searched this module file, skip it now.
1653 if (M.Generation <= This->PriorGeneration)
1654 return true;
1655
1656 ASTIdentifierLookupTable *IdTable
1657 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1658 if (!IdTable)
1659 return false;
1660
1661 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1662 M, This->Found);
1663 ++This->NumIdentifierLookups;
1664 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
1665 if (Pos == IdTable->end())
1666 return false;
1667
1668 // Dereferencing the iterator has the effect of building the
1669 // IdentifierInfo node and populating it with the various
1670 // declarations it needs.
1671 ++This->NumIdentifierLookupHits;
1672 This->Found = *Pos;
1673 return true;
1674 }
1675
1676 // \brief Retrieve the identifier info found within the module
1677 // files.
getIdentifierInfo() const1678 IdentifierInfo *getIdentifierInfo() const { return Found; }
1679 };
1680 }
1681
updateOutOfDateIdentifier(IdentifierInfo & II)1682 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1683 // Note that we are loading an identifier.
1684 Deserializing AnIdentifier(this);
1685
1686 unsigned PriorGeneration = 0;
1687 if (getContext().getLangOpts().Modules)
1688 PriorGeneration = IdentifierGeneration[&II];
1689
1690 // If there is a global index, look there first to determine which modules
1691 // provably do not have any results for this identifier.
1692 GlobalModuleIndex::HitSet Hits;
1693 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1694 if (!loadGlobalIndex()) {
1695 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1696 HitsPtr = &Hits;
1697 }
1698 }
1699
1700 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1701 NumIdentifierLookups,
1702 NumIdentifierLookupHits);
1703 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
1704 markIdentifierUpToDate(&II);
1705 }
1706
markIdentifierUpToDate(IdentifierInfo * II)1707 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1708 if (!II)
1709 return;
1710
1711 II->setOutOfDate(false);
1712
1713 // Update the generation for this identifier.
1714 if (getContext().getLangOpts().Modules)
1715 IdentifierGeneration[II] = getGeneration();
1716 }
1717
1718 struct ASTReader::ModuleMacroInfo {
1719 SubmoduleID SubModID;
1720 MacroInfo *MI;
1721 SubmoduleID *Overrides;
1722 // FIXME: Remove this.
1723 ModuleFile *F;
1724
isDefineASTReader::ModuleMacroInfo1725 bool isDefine() const { return MI; }
1726
getSubmoduleIDASTReader::ModuleMacroInfo1727 SubmoduleID getSubmoduleID() const { return SubModID; }
1728
getOverriddenSubmodulesASTReader::ModuleMacroInfo1729 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
1730 if (!Overrides)
1731 return None;
1732 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1733 }
1734
importASTReader::ModuleMacroInfo1735 DefMacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
1736 if (!MI)
1737 return nullptr;
1738 return PP.AllocateDefMacroDirective(MI, ImportLoc, /*isImported=*/true);
1739 }
1740 };
1741
1742 ASTReader::ModuleMacroInfo *
getModuleMacro(const PendingMacroInfo & PMInfo)1743 ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1744 ModuleMacroInfo Info;
1745
1746 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1747 if (ID & 1) {
1748 // Macro undefinition.
1749 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
1750 Info.MI = nullptr;
1751 } else {
1752 // Macro definition.
1753 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1754 assert(GMacID);
1755
1756 // If this macro has already been loaded, don't do so again.
1757 // FIXME: This is highly dubious. Multiple macro definitions can have the
1758 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1759 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
1760 return nullptr;
1761
1762 Info.MI = getMacro(GMacID);
1763 Info.SubModID = Info.MI->getOwningModuleID();
1764 }
1765 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1766 Info.F = PMInfo.M;
1767
1768 return new (Context) ModuleMacroInfo(Info);
1769 }
1770
resolvePendingMacro(IdentifierInfo * II,const PendingMacroInfo & PMInfo)1771 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1772 const PendingMacroInfo &PMInfo) {
1773 assert(II);
1774
1775 if (PMInfo.M->Kind != MK_Module) {
1776 installPCHMacroDirectives(II, *PMInfo.M,
1777 PMInfo.PCHMacroData.MacroDirectivesOffset);
1778 return;
1779 }
1780
1781 // Module Macro.
1782
1783 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1784 if (!MMI)
1785 return;
1786
1787 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1788 if (Owner && Owner->NameVisibility == Module::Hidden) {
1789 // Macros in the owning module are hidden. Just remember this macro to
1790 // install if we make this module visible.
1791 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1792 } else {
1793 installImportedMacro(II, MMI, Owner);
1794 }
1795 }
1796
installPCHMacroDirectives(IdentifierInfo * II,ModuleFile & M,uint64_t Offset)1797 void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1798 ModuleFile &M, uint64_t Offset) {
1799 assert(M.Kind != MK_Module);
1800
1801 BitstreamCursor &Cursor = M.MacroCursor;
1802 SavedStreamPosition SavedPosition(Cursor);
1803 Cursor.JumpToBit(Offset);
1804
1805 llvm::BitstreamEntry Entry =
1806 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1807 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1808 Error("malformed block record in AST file");
1809 return;
1810 }
1811
1812 RecordData Record;
1813 PreprocessorRecordTypes RecType =
1814 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1815 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1816 Error("malformed block record in AST file");
1817 return;
1818 }
1819
1820 // Deserialize the macro directives history in reverse source-order.
1821 MacroDirective *Latest = nullptr, *Earliest = nullptr;
1822 unsigned Idx = 0, N = Record.size();
1823 while (Idx < N) {
1824 MacroDirective *MD = nullptr;
1825 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
1826 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1827 switch (K) {
1828 case MacroDirective::MD_Define: {
1829 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1830 MacroInfo *MI = getMacro(GMacID);
1831 bool isImported = Record[Idx++];
1832 bool isAmbiguous = Record[Idx++];
1833 DefMacroDirective *DefMD =
1834 PP.AllocateDefMacroDirective(MI, Loc, isImported);
1835 DefMD->setAmbiguous(isAmbiguous);
1836 MD = DefMD;
1837 break;
1838 }
1839 case MacroDirective::MD_Undefine:
1840 MD = PP.AllocateUndefMacroDirective(Loc);
1841 break;
1842 case MacroDirective::MD_Visibility: {
1843 bool isPublic = Record[Idx++];
1844 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1845 break;
1846 }
1847 }
1848
1849 if (!Latest)
1850 Latest = MD;
1851 if (Earliest)
1852 Earliest->setPrevious(MD);
1853 Earliest = MD;
1854 }
1855
1856 PP.setLoadedMacroDirective(II, Latest);
1857 }
1858
1859 /// \brief For the given macro definitions, check if they are both in system
1860 /// modules.
areDefinedInSystemModules(MacroInfo * PrevMI,MacroInfo * NewMI,Module * NewOwner,ASTReader & Reader)1861 static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
1862 Module *NewOwner, ASTReader &Reader) {
1863 assert(PrevMI && NewMI);
1864 Module *PrevOwner = nullptr;
1865 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1866 PrevOwner = Reader.getSubmodule(PrevModID);
1867 SourceManager &SrcMgr = Reader.getSourceManager();
1868 bool PrevInSystem
1869 = PrevOwner? PrevOwner->IsSystem
1870 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1871 bool NewInSystem
1872 = NewOwner? NewOwner->IsSystem
1873 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1874 if (PrevOwner && PrevOwner == NewOwner)
1875 return false;
1876 return PrevInSystem && NewInSystem;
1877 }
1878
removeOverriddenMacros(IdentifierInfo * II,AmbiguousMacros & Ambig,ArrayRef<SubmoduleID> Overrides)1879 void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
1880 AmbiguousMacros &Ambig,
1881 ArrayRef<SubmoduleID> Overrides) {
1882 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1883 SubmoduleID OwnerID = Overrides[OI];
1884
1885 // If this macro is not yet visible, remove it from the hidden names list.
1886 Module *Owner = getSubmodule(OwnerID);
1887 HiddenNames &Hidden = HiddenNamesMap[Owner];
1888 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1889 if (HI != Hidden.HiddenMacros.end()) {
1890 auto SubOverrides = HI->second->getOverriddenSubmodules();
1891 Hidden.HiddenMacros.erase(HI);
1892 removeOverriddenMacros(II, Ambig, SubOverrides);
1893 }
1894
1895 // If this macro is already in our list of conflicts, remove it from there.
1896 Ambig.erase(
1897 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1898 return MD->getInfo()->getOwningModuleID() == OwnerID;
1899 }),
1900 Ambig.end());
1901 }
1902 }
1903
1904 ASTReader::AmbiguousMacros *
removeOverriddenMacros(IdentifierInfo * II,ArrayRef<SubmoduleID> Overrides)1905 ASTReader::removeOverriddenMacros(IdentifierInfo *II,
1906 ArrayRef<SubmoduleID> Overrides) {
1907 MacroDirective *Prev = PP.getMacroDirective(II);
1908 if (!Prev && Overrides.empty())
1909 return nullptr;
1910
1911 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
1912 : nullptr;
1913 if (PrevDef && PrevDef->isAmbiguous()) {
1914 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
1915 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
1916 Ambig.push_back(PrevDef);
1917
1918 removeOverriddenMacros(II, Ambig, Overrides);
1919
1920 if (!Ambig.empty())
1921 return &Ambig;
1922
1923 AmbiguousMacroDefs.erase(II);
1924 } else {
1925 // There's no ambiguity yet. Maybe we're introducing one.
1926 AmbiguousMacros Ambig;
1927 if (PrevDef)
1928 Ambig.push_back(PrevDef);
1929
1930 removeOverriddenMacros(II, Ambig, Overrides);
1931
1932 if (!Ambig.empty()) {
1933 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
1934 std::swap(Result, Ambig);
1935 return &Result;
1936 }
1937 }
1938
1939 // We ended up with no ambiguity.
1940 return nullptr;
1941 }
1942
installImportedMacro(IdentifierInfo * II,ModuleMacroInfo * MMI,Module * Owner)1943 void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
1944 Module *Owner) {
1945 assert(II && Owner);
1946
1947 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
1948 if (ImportLoc.isInvalid()) {
1949 // FIXME: If we made macros from this module visible but didn't provide a
1950 // source location for the import, we don't have a location for the macro.
1951 // Use the location at which the containing module file was first imported
1952 // for now.
1953 ImportLoc = MMI->F->DirectImportLoc;
1954 assert(ImportLoc.isValid() && "no import location for a visible macro?");
1955 }
1956
1957 AmbiguousMacros *Prev =
1958 removeOverriddenMacros(II, MMI->getOverriddenSubmodules());
1959
1960 // Create a synthetic macro definition corresponding to the import (or null
1961 // if this was an undefinition of the macro).
1962 DefMacroDirective *MD = MMI->import(PP, ImportLoc);
1963
1964 // If there's no ambiguity, just install the macro.
1965 if (!Prev) {
1966 if (MD)
1967 PP.appendMacroDirective(II, MD);
1968 else
1969 PP.appendMacroDirective(II, PP.AllocateUndefMacroDirective(ImportLoc));
1970 return;
1971 }
1972 assert(!Prev->empty());
1973
1974 if (!MD) {
1975 // We imported a #undef that didn't remove all prior definitions. The most
1976 // recent prior definition remains, and we install it in the place of the
1977 // imported directive.
1978 MacroInfo *NewMI = Prev->back()->getInfo();
1979 Prev->pop_back();
1980 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc, /*Imported*/true);
1981 }
1982
1983 // We're introducing a macro definition that creates or adds to an ambiguity.
1984 // We can resolve that ambiguity if this macro is token-for-token identical to
1985 // all of the existing definitions.
1986 MacroInfo *NewMI = MD->getInfo();
1987 assert(NewMI && "macro definition with no MacroInfo?");
1988 while (!Prev->empty()) {
1989 MacroInfo *PrevMI = Prev->back()->getInfo();
1990 assert(PrevMI && "macro definition with no MacroInfo?");
1991
1992 // Before marking the macros as ambiguous, check if this is a case where
1993 // both macros are in system headers. If so, we trust that the system
1994 // did not get it wrong. This also handles cases where Clang's own
1995 // headers have a different spelling of certain system macros:
1996 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
1997 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
1998 //
1999 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2000 // overrides the system limits.h's macros, so there's no conflict here.
2001 if (NewMI != PrevMI &&
2002 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2003 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2004 break;
2005
2006 // The previous definition is the same as this one (or both are defined in
2007 // system modules so we can assume they're equivalent); we don't need to
2008 // track it any more.
2009 Prev->pop_back();
2010 }
2011
2012 if (!Prev->empty())
2013 MD->setAmbiguous(true);
2014
2015 PP.appendMacroDirective(II, MD);
2016 }
2017
2018 ASTReader::InputFileInfo
readInputFileInfo(ModuleFile & F,unsigned ID)2019 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2020 // Go find this input file.
2021 BitstreamCursor &Cursor = F.InputFilesCursor;
2022 SavedStreamPosition SavedPosition(Cursor);
2023 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2024
2025 unsigned Code = Cursor.ReadCode();
2026 RecordData Record;
2027 StringRef Blob;
2028
2029 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2030 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2031 "invalid record type for input file");
2032 (void)Result;
2033
2034 std::string Filename;
2035 off_t StoredSize;
2036 time_t StoredTime;
2037 bool Overridden;
2038
2039 assert(Record[0] == ID && "Bogus stored ID or offset");
2040 StoredSize = static_cast<off_t>(Record[1]);
2041 StoredTime = static_cast<time_t>(Record[2]);
2042 Overridden = static_cast<bool>(Record[3]);
2043 Filename = Blob;
2044 MaybeAddSystemRootToFilename(F, Filename);
2045
2046 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2047 return R;
2048 }
2049
getInputFileName(ModuleFile & F,unsigned int ID)2050 std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
2051 return readInputFileInfo(F, ID).Filename;
2052 }
2053
getInputFile(ModuleFile & F,unsigned ID,bool Complain)2054 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2055 // If this ID is bogus, just return an empty input file.
2056 if (ID == 0 || ID > F.InputFilesLoaded.size())
2057 return InputFile();
2058
2059 // If we've already loaded this input file, return it.
2060 if (F.InputFilesLoaded[ID-1].getFile())
2061 return F.InputFilesLoaded[ID-1];
2062
2063 if (F.InputFilesLoaded[ID-1].isNotFound())
2064 return InputFile();
2065
2066 // Go find this input file.
2067 BitstreamCursor &Cursor = F.InputFilesCursor;
2068 SavedStreamPosition SavedPosition(Cursor);
2069 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2070
2071 InputFileInfo FI = readInputFileInfo(F, ID);
2072 off_t StoredSize = FI.StoredSize;
2073 time_t StoredTime = FI.StoredTime;
2074 bool Overridden = FI.Overridden;
2075 StringRef Filename = FI.Filename;
2076
2077 const FileEntry *File
2078 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2079 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2080
2081 // If we didn't find the file, resolve it relative to the
2082 // original directory from which this AST file was created.
2083 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
2084 F.OriginalDir != CurrentDir) {
2085 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2086 F.OriginalDir,
2087 CurrentDir);
2088 if (!Resolved.empty())
2089 File = FileMgr.getFile(Resolved);
2090 }
2091
2092 // For an overridden file, create a virtual file with the stored
2093 // size/timestamp.
2094 if (Overridden && File == nullptr) {
2095 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2096 }
2097
2098 if (File == nullptr) {
2099 if (Complain) {
2100 std::string ErrorStr = "could not find file '";
2101 ErrorStr += Filename;
2102 ErrorStr += "' referenced by AST file";
2103 Error(ErrorStr.c_str());
2104 }
2105 // Record that we didn't find the file.
2106 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2107 return InputFile();
2108 }
2109
2110 // Check if there was a request to override the contents of the file
2111 // that was part of the precompiled header. Overridding such a file
2112 // can lead to problems when lexing using the source locations from the
2113 // PCH.
2114 SourceManager &SM = getSourceManager();
2115 if (!Overridden && SM.isFileOverridden(File)) {
2116 if (Complain)
2117 Error(diag::err_fe_pch_file_overridden, Filename);
2118 // After emitting the diagnostic, recover by disabling the override so
2119 // that the original file will be used.
2120 SM.disableFileContentsOverride(File);
2121 // The FileEntry is a virtual file entry with the size of the contents
2122 // that would override the original contents. Set it to the original's
2123 // size/time.
2124 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2125 StoredSize, StoredTime);
2126 }
2127
2128 bool IsOutOfDate = false;
2129
2130 // For an overridden file, there is nothing to validate.
2131 if (!Overridden && (StoredSize != File->getSize()
2132 #if !defined(LLVM_ON_WIN32)
2133 // In our regression testing, the Windows file system seems to
2134 // have inconsistent modification times that sometimes
2135 // erroneously trigger this error-handling path.
2136 || StoredTime != File->getModificationTime()
2137 #endif
2138 )) {
2139 if (Complain) {
2140 // Build a list of the PCH imports that got us here (in reverse).
2141 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2142 while (ImportStack.back()->ImportedBy.size() > 0)
2143 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2144
2145 // The top-level PCH is stale.
2146 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2147 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2148
2149 // Print the import stack.
2150 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2151 Diag(diag::note_pch_required_by)
2152 << Filename << ImportStack[0]->FileName;
2153 for (unsigned I = 1; I < ImportStack.size(); ++I)
2154 Diag(diag::note_pch_required_by)
2155 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2156 }
2157
2158 if (!Diags.isDiagnosticInFlight())
2159 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2160 }
2161
2162 IsOutOfDate = true;
2163 }
2164
2165 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2166
2167 // Note that we've loaded this input file.
2168 F.InputFilesLoaded[ID-1] = IF;
2169 return IF;
2170 }
2171
getFileEntry(StringRef filenameStrRef)2172 const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
2173 ModuleFile &M = ModuleMgr.getPrimaryModule();
2174 std::string Filename = filenameStrRef;
2175 MaybeAddSystemRootToFilename(M, Filename);
2176 const FileEntry *File = FileMgr.getFile(Filename);
2177 if (File == nullptr && !M.OriginalDir.empty() && !CurrentDir.empty() &&
2178 M.OriginalDir != CurrentDir) {
2179 std::string resolved = resolveFileRelativeToOriginalDir(Filename,
2180 M.OriginalDir,
2181 CurrentDir);
2182 if (!resolved.empty())
2183 File = FileMgr.getFile(resolved);
2184 }
2185
2186 return File;
2187 }
2188
2189 /// \brief If we are loading a relocatable PCH file, and the filename is
2190 /// not an absolute path, add the system root to the beginning of the file
2191 /// name.
MaybeAddSystemRootToFilename(ModuleFile & M,std::string & Filename)2192 void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
2193 std::string &Filename) {
2194 // If this is not a relocatable PCH file, there's nothing to do.
2195 if (!M.RelocatablePCH)
2196 return;
2197
2198 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2199 return;
2200
2201 if (isysroot.empty()) {
2202 // If no system root was given, default to '/'
2203 Filename.insert(Filename.begin(), '/');
2204 return;
2205 }
2206
2207 unsigned Length = isysroot.size();
2208 if (isysroot[Length - 1] != '/')
2209 Filename.insert(Filename.begin(), '/');
2210
2211 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
2212 }
2213
2214 ASTReader::ASTReadResult
ReadControlBlock(ModuleFile & F,SmallVectorImpl<ImportedModule> & Loaded,const ModuleFile * ImportedBy,unsigned ClientLoadCapabilities)2215 ASTReader::ReadControlBlock(ModuleFile &F,
2216 SmallVectorImpl<ImportedModule> &Loaded,
2217 const ModuleFile *ImportedBy,
2218 unsigned ClientLoadCapabilities) {
2219 BitstreamCursor &Stream = F.Stream;
2220
2221 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2222 Error("malformed block record in AST file");
2223 return Failure;
2224 }
2225
2226 // Read all of the records and blocks in the control block.
2227 RecordData Record;
2228 while (1) {
2229 llvm::BitstreamEntry Entry = Stream.advance();
2230
2231 switch (Entry.Kind) {
2232 case llvm::BitstreamEntry::Error:
2233 Error("malformed block record in AST file");
2234 return Failure;
2235 case llvm::BitstreamEntry::EndBlock: {
2236 // Validate input files.
2237 const HeaderSearchOptions &HSOpts =
2238 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2239
2240 // All user input files reside at the index range [0, Record[1]), and
2241 // system input files reside at [Record[1], Record[0]).
2242 // Record is the one from INPUT_FILE_OFFSETS.
2243 unsigned NumInputs = Record[0];
2244 unsigned NumUserInputs = Record[1];
2245
2246 if (!DisableValidation &&
2247 (ValidateSystemInputs || !HSOpts.ModulesValidateOncePerBuildSession ||
2248 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp)) {
2249 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2250
2251 // If we are reading a module, we will create a verification timestamp,
2252 // so we verify all input files. Otherwise, verify only user input
2253 // files.
2254
2255 unsigned N = NumUserInputs;
2256 if (ValidateSystemInputs ||
2257 (HSOpts.ModulesValidateOncePerBuildSession && F.Kind == MK_Module))
2258 N = NumInputs;
2259
2260 for (unsigned I = 0; I < N; ++I) {
2261 InputFile IF = getInputFile(F, I+1, Complain);
2262 if (!IF.getFile() || IF.isOutOfDate())
2263 return OutOfDate;
2264 }
2265 }
2266
2267 if (Listener)
2268 Listener->visitModuleFile(F.FileName);
2269
2270 if (Listener && Listener->needsInputFileVisitation()) {
2271 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2272 : NumUserInputs;
2273 for (unsigned I = 0; I < N; ++I) {
2274 bool IsSystem = I >= NumUserInputs;
2275 InputFileInfo FI = readInputFileInfo(F, I+1);
2276 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2277 }
2278 }
2279
2280 return Success;
2281 }
2282
2283 case llvm::BitstreamEntry::SubBlock:
2284 switch (Entry.ID) {
2285 case INPUT_FILES_BLOCK_ID:
2286 F.InputFilesCursor = Stream;
2287 if (Stream.SkipBlock() || // Skip with the main cursor
2288 // Read the abbreviations
2289 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2290 Error("malformed block record in AST file");
2291 return Failure;
2292 }
2293 continue;
2294
2295 default:
2296 if (Stream.SkipBlock()) {
2297 Error("malformed block record in AST file");
2298 return Failure;
2299 }
2300 continue;
2301 }
2302
2303 case llvm::BitstreamEntry::Record:
2304 // The interesting case.
2305 break;
2306 }
2307
2308 // Read and process a record.
2309 Record.clear();
2310 StringRef Blob;
2311 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2312 case METADATA: {
2313 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2314 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2315 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2316 : diag::err_pch_version_too_new);
2317 return VersionMismatch;
2318 }
2319
2320 bool hasErrors = Record[5];
2321 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2322 Diag(diag::err_pch_with_compiler_errors);
2323 return HadErrors;
2324 }
2325
2326 F.RelocatablePCH = Record[4];
2327
2328 const std::string &CurBranch = getClangFullRepositoryVersion();
2329 StringRef ASTBranch = Blob;
2330 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2331 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2332 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2333 return VersionMismatch;
2334 }
2335 break;
2336 }
2337
2338 case IMPORTS: {
2339 // Load each of the imported PCH files.
2340 unsigned Idx = 0, N = Record.size();
2341 while (Idx < N) {
2342 // Read information about the AST file.
2343 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2344 // The import location will be the local one for now; we will adjust
2345 // all import locations of module imports after the global source
2346 // location info are setup.
2347 SourceLocation ImportLoc =
2348 SourceLocation::getFromRawEncoding(Record[Idx++]);
2349 off_t StoredSize = (off_t)Record[Idx++];
2350 time_t StoredModTime = (time_t)Record[Idx++];
2351 unsigned Length = Record[Idx++];
2352 SmallString<128> ImportedFile(Record.begin() + Idx,
2353 Record.begin() + Idx + Length);
2354 Idx += Length;
2355
2356 // Load the AST file.
2357 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
2358 StoredSize, StoredModTime,
2359 ClientLoadCapabilities)) {
2360 case Failure: return Failure;
2361 // If we have to ignore the dependency, we'll have to ignore this too.
2362 case Missing:
2363 case OutOfDate: return OutOfDate;
2364 case VersionMismatch: return VersionMismatch;
2365 case ConfigurationMismatch: return ConfigurationMismatch;
2366 case HadErrors: return HadErrors;
2367 case Success: break;
2368 }
2369 }
2370 break;
2371 }
2372
2373 case LANGUAGE_OPTIONS: {
2374 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2375 if (Listener && &F == *ModuleMgr.begin() &&
2376 ParseLanguageOptions(Record, Complain, *Listener) &&
2377 !DisableValidation && !AllowConfigurationMismatch)
2378 return ConfigurationMismatch;
2379 break;
2380 }
2381
2382 case TARGET_OPTIONS: {
2383 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2384 if (Listener && &F == *ModuleMgr.begin() &&
2385 ParseTargetOptions(Record, Complain, *Listener) &&
2386 !DisableValidation && !AllowConfigurationMismatch)
2387 return ConfigurationMismatch;
2388 break;
2389 }
2390
2391 case DIAGNOSTIC_OPTIONS: {
2392 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
2393 if (Listener && &F == *ModuleMgr.begin() &&
2394 ParseDiagnosticOptions(Record, Complain, *Listener) &&
2395 !DisableValidation)
2396 return OutOfDate;
2397 break;
2398 }
2399
2400 case FILE_SYSTEM_OPTIONS: {
2401 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2402 if (Listener && &F == *ModuleMgr.begin() &&
2403 ParseFileSystemOptions(Record, Complain, *Listener) &&
2404 !DisableValidation && !AllowConfigurationMismatch)
2405 return ConfigurationMismatch;
2406 break;
2407 }
2408
2409 case HEADER_SEARCH_OPTIONS: {
2410 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2411 if (Listener && &F == *ModuleMgr.begin() &&
2412 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
2413 !DisableValidation && !AllowConfigurationMismatch)
2414 return ConfigurationMismatch;
2415 break;
2416 }
2417
2418 case PREPROCESSOR_OPTIONS: {
2419 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2420 if (Listener && &F == *ModuleMgr.begin() &&
2421 ParsePreprocessorOptions(Record, Complain, *Listener,
2422 SuggestedPredefines) &&
2423 !DisableValidation && !AllowConfigurationMismatch)
2424 return ConfigurationMismatch;
2425 break;
2426 }
2427
2428 case ORIGINAL_FILE:
2429 F.OriginalSourceFileID = FileID::get(Record[0]);
2430 F.ActualOriginalSourceFileName = Blob;
2431 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2432 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
2433 break;
2434
2435 case ORIGINAL_FILE_ID:
2436 F.OriginalSourceFileID = FileID::get(Record[0]);
2437 break;
2438
2439 case ORIGINAL_PCH_DIR:
2440 F.OriginalDir = Blob;
2441 break;
2442
2443 case MODULE_NAME:
2444 F.ModuleName = Blob;
2445 if (Listener)
2446 Listener->ReadModuleName(F.ModuleName);
2447 break;
2448
2449 case MODULE_MAP_FILE:
2450 F.ModuleMapPath = Blob;
2451
2452 // Try to resolve ModuleName in the current header search context and
2453 // verify that it is found in the same module map file as we saved. If the
2454 // top-level AST file is a main file, skip this check because there is no
2455 // usable header search context.
2456 assert(!F.ModuleName.empty() &&
2457 "MODULE_NAME should come before MOUDLE_MAP_FILE");
2458 if (F.Kind == MK_Module &&
2459 (*ModuleMgr.begin())->Kind != MK_MainFile) {
2460 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2461 if (!M) {
2462 assert(ImportedBy && "top-level import should be verified");
2463 if ((ClientLoadCapabilities & ARR_Missing) == 0)
2464 Diag(diag::err_imported_module_not_found)
2465 << F.ModuleName << ImportedBy->FileName;
2466 return Missing;
2467 }
2468
2469 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
2470 if (StoredModMap == nullptr || StoredModMap != M->ModuleMap) {
2471 assert(M->ModuleMap && "found module is missing module map file");
2472 assert(M->Name == F.ModuleName && "found module with different name");
2473 assert(ImportedBy && "top-level import should be verified");
2474 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2475 Diag(diag::err_imported_module_modmap_changed)
2476 << F.ModuleName << ImportedBy->FileName
2477 << M->ModuleMap->getName() << F.ModuleMapPath;
2478 return OutOfDate;
2479 }
2480 }
2481
2482 if (Listener)
2483 Listener->ReadModuleMapFile(F.ModuleMapPath);
2484 break;
2485
2486 case INPUT_FILE_OFFSETS:
2487 F.InputFileOffsets = (const uint32_t *)Blob.data();
2488 F.InputFilesLoaded.resize(Record[0]);
2489 break;
2490 }
2491 }
2492 }
2493
2494 ASTReader::ASTReadResult
ReadASTBlock(ModuleFile & F,unsigned ClientLoadCapabilities)2495 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2496 BitstreamCursor &Stream = F.Stream;
2497
2498 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2499 Error("malformed block record in AST file");
2500 return Failure;
2501 }
2502
2503 // Read all of the records and blocks for the AST file.
2504 RecordData Record;
2505 while (1) {
2506 llvm::BitstreamEntry Entry = Stream.advance();
2507
2508 switch (Entry.Kind) {
2509 case llvm::BitstreamEntry::Error:
2510 Error("error at end of module block in AST file");
2511 return Failure;
2512 case llvm::BitstreamEntry::EndBlock: {
2513 // Outside of C++, we do not store a lookup map for the translation unit.
2514 // Instead, mark it as needing a lookup map to be built if this module
2515 // contains any declarations lexically within it (which it always does!).
2516 // This usually has no cost, since we very rarely need the lookup map for
2517 // the translation unit outside C++.
2518 DeclContext *DC = Context.getTranslationUnitDecl();
2519 if (DC->hasExternalLexicalStorage() &&
2520 !getContext().getLangOpts().CPlusPlus)
2521 DC->setMustBuildLookupTable();
2522
2523 return Success;
2524 }
2525 case llvm::BitstreamEntry::SubBlock:
2526 switch (Entry.ID) {
2527 case DECLTYPES_BLOCK_ID:
2528 // We lazily load the decls block, but we want to set up the
2529 // DeclsCursor cursor to point into it. Clone our current bitcode
2530 // cursor to it, enter the block and read the abbrevs in that block.
2531 // With the main cursor, we just skip over it.
2532 F.DeclsCursor = Stream;
2533 if (Stream.SkipBlock() || // Skip with the main cursor.
2534 // Read the abbrevs.
2535 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2536 Error("malformed block record in AST file");
2537 return Failure;
2538 }
2539 break;
2540
2541 case PREPROCESSOR_BLOCK_ID:
2542 F.MacroCursor = Stream;
2543 if (!PP.getExternalSource())
2544 PP.setExternalSource(this);
2545
2546 if (Stream.SkipBlock() ||
2547 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2548 Error("malformed block record in AST file");
2549 return Failure;
2550 }
2551 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2552 break;
2553
2554 case PREPROCESSOR_DETAIL_BLOCK_ID:
2555 F.PreprocessorDetailCursor = Stream;
2556 if (Stream.SkipBlock() ||
2557 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2558 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2559 Error("malformed preprocessor detail record in AST file");
2560 return Failure;
2561 }
2562 F.PreprocessorDetailStartOffset
2563 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2564
2565 if (!PP.getPreprocessingRecord())
2566 PP.createPreprocessingRecord();
2567 if (!PP.getPreprocessingRecord()->getExternalSource())
2568 PP.getPreprocessingRecord()->SetExternalSource(*this);
2569 break;
2570
2571 case SOURCE_MANAGER_BLOCK_ID:
2572 if (ReadSourceManagerBlock(F))
2573 return Failure;
2574 break;
2575
2576 case SUBMODULE_BLOCK_ID:
2577 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2578 return Result;
2579 break;
2580
2581 case COMMENTS_BLOCK_ID: {
2582 BitstreamCursor C = Stream;
2583 if (Stream.SkipBlock() ||
2584 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2585 Error("malformed comments block in AST file");
2586 return Failure;
2587 }
2588 CommentsCursors.push_back(std::make_pair(C, &F));
2589 break;
2590 }
2591
2592 default:
2593 if (Stream.SkipBlock()) {
2594 Error("malformed block record in AST file");
2595 return Failure;
2596 }
2597 break;
2598 }
2599 continue;
2600
2601 case llvm::BitstreamEntry::Record:
2602 // The interesting case.
2603 break;
2604 }
2605
2606 // Read and process a record.
2607 Record.clear();
2608 StringRef Blob;
2609 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2610 default: // Default behavior: ignore.
2611 break;
2612
2613 case TYPE_OFFSET: {
2614 if (F.LocalNumTypes != 0) {
2615 Error("duplicate TYPE_OFFSET record in AST file");
2616 return Failure;
2617 }
2618 F.TypeOffsets = (const uint32_t *)Blob.data();
2619 F.LocalNumTypes = Record[0];
2620 unsigned LocalBaseTypeIndex = Record[1];
2621 F.BaseTypeIndex = getTotalNumTypes();
2622
2623 if (F.LocalNumTypes > 0) {
2624 // Introduce the global -> local mapping for types within this module.
2625 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2626
2627 // Introduce the local -> global mapping for types within this module.
2628 F.TypeRemap.insertOrReplace(
2629 std::make_pair(LocalBaseTypeIndex,
2630 F.BaseTypeIndex - LocalBaseTypeIndex));
2631
2632 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2633 }
2634 break;
2635 }
2636
2637 case DECL_OFFSET: {
2638 if (F.LocalNumDecls != 0) {
2639 Error("duplicate DECL_OFFSET record in AST file");
2640 return Failure;
2641 }
2642 F.DeclOffsets = (const DeclOffset *)Blob.data();
2643 F.LocalNumDecls = Record[0];
2644 unsigned LocalBaseDeclID = Record[1];
2645 F.BaseDeclID = getTotalNumDecls();
2646
2647 if (F.LocalNumDecls > 0) {
2648 // Introduce the global -> local mapping for declarations within this
2649 // module.
2650 GlobalDeclMap.insert(
2651 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2652
2653 // Introduce the local -> global mapping for declarations within this
2654 // module.
2655 F.DeclRemap.insertOrReplace(
2656 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2657
2658 // Introduce the global -> local mapping for declarations within this
2659 // module.
2660 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2661
2662 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2663 }
2664 break;
2665 }
2666
2667 case TU_UPDATE_LEXICAL: {
2668 DeclContext *TU = Context.getTranslationUnitDecl();
2669 DeclContextInfo &Info = F.DeclContextInfos[TU];
2670 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
2671 Info.NumLexicalDecls
2672 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
2673 TU->setHasExternalLexicalStorage(true);
2674 break;
2675 }
2676
2677 case UPDATE_VISIBLE: {
2678 unsigned Idx = 0;
2679 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2680 ASTDeclContextNameLookupTable *Table =
2681 ASTDeclContextNameLookupTable::Create(
2682 (const unsigned char *)Blob.data() + Record[Idx++],
2683 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2684 (const unsigned char *)Blob.data(),
2685 ASTDeclContextNameLookupTrait(*this, F));
2686 if (Decl *D = GetExistingDecl(ID)) {
2687 auto *DC = cast<DeclContext>(D);
2688 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
2689 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2690 // FIXME: There should never be an existing lookup table.
2691 delete LookupTable;
2692 LookupTable = Table;
2693 } else
2694 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2695 break;
2696 }
2697
2698 case IDENTIFIER_TABLE:
2699 F.IdentifierTableData = Blob.data();
2700 if (Record[0]) {
2701 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2702 (const unsigned char *)F.IdentifierTableData + Record[0],
2703 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2704 (const unsigned char *)F.IdentifierTableData,
2705 ASTIdentifierLookupTrait(*this, F));
2706
2707 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2708 }
2709 break;
2710
2711 case IDENTIFIER_OFFSET: {
2712 if (F.LocalNumIdentifiers != 0) {
2713 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2714 return Failure;
2715 }
2716 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2717 F.LocalNumIdentifiers = Record[0];
2718 unsigned LocalBaseIdentifierID = Record[1];
2719 F.BaseIdentifierID = getTotalNumIdentifiers();
2720
2721 if (F.LocalNumIdentifiers > 0) {
2722 // Introduce the global -> local mapping for identifiers within this
2723 // module.
2724 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2725 &F));
2726
2727 // Introduce the local -> global mapping for identifiers within this
2728 // module.
2729 F.IdentifierRemap.insertOrReplace(
2730 std::make_pair(LocalBaseIdentifierID,
2731 F.BaseIdentifierID - LocalBaseIdentifierID));
2732
2733 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2734 + F.LocalNumIdentifiers);
2735 }
2736 break;
2737 }
2738
2739 case EAGERLY_DESERIALIZED_DECLS:
2740 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2741 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2742 break;
2743
2744 case SPECIAL_TYPES:
2745 if (SpecialTypes.empty()) {
2746 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2747 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2748 break;
2749 }
2750
2751 if (SpecialTypes.size() != Record.size()) {
2752 Error("invalid special-types record");
2753 return Failure;
2754 }
2755
2756 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2757 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2758 if (!SpecialTypes[I])
2759 SpecialTypes[I] = ID;
2760 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2761 // merge step?
2762 }
2763 break;
2764
2765 case STATISTICS:
2766 TotalNumStatements += Record[0];
2767 TotalNumMacros += Record[1];
2768 TotalLexicalDeclContexts += Record[2];
2769 TotalVisibleDeclContexts += Record[3];
2770 break;
2771
2772 case UNUSED_FILESCOPED_DECLS:
2773 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2774 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2775 break;
2776
2777 case DELEGATING_CTORS:
2778 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2779 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2780 break;
2781
2782 case WEAK_UNDECLARED_IDENTIFIERS:
2783 if (Record.size() % 4 != 0) {
2784 Error("invalid weak identifiers record");
2785 return Failure;
2786 }
2787
2788 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2789 // files. This isn't the way to do it :)
2790 WeakUndeclaredIdentifiers.clear();
2791
2792 // Translate the weak, undeclared identifiers into global IDs.
2793 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2794 WeakUndeclaredIdentifiers.push_back(
2795 getGlobalIdentifierID(F, Record[I++]));
2796 WeakUndeclaredIdentifiers.push_back(
2797 getGlobalIdentifierID(F, Record[I++]));
2798 WeakUndeclaredIdentifiers.push_back(
2799 ReadSourceLocation(F, Record, I).getRawEncoding());
2800 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2801 }
2802 break;
2803
2804 case LOCALLY_SCOPED_EXTERN_C_DECLS:
2805 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2806 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
2807 break;
2808
2809 case SELECTOR_OFFSETS: {
2810 F.SelectorOffsets = (const uint32_t *)Blob.data();
2811 F.LocalNumSelectors = Record[0];
2812 unsigned LocalBaseSelectorID = Record[1];
2813 F.BaseSelectorID = getTotalNumSelectors();
2814
2815 if (F.LocalNumSelectors > 0) {
2816 // Introduce the global -> local mapping for selectors within this
2817 // module.
2818 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2819
2820 // Introduce the local -> global mapping for selectors within this
2821 // module.
2822 F.SelectorRemap.insertOrReplace(
2823 std::make_pair(LocalBaseSelectorID,
2824 F.BaseSelectorID - LocalBaseSelectorID));
2825
2826 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2827 }
2828 break;
2829 }
2830
2831 case METHOD_POOL:
2832 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
2833 if (Record[0])
2834 F.SelectorLookupTable
2835 = ASTSelectorLookupTable::Create(
2836 F.SelectorLookupTableData + Record[0],
2837 F.SelectorLookupTableData,
2838 ASTSelectorLookupTrait(*this, F));
2839 TotalNumMethodPoolEntries += Record[1];
2840 break;
2841
2842 case REFERENCED_SELECTOR_POOL:
2843 if (!Record.empty()) {
2844 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2845 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2846 Record[Idx++]));
2847 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2848 getRawEncoding());
2849 }
2850 }
2851 break;
2852
2853 case PP_COUNTER_VALUE:
2854 if (!Record.empty() && Listener)
2855 Listener->ReadCounter(F, Record[0]);
2856 break;
2857
2858 case FILE_SORTED_DECLS:
2859 F.FileSortedDecls = (const DeclID *)Blob.data();
2860 F.NumFileSortedDecls = Record[0];
2861 break;
2862
2863 case SOURCE_LOCATION_OFFSETS: {
2864 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
2865 F.LocalNumSLocEntries = Record[0];
2866 unsigned SLocSpaceSize = Record[1];
2867 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2868 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2869 SLocSpaceSize);
2870 // Make our entry in the range map. BaseID is negative and growing, so
2871 // we invert it. Because we invert it, though, we need the other end of
2872 // the range.
2873 unsigned RangeStart =
2874 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2875 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2876 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2877
2878 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2879 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2880 GlobalSLocOffsetMap.insert(
2881 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2882 - SLocSpaceSize,&F));
2883
2884 // Initialize the remapping table.
2885 // Invalid stays invalid.
2886 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
2887 // This module. Base was 2 when being compiled.
2888 F.SLocRemap.insertOrReplace(std::make_pair(2U,
2889 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2890
2891 TotalNumSLocEntries += F.LocalNumSLocEntries;
2892 break;
2893 }
2894
2895 case MODULE_OFFSET_MAP: {
2896 // Additional remapping information.
2897 const unsigned char *Data = (const unsigned char*)Blob.data();
2898 const unsigned char *DataEnd = Data + Blob.size();
2899
2900 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2901 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2902 F.SLocRemap.insert(std::make_pair(0U, 0));
2903 F.SLocRemap.insert(std::make_pair(2U, 1));
2904 }
2905
2906 // Continuous range maps we may be updating in our module.
2907 ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
2908 ContinuousRangeMap<uint32_t, int, 2>::Builder
2909 IdentifierRemap(F.IdentifierRemap);
2910 ContinuousRangeMap<uint32_t, int, 2>::Builder
2911 MacroRemap(F.MacroRemap);
2912 ContinuousRangeMap<uint32_t, int, 2>::Builder
2913 PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2914 ContinuousRangeMap<uint32_t, int, 2>::Builder
2915 SubmoduleRemap(F.SubmoduleRemap);
2916 ContinuousRangeMap<uint32_t, int, 2>::Builder
2917 SelectorRemap(F.SelectorRemap);
2918 ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2919 ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2920
2921 while(Data < DataEnd) {
2922 using namespace llvm::support;
2923 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
2924 StringRef Name = StringRef((const char*)Data, Len);
2925 Data += Len;
2926 ModuleFile *OM = ModuleMgr.lookup(Name);
2927 if (!OM) {
2928 Error("SourceLocation remap refers to unknown module");
2929 return Failure;
2930 }
2931
2932 uint32_t SLocOffset =
2933 endian::readNext<uint32_t, little, unaligned>(Data);
2934 uint32_t IdentifierIDOffset =
2935 endian::readNext<uint32_t, little, unaligned>(Data);
2936 uint32_t MacroIDOffset =
2937 endian::readNext<uint32_t, little, unaligned>(Data);
2938 uint32_t PreprocessedEntityIDOffset =
2939 endian::readNext<uint32_t, little, unaligned>(Data);
2940 uint32_t SubmoduleIDOffset =
2941 endian::readNext<uint32_t, little, unaligned>(Data);
2942 uint32_t SelectorIDOffset =
2943 endian::readNext<uint32_t, little, unaligned>(Data);
2944 uint32_t DeclIDOffset =
2945 endian::readNext<uint32_t, little, unaligned>(Data);
2946 uint32_t TypeIndexOffset =
2947 endian::readNext<uint32_t, little, unaligned>(Data);
2948
2949 // Source location offset is mapped to OM->SLocEntryBaseOffset.
2950 SLocRemap.insert(std::make_pair(SLocOffset,
2951 static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
2952 IdentifierRemap.insert(
2953 std::make_pair(IdentifierIDOffset,
2954 OM->BaseIdentifierID - IdentifierIDOffset));
2955 MacroRemap.insert(std::make_pair(MacroIDOffset,
2956 OM->BaseMacroID - MacroIDOffset));
2957 PreprocessedEntityRemap.insert(
2958 std::make_pair(PreprocessedEntityIDOffset,
2959 OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
2960 SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
2961 OM->BaseSubmoduleID - SubmoduleIDOffset));
2962 SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2963 OM->BaseSelectorID - SelectorIDOffset));
2964 DeclRemap.insert(std::make_pair(DeclIDOffset,
2965 OM->BaseDeclID - DeclIDOffset));
2966
2967 TypeRemap.insert(std::make_pair(TypeIndexOffset,
2968 OM->BaseTypeIndex - TypeIndexOffset));
2969
2970 // Global -> local mappings.
2971 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2972 }
2973 break;
2974 }
2975
2976 case SOURCE_MANAGER_LINE_TABLE:
2977 if (ParseLineTable(F, Record))
2978 return Failure;
2979 break;
2980
2981 case SOURCE_LOCATION_PRELOADS: {
2982 // Need to transform from the local view (1-based IDs) to the global view,
2983 // which is based off F.SLocEntryBaseID.
2984 if (!F.PreloadSLocEntries.empty()) {
2985 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2986 return Failure;
2987 }
2988
2989 F.PreloadSLocEntries.swap(Record);
2990 break;
2991 }
2992
2993 case EXT_VECTOR_DECLS:
2994 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2995 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2996 break;
2997
2998 case VTABLE_USES:
2999 if (Record.size() % 3 != 0) {
3000 Error("Invalid VTABLE_USES record");
3001 return Failure;
3002 }
3003
3004 // Later tables overwrite earlier ones.
3005 // FIXME: Modules will have some trouble with this. This is clearly not
3006 // the right way to do this.
3007 VTableUses.clear();
3008
3009 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3010 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3011 VTableUses.push_back(
3012 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3013 VTableUses.push_back(Record[Idx++]);
3014 }
3015 break;
3016
3017 case DYNAMIC_CLASSES:
3018 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3019 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3020 break;
3021
3022 case PENDING_IMPLICIT_INSTANTIATIONS:
3023 if (PendingInstantiations.size() % 2 != 0) {
3024 Error("Invalid existing PendingInstantiations");
3025 return Failure;
3026 }
3027
3028 if (Record.size() % 2 != 0) {
3029 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3030 return Failure;
3031 }
3032
3033 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3034 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3035 PendingInstantiations.push_back(
3036 ReadSourceLocation(F, Record, I).getRawEncoding());
3037 }
3038 break;
3039
3040 case SEMA_DECL_REFS:
3041 if (Record.size() != 2) {
3042 Error("Invalid SEMA_DECL_REFS block");
3043 return Failure;
3044 }
3045 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3046 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3047 break;
3048
3049 case PPD_ENTITIES_OFFSETS: {
3050 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3051 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3052 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3053
3054 unsigned LocalBasePreprocessedEntityID = Record[0];
3055
3056 unsigned StartingID;
3057 if (!PP.getPreprocessingRecord())
3058 PP.createPreprocessingRecord();
3059 if (!PP.getPreprocessingRecord()->getExternalSource())
3060 PP.getPreprocessingRecord()->SetExternalSource(*this);
3061 StartingID
3062 = PP.getPreprocessingRecord()
3063 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3064 F.BasePreprocessedEntityID = StartingID;
3065
3066 if (F.NumPreprocessedEntities > 0) {
3067 // Introduce the global -> local mapping for preprocessed entities in
3068 // this module.
3069 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3070
3071 // Introduce the local -> global mapping for preprocessed entities in
3072 // this module.
3073 F.PreprocessedEntityRemap.insertOrReplace(
3074 std::make_pair(LocalBasePreprocessedEntityID,
3075 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3076 }
3077
3078 break;
3079 }
3080
3081 case DECL_UPDATE_OFFSETS: {
3082 if (Record.size() % 2 != 0) {
3083 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3084 return Failure;
3085 }
3086 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3087 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3088 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3089
3090 // If we've already loaded the decl, perform the updates when we finish
3091 // loading this block.
3092 if (Decl *D = GetExistingDecl(ID))
3093 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3094 }
3095 break;
3096 }
3097
3098 case DECL_REPLACEMENTS: {
3099 if (Record.size() % 3 != 0) {
3100 Error("invalid DECL_REPLACEMENTS block in AST file");
3101 return Failure;
3102 }
3103 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3104 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3105 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3106 break;
3107 }
3108
3109 case OBJC_CATEGORIES_MAP: {
3110 if (F.LocalNumObjCCategoriesInMap != 0) {
3111 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3112 return Failure;
3113 }
3114
3115 F.LocalNumObjCCategoriesInMap = Record[0];
3116 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3117 break;
3118 }
3119
3120 case OBJC_CATEGORIES:
3121 F.ObjCCategories.swap(Record);
3122 break;
3123
3124 case CXX_BASE_SPECIFIER_OFFSETS: {
3125 if (F.LocalNumCXXBaseSpecifiers != 0) {
3126 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
3127 return Failure;
3128 }
3129
3130 F.LocalNumCXXBaseSpecifiers = Record[0];
3131 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
3132 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3133 break;
3134 }
3135
3136 case DIAG_PRAGMA_MAPPINGS:
3137 if (F.PragmaDiagMappings.empty())
3138 F.PragmaDiagMappings.swap(Record);
3139 else
3140 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3141 Record.begin(), Record.end());
3142 break;
3143
3144 case CUDA_SPECIAL_DECL_REFS:
3145 // Later tables overwrite earlier ones.
3146 // FIXME: Modules will have trouble with this.
3147 CUDASpecialDeclRefs.clear();
3148 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3149 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3150 break;
3151
3152 case HEADER_SEARCH_TABLE: {
3153 F.HeaderFileInfoTableData = Blob.data();
3154 F.LocalNumHeaderFileInfos = Record[1];
3155 if (Record[0]) {
3156 F.HeaderFileInfoTable
3157 = HeaderFileInfoLookupTable::Create(
3158 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3159 (const unsigned char *)F.HeaderFileInfoTableData,
3160 HeaderFileInfoTrait(*this, F,
3161 &PP.getHeaderSearchInfo(),
3162 Blob.data() + Record[2]));
3163
3164 PP.getHeaderSearchInfo().SetExternalSource(this);
3165 if (!PP.getHeaderSearchInfo().getExternalLookup())
3166 PP.getHeaderSearchInfo().SetExternalLookup(this);
3167 }
3168 break;
3169 }
3170
3171 case FP_PRAGMA_OPTIONS:
3172 // Later tables overwrite earlier ones.
3173 FPPragmaOptions.swap(Record);
3174 break;
3175
3176 case OPENCL_EXTENSIONS:
3177 // Later tables overwrite earlier ones.
3178 OpenCLExtensions.swap(Record);
3179 break;
3180
3181 case TENTATIVE_DEFINITIONS:
3182 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3183 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3184 break;
3185
3186 case KNOWN_NAMESPACES:
3187 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3188 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3189 break;
3190
3191 case UNDEFINED_BUT_USED:
3192 if (UndefinedButUsed.size() % 2 != 0) {
3193 Error("Invalid existing UndefinedButUsed");
3194 return Failure;
3195 }
3196
3197 if (Record.size() % 2 != 0) {
3198 Error("invalid undefined-but-used record");
3199 return Failure;
3200 }
3201 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3202 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3203 UndefinedButUsed.push_back(
3204 ReadSourceLocation(F, Record, I).getRawEncoding());
3205 }
3206 break;
3207
3208 case IMPORTED_MODULES: {
3209 if (F.Kind != MK_Module) {
3210 // If we aren't loading a module (which has its own exports), make
3211 // all of the imported modules visible.
3212 // FIXME: Deal with macros-only imports.
3213 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3214 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3215 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3216 if (GlobalID)
3217 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3218 }
3219 }
3220 break;
3221 }
3222
3223 case LOCAL_REDECLARATIONS: {
3224 F.RedeclarationChains.swap(Record);
3225 break;
3226 }
3227
3228 case LOCAL_REDECLARATIONS_MAP: {
3229 if (F.LocalNumRedeclarationsInMap != 0) {
3230 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
3231 return Failure;
3232 }
3233
3234 F.LocalNumRedeclarationsInMap = Record[0];
3235 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
3236 break;
3237 }
3238
3239 case MERGED_DECLARATIONS: {
3240 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3241 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3242 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3243 for (unsigned N = Record[Idx++]; N > 0; --N)
3244 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3245 }
3246 break;
3247 }
3248
3249 case MACRO_OFFSET: {
3250 if (F.LocalNumMacros != 0) {
3251 Error("duplicate MACRO_OFFSET record in AST file");
3252 return Failure;
3253 }
3254 F.MacroOffsets = (const uint32_t *)Blob.data();
3255 F.LocalNumMacros = Record[0];
3256 unsigned LocalBaseMacroID = Record[1];
3257 F.BaseMacroID = getTotalNumMacros();
3258
3259 if (F.LocalNumMacros > 0) {
3260 // Introduce the global -> local mapping for macros within this module.
3261 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3262
3263 // Introduce the local -> global mapping for macros within this module.
3264 F.MacroRemap.insertOrReplace(
3265 std::make_pair(LocalBaseMacroID,
3266 F.BaseMacroID - LocalBaseMacroID));
3267
3268 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3269 }
3270 break;
3271 }
3272
3273 case MACRO_TABLE: {
3274 // FIXME: Not used yet.
3275 break;
3276 }
3277
3278 case LATE_PARSED_TEMPLATE: {
3279 LateParsedTemplates.append(Record.begin(), Record.end());
3280 break;
3281 }
3282
3283 case OPTIMIZE_PRAGMA_OPTIONS:
3284 if (Record.size() != 1) {
3285 Error("invalid pragma optimize record");
3286 return Failure;
3287 }
3288 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3289 break;
3290 }
3291 }
3292 }
3293
3294 /// \brief Move the given method to the back of the global list of methods.
moveMethodToBackOfGlobalList(Sema & S,ObjCMethodDecl * Method)3295 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3296 // Find the entry for this selector in the method pool.
3297 Sema::GlobalMethodPool::iterator Known
3298 = S.MethodPool.find(Method->getSelector());
3299 if (Known == S.MethodPool.end())
3300 return;
3301
3302 // Retrieve the appropriate method list.
3303 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3304 : Known->second.second;
3305 bool Found = false;
3306 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3307 if (!Found) {
3308 if (List->Method == Method) {
3309 Found = true;
3310 } else {
3311 // Keep searching.
3312 continue;
3313 }
3314 }
3315
3316 if (List->getNext())
3317 List->Method = List->getNext()->Method;
3318 else
3319 List->Method = Method;
3320 }
3321 }
3322
makeNamesVisible(const HiddenNames & Names,Module * Owner)3323 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3324 for (unsigned I = 0, N = Names.HiddenDecls.size(); I != N; ++I) {
3325 Decl *D = Names.HiddenDecls[I];
3326 bool wasHidden = D->Hidden;
3327 D->Hidden = false;
3328
3329 if (wasHidden && SemaObj) {
3330 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3331 moveMethodToBackOfGlobalList(*SemaObj, Method);
3332 }
3333 }
3334 }
3335
3336 for (HiddenMacrosMap::const_iterator I = Names.HiddenMacros.begin(),
3337 E = Names.HiddenMacros.end();
3338 I != E; ++I)
3339 installImportedMacro(I->first, I->second, Owner);
3340 }
3341
makeModuleVisible(Module * Mod,Module::NameVisibilityKind NameVisibility,SourceLocation ImportLoc,bool Complain)3342 void ASTReader::makeModuleVisible(Module *Mod,
3343 Module::NameVisibilityKind NameVisibility,
3344 SourceLocation ImportLoc,
3345 bool Complain) {
3346 llvm::SmallPtrSet<Module *, 4> Visited;
3347 SmallVector<Module *, 4> Stack;
3348 Stack.push_back(Mod);
3349 while (!Stack.empty()) {
3350 Mod = Stack.pop_back_val();
3351
3352 if (NameVisibility <= Mod->NameVisibility) {
3353 // This module already has this level of visibility (or greater), so
3354 // there is nothing more to do.
3355 continue;
3356 }
3357
3358 if (!Mod->isAvailable()) {
3359 // Modules that aren't available cannot be made visible.
3360 continue;
3361 }
3362
3363 // Update the module's name visibility.
3364 if (NameVisibility >= Module::MacrosVisible &&
3365 Mod->NameVisibility < Module::MacrosVisible)
3366 Mod->MacroVisibilityLoc = ImportLoc;
3367 Mod->NameVisibility = NameVisibility;
3368
3369 // If we've already deserialized any names from this module,
3370 // mark them as visible.
3371 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3372 if (Hidden != HiddenNamesMap.end()) {
3373 makeNamesVisible(Hidden->second, Hidden->first);
3374 HiddenNamesMap.erase(Hidden);
3375 }
3376
3377 // Push any exported modules onto the stack to be marked as visible.
3378 SmallVector<Module *, 16> Exports;
3379 Mod->getExportedModules(Exports);
3380 for (SmallVectorImpl<Module *>::iterator
3381 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3382 Module *Exported = *I;
3383 if (Visited.insert(Exported))
3384 Stack.push_back(Exported);
3385 }
3386
3387 // Detect any conflicts.
3388 if (Complain) {
3389 assert(ImportLoc.isValid() && "Missing import location");
3390 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3391 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3392 Diag(ImportLoc, diag::warn_module_conflict)
3393 << Mod->getFullModuleName()
3394 << Mod->Conflicts[I].Other->getFullModuleName()
3395 << Mod->Conflicts[I].Message;
3396 // FIXME: Need note where the other module was imported.
3397 }
3398 }
3399 }
3400 }
3401 }
3402
loadGlobalIndex()3403 bool ASTReader::loadGlobalIndex() {
3404 if (GlobalIndex)
3405 return false;
3406
3407 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3408 !Context.getLangOpts().Modules)
3409 return true;
3410
3411 // Try to load the global index.
3412 TriedLoadingGlobalIndex = true;
3413 StringRef ModuleCachePath
3414 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3415 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3416 = GlobalModuleIndex::readIndex(ModuleCachePath);
3417 if (!Result.first)
3418 return true;
3419
3420 GlobalIndex.reset(Result.first);
3421 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3422 return false;
3423 }
3424
isGlobalIndexUnavailable() const3425 bool ASTReader::isGlobalIndexUnavailable() const {
3426 return Context.getLangOpts().Modules && UseGlobalIndex &&
3427 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3428 }
3429
updateModuleTimestamp(ModuleFile & MF)3430 static void updateModuleTimestamp(ModuleFile &MF) {
3431 // Overwrite the timestamp file contents so that file's mtime changes.
3432 std::string TimestampFilename = MF.getTimestampFilename();
3433 std::string ErrorInfo;
3434 llvm::raw_fd_ostream OS(TimestampFilename.c_str(), ErrorInfo,
3435 llvm::sys::fs::F_Text);
3436 if (!ErrorInfo.empty())
3437 return;
3438 OS << "Timestamp file\n";
3439 }
3440
ReadAST(const std::string & FileName,ModuleKind Type,SourceLocation ImportLoc,unsigned ClientLoadCapabilities)3441 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3442 ModuleKind Type,
3443 SourceLocation ImportLoc,
3444 unsigned ClientLoadCapabilities) {
3445 llvm::SaveAndRestore<SourceLocation>
3446 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3447
3448 // Defer any pending actions until we get to the end of reading the AST file.
3449 Deserializing AnASTFile(this);
3450
3451 // Bump the generation number.
3452 unsigned PreviousGeneration = incrementGeneration(Context);
3453
3454 unsigned NumModules = ModuleMgr.size();
3455 SmallVector<ImportedModule, 4> Loaded;
3456 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
3457 /*ImportedBy=*/nullptr, Loaded,
3458 0, 0,
3459 ClientLoadCapabilities)) {
3460 case Failure:
3461 case Missing:
3462 case OutOfDate:
3463 case VersionMismatch:
3464 case ConfigurationMismatch:
3465 case HadErrors: {
3466 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3467 for (const ImportedModule &IM : Loaded)
3468 LoadedSet.insert(IM.Mod);
3469
3470 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
3471 LoadedSet,
3472 Context.getLangOpts().Modules
3473 ? &PP.getHeaderSearchInfo().getModuleMap()
3474 : nullptr);
3475
3476 // If we find that any modules are unusable, the global index is going
3477 // to be out-of-date. Just remove it.
3478 GlobalIndex.reset();
3479 ModuleMgr.setGlobalIndex(nullptr);
3480 return ReadResult;
3481 }
3482 case Success:
3483 break;
3484 }
3485
3486 // Here comes stuff that we only do once the entire chain is loaded.
3487
3488 // Load the AST blocks of all of the modules that we loaded.
3489 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3490 MEnd = Loaded.end();
3491 M != MEnd; ++M) {
3492 ModuleFile &F = *M->Mod;
3493
3494 // Read the AST block.
3495 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3496 return Result;
3497
3498 // Once read, set the ModuleFile bit base offset and update the size in
3499 // bits of all files we've seen.
3500 F.GlobalBitOffset = TotalModulesSizeInBits;
3501 TotalModulesSizeInBits += F.SizeInBits;
3502 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3503
3504 // Preload SLocEntries.
3505 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3506 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3507 // Load it through the SourceManager and don't call ReadSLocEntry()
3508 // directly because the entry may have already been loaded in which case
3509 // calling ReadSLocEntry() directly would trigger an assertion in
3510 // SourceManager.
3511 SourceMgr.getLoadedSLocEntryByID(Index);
3512 }
3513 }
3514
3515 // Setup the import locations and notify the module manager that we've
3516 // committed to these module files.
3517 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3518 MEnd = Loaded.end();
3519 M != MEnd; ++M) {
3520 ModuleFile &F = *M->Mod;
3521
3522 ModuleMgr.moduleFileAccepted(&F);
3523
3524 // Set the import location.
3525 F.DirectImportLoc = ImportLoc;
3526 if (!M->ImportedBy)
3527 F.ImportLoc = M->ImportLoc;
3528 else
3529 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3530 M->ImportLoc.getRawEncoding());
3531 }
3532
3533 // Mark all of the identifiers in the identifier table as being out of date,
3534 // so that various accessors know to check the loaded modules when the
3535 // identifier is used.
3536 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3537 IdEnd = PP.getIdentifierTable().end();
3538 Id != IdEnd; ++Id)
3539 Id->second->setOutOfDate(true);
3540
3541 // Resolve any unresolved module exports.
3542 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3543 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
3544 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3545 Module *ResolvedMod = getSubmodule(GlobalID);
3546
3547 switch (Unresolved.Kind) {
3548 case UnresolvedModuleRef::Conflict:
3549 if (ResolvedMod) {
3550 Module::Conflict Conflict;
3551 Conflict.Other = ResolvedMod;
3552 Conflict.Message = Unresolved.String.str();
3553 Unresolved.Mod->Conflicts.push_back(Conflict);
3554 }
3555 continue;
3556
3557 case UnresolvedModuleRef::Import:
3558 if (ResolvedMod)
3559 Unresolved.Mod->Imports.push_back(ResolvedMod);
3560 continue;
3561
3562 case UnresolvedModuleRef::Export:
3563 if (ResolvedMod || Unresolved.IsWildcard)
3564 Unresolved.Mod->Exports.push_back(
3565 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3566 continue;
3567 }
3568 }
3569 UnresolvedModuleRefs.clear();
3570
3571 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3572 // Might be unnecessary as use declarations are only used to build the
3573 // module itself.
3574
3575 InitializeContext();
3576
3577 if (SemaObj)
3578 UpdateSema();
3579
3580 if (DeserializationListener)
3581 DeserializationListener->ReaderInitialized(this);
3582
3583 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3584 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3585 PrimaryModule.OriginalSourceFileID
3586 = FileID::get(PrimaryModule.SLocEntryBaseID
3587 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3588
3589 // If this AST file is a precompiled preamble, then set the
3590 // preamble file ID of the source manager to the file source file
3591 // from which the preamble was built.
3592 if (Type == MK_Preamble) {
3593 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3594 } else if (Type == MK_MainFile) {
3595 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3596 }
3597 }
3598
3599 // For any Objective-C class definitions we have already loaded, make sure
3600 // that we load any additional categories.
3601 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3602 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3603 ObjCClassesLoaded[I],
3604 PreviousGeneration);
3605 }
3606
3607 if (PP.getHeaderSearchInfo()
3608 .getHeaderSearchOpts()
3609 .ModulesValidateOncePerBuildSession) {
3610 // Now we are certain that the module and all modules it depends on are
3611 // up to date. Create or update timestamp files for modules that are
3612 // located in the module cache (not for PCH files that could be anywhere
3613 // in the filesystem).
3614 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3615 ImportedModule &M = Loaded[I];
3616 if (M.Mod->Kind == MK_Module) {
3617 updateModuleTimestamp(*M.Mod);
3618 }
3619 }
3620 }
3621
3622 return Success;
3623 }
3624
3625 ASTReader::ASTReadResult
ReadASTCore(StringRef FileName,ModuleKind Type,SourceLocation ImportLoc,ModuleFile * ImportedBy,SmallVectorImpl<ImportedModule> & Loaded,off_t ExpectedSize,time_t ExpectedModTime,unsigned ClientLoadCapabilities)3626 ASTReader::ReadASTCore(StringRef FileName,
3627 ModuleKind Type,
3628 SourceLocation ImportLoc,
3629 ModuleFile *ImportedBy,
3630 SmallVectorImpl<ImportedModule> &Loaded,
3631 off_t ExpectedSize, time_t ExpectedModTime,
3632 unsigned ClientLoadCapabilities) {
3633 ModuleFile *M;
3634 std::string ErrorStr;
3635 ModuleManager::AddModuleResult AddResult
3636 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
3637 getGeneration(), ExpectedSize, ExpectedModTime,
3638 M, ErrorStr);
3639
3640 switch (AddResult) {
3641 case ModuleManager::AlreadyLoaded:
3642 return Success;
3643
3644 case ModuleManager::NewlyLoaded:
3645 // Load module file below.
3646 break;
3647
3648 case ModuleManager::Missing:
3649 // The module file was missing; if the client handle handle, that, return
3650 // it.
3651 if (ClientLoadCapabilities & ARR_Missing)
3652 return Missing;
3653
3654 // Otherwise, return an error.
3655 {
3656 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3657 + ErrorStr;
3658 Error(Msg);
3659 }
3660 return Failure;
3661
3662 case ModuleManager::OutOfDate:
3663 // We couldn't load the module file because it is out-of-date. If the
3664 // client can handle out-of-date, return it.
3665 if (ClientLoadCapabilities & ARR_OutOfDate)
3666 return OutOfDate;
3667
3668 // Otherwise, return an error.
3669 {
3670 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3671 + ErrorStr;
3672 Error(Msg);
3673 }
3674 return Failure;
3675 }
3676
3677 assert(M && "Missing module file");
3678
3679 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3680 // module?
3681 if (FileName != "-") {
3682 CurrentDir = llvm::sys::path::parent_path(FileName);
3683 if (CurrentDir.empty()) CurrentDir = ".";
3684 }
3685
3686 ModuleFile &F = *M;
3687 BitstreamCursor &Stream = F.Stream;
3688 Stream.init(F.StreamFile);
3689 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3690
3691 // Sniff for the signature.
3692 if (Stream.Read(8) != 'C' ||
3693 Stream.Read(8) != 'P' ||
3694 Stream.Read(8) != 'C' ||
3695 Stream.Read(8) != 'H') {
3696 Diag(diag::err_not_a_pch_file) << FileName;
3697 return Failure;
3698 }
3699
3700 // This is used for compatibility with older PCH formats.
3701 bool HaveReadControlBlock = false;
3702
3703 while (1) {
3704 llvm::BitstreamEntry Entry = Stream.advance();
3705
3706 switch (Entry.Kind) {
3707 case llvm::BitstreamEntry::Error:
3708 case llvm::BitstreamEntry::EndBlock:
3709 case llvm::BitstreamEntry::Record:
3710 Error("invalid record at top-level of AST file");
3711 return Failure;
3712
3713 case llvm::BitstreamEntry::SubBlock:
3714 break;
3715 }
3716
3717 // We only know the control subblock ID.
3718 switch (Entry.ID) {
3719 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3720 if (Stream.ReadBlockInfoBlock()) {
3721 Error("malformed BlockInfoBlock in AST file");
3722 return Failure;
3723 }
3724 break;
3725 case CONTROL_BLOCK_ID:
3726 HaveReadControlBlock = true;
3727 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
3728 case Success:
3729 break;
3730
3731 case Failure: return Failure;
3732 case Missing: return Missing;
3733 case OutOfDate: return OutOfDate;
3734 case VersionMismatch: return VersionMismatch;
3735 case ConfigurationMismatch: return ConfigurationMismatch;
3736 case HadErrors: return HadErrors;
3737 }
3738 break;
3739 case AST_BLOCK_ID:
3740 if (!HaveReadControlBlock) {
3741 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3742 Diag(diag::err_pch_version_too_old);
3743 return VersionMismatch;
3744 }
3745
3746 // Record that we've loaded this module.
3747 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3748 return Success;
3749
3750 default:
3751 if (Stream.SkipBlock()) {
3752 Error("malformed block record in AST file");
3753 return Failure;
3754 }
3755 break;
3756 }
3757 }
3758
3759 return Success;
3760 }
3761
InitializeContext()3762 void ASTReader::InitializeContext() {
3763 // If there's a listener, notify them that we "read" the translation unit.
3764 if (DeserializationListener)
3765 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3766 Context.getTranslationUnitDecl());
3767
3768 // FIXME: Find a better way to deal with collisions between these
3769 // built-in types. Right now, we just ignore the problem.
3770
3771 // Load the special types.
3772 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3773 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3774 if (!Context.CFConstantStringTypeDecl)
3775 Context.setCFConstantStringType(GetType(String));
3776 }
3777
3778 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3779 QualType FileType = GetType(File);
3780 if (FileType.isNull()) {
3781 Error("FILE type is NULL");
3782 return;
3783 }
3784
3785 if (!Context.FILEDecl) {
3786 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3787 Context.setFILEDecl(Typedef->getDecl());
3788 else {
3789 const TagType *Tag = FileType->getAs<TagType>();
3790 if (!Tag) {
3791 Error("Invalid FILE type in AST file");
3792 return;
3793 }
3794 Context.setFILEDecl(Tag->getDecl());
3795 }
3796 }
3797 }
3798
3799 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3800 QualType Jmp_bufType = GetType(Jmp_buf);
3801 if (Jmp_bufType.isNull()) {
3802 Error("jmp_buf type is NULL");
3803 return;
3804 }
3805
3806 if (!Context.jmp_bufDecl) {
3807 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3808 Context.setjmp_bufDecl(Typedef->getDecl());
3809 else {
3810 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3811 if (!Tag) {
3812 Error("Invalid jmp_buf type in AST file");
3813 return;
3814 }
3815 Context.setjmp_bufDecl(Tag->getDecl());
3816 }
3817 }
3818 }
3819
3820 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3821 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3822 if (Sigjmp_bufType.isNull()) {
3823 Error("sigjmp_buf type is NULL");
3824 return;
3825 }
3826
3827 if (!Context.sigjmp_bufDecl) {
3828 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3829 Context.setsigjmp_bufDecl(Typedef->getDecl());
3830 else {
3831 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3832 assert(Tag && "Invalid sigjmp_buf type in AST file");
3833 Context.setsigjmp_bufDecl(Tag->getDecl());
3834 }
3835 }
3836 }
3837
3838 if (unsigned ObjCIdRedef
3839 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3840 if (Context.ObjCIdRedefinitionType.isNull())
3841 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3842 }
3843
3844 if (unsigned ObjCClassRedef
3845 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3846 if (Context.ObjCClassRedefinitionType.isNull())
3847 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3848 }
3849
3850 if (unsigned ObjCSelRedef
3851 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3852 if (Context.ObjCSelRedefinitionType.isNull())
3853 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3854 }
3855
3856 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3857 QualType Ucontext_tType = GetType(Ucontext_t);
3858 if (Ucontext_tType.isNull()) {
3859 Error("ucontext_t type is NULL");
3860 return;
3861 }
3862
3863 if (!Context.ucontext_tDecl) {
3864 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3865 Context.setucontext_tDecl(Typedef->getDecl());
3866 else {
3867 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3868 assert(Tag && "Invalid ucontext_t type in AST file");
3869 Context.setucontext_tDecl(Tag->getDecl());
3870 }
3871 }
3872 }
3873 }
3874
3875 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3876
3877 // If there were any CUDA special declarations, deserialize them.
3878 if (!CUDASpecialDeclRefs.empty()) {
3879 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3880 Context.setcudaConfigureCallDecl(
3881 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3882 }
3883
3884 // Re-export any modules that were imported by a non-module AST file.
3885 // FIXME: This does not make macro-only imports visible again. It also doesn't
3886 // make #includes mapped to module imports visible.
3887 for (auto &Import : ImportedModules) {
3888 if (Module *Imported = getSubmodule(Import.ID))
3889 makeModuleVisible(Imported, Module::AllVisible,
3890 /*ImportLoc=*/Import.ImportLoc,
3891 /*Complain=*/false);
3892 }
3893 ImportedModules.clear();
3894 }
3895
finalizeForWriting()3896 void ASTReader::finalizeForWriting() {
3897 for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(),
3898 HiddenEnd = HiddenNamesMap.end();
3899 Hidden != HiddenEnd; ++Hidden) {
3900 makeNamesVisible(Hidden->second, Hidden->first);
3901 }
3902 HiddenNamesMap.clear();
3903 }
3904
3905 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3906 /// cursor into the start of the given block ID, returning false on success and
3907 /// true on failure.
SkipCursorToBlock(BitstreamCursor & Cursor,unsigned BlockID)3908 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3909 while (1) {
3910 llvm::BitstreamEntry Entry = Cursor.advance();
3911 switch (Entry.Kind) {
3912 case llvm::BitstreamEntry::Error:
3913 case llvm::BitstreamEntry::EndBlock:
3914 return true;
3915
3916 case llvm::BitstreamEntry::Record:
3917 // Ignore top-level records.
3918 Cursor.skipRecord(Entry.ID);
3919 break;
3920
3921 case llvm::BitstreamEntry::SubBlock:
3922 if (Entry.ID == BlockID) {
3923 if (Cursor.EnterSubBlock(BlockID))
3924 return true;
3925 // Found it!
3926 return false;
3927 }
3928
3929 if (Cursor.SkipBlock())
3930 return true;
3931 }
3932 }
3933 }
3934
3935 /// \brief Retrieve the name of the original source file name
3936 /// directly from the AST file, without actually loading the AST
3937 /// file.
getOriginalSourceFile(const std::string & ASTFileName,FileManager & FileMgr,DiagnosticsEngine & Diags)3938 std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3939 FileManager &FileMgr,
3940 DiagnosticsEngine &Diags) {
3941 // Open the AST file.
3942 std::string ErrStr;
3943 std::unique_ptr<llvm::MemoryBuffer> Buffer;
3944 Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
3945 if (!Buffer) {
3946 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
3947 return std::string();
3948 }
3949
3950 // Initialize the stream
3951 llvm::BitstreamReader StreamFile;
3952 BitstreamCursor Stream;
3953 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3954 (const unsigned char *)Buffer->getBufferEnd());
3955 Stream.init(StreamFile);
3956
3957 // Sniff for the signature.
3958 if (Stream.Read(8) != 'C' ||
3959 Stream.Read(8) != 'P' ||
3960 Stream.Read(8) != 'C' ||
3961 Stream.Read(8) != 'H') {
3962 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3963 return std::string();
3964 }
3965
3966 // Scan for the CONTROL_BLOCK_ID block.
3967 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
3968 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3969 return std::string();
3970 }
3971
3972 // Scan for ORIGINAL_FILE inside the control block.
3973 RecordData Record;
3974 while (1) {
3975 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3976 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3977 return std::string();
3978
3979 if (Entry.Kind != llvm::BitstreamEntry::Record) {
3980 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3981 return std::string();
3982 }
3983
3984 Record.clear();
3985 StringRef Blob;
3986 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
3987 return Blob.str();
3988 }
3989 }
3990
3991 namespace {
3992 class SimplePCHValidator : public ASTReaderListener {
3993 const LangOptions &ExistingLangOpts;
3994 const TargetOptions &ExistingTargetOpts;
3995 const PreprocessorOptions &ExistingPPOpts;
3996 FileManager &FileMgr;
3997
3998 public:
SimplePCHValidator(const LangOptions & ExistingLangOpts,const TargetOptions & ExistingTargetOpts,const PreprocessorOptions & ExistingPPOpts,FileManager & FileMgr)3999 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4000 const TargetOptions &ExistingTargetOpts,
4001 const PreprocessorOptions &ExistingPPOpts,
4002 FileManager &FileMgr)
4003 : ExistingLangOpts(ExistingLangOpts),
4004 ExistingTargetOpts(ExistingTargetOpts),
4005 ExistingPPOpts(ExistingPPOpts),
4006 FileMgr(FileMgr)
4007 {
4008 }
4009
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain)4010 bool ReadLanguageOptions(const LangOptions &LangOpts,
4011 bool Complain) override {
4012 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr);
4013 }
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain)4014 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4015 bool Complain) override {
4016 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
4017 }
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool Complain,std::string & SuggestedPredefines)4018 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4019 bool Complain,
4020 std::string &SuggestedPredefines) override {
4021 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4022 SuggestedPredefines, ExistingLangOpts);
4023 }
4024 };
4025 }
4026
readASTFileControlBlock(StringRef Filename,FileManager & FileMgr,ASTReaderListener & Listener)4027 bool ASTReader::readASTFileControlBlock(StringRef Filename,
4028 FileManager &FileMgr,
4029 ASTReaderListener &Listener) {
4030 // Open the AST file.
4031 std::string ErrStr;
4032 std::unique_ptr<llvm::MemoryBuffer> Buffer;
4033 Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr));
4034 if (!Buffer) {
4035 return true;
4036 }
4037
4038 // Initialize the stream
4039 llvm::BitstreamReader StreamFile;
4040 BitstreamCursor Stream;
4041 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4042 (const unsigned char *)Buffer->getBufferEnd());
4043 Stream.init(StreamFile);
4044
4045 // Sniff for the signature.
4046 if (Stream.Read(8) != 'C' ||
4047 Stream.Read(8) != 'P' ||
4048 Stream.Read(8) != 'C' ||
4049 Stream.Read(8) != 'H') {
4050 return true;
4051 }
4052
4053 // Scan for the CONTROL_BLOCK_ID block.
4054 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4055 return true;
4056
4057 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4058 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4059 BitstreamCursor InputFilesCursor;
4060 if (NeedsInputFiles) {
4061 InputFilesCursor = Stream;
4062 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4063 return true;
4064
4065 // Read the abbreviations
4066 while (true) {
4067 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4068 unsigned Code = InputFilesCursor.ReadCode();
4069
4070 // We expect all abbrevs to be at the start of the block.
4071 if (Code != llvm::bitc::DEFINE_ABBREV) {
4072 InputFilesCursor.JumpToBit(Offset);
4073 break;
4074 }
4075 InputFilesCursor.ReadAbbrevRecord();
4076 }
4077 }
4078
4079 // Scan for ORIGINAL_FILE inside the control block.
4080 RecordData Record;
4081 while (1) {
4082 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4083 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4084 return false;
4085
4086 if (Entry.Kind != llvm::BitstreamEntry::Record)
4087 return true;
4088
4089 Record.clear();
4090 StringRef Blob;
4091 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4092 switch ((ControlRecordTypes)RecCode) {
4093 case METADATA: {
4094 if (Record[0] != VERSION_MAJOR)
4095 return true;
4096
4097 if (Listener.ReadFullVersionInformation(Blob))
4098 return true;
4099
4100 break;
4101 }
4102 case MODULE_NAME:
4103 Listener.ReadModuleName(Blob);
4104 break;
4105 case MODULE_MAP_FILE:
4106 Listener.ReadModuleMapFile(Blob);
4107 break;
4108 case LANGUAGE_OPTIONS:
4109 if (ParseLanguageOptions(Record, false, Listener))
4110 return true;
4111 break;
4112
4113 case TARGET_OPTIONS:
4114 if (ParseTargetOptions(Record, false, Listener))
4115 return true;
4116 break;
4117
4118 case DIAGNOSTIC_OPTIONS:
4119 if (ParseDiagnosticOptions(Record, false, Listener))
4120 return true;
4121 break;
4122
4123 case FILE_SYSTEM_OPTIONS:
4124 if (ParseFileSystemOptions(Record, false, Listener))
4125 return true;
4126 break;
4127
4128 case HEADER_SEARCH_OPTIONS:
4129 if (ParseHeaderSearchOptions(Record, false, Listener))
4130 return true;
4131 break;
4132
4133 case PREPROCESSOR_OPTIONS: {
4134 std::string IgnoredSuggestedPredefines;
4135 if (ParsePreprocessorOptions(Record, false, Listener,
4136 IgnoredSuggestedPredefines))
4137 return true;
4138 break;
4139 }
4140
4141 case INPUT_FILE_OFFSETS: {
4142 if (!NeedsInputFiles)
4143 break;
4144
4145 unsigned NumInputFiles = Record[0];
4146 unsigned NumUserFiles = Record[1];
4147 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4148 for (unsigned I = 0; I != NumInputFiles; ++I) {
4149 // Go find this input file.
4150 bool isSystemFile = I >= NumUserFiles;
4151
4152 if (isSystemFile && !NeedsSystemInputFiles)
4153 break; // the rest are system input files
4154
4155 BitstreamCursor &Cursor = InputFilesCursor;
4156 SavedStreamPosition SavedPosition(Cursor);
4157 Cursor.JumpToBit(InputFileOffs[I]);
4158
4159 unsigned Code = Cursor.ReadCode();
4160 RecordData Record;
4161 StringRef Blob;
4162 bool shouldContinue = false;
4163 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4164 case INPUT_FILE:
4165 bool Overridden = static_cast<bool>(Record[3]);
4166 shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden);
4167 break;
4168 }
4169 if (!shouldContinue)
4170 break;
4171 }
4172 break;
4173 }
4174
4175 default:
4176 // No other validation to perform.
4177 break;
4178 }
4179 }
4180 }
4181
4182
isAcceptableASTFile(StringRef Filename,FileManager & FileMgr,const LangOptions & LangOpts,const TargetOptions & TargetOpts,const PreprocessorOptions & PPOpts)4183 bool ASTReader::isAcceptableASTFile(StringRef Filename,
4184 FileManager &FileMgr,
4185 const LangOptions &LangOpts,
4186 const TargetOptions &TargetOpts,
4187 const PreprocessorOptions &PPOpts) {
4188 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4189 return !readASTFileControlBlock(Filename, FileMgr, validator);
4190 }
4191
4192 ASTReader::ASTReadResult
ReadSubmoduleBlock(ModuleFile & F,unsigned ClientLoadCapabilities)4193 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4194 // Enter the submodule block.
4195 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4196 Error("malformed submodule block record in AST file");
4197 return Failure;
4198 }
4199
4200 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4201 bool First = true;
4202 Module *CurrentModule = nullptr;
4203 RecordData Record;
4204 while (true) {
4205 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4206
4207 switch (Entry.Kind) {
4208 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4209 case llvm::BitstreamEntry::Error:
4210 Error("malformed block record in AST file");
4211 return Failure;
4212 case llvm::BitstreamEntry::EndBlock:
4213 return Success;
4214 case llvm::BitstreamEntry::Record:
4215 // The interesting case.
4216 break;
4217 }
4218
4219 // Read a record.
4220 StringRef Blob;
4221 Record.clear();
4222 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
4223 default: // Default behavior: ignore.
4224 break;
4225
4226 case SUBMODULE_DEFINITION: {
4227 if (First) {
4228 Error("missing submodule metadata record at beginning of block");
4229 return Failure;
4230 }
4231
4232 if (Record.size() < 8) {
4233 Error("malformed module definition");
4234 return Failure;
4235 }
4236
4237 StringRef Name = Blob;
4238 unsigned Idx = 0;
4239 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4240 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4241 bool IsFramework = Record[Idx++];
4242 bool IsExplicit = Record[Idx++];
4243 bool IsSystem = Record[Idx++];
4244 bool IsExternC = Record[Idx++];
4245 bool InferSubmodules = Record[Idx++];
4246 bool InferExplicitSubmodules = Record[Idx++];
4247 bool InferExportWildcard = Record[Idx++];
4248 bool ConfigMacrosExhaustive = Record[Idx++];
4249
4250 Module *ParentModule = nullptr;
4251 const FileEntry *ModuleMap = nullptr;
4252 if (Parent) {
4253 ParentModule = getSubmodule(Parent);
4254 ModuleMap = ParentModule->ModuleMap;
4255 }
4256
4257 if (!F.ModuleMapPath.empty())
4258 ModuleMap = FileMgr.getFile(F.ModuleMapPath);
4259
4260 // Retrieve this (sub)module from the module map, creating it if
4261 // necessary.
4262 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, ModuleMap,
4263 IsFramework,
4264 IsExplicit).first;
4265 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4266 if (GlobalIndex >= SubmodulesLoaded.size() ||
4267 SubmodulesLoaded[GlobalIndex]) {
4268 Error("too many submodules");
4269 return Failure;
4270 }
4271
4272 if (!ParentModule) {
4273 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4274 if (CurFile != F.File) {
4275 if (!Diags.isDiagnosticInFlight()) {
4276 Diag(diag::err_module_file_conflict)
4277 << CurrentModule->getTopLevelModuleName()
4278 << CurFile->getName()
4279 << F.File->getName();
4280 }
4281 return Failure;
4282 }
4283 }
4284
4285 CurrentModule->setASTFile(F.File);
4286 }
4287
4288 CurrentModule->IsFromModuleFile = true;
4289 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
4290 CurrentModule->IsExternC = IsExternC;
4291 CurrentModule->InferSubmodules = InferSubmodules;
4292 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4293 CurrentModule->InferExportWildcard = InferExportWildcard;
4294 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
4295 if (DeserializationListener)
4296 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4297
4298 SubmodulesLoaded[GlobalIndex] = CurrentModule;
4299
4300 // Clear out data that will be replaced by what is the module file.
4301 CurrentModule->LinkLibraries.clear();
4302 CurrentModule->ConfigMacros.clear();
4303 CurrentModule->UnresolvedConflicts.clear();
4304 CurrentModule->Conflicts.clear();
4305 break;
4306 }
4307
4308 case SUBMODULE_UMBRELLA_HEADER: {
4309 if (First) {
4310 Error("missing submodule metadata record at beginning of block");
4311 return Failure;
4312 }
4313
4314 if (!CurrentModule)
4315 break;
4316
4317 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
4318 if (!CurrentModule->getUmbrellaHeader())
4319 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4320 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
4321 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4322 Error("mismatched umbrella headers in submodule");
4323 return OutOfDate;
4324 }
4325 }
4326 break;
4327 }
4328
4329 case SUBMODULE_HEADER: {
4330 if (First) {
4331 Error("missing submodule metadata record at beginning of block");
4332 return Failure;
4333 }
4334
4335 if (!CurrentModule)
4336 break;
4337
4338 // We lazily associate headers with their modules via the HeaderInfoTable.
4339 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4340 // of complete filenames or remove it entirely.
4341 break;
4342 }
4343
4344 case SUBMODULE_EXCLUDED_HEADER: {
4345 if (First) {
4346 Error("missing submodule metadata record at beginning of block");
4347 return Failure;
4348 }
4349
4350 if (!CurrentModule)
4351 break;
4352
4353 // We lazily associate headers with their modules via the HeaderInfoTable.
4354 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4355 // of complete filenames or remove it entirely.
4356 break;
4357 }
4358
4359 case SUBMODULE_PRIVATE_HEADER: {
4360 if (First) {
4361 Error("missing submodule metadata record at beginning of block");
4362 return Failure;
4363 }
4364
4365 if (!CurrentModule)
4366 break;
4367
4368 // We lazily associate headers with their modules via the HeaderInfoTable.
4369 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4370 // of complete filenames or remove it entirely.
4371 break;
4372 }
4373
4374 case SUBMODULE_TOPHEADER: {
4375 if (First) {
4376 Error("missing submodule metadata record at beginning of block");
4377 return Failure;
4378 }
4379
4380 if (!CurrentModule)
4381 break;
4382
4383 CurrentModule->addTopHeaderFilename(Blob);
4384 break;
4385 }
4386
4387 case SUBMODULE_UMBRELLA_DIR: {
4388 if (First) {
4389 Error("missing submodule metadata record at beginning of block");
4390 return Failure;
4391 }
4392
4393 if (!CurrentModule)
4394 break;
4395
4396 if (const DirectoryEntry *Umbrella
4397 = PP.getFileManager().getDirectory(Blob)) {
4398 if (!CurrentModule->getUmbrellaDir())
4399 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4400 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
4401 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4402 Error("mismatched umbrella directories in submodule");
4403 return OutOfDate;
4404 }
4405 }
4406 break;
4407 }
4408
4409 case SUBMODULE_METADATA: {
4410 if (!First) {
4411 Error("submodule metadata record not at beginning of block");
4412 return Failure;
4413 }
4414 First = false;
4415
4416 F.BaseSubmoduleID = getTotalNumSubmodules();
4417 F.LocalNumSubmodules = Record[0];
4418 unsigned LocalBaseSubmoduleID = Record[1];
4419 if (F.LocalNumSubmodules > 0) {
4420 // Introduce the global -> local mapping for submodules within this
4421 // module.
4422 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4423
4424 // Introduce the local -> global mapping for submodules within this
4425 // module.
4426 F.SubmoduleRemap.insertOrReplace(
4427 std::make_pair(LocalBaseSubmoduleID,
4428 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4429
4430 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4431 }
4432 break;
4433 }
4434
4435 case SUBMODULE_IMPORTS: {
4436 if (First) {
4437 Error("missing submodule metadata record at beginning of block");
4438 return Failure;
4439 }
4440
4441 if (!CurrentModule)
4442 break;
4443
4444 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
4445 UnresolvedModuleRef Unresolved;
4446 Unresolved.File = &F;
4447 Unresolved.Mod = CurrentModule;
4448 Unresolved.ID = Record[Idx];
4449 Unresolved.Kind = UnresolvedModuleRef::Import;
4450 Unresolved.IsWildcard = false;
4451 UnresolvedModuleRefs.push_back(Unresolved);
4452 }
4453 break;
4454 }
4455
4456 case SUBMODULE_EXPORTS: {
4457 if (First) {
4458 Error("missing submodule metadata record at beginning of block");
4459 return Failure;
4460 }
4461
4462 if (!CurrentModule)
4463 break;
4464
4465 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
4466 UnresolvedModuleRef Unresolved;
4467 Unresolved.File = &F;
4468 Unresolved.Mod = CurrentModule;
4469 Unresolved.ID = Record[Idx];
4470 Unresolved.Kind = UnresolvedModuleRef::Export;
4471 Unresolved.IsWildcard = Record[Idx + 1];
4472 UnresolvedModuleRefs.push_back(Unresolved);
4473 }
4474
4475 // Once we've loaded the set of exports, there's no reason to keep
4476 // the parsed, unresolved exports around.
4477 CurrentModule->UnresolvedExports.clear();
4478 break;
4479 }
4480 case SUBMODULE_REQUIRES: {
4481 if (First) {
4482 Error("missing submodule metadata record at beginning of block");
4483 return Failure;
4484 }
4485
4486 if (!CurrentModule)
4487 break;
4488
4489 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
4490 Context.getTargetInfo());
4491 break;
4492 }
4493
4494 case SUBMODULE_LINK_LIBRARY:
4495 if (First) {
4496 Error("missing submodule metadata record at beginning of block");
4497 return Failure;
4498 }
4499
4500 if (!CurrentModule)
4501 break;
4502
4503 CurrentModule->LinkLibraries.push_back(
4504 Module::LinkLibrary(Blob, Record[0]));
4505 break;
4506
4507 case SUBMODULE_CONFIG_MACRO:
4508 if (First) {
4509 Error("missing submodule metadata record at beginning of block");
4510 return Failure;
4511 }
4512
4513 if (!CurrentModule)
4514 break;
4515
4516 CurrentModule->ConfigMacros.push_back(Blob.str());
4517 break;
4518
4519 case SUBMODULE_CONFLICT: {
4520 if (First) {
4521 Error("missing submodule metadata record at beginning of block");
4522 return Failure;
4523 }
4524
4525 if (!CurrentModule)
4526 break;
4527
4528 UnresolvedModuleRef Unresolved;
4529 Unresolved.File = &F;
4530 Unresolved.Mod = CurrentModule;
4531 Unresolved.ID = Record[0];
4532 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4533 Unresolved.IsWildcard = false;
4534 Unresolved.String = Blob;
4535 UnresolvedModuleRefs.push_back(Unresolved);
4536 break;
4537 }
4538 }
4539 }
4540 }
4541
4542 /// \brief Parse the record that corresponds to a LangOptions data
4543 /// structure.
4544 ///
4545 /// This routine parses the language options from the AST file and then gives
4546 /// them to the AST listener if one is set.
4547 ///
4548 /// \returns true if the listener deems the file unacceptable, false otherwise.
ParseLanguageOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4549 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4550 bool Complain,
4551 ASTReaderListener &Listener) {
4552 LangOptions LangOpts;
4553 unsigned Idx = 0;
4554 #define LANGOPT(Name, Bits, Default, Description) \
4555 LangOpts.Name = Record[Idx++];
4556 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4557 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4558 #include "clang/Basic/LangOptions.def"
4559 #define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
4560 #include "clang/Basic/Sanitizers.def"
4561
4562 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4563 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4564 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4565
4566 unsigned Length = Record[Idx++];
4567 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4568 Record.begin() + Idx + Length);
4569
4570 Idx += Length;
4571
4572 // Comment options.
4573 for (unsigned N = Record[Idx++]; N; --N) {
4574 LangOpts.CommentOpts.BlockCommandNames.push_back(
4575 ReadString(Record, Idx));
4576 }
4577 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
4578
4579 return Listener.ReadLanguageOptions(LangOpts, Complain);
4580 }
4581
ParseTargetOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4582 bool ASTReader::ParseTargetOptions(const RecordData &Record,
4583 bool Complain,
4584 ASTReaderListener &Listener) {
4585 unsigned Idx = 0;
4586 TargetOptions TargetOpts;
4587 TargetOpts.Triple = ReadString(Record, Idx);
4588 TargetOpts.CPU = ReadString(Record, Idx);
4589 TargetOpts.ABI = ReadString(Record, Idx);
4590 for (unsigned N = Record[Idx++]; N; --N) {
4591 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4592 }
4593 for (unsigned N = Record[Idx++]; N; --N) {
4594 TargetOpts.Features.push_back(ReadString(Record, Idx));
4595 }
4596
4597 return Listener.ReadTargetOptions(TargetOpts, Complain);
4598 }
4599
ParseDiagnosticOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4600 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4601 ASTReaderListener &Listener) {
4602 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
4603 unsigned Idx = 0;
4604 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
4605 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
4606 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
4607 #include "clang/Basic/DiagnosticOptions.def"
4608
4609 for (unsigned N = Record[Idx++]; N; --N) {
4610 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
4611 }
4612
4613 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4614 }
4615
ParseFileSystemOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4616 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4617 ASTReaderListener &Listener) {
4618 FileSystemOptions FSOpts;
4619 unsigned Idx = 0;
4620 FSOpts.WorkingDir = ReadString(Record, Idx);
4621 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4622 }
4623
ParseHeaderSearchOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)4624 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4625 bool Complain,
4626 ASTReaderListener &Listener) {
4627 HeaderSearchOptions HSOpts;
4628 unsigned Idx = 0;
4629 HSOpts.Sysroot = ReadString(Record, Idx);
4630
4631 // Include entries.
4632 for (unsigned N = Record[Idx++]; N; --N) {
4633 std::string Path = ReadString(Record, Idx);
4634 frontend::IncludeDirGroup Group
4635 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
4636 bool IsFramework = Record[Idx++];
4637 bool IgnoreSysRoot = Record[Idx++];
4638 HSOpts.UserEntries.push_back(
4639 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
4640 }
4641
4642 // System header prefixes.
4643 for (unsigned N = Record[Idx++]; N; --N) {
4644 std::string Prefix = ReadString(Record, Idx);
4645 bool IsSystemHeader = Record[Idx++];
4646 HSOpts.SystemHeaderPrefixes.push_back(
4647 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4648 }
4649
4650 HSOpts.ResourceDir = ReadString(Record, Idx);
4651 HSOpts.ModuleCachePath = ReadString(Record, Idx);
4652 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
4653 HSOpts.DisableModuleHash = Record[Idx++];
4654 HSOpts.UseBuiltinIncludes = Record[Idx++];
4655 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4656 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4657 HSOpts.UseLibcxx = Record[Idx++];
4658
4659 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4660 }
4661
ParsePreprocessorOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener,std::string & SuggestedPredefines)4662 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4663 bool Complain,
4664 ASTReaderListener &Listener,
4665 std::string &SuggestedPredefines) {
4666 PreprocessorOptions PPOpts;
4667 unsigned Idx = 0;
4668
4669 // Macro definitions/undefs
4670 for (unsigned N = Record[Idx++]; N; --N) {
4671 std::string Macro = ReadString(Record, Idx);
4672 bool IsUndef = Record[Idx++];
4673 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4674 }
4675
4676 // Includes
4677 for (unsigned N = Record[Idx++]; N; --N) {
4678 PPOpts.Includes.push_back(ReadString(Record, Idx));
4679 }
4680
4681 // Macro Includes
4682 for (unsigned N = Record[Idx++]; N; --N) {
4683 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4684 }
4685
4686 PPOpts.UsePredefines = Record[Idx++];
4687 PPOpts.DetailedRecord = Record[Idx++];
4688 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4689 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4690 PPOpts.ObjCXXARCStandardLibrary =
4691 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4692 SuggestedPredefines.clear();
4693 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4694 SuggestedPredefines);
4695 }
4696
4697 std::pair<ModuleFile *, unsigned>
getModulePreprocessedEntity(unsigned GlobalIndex)4698 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4699 GlobalPreprocessedEntityMapType::iterator
4700 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4701 assert(I != GlobalPreprocessedEntityMap.end() &&
4702 "Corrupted global preprocessed entity map");
4703 ModuleFile *M = I->second;
4704 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4705 return std::make_pair(M, LocalIndex);
4706 }
4707
4708 std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
getModulePreprocessedEntities(ModuleFile & Mod) const4709 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4710 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4711 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4712 Mod.NumPreprocessedEntities);
4713
4714 return std::make_pair(PreprocessingRecord::iterator(),
4715 PreprocessingRecord::iterator());
4716 }
4717
4718 std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
getModuleFileLevelDecls(ModuleFile & Mod)4719 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4720 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4721 ModuleDeclIterator(this, &Mod,
4722 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4723 }
4724
ReadPreprocessedEntity(unsigned Index)4725 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4726 PreprocessedEntityID PPID = Index+1;
4727 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4728 ModuleFile &M = *PPInfo.first;
4729 unsigned LocalIndex = PPInfo.second;
4730 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4731
4732 if (!PP.getPreprocessingRecord()) {
4733 Error("no preprocessing record");
4734 return nullptr;
4735 }
4736
4737 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4738 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4739
4740 llvm::BitstreamEntry Entry =
4741 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4742 if (Entry.Kind != llvm::BitstreamEntry::Record)
4743 return nullptr;
4744
4745 // Read the record.
4746 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4747 ReadSourceLocation(M, PPOffs.End));
4748 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
4749 StringRef Blob;
4750 RecordData Record;
4751 PreprocessorDetailRecordTypes RecType =
4752 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4753 Entry.ID, Record, &Blob);
4754 switch (RecType) {
4755 case PPD_MACRO_EXPANSION: {
4756 bool isBuiltin = Record[0];
4757 IdentifierInfo *Name = nullptr;
4758 MacroDefinition *Def = nullptr;
4759 if (isBuiltin)
4760 Name = getLocalIdentifier(M, Record[1]);
4761 else {
4762 PreprocessedEntityID
4763 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4764 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4765 }
4766
4767 MacroExpansion *ME;
4768 if (isBuiltin)
4769 ME = new (PPRec) MacroExpansion(Name, Range);
4770 else
4771 ME = new (PPRec) MacroExpansion(Def, Range);
4772
4773 return ME;
4774 }
4775
4776 case PPD_MACRO_DEFINITION: {
4777 // Decode the identifier info and then check again; if the macro is
4778 // still defined and associated with the identifier,
4779 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4780 MacroDefinition *MD
4781 = new (PPRec) MacroDefinition(II, Range);
4782
4783 if (DeserializationListener)
4784 DeserializationListener->MacroDefinitionRead(PPID, MD);
4785
4786 return MD;
4787 }
4788
4789 case PPD_INCLUSION_DIRECTIVE: {
4790 const char *FullFileNameStart = Blob.data() + Record[0];
4791 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
4792 const FileEntry *File = nullptr;
4793 if (!FullFileName.empty())
4794 File = PP.getFileManager().getFile(FullFileName);
4795
4796 // FIXME: Stable encoding
4797 InclusionDirective::InclusionKind Kind
4798 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4799 InclusionDirective *ID
4800 = new (PPRec) InclusionDirective(PPRec, Kind,
4801 StringRef(Blob.data(), Record[0]),
4802 Record[1], Record[3],
4803 File,
4804 Range);
4805 return ID;
4806 }
4807 }
4808
4809 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4810 }
4811
4812 /// \brief \arg SLocMapI points at a chunk of a module that contains no
4813 /// preprocessed entities or the entities it contains are not the ones we are
4814 /// looking for. Find the next module that contains entities and return the ID
4815 /// of the first entry.
findNextPreprocessedEntity(GlobalSLocOffsetMapType::const_iterator SLocMapI) const4816 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4817 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4818 ++SLocMapI;
4819 for (GlobalSLocOffsetMapType::const_iterator
4820 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4821 ModuleFile &M = *SLocMapI->second;
4822 if (M.NumPreprocessedEntities)
4823 return M.BasePreprocessedEntityID;
4824 }
4825
4826 return getTotalNumPreprocessedEntities();
4827 }
4828
4829 namespace {
4830
4831 template <unsigned PPEntityOffset::*PPLoc>
4832 struct PPEntityComp {
4833 const ASTReader &Reader;
4834 ModuleFile &M;
4835
PPEntityComp__anon546a9c040511::PPEntityComp4836 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4837
operator ()__anon546a9c040511::PPEntityComp4838 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4839 SourceLocation LHS = getLoc(L);
4840 SourceLocation RHS = getLoc(R);
4841 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4842 }
4843
operator ()__anon546a9c040511::PPEntityComp4844 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4845 SourceLocation LHS = getLoc(L);
4846 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4847 }
4848
operator ()__anon546a9c040511::PPEntityComp4849 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4850 SourceLocation RHS = getLoc(R);
4851 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4852 }
4853
getLoc__anon546a9c040511::PPEntityComp4854 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4855 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4856 }
4857 };
4858
4859 }
4860
findPreprocessedEntity(SourceLocation Loc,bool EndsAfter) const4861 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4862 bool EndsAfter) const {
4863 if (SourceMgr.isLocalSourceLocation(Loc))
4864 return getTotalNumPreprocessedEntities();
4865
4866 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4867 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
4868 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4869 "Corrupted global sloc offset map");
4870
4871 if (SLocMapI->second->NumPreprocessedEntities == 0)
4872 return findNextPreprocessedEntity(SLocMapI);
4873
4874 ModuleFile &M = *SLocMapI->second;
4875 typedef const PPEntityOffset *pp_iterator;
4876 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4877 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4878
4879 size_t Count = M.NumPreprocessedEntities;
4880 size_t Half;
4881 pp_iterator First = pp_begin;
4882 pp_iterator PPI;
4883
4884 if (EndsAfter) {
4885 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4886 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4887 } else {
4888 // Do a binary search manually instead of using std::lower_bound because
4889 // The end locations of entities may be unordered (when a macro expansion
4890 // is inside another macro argument), but for this case it is not important
4891 // whether we get the first macro expansion or its containing macro.
4892 while (Count > 0) {
4893 Half = Count / 2;
4894 PPI = First;
4895 std::advance(PPI, Half);
4896 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4897 Loc)) {
4898 First = PPI;
4899 ++First;
4900 Count = Count - Half - 1;
4901 } else
4902 Count = Half;
4903 }
4904 }
4905
4906 if (PPI == pp_end)
4907 return findNextPreprocessedEntity(SLocMapI);
4908
4909 return M.BasePreprocessedEntityID + (PPI - pp_begin);
4910 }
4911
4912 /// \brief Returns a pair of [Begin, End) indices of preallocated
4913 /// preprocessed entities that \arg Range encompasses.
4914 std::pair<unsigned, unsigned>
findPreprocessedEntitiesInRange(SourceRange Range)4915 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
4916 if (Range.isInvalid())
4917 return std::make_pair(0,0);
4918 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
4919
4920 PreprocessedEntityID BeginID =
4921 findPreprocessedEntity(Range.getBegin(), false);
4922 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
4923 return std::make_pair(BeginID, EndID);
4924 }
4925
4926 /// \brief Optionally returns true or false if the preallocated preprocessed
4927 /// entity with index \arg Index came from file \arg FID.
isPreprocessedEntityInFileID(unsigned Index,FileID FID)4928 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
4929 FileID FID) {
4930 if (FID.isInvalid())
4931 return false;
4932
4933 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4934 ModuleFile &M = *PPInfo.first;
4935 unsigned LocalIndex = PPInfo.second;
4936 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4937
4938 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
4939 if (Loc.isInvalid())
4940 return false;
4941
4942 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
4943 return true;
4944 else
4945 return false;
4946 }
4947
4948 namespace {
4949 /// \brief Visitor used to search for information about a header file.
4950 class HeaderFileInfoVisitor {
4951 const FileEntry *FE;
4952
4953 Optional<HeaderFileInfo> HFI;
4954
4955 public:
HeaderFileInfoVisitor(const FileEntry * FE)4956 explicit HeaderFileInfoVisitor(const FileEntry *FE)
4957 : FE(FE) { }
4958
visit(ModuleFile & M,void * UserData)4959 static bool visit(ModuleFile &M, void *UserData) {
4960 HeaderFileInfoVisitor *This
4961 = static_cast<HeaderFileInfoVisitor *>(UserData);
4962
4963 HeaderFileInfoLookupTable *Table
4964 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
4965 if (!Table)
4966 return false;
4967
4968 // Look in the on-disk hash table for an entry for this file name.
4969 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
4970 if (Pos == Table->end())
4971 return false;
4972
4973 This->HFI = *Pos;
4974 return true;
4975 }
4976
getHeaderFileInfo() const4977 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
4978 };
4979 }
4980
GetHeaderFileInfo(const FileEntry * FE)4981 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
4982 HeaderFileInfoVisitor Visitor(FE);
4983 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
4984 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
4985 return *HFI;
4986
4987 return HeaderFileInfo();
4988 }
4989
ReadPragmaDiagnosticMappings(DiagnosticsEngine & Diag)4990 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
4991 // FIXME: Make it work properly with modules.
4992 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
4993 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
4994 ModuleFile &F = *(*I);
4995 unsigned Idx = 0;
4996 DiagStates.clear();
4997 assert(!Diag.DiagStates.empty());
4998 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
4999 while (Idx < F.PragmaDiagMappings.size()) {
5000 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5001 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5002 if (DiagStateID != 0) {
5003 Diag.DiagStatePoints.push_back(
5004 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5005 FullSourceLoc(Loc, SourceMgr)));
5006 continue;
5007 }
5008
5009 assert(DiagStateID == 0);
5010 // A new DiagState was created here.
5011 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5012 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5013 DiagStates.push_back(NewState);
5014 Diag.DiagStatePoints.push_back(
5015 DiagnosticsEngine::DiagStatePoint(NewState,
5016 FullSourceLoc(Loc, SourceMgr)));
5017 while (1) {
5018 assert(Idx < F.PragmaDiagMappings.size() &&
5019 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5020 if (Idx >= F.PragmaDiagMappings.size()) {
5021 break; // Something is messed up but at least avoid infinite loop in
5022 // release build.
5023 }
5024 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5025 if (DiagID == (unsigned)-1) {
5026 break; // no more diag/map pairs for this location.
5027 }
5028 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5029 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5030 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
5031 }
5032 }
5033 }
5034 }
5035
5036 /// \brief Get the correct cursor and offset for loading a type.
TypeCursorForIndex(unsigned Index)5037 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5038 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5039 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5040 ModuleFile *M = I->second;
5041 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5042 }
5043
5044 /// \brief Read and return the type with the given index..
5045 ///
5046 /// The index is the type ID, shifted and minus the number of predefs. This
5047 /// routine actually reads the record corresponding to the type at the given
5048 /// location. It is a helper routine for GetType, which deals with reading type
5049 /// IDs.
readTypeRecord(unsigned Index)5050 QualType ASTReader::readTypeRecord(unsigned Index) {
5051 RecordLocation Loc = TypeCursorForIndex(Index);
5052 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5053
5054 // Keep track of where we are in the stream, then jump back there
5055 // after reading this type.
5056 SavedStreamPosition SavedPosition(DeclsCursor);
5057
5058 ReadingKindTracker ReadingKind(Read_Type, *this);
5059
5060 // Note that we are loading a type record.
5061 Deserializing AType(this);
5062
5063 unsigned Idx = 0;
5064 DeclsCursor.JumpToBit(Loc.Offset);
5065 RecordData Record;
5066 unsigned Code = DeclsCursor.ReadCode();
5067 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5068 case TYPE_EXT_QUAL: {
5069 if (Record.size() != 2) {
5070 Error("Incorrect encoding of extended qualifier type");
5071 return QualType();
5072 }
5073 QualType Base = readType(*Loc.F, Record, Idx);
5074 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5075 return Context.getQualifiedType(Base, Quals);
5076 }
5077
5078 case TYPE_COMPLEX: {
5079 if (Record.size() != 1) {
5080 Error("Incorrect encoding of complex type");
5081 return QualType();
5082 }
5083 QualType ElemType = readType(*Loc.F, Record, Idx);
5084 return Context.getComplexType(ElemType);
5085 }
5086
5087 case TYPE_POINTER: {
5088 if (Record.size() != 1) {
5089 Error("Incorrect encoding of pointer type");
5090 return QualType();
5091 }
5092 QualType PointeeType = readType(*Loc.F, Record, Idx);
5093 return Context.getPointerType(PointeeType);
5094 }
5095
5096 case TYPE_DECAYED: {
5097 if (Record.size() != 1) {
5098 Error("Incorrect encoding of decayed type");
5099 return QualType();
5100 }
5101 QualType OriginalType = readType(*Loc.F, Record, Idx);
5102 QualType DT = Context.getAdjustedParameterType(OriginalType);
5103 if (!isa<DecayedType>(DT))
5104 Error("Decayed type does not decay");
5105 return DT;
5106 }
5107
5108 case TYPE_ADJUSTED: {
5109 if (Record.size() != 2) {
5110 Error("Incorrect encoding of adjusted type");
5111 return QualType();
5112 }
5113 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5114 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5115 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5116 }
5117
5118 case TYPE_BLOCK_POINTER: {
5119 if (Record.size() != 1) {
5120 Error("Incorrect encoding of block pointer type");
5121 return QualType();
5122 }
5123 QualType PointeeType = readType(*Loc.F, Record, Idx);
5124 return Context.getBlockPointerType(PointeeType);
5125 }
5126
5127 case TYPE_LVALUE_REFERENCE: {
5128 if (Record.size() != 2) {
5129 Error("Incorrect encoding of lvalue reference type");
5130 return QualType();
5131 }
5132 QualType PointeeType = readType(*Loc.F, Record, Idx);
5133 return Context.getLValueReferenceType(PointeeType, Record[1]);
5134 }
5135
5136 case TYPE_RVALUE_REFERENCE: {
5137 if (Record.size() != 1) {
5138 Error("Incorrect encoding of rvalue reference type");
5139 return QualType();
5140 }
5141 QualType PointeeType = readType(*Loc.F, Record, Idx);
5142 return Context.getRValueReferenceType(PointeeType);
5143 }
5144
5145 case TYPE_MEMBER_POINTER: {
5146 if (Record.size() != 2) {
5147 Error("Incorrect encoding of member pointer type");
5148 return QualType();
5149 }
5150 QualType PointeeType = readType(*Loc.F, Record, Idx);
5151 QualType ClassType = readType(*Loc.F, Record, Idx);
5152 if (PointeeType.isNull() || ClassType.isNull())
5153 return QualType();
5154
5155 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5156 }
5157
5158 case TYPE_CONSTANT_ARRAY: {
5159 QualType ElementType = readType(*Loc.F, Record, Idx);
5160 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5161 unsigned IndexTypeQuals = Record[2];
5162 unsigned Idx = 3;
5163 llvm::APInt Size = ReadAPInt(Record, Idx);
5164 return Context.getConstantArrayType(ElementType, Size,
5165 ASM, IndexTypeQuals);
5166 }
5167
5168 case TYPE_INCOMPLETE_ARRAY: {
5169 QualType ElementType = readType(*Loc.F, Record, Idx);
5170 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5171 unsigned IndexTypeQuals = Record[2];
5172 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5173 }
5174
5175 case TYPE_VARIABLE_ARRAY: {
5176 QualType ElementType = readType(*Loc.F, Record, Idx);
5177 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5178 unsigned IndexTypeQuals = Record[2];
5179 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5180 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5181 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5182 ASM, IndexTypeQuals,
5183 SourceRange(LBLoc, RBLoc));
5184 }
5185
5186 case TYPE_VECTOR: {
5187 if (Record.size() != 3) {
5188 Error("incorrect encoding of vector type in AST file");
5189 return QualType();
5190 }
5191
5192 QualType ElementType = readType(*Loc.F, Record, Idx);
5193 unsigned NumElements = Record[1];
5194 unsigned VecKind = Record[2];
5195 return Context.getVectorType(ElementType, NumElements,
5196 (VectorType::VectorKind)VecKind);
5197 }
5198
5199 case TYPE_EXT_VECTOR: {
5200 if (Record.size() != 3) {
5201 Error("incorrect encoding of extended vector type in AST file");
5202 return QualType();
5203 }
5204
5205 QualType ElementType = readType(*Loc.F, Record, Idx);
5206 unsigned NumElements = Record[1];
5207 return Context.getExtVectorType(ElementType, NumElements);
5208 }
5209
5210 case TYPE_FUNCTION_NO_PROTO: {
5211 if (Record.size() != 6) {
5212 Error("incorrect encoding of no-proto function type");
5213 return QualType();
5214 }
5215 QualType ResultType = readType(*Loc.F, Record, Idx);
5216 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5217 (CallingConv)Record[4], Record[5]);
5218 return Context.getFunctionNoProtoType(ResultType, Info);
5219 }
5220
5221 case TYPE_FUNCTION_PROTO: {
5222 QualType ResultType = readType(*Loc.F, Record, Idx);
5223
5224 FunctionProtoType::ExtProtoInfo EPI;
5225 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5226 /*hasregparm*/ Record[2],
5227 /*regparm*/ Record[3],
5228 static_cast<CallingConv>(Record[4]),
5229 /*produces*/ Record[5]);
5230
5231 unsigned Idx = 6;
5232 unsigned NumParams = Record[Idx++];
5233 SmallVector<QualType, 16> ParamTypes;
5234 for (unsigned I = 0; I != NumParams; ++I)
5235 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5236
5237 EPI.Variadic = Record[Idx++];
5238 EPI.HasTrailingReturn = Record[Idx++];
5239 EPI.TypeQuals = Record[Idx++];
5240 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
5241 SmallVector<QualType, 8> ExceptionStorage;
5242 readExceptionSpec(*Loc.F, ExceptionStorage, EPI, Record, Idx);
5243 return Context.getFunctionType(ResultType, ParamTypes, EPI);
5244 }
5245
5246 case TYPE_UNRESOLVED_USING: {
5247 unsigned Idx = 0;
5248 return Context.getTypeDeclType(
5249 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5250 }
5251
5252 case TYPE_TYPEDEF: {
5253 if (Record.size() != 2) {
5254 Error("incorrect encoding of typedef type");
5255 return QualType();
5256 }
5257 unsigned Idx = 0;
5258 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5259 QualType Canonical = readType(*Loc.F, Record, Idx);
5260 if (!Canonical.isNull())
5261 Canonical = Context.getCanonicalType(Canonical);
5262 return Context.getTypedefType(Decl, Canonical);
5263 }
5264
5265 case TYPE_TYPEOF_EXPR:
5266 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5267
5268 case TYPE_TYPEOF: {
5269 if (Record.size() != 1) {
5270 Error("incorrect encoding of typeof(type) in AST file");
5271 return QualType();
5272 }
5273 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5274 return Context.getTypeOfType(UnderlyingType);
5275 }
5276
5277 case TYPE_DECLTYPE: {
5278 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5279 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5280 }
5281
5282 case TYPE_UNARY_TRANSFORM: {
5283 QualType BaseType = readType(*Loc.F, Record, Idx);
5284 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5285 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5286 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5287 }
5288
5289 case TYPE_AUTO: {
5290 QualType Deduced = readType(*Loc.F, Record, Idx);
5291 bool IsDecltypeAuto = Record[Idx++];
5292 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
5293 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
5294 }
5295
5296 case TYPE_RECORD: {
5297 if (Record.size() != 2) {
5298 Error("incorrect encoding of record type");
5299 return QualType();
5300 }
5301 unsigned Idx = 0;
5302 bool IsDependent = Record[Idx++];
5303 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5304 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5305 QualType T = Context.getRecordType(RD);
5306 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5307 return T;
5308 }
5309
5310 case TYPE_ENUM: {
5311 if (Record.size() != 2) {
5312 Error("incorrect encoding of enum type");
5313 return QualType();
5314 }
5315 unsigned Idx = 0;
5316 bool IsDependent = Record[Idx++];
5317 QualType T
5318 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5319 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5320 return T;
5321 }
5322
5323 case TYPE_ATTRIBUTED: {
5324 if (Record.size() != 3) {
5325 Error("incorrect encoding of attributed type");
5326 return QualType();
5327 }
5328 QualType modifiedType = readType(*Loc.F, Record, Idx);
5329 QualType equivalentType = readType(*Loc.F, Record, Idx);
5330 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5331 return Context.getAttributedType(kind, modifiedType, equivalentType);
5332 }
5333
5334 case TYPE_PAREN: {
5335 if (Record.size() != 1) {
5336 Error("incorrect encoding of paren type");
5337 return QualType();
5338 }
5339 QualType InnerType = readType(*Loc.F, Record, Idx);
5340 return Context.getParenType(InnerType);
5341 }
5342
5343 case TYPE_PACK_EXPANSION: {
5344 if (Record.size() != 2) {
5345 Error("incorrect encoding of pack expansion type");
5346 return QualType();
5347 }
5348 QualType Pattern = readType(*Loc.F, Record, Idx);
5349 if (Pattern.isNull())
5350 return QualType();
5351 Optional<unsigned> NumExpansions;
5352 if (Record[1])
5353 NumExpansions = Record[1] - 1;
5354 return Context.getPackExpansionType(Pattern, NumExpansions);
5355 }
5356
5357 case TYPE_ELABORATED: {
5358 unsigned Idx = 0;
5359 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5360 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5361 QualType NamedType = readType(*Loc.F, Record, Idx);
5362 return Context.getElaboratedType(Keyword, NNS, NamedType);
5363 }
5364
5365 case TYPE_OBJC_INTERFACE: {
5366 unsigned Idx = 0;
5367 ObjCInterfaceDecl *ItfD
5368 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5369 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5370 }
5371
5372 case TYPE_OBJC_OBJECT: {
5373 unsigned Idx = 0;
5374 QualType Base = readType(*Loc.F, Record, Idx);
5375 unsigned NumProtos = Record[Idx++];
5376 SmallVector<ObjCProtocolDecl*, 4> Protos;
5377 for (unsigned I = 0; I != NumProtos; ++I)
5378 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5379 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5380 }
5381
5382 case TYPE_OBJC_OBJECT_POINTER: {
5383 unsigned Idx = 0;
5384 QualType Pointee = readType(*Loc.F, Record, Idx);
5385 return Context.getObjCObjectPointerType(Pointee);
5386 }
5387
5388 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5389 unsigned Idx = 0;
5390 QualType Parm = readType(*Loc.F, Record, Idx);
5391 QualType Replacement = readType(*Loc.F, Record, Idx);
5392 return Context.getSubstTemplateTypeParmType(
5393 cast<TemplateTypeParmType>(Parm),
5394 Context.getCanonicalType(Replacement));
5395 }
5396
5397 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5398 unsigned Idx = 0;
5399 QualType Parm = readType(*Loc.F, Record, Idx);
5400 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5401 return Context.getSubstTemplateTypeParmPackType(
5402 cast<TemplateTypeParmType>(Parm),
5403 ArgPack);
5404 }
5405
5406 case TYPE_INJECTED_CLASS_NAME: {
5407 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5408 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5409 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5410 // for AST reading, too much interdependencies.
5411 const Type *T;
5412 if (const Type *Existing = D->getTypeForDecl())
5413 T = Existing;
5414 else if (auto *Prev = D->getPreviousDecl())
5415 T = Prev->getTypeForDecl();
5416 else
5417 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5418 return QualType(T, 0);
5419 }
5420
5421 case TYPE_TEMPLATE_TYPE_PARM: {
5422 unsigned Idx = 0;
5423 unsigned Depth = Record[Idx++];
5424 unsigned Index = Record[Idx++];
5425 bool Pack = Record[Idx++];
5426 TemplateTypeParmDecl *D
5427 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5428 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5429 }
5430
5431 case TYPE_DEPENDENT_NAME: {
5432 unsigned Idx = 0;
5433 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5434 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5435 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5436 QualType Canon = readType(*Loc.F, Record, Idx);
5437 if (!Canon.isNull())
5438 Canon = Context.getCanonicalType(Canon);
5439 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5440 }
5441
5442 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5443 unsigned Idx = 0;
5444 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5445 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5446 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5447 unsigned NumArgs = Record[Idx++];
5448 SmallVector<TemplateArgument, 8> Args;
5449 Args.reserve(NumArgs);
5450 while (NumArgs--)
5451 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5452 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5453 Args.size(), Args.data());
5454 }
5455
5456 case TYPE_DEPENDENT_SIZED_ARRAY: {
5457 unsigned Idx = 0;
5458
5459 // ArrayType
5460 QualType ElementType = readType(*Loc.F, Record, Idx);
5461 ArrayType::ArraySizeModifier ASM
5462 = (ArrayType::ArraySizeModifier)Record[Idx++];
5463 unsigned IndexTypeQuals = Record[Idx++];
5464
5465 // DependentSizedArrayType
5466 Expr *NumElts = ReadExpr(*Loc.F);
5467 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5468
5469 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5470 IndexTypeQuals, Brackets);
5471 }
5472
5473 case TYPE_TEMPLATE_SPECIALIZATION: {
5474 unsigned Idx = 0;
5475 bool IsDependent = Record[Idx++];
5476 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5477 SmallVector<TemplateArgument, 8> Args;
5478 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5479 QualType Underlying = readType(*Loc.F, Record, Idx);
5480 QualType T;
5481 if (Underlying.isNull())
5482 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5483 Args.size());
5484 else
5485 T = Context.getTemplateSpecializationType(Name, Args.data(),
5486 Args.size(), Underlying);
5487 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5488 return T;
5489 }
5490
5491 case TYPE_ATOMIC: {
5492 if (Record.size() != 1) {
5493 Error("Incorrect encoding of atomic type");
5494 return QualType();
5495 }
5496 QualType ValueType = readType(*Loc.F, Record, Idx);
5497 return Context.getAtomicType(ValueType);
5498 }
5499 }
5500 llvm_unreachable("Invalid TypeCode!");
5501 }
5502
readExceptionSpec(ModuleFile & ModuleFile,SmallVectorImpl<QualType> & Exceptions,FunctionProtoType::ExtProtoInfo & EPI,const RecordData & Record,unsigned & Idx)5503 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5504 SmallVectorImpl<QualType> &Exceptions,
5505 FunctionProtoType::ExtProtoInfo &EPI,
5506 const RecordData &Record, unsigned &Idx) {
5507 ExceptionSpecificationType EST =
5508 static_cast<ExceptionSpecificationType>(Record[Idx++]);
5509 EPI.ExceptionSpecType = EST;
5510 if (EST == EST_Dynamic) {
5511 EPI.NumExceptions = Record[Idx++];
5512 for (unsigned I = 0; I != EPI.NumExceptions; ++I)
5513 Exceptions.push_back(readType(ModuleFile, Record, Idx));
5514 EPI.Exceptions = Exceptions.data();
5515 } else if (EST == EST_ComputedNoexcept) {
5516 EPI.NoexceptExpr = ReadExpr(ModuleFile);
5517 } else if (EST == EST_Uninstantiated) {
5518 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5519 EPI.ExceptionSpecTemplate =
5520 ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5521 } else if (EST == EST_Unevaluated) {
5522 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5523 }
5524 }
5525
5526 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5527 ASTReader &Reader;
5528 ModuleFile &F;
5529 const ASTReader::RecordData &Record;
5530 unsigned &Idx;
5531
ReadSourceLocation(const ASTReader::RecordData & R,unsigned & I)5532 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5533 unsigned &I) {
5534 return Reader.ReadSourceLocation(F, R, I);
5535 }
5536
5537 template<typename T>
ReadDeclAs(const ASTReader::RecordData & Record,unsigned & Idx)5538 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5539 return Reader.ReadDeclAs<T>(F, Record, Idx);
5540 }
5541
5542 public:
TypeLocReader(ASTReader & Reader,ModuleFile & F,const ASTReader::RecordData & Record,unsigned & Idx)5543 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5544 const ASTReader::RecordData &Record, unsigned &Idx)
5545 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5546 { }
5547
5548 // We want compile-time assurance that we've enumerated all of
5549 // these, so unfortunately we have to declare them first, then
5550 // define them out-of-line.
5551 #define ABSTRACT_TYPELOC(CLASS, PARENT)
5552 #define TYPELOC(CLASS, PARENT) \
5553 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5554 #include "clang/AST/TypeLocNodes.def"
5555
5556 void VisitFunctionTypeLoc(FunctionTypeLoc);
5557 void VisitArrayTypeLoc(ArrayTypeLoc);
5558 };
5559
VisitQualifiedTypeLoc(QualifiedTypeLoc TL)5560 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5561 // nothing to do
5562 }
VisitBuiltinTypeLoc(BuiltinTypeLoc TL)5563 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5564 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5565 if (TL.needsExtraLocalData()) {
5566 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5567 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5568 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5569 TL.setModeAttr(Record[Idx++]);
5570 }
5571 }
VisitComplexTypeLoc(ComplexTypeLoc TL)5572 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5573 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5574 }
VisitPointerTypeLoc(PointerTypeLoc TL)5575 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5576 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5577 }
VisitDecayedTypeLoc(DecayedTypeLoc TL)5578 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5579 // nothing to do
5580 }
VisitAdjustedTypeLoc(AdjustedTypeLoc TL)5581 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5582 // nothing to do
5583 }
VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL)5584 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5585 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5586 }
VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL)5587 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5588 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5589 }
VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL)5590 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5591 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5592 }
VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL)5593 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5594 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5595 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5596 }
VisitArrayTypeLoc(ArrayTypeLoc TL)5597 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5598 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5599 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5600 if (Record[Idx++])
5601 TL.setSizeExpr(Reader.ReadExpr(F));
5602 else
5603 TL.setSizeExpr(nullptr);
5604 }
VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL)5605 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5606 VisitArrayTypeLoc(TL);
5607 }
VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL)5608 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5609 VisitArrayTypeLoc(TL);
5610 }
VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL)5611 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5612 VisitArrayTypeLoc(TL);
5613 }
VisitDependentSizedArrayTypeLoc(DependentSizedArrayTypeLoc TL)5614 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5615 DependentSizedArrayTypeLoc TL) {
5616 VisitArrayTypeLoc(TL);
5617 }
VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL)5618 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5619 DependentSizedExtVectorTypeLoc TL) {
5620 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5621 }
VisitVectorTypeLoc(VectorTypeLoc TL)5622 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5623 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5624 }
VisitExtVectorTypeLoc(ExtVectorTypeLoc TL)5625 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5626 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5627 }
VisitFunctionTypeLoc(FunctionTypeLoc TL)5628 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5629 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5630 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5631 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5632 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
5633 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5634 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
5635 }
5636 }
VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL)5637 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5638 VisitFunctionTypeLoc(TL);
5639 }
VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL)5640 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5641 VisitFunctionTypeLoc(TL);
5642 }
VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL)5643 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5644 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5645 }
VisitTypedefTypeLoc(TypedefTypeLoc TL)5646 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5647 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5648 }
VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL)5649 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5650 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5651 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5652 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5653 }
VisitTypeOfTypeLoc(TypeOfTypeLoc TL)5654 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5655 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5656 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5657 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5658 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5659 }
VisitDecltypeTypeLoc(DecltypeTypeLoc TL)5660 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5661 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5662 }
VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL)5663 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5664 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5665 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5666 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5667 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5668 }
VisitAutoTypeLoc(AutoTypeLoc TL)5669 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5670 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5671 }
VisitRecordTypeLoc(RecordTypeLoc TL)5672 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5673 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5674 }
VisitEnumTypeLoc(EnumTypeLoc TL)5675 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5676 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5677 }
VisitAttributedTypeLoc(AttributedTypeLoc TL)5678 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5679 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5680 if (TL.hasAttrOperand()) {
5681 SourceRange range;
5682 range.setBegin(ReadSourceLocation(Record, Idx));
5683 range.setEnd(ReadSourceLocation(Record, Idx));
5684 TL.setAttrOperandParensRange(range);
5685 }
5686 if (TL.hasAttrExprOperand()) {
5687 if (Record[Idx++])
5688 TL.setAttrExprOperand(Reader.ReadExpr(F));
5689 else
5690 TL.setAttrExprOperand(nullptr);
5691 } else if (TL.hasAttrEnumOperand())
5692 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5693 }
VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)5694 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5695 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5696 }
VisitSubstTemplateTypeParmTypeLoc(SubstTemplateTypeParmTypeLoc TL)5697 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5698 SubstTemplateTypeParmTypeLoc TL) {
5699 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5700 }
VisitSubstTemplateTypeParmPackTypeLoc(SubstTemplateTypeParmPackTypeLoc TL)5701 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5702 SubstTemplateTypeParmPackTypeLoc TL) {
5703 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5704 }
VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL)5705 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5706 TemplateSpecializationTypeLoc TL) {
5707 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5708 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5709 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5710 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5711 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5712 TL.setArgLocInfo(i,
5713 Reader.GetTemplateArgumentLocInfo(F,
5714 TL.getTypePtr()->getArg(i).getKind(),
5715 Record, Idx));
5716 }
VisitParenTypeLoc(ParenTypeLoc TL)5717 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5718 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5719 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5720 }
VisitElaboratedTypeLoc(ElaboratedTypeLoc TL)5721 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5722 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5723 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5724 }
VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL)5725 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5726 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5727 }
VisitDependentNameTypeLoc(DependentNameTypeLoc TL)5728 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5729 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5730 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5731 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5732 }
VisitDependentTemplateSpecializationTypeLoc(DependentTemplateSpecializationTypeLoc TL)5733 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5734 DependentTemplateSpecializationTypeLoc TL) {
5735 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5736 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5737 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5738 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5739 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5740 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5741 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5742 TL.setArgLocInfo(I,
5743 Reader.GetTemplateArgumentLocInfo(F,
5744 TL.getTypePtr()->getArg(I).getKind(),
5745 Record, Idx));
5746 }
VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL)5747 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5748 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5749 }
VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL)5750 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5751 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5752 }
VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL)5753 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5754 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5755 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5756 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5757 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5758 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5759 }
VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL)5760 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5761 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5762 }
VisitAtomicTypeLoc(AtomicTypeLoc TL)5763 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5764 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5765 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5766 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5767 }
5768
GetTypeSourceInfo(ModuleFile & F,const RecordData & Record,unsigned & Idx)5769 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5770 const RecordData &Record,
5771 unsigned &Idx) {
5772 QualType InfoTy = readType(F, Record, Idx);
5773 if (InfoTy.isNull())
5774 return nullptr;
5775
5776 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5777 TypeLocReader TLR(*this, F, Record, Idx);
5778 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5779 TLR.Visit(TL);
5780 return TInfo;
5781 }
5782
GetType(TypeID ID)5783 QualType ASTReader::GetType(TypeID ID) {
5784 unsigned FastQuals = ID & Qualifiers::FastMask;
5785 unsigned Index = ID >> Qualifiers::FastWidth;
5786
5787 if (Index < NUM_PREDEF_TYPE_IDS) {
5788 QualType T;
5789 switch ((PredefinedTypeIDs)Index) {
5790 case PREDEF_TYPE_NULL_ID: return QualType();
5791 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5792 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5793
5794 case PREDEF_TYPE_CHAR_U_ID:
5795 case PREDEF_TYPE_CHAR_S_ID:
5796 // FIXME: Check that the signedness of CharTy is correct!
5797 T = Context.CharTy;
5798 break;
5799
5800 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5801 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5802 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5803 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5804 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5805 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5806 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5807 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5808 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5809 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5810 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5811 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5812 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5813 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5814 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5815 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5816 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5817 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5818 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5819 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5820 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5821 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5822 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5823 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5824 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5825 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5826 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5827 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
5828 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5829 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5830 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5831 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5832 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5833 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
5834 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
5835 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
5836 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5837
5838 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5839 T = Context.getAutoRRefDeductType();
5840 break;
5841
5842 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5843 T = Context.ARCUnbridgedCastTy;
5844 break;
5845
5846 case PREDEF_TYPE_VA_LIST_TAG:
5847 T = Context.getVaListTagType();
5848 break;
5849
5850 case PREDEF_TYPE_BUILTIN_FN:
5851 T = Context.BuiltinFnTy;
5852 break;
5853 }
5854
5855 assert(!T.isNull() && "Unknown predefined type");
5856 return T.withFastQualifiers(FastQuals);
5857 }
5858
5859 Index -= NUM_PREDEF_TYPE_IDS;
5860 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5861 if (TypesLoaded[Index].isNull()) {
5862 TypesLoaded[Index] = readTypeRecord(Index);
5863 if (TypesLoaded[Index].isNull())
5864 return QualType();
5865
5866 TypesLoaded[Index]->setFromAST();
5867 if (DeserializationListener)
5868 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5869 TypesLoaded[Index]);
5870 }
5871
5872 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5873 }
5874
getLocalType(ModuleFile & F,unsigned LocalID)5875 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5876 return GetType(getGlobalTypeID(F, LocalID));
5877 }
5878
5879 serialization::TypeID
getGlobalTypeID(ModuleFile & F,unsigned LocalID) const5880 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5881 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5882 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5883
5884 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5885 return LocalID;
5886
5887 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5888 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5889 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5890
5891 unsigned GlobalIndex = LocalIndex + I->second;
5892 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5893 }
5894
5895 TemplateArgumentLocInfo
GetTemplateArgumentLocInfo(ModuleFile & F,TemplateArgument::ArgKind Kind,const RecordData & Record,unsigned & Index)5896 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5897 TemplateArgument::ArgKind Kind,
5898 const RecordData &Record,
5899 unsigned &Index) {
5900 switch (Kind) {
5901 case TemplateArgument::Expression:
5902 return ReadExpr(F);
5903 case TemplateArgument::Type:
5904 return GetTypeSourceInfo(F, Record, Index);
5905 case TemplateArgument::Template: {
5906 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5907 Index);
5908 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5909 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5910 SourceLocation());
5911 }
5912 case TemplateArgument::TemplateExpansion: {
5913 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5914 Index);
5915 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5916 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
5917 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5918 EllipsisLoc);
5919 }
5920 case TemplateArgument::Null:
5921 case TemplateArgument::Integral:
5922 case TemplateArgument::Declaration:
5923 case TemplateArgument::NullPtr:
5924 case TemplateArgument::Pack:
5925 // FIXME: Is this right?
5926 return TemplateArgumentLocInfo();
5927 }
5928 llvm_unreachable("unexpected template argument loc");
5929 }
5930
5931 TemplateArgumentLoc
ReadTemplateArgumentLoc(ModuleFile & F,const RecordData & Record,unsigned & Index)5932 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
5933 const RecordData &Record, unsigned &Index) {
5934 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
5935
5936 if (Arg.getKind() == TemplateArgument::Expression) {
5937 if (Record[Index++]) // bool InfoHasSameExpr.
5938 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
5939 }
5940 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
5941 Record, Index));
5942 }
5943
5944 const ASTTemplateArgumentListInfo*
ReadASTTemplateArgumentListInfo(ModuleFile & F,const RecordData & Record,unsigned & Index)5945 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
5946 const RecordData &Record,
5947 unsigned &Index) {
5948 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
5949 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
5950 unsigned NumArgsAsWritten = Record[Index++];
5951 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
5952 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
5953 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
5954 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
5955 }
5956
GetExternalDecl(uint32_t ID)5957 Decl *ASTReader::GetExternalDecl(uint32_t ID) {
5958 return GetDecl(ID);
5959 }
5960
CompleteRedeclChain(const Decl * D)5961 void ASTReader::CompleteRedeclChain(const Decl *D) {
5962 if (NumCurrentElementsDeserializing) {
5963 // We arrange to not care about the complete redeclaration chain while we're
5964 // deserializing. Just remember that the AST has marked this one as complete
5965 // but that it's not actually complete yet, so we know we still need to
5966 // complete it later.
5967 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
5968 return;
5969 }
5970
5971 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
5972
5973 // Recursively ensure that the decl context itself is complete
5974 // (in particular, this matters if the decl context is a namespace).
5975 //
5976 // FIXME: This should be performed by lookup instead of here.
5977 cast<Decl>(DC)->getMostRecentDecl();
5978
5979 // If this is a named declaration, complete it by looking it up
5980 // within its context.
5981 //
5982 // FIXME: We don't currently handle the cases where we can't do this;
5983 // merging a class definition that contains unnamed entities should merge
5984 // those entities. Likewise, merging a function definition should merge
5985 // all mergeable entities within it.
5986 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
5987 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
5988 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
5989 auto *II = Name.getAsIdentifierInfo();
5990 if (isa<TranslationUnitDecl>(DC) && II) {
5991 // Outside of C++, we don't have a lookup table for the TU, so update
5992 // the identifier instead. In C++, either way should work fine.
5993 if (II->isOutOfDate())
5994 updateOutOfDateIdentifier(*II);
5995 } else
5996 DC->lookup(Name);
5997 }
5998 }
5999 }
6000
readCXXBaseSpecifiers(ModuleFile & M,const RecordData & Record,unsigned & Idx)6001 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6002 const RecordData &Record,
6003 unsigned &Idx) {
6004 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6005 Error("malformed AST file: missing C++ base specifier");
6006 return 0;
6007 }
6008
6009 unsigned LocalID = Record[Idx++];
6010 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6011 }
6012
GetExternalCXXBaseSpecifiers(uint64_t Offset)6013 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6014 RecordLocation Loc = getLocalBitOffset(Offset);
6015 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6016 SavedStreamPosition SavedPosition(Cursor);
6017 Cursor.JumpToBit(Loc.Offset);
6018 ReadingKindTracker ReadingKind(Read_Decl, *this);
6019 RecordData Record;
6020 unsigned Code = Cursor.ReadCode();
6021 unsigned RecCode = Cursor.readRecord(Code, Record);
6022 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
6023 Error("malformed AST file: missing C++ base specifiers");
6024 return nullptr;
6025 }
6026
6027 unsigned Idx = 0;
6028 unsigned NumBases = Record[Idx++];
6029 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6030 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6031 for (unsigned I = 0; I != NumBases; ++I)
6032 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6033 return Bases;
6034 }
6035
6036 serialization::DeclID
getGlobalDeclID(ModuleFile & F,LocalDeclID LocalID) const6037 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6038 if (LocalID < NUM_PREDEF_DECL_IDS)
6039 return LocalID;
6040
6041 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6042 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6043 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6044
6045 return LocalID + I->second;
6046 }
6047
isDeclIDFromModule(serialization::GlobalDeclID ID,ModuleFile & M) const6048 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6049 ModuleFile &M) const {
6050 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6051 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6052 return &M == I->second;
6053 }
6054
getOwningModuleFile(const Decl * D)6055 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
6056 if (!D->isFromASTFile())
6057 return nullptr;
6058 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6059 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6060 return I->second;
6061 }
6062
getSourceLocationForDeclID(GlobalDeclID ID)6063 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6064 if (ID < NUM_PREDEF_DECL_IDS)
6065 return SourceLocation();
6066
6067 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6068
6069 if (Index > DeclsLoaded.size()) {
6070 Error("declaration ID out-of-range for AST file");
6071 return SourceLocation();
6072 }
6073
6074 if (Decl *D = DeclsLoaded[Index])
6075 return D->getLocation();
6076
6077 unsigned RawLocation = 0;
6078 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6079 return ReadSourceLocation(*Rec.F, RawLocation);
6080 }
6081
GetExistingDecl(DeclID ID)6082 Decl *ASTReader::GetExistingDecl(DeclID ID) {
6083 if (ID < NUM_PREDEF_DECL_IDS) {
6084 switch ((PredefinedDeclIDs)ID) {
6085 case PREDEF_DECL_NULL_ID:
6086 return nullptr;
6087
6088 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6089 return Context.getTranslationUnitDecl();
6090
6091 case PREDEF_DECL_OBJC_ID_ID:
6092 return Context.getObjCIdDecl();
6093
6094 case PREDEF_DECL_OBJC_SEL_ID:
6095 return Context.getObjCSelDecl();
6096
6097 case PREDEF_DECL_OBJC_CLASS_ID:
6098 return Context.getObjCClassDecl();
6099
6100 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6101 return Context.getObjCProtocolDecl();
6102
6103 case PREDEF_DECL_INT_128_ID:
6104 return Context.getInt128Decl();
6105
6106 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6107 return Context.getUInt128Decl();
6108
6109 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6110 return Context.getObjCInstanceTypeDecl();
6111
6112 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6113 return Context.getBuiltinVaListDecl();
6114 }
6115 }
6116
6117 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6118
6119 if (Index >= DeclsLoaded.size()) {
6120 assert(0 && "declaration ID out-of-range for AST file");
6121 Error("declaration ID out-of-range for AST file");
6122 return nullptr;
6123 }
6124
6125 return DeclsLoaded[Index];
6126 }
6127
GetDecl(DeclID ID)6128 Decl *ASTReader::GetDecl(DeclID ID) {
6129 if (ID < NUM_PREDEF_DECL_IDS)
6130 return GetExistingDecl(ID);
6131
6132 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6133
6134 if (Index >= DeclsLoaded.size()) {
6135 assert(0 && "declaration ID out-of-range for AST file");
6136 Error("declaration ID out-of-range for AST file");
6137 return nullptr;
6138 }
6139
6140 if (!DeclsLoaded[Index]) {
6141 ReadDeclRecord(ID);
6142 if (DeserializationListener)
6143 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6144 }
6145
6146 return DeclsLoaded[Index];
6147 }
6148
mapGlobalIDToModuleFileGlobalID(ModuleFile & M,DeclID GlobalID)6149 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6150 DeclID GlobalID) {
6151 if (GlobalID < NUM_PREDEF_DECL_IDS)
6152 return GlobalID;
6153
6154 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6155 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6156 ModuleFile *Owner = I->second;
6157
6158 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6159 = M.GlobalToLocalDeclIDs.find(Owner);
6160 if (Pos == M.GlobalToLocalDeclIDs.end())
6161 return 0;
6162
6163 return GlobalID - Owner->BaseDeclID + Pos->second;
6164 }
6165
ReadDeclID(ModuleFile & F,const RecordData & Record,unsigned & Idx)6166 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6167 const RecordData &Record,
6168 unsigned &Idx) {
6169 if (Idx >= Record.size()) {
6170 Error("Corrupted AST file");
6171 return 0;
6172 }
6173
6174 return getGlobalDeclID(F, Record[Idx++]);
6175 }
6176
6177 /// \brief Resolve the offset of a statement into a statement.
6178 ///
6179 /// This operation will read a new statement from the external
6180 /// source each time it is called, and is meant to be used via a
6181 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
GetExternalDeclStmt(uint64_t Offset)6182 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6183 // Switch case IDs are per Decl.
6184 ClearSwitchCaseIDs();
6185
6186 // Offset here is a global offset across the entire chain.
6187 RecordLocation Loc = getLocalBitOffset(Offset);
6188 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6189 return ReadStmtFromStream(*Loc.F);
6190 }
6191
6192 namespace {
6193 class FindExternalLexicalDeclsVisitor {
6194 ASTReader &Reader;
6195 const DeclContext *DC;
6196 bool (*isKindWeWant)(Decl::Kind);
6197
6198 SmallVectorImpl<Decl*> &Decls;
6199 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6200
6201 public:
FindExternalLexicalDeclsVisitor(ASTReader & Reader,const DeclContext * DC,bool (* isKindWeWant)(Decl::Kind),SmallVectorImpl<Decl * > & Decls)6202 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6203 bool (*isKindWeWant)(Decl::Kind),
6204 SmallVectorImpl<Decl*> &Decls)
6205 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6206 {
6207 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6208 PredefsVisited[I] = false;
6209 }
6210
visit(ModuleFile & M,bool Preorder,void * UserData)6211 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6212 if (Preorder)
6213 return false;
6214
6215 FindExternalLexicalDeclsVisitor *This
6216 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6217
6218 ModuleFile::DeclContextInfosMap::iterator Info
6219 = M.DeclContextInfos.find(This->DC);
6220 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6221 return false;
6222
6223 // Load all of the declaration IDs
6224 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6225 *IDE = ID + Info->second.NumLexicalDecls;
6226 ID != IDE; ++ID) {
6227 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6228 continue;
6229
6230 // Don't add predefined declarations to the lexical context more
6231 // than once.
6232 if (ID->second < NUM_PREDEF_DECL_IDS) {
6233 if (This->PredefsVisited[ID->second])
6234 continue;
6235
6236 This->PredefsVisited[ID->second] = true;
6237 }
6238
6239 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6240 if (!This->DC->isDeclInLexicalTraversal(D))
6241 This->Decls.push_back(D);
6242 }
6243 }
6244
6245 return false;
6246 }
6247 };
6248 }
6249
FindExternalLexicalDecls(const DeclContext * DC,bool (* isKindWeWant)(Decl::Kind),SmallVectorImpl<Decl * > & Decls)6250 ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6251 bool (*isKindWeWant)(Decl::Kind),
6252 SmallVectorImpl<Decl*> &Decls) {
6253 // There might be lexical decls in multiple modules, for the TU at
6254 // least. Walk all of the modules in the order they were loaded.
6255 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6256 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6257 ++NumLexicalDeclContextsRead;
6258 return ELR_Success;
6259 }
6260
6261 namespace {
6262
6263 class DeclIDComp {
6264 ASTReader &Reader;
6265 ModuleFile &Mod;
6266
6267 public:
DeclIDComp(ASTReader & Reader,ModuleFile & M)6268 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6269
operator ()(LocalDeclID L,LocalDeclID R) const6270 bool operator()(LocalDeclID L, LocalDeclID R) const {
6271 SourceLocation LHS = getLocation(L);
6272 SourceLocation RHS = getLocation(R);
6273 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6274 }
6275
operator ()(SourceLocation LHS,LocalDeclID R) const6276 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6277 SourceLocation RHS = getLocation(R);
6278 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6279 }
6280
operator ()(LocalDeclID L,SourceLocation RHS) const6281 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6282 SourceLocation LHS = getLocation(L);
6283 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6284 }
6285
getLocation(LocalDeclID ID) const6286 SourceLocation getLocation(LocalDeclID ID) const {
6287 return Reader.getSourceManager().getFileLoc(
6288 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6289 }
6290 };
6291
6292 }
6293
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)6294 void ASTReader::FindFileRegionDecls(FileID File,
6295 unsigned Offset, unsigned Length,
6296 SmallVectorImpl<Decl *> &Decls) {
6297 SourceManager &SM = getSourceManager();
6298
6299 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6300 if (I == FileDeclIDs.end())
6301 return;
6302
6303 FileDeclsInfo &DInfo = I->second;
6304 if (DInfo.Decls.empty())
6305 return;
6306
6307 SourceLocation
6308 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6309 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6310
6311 DeclIDComp DIDComp(*this, *DInfo.Mod);
6312 ArrayRef<serialization::LocalDeclID>::iterator
6313 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6314 BeginLoc, DIDComp);
6315 if (BeginIt != DInfo.Decls.begin())
6316 --BeginIt;
6317
6318 // If we are pointing at a top-level decl inside an objc container, we need
6319 // to backtrack until we find it otherwise we will fail to report that the
6320 // region overlaps with an objc container.
6321 while (BeginIt != DInfo.Decls.begin() &&
6322 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6323 ->isTopLevelDeclInObjCContainer())
6324 --BeginIt;
6325
6326 ArrayRef<serialization::LocalDeclID>::iterator
6327 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6328 EndLoc, DIDComp);
6329 if (EndIt != DInfo.Decls.end())
6330 ++EndIt;
6331
6332 for (ArrayRef<serialization::LocalDeclID>::iterator
6333 DIt = BeginIt; DIt != EndIt; ++DIt)
6334 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6335 }
6336
6337 namespace {
6338 /// \brief ModuleFile visitor used to perform name lookup into a
6339 /// declaration context.
6340 class DeclContextNameLookupVisitor {
6341 ASTReader &Reader;
6342 SmallVectorImpl<const DeclContext *> &Contexts;
6343 DeclarationName Name;
6344 SmallVectorImpl<NamedDecl *> &Decls;
6345
6346 public:
DeclContextNameLookupVisitor(ASTReader & Reader,SmallVectorImpl<const DeclContext * > & Contexts,DeclarationName Name,SmallVectorImpl<NamedDecl * > & Decls)6347 DeclContextNameLookupVisitor(ASTReader &Reader,
6348 SmallVectorImpl<const DeclContext *> &Contexts,
6349 DeclarationName Name,
6350 SmallVectorImpl<NamedDecl *> &Decls)
6351 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6352
visit(ModuleFile & M,void * UserData)6353 static bool visit(ModuleFile &M, void *UserData) {
6354 DeclContextNameLookupVisitor *This
6355 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6356
6357 // Check whether we have any visible declaration information for
6358 // this context in this module.
6359 ModuleFile::DeclContextInfosMap::iterator Info;
6360 bool FoundInfo = false;
6361 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6362 Info = M.DeclContextInfos.find(This->Contexts[I]);
6363 if (Info != M.DeclContextInfos.end() &&
6364 Info->second.NameLookupTableData) {
6365 FoundInfo = true;
6366 break;
6367 }
6368 }
6369
6370 if (!FoundInfo)
6371 return false;
6372
6373 // Look for this name within this module.
6374 ASTDeclContextNameLookupTable *LookupTable =
6375 Info->second.NameLookupTableData;
6376 ASTDeclContextNameLookupTable::iterator Pos
6377 = LookupTable->find(This->Name);
6378 if (Pos == LookupTable->end())
6379 return false;
6380
6381 bool FoundAnything = false;
6382 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6383 for (; Data.first != Data.second; ++Data.first) {
6384 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6385 if (!ND)
6386 continue;
6387
6388 if (ND->getDeclName() != This->Name) {
6389 // A name might be null because the decl's redeclarable part is
6390 // currently read before reading its name. The lookup is triggered by
6391 // building that decl (likely indirectly), and so it is later in the
6392 // sense of "already existing" and can be ignored here.
6393 continue;
6394 }
6395
6396 // Record this declaration.
6397 FoundAnything = true;
6398 This->Decls.push_back(ND);
6399 }
6400
6401 return FoundAnything;
6402 }
6403 };
6404 }
6405
6406 /// \brief Retrieve the "definitive" module file for the definition of the
6407 /// given declaration context, if there is one.
6408 ///
6409 /// The "definitive" module file is the only place where we need to look to
6410 /// find information about the declarations within the given declaration
6411 /// context. For example, C++ and Objective-C classes, C structs/unions, and
6412 /// Objective-C protocols, categories, and extensions are all defined in a
6413 /// single place in the source code, so they have definitive module files
6414 /// associated with them. C++ namespaces, on the other hand, can have
6415 /// definitions in multiple different module files.
6416 ///
6417 /// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6418 /// NDEBUG checking.
getDefinitiveModuleFileFor(const DeclContext * DC,ASTReader & Reader)6419 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6420 ASTReader &Reader) {
6421 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6422 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
6423
6424 return nullptr;
6425 }
6426
6427 bool
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)6428 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6429 DeclarationName Name) {
6430 assert(DC->hasExternalVisibleStorage() &&
6431 "DeclContext has no visible decls in storage");
6432 if (!Name)
6433 return false;
6434
6435 SmallVector<NamedDecl *, 64> Decls;
6436
6437 // Compute the declaration contexts we need to look into. Multiple such
6438 // declaration contexts occur when two declaration contexts from disjoint
6439 // modules get merged, e.g., when two namespaces with the same name are
6440 // independently defined in separate modules.
6441 SmallVector<const DeclContext *, 2> Contexts;
6442 Contexts.push_back(DC);
6443
6444 if (DC->isNamespace()) {
6445 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6446 if (Merged != MergedDecls.end()) {
6447 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6448 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6449 }
6450 }
6451 if (isa<CXXRecordDecl>(DC)) {
6452 auto Merged = MergedLookups.find(DC);
6453 if (Merged != MergedLookups.end())
6454 Contexts.insert(Contexts.end(), Merged->second.begin(),
6455 Merged->second.end());
6456 }
6457
6458 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
6459
6460 // If we can definitively determine which module file to look into,
6461 // only look there. Otherwise, look in all module files.
6462 ModuleFile *Definitive;
6463 if (Contexts.size() == 1 &&
6464 (Definitive = getDefinitiveModuleFileFor(DC, *this))) {
6465 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6466 } else {
6467 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6468 }
6469 ++NumVisibleDeclContextsRead;
6470 SetExternalVisibleDeclsForName(DC, Name, Decls);
6471 return !Decls.empty();
6472 }
6473
6474 namespace {
6475 /// \brief ModuleFile visitor used to retrieve all visible names in a
6476 /// declaration context.
6477 class DeclContextAllNamesVisitor {
6478 ASTReader &Reader;
6479 SmallVectorImpl<const DeclContext *> &Contexts;
6480 DeclsMap &Decls;
6481 bool VisitAll;
6482
6483 public:
DeclContextAllNamesVisitor(ASTReader & Reader,SmallVectorImpl<const DeclContext * > & Contexts,DeclsMap & Decls,bool VisitAll)6484 DeclContextAllNamesVisitor(ASTReader &Reader,
6485 SmallVectorImpl<const DeclContext *> &Contexts,
6486 DeclsMap &Decls, bool VisitAll)
6487 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
6488
visit(ModuleFile & M,void * UserData)6489 static bool visit(ModuleFile &M, void *UserData) {
6490 DeclContextAllNamesVisitor *This
6491 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6492
6493 // Check whether we have any visible declaration information for
6494 // this context in this module.
6495 ModuleFile::DeclContextInfosMap::iterator Info;
6496 bool FoundInfo = false;
6497 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6498 Info = M.DeclContextInfos.find(This->Contexts[I]);
6499 if (Info != M.DeclContextInfos.end() &&
6500 Info->second.NameLookupTableData) {
6501 FoundInfo = true;
6502 break;
6503 }
6504 }
6505
6506 if (!FoundInfo)
6507 return false;
6508
6509 ASTDeclContextNameLookupTable *LookupTable =
6510 Info->second.NameLookupTableData;
6511 bool FoundAnything = false;
6512 for (ASTDeclContextNameLookupTable::data_iterator
6513 I = LookupTable->data_begin(), E = LookupTable->data_end();
6514 I != E;
6515 ++I) {
6516 ASTDeclContextNameLookupTrait::data_type Data = *I;
6517 for (; Data.first != Data.second; ++Data.first) {
6518 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6519 *Data.first);
6520 if (!ND)
6521 continue;
6522
6523 // Record this declaration.
6524 FoundAnything = true;
6525 This->Decls[ND->getDeclName()].push_back(ND);
6526 }
6527 }
6528
6529 return FoundAnything && !This->VisitAll;
6530 }
6531 };
6532 }
6533
completeVisibleDeclsMap(const DeclContext * DC)6534 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6535 if (!DC->hasExternalVisibleStorage())
6536 return;
6537 DeclsMap Decls;
6538
6539 // Compute the declaration contexts we need to look into. Multiple such
6540 // declaration contexts occur when two declaration contexts from disjoint
6541 // modules get merged, e.g., when two namespaces with the same name are
6542 // independently defined in separate modules.
6543 SmallVector<const DeclContext *, 2> Contexts;
6544 Contexts.push_back(DC);
6545
6546 if (DC->isNamespace()) {
6547 MergedDeclsMap::iterator Merged
6548 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6549 if (Merged != MergedDecls.end()) {
6550 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6551 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6552 }
6553 }
6554
6555 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6556 /*VisitAll=*/DC->isFileContext());
6557 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6558 ++NumVisibleDeclContextsRead;
6559
6560 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
6561 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6562 }
6563 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6564 }
6565
6566 /// \brief Under non-PCH compilation the consumer receives the objc methods
6567 /// before receiving the implementation, and codegen depends on this.
6568 /// We simulate this by deserializing and passing to consumer the methods of the
6569 /// implementation before passing the deserialized implementation decl.
PassObjCImplDeclToConsumer(ObjCImplDecl * ImplD,ASTConsumer * Consumer)6570 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6571 ASTConsumer *Consumer) {
6572 assert(ImplD && Consumer);
6573
6574 for (auto *I : ImplD->methods())
6575 Consumer->HandleInterestingDecl(DeclGroupRef(I));
6576
6577 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6578 }
6579
PassInterestingDeclsToConsumer()6580 void ASTReader::PassInterestingDeclsToConsumer() {
6581 assert(Consumer);
6582
6583 if (PassingDeclsToConsumer)
6584 return;
6585
6586 // Guard variable to avoid recursively redoing the process of passing
6587 // decls to consumer.
6588 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6589 true);
6590
6591 while (!InterestingDecls.empty()) {
6592 Decl *D = InterestingDecls.front();
6593 InterestingDecls.pop_front();
6594
6595 PassInterestingDeclToConsumer(D);
6596 }
6597 }
6598
PassInterestingDeclToConsumer(Decl * D)6599 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6600 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6601 PassObjCImplDeclToConsumer(ImplD, Consumer);
6602 else
6603 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6604 }
6605
StartTranslationUnit(ASTConsumer * Consumer)6606 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6607 this->Consumer = Consumer;
6608
6609 if (!Consumer)
6610 return;
6611
6612 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
6613 // Force deserialization of this decl, which will cause it to be queued for
6614 // passing to the consumer.
6615 GetDecl(EagerlyDeserializedDecls[I]);
6616 }
6617 EagerlyDeserializedDecls.clear();
6618
6619 PassInterestingDeclsToConsumer();
6620 }
6621
PrintStats()6622 void ASTReader::PrintStats() {
6623 std::fprintf(stderr, "*** AST File Statistics:\n");
6624
6625 unsigned NumTypesLoaded
6626 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6627 QualType());
6628 unsigned NumDeclsLoaded
6629 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
6630 (Decl *)nullptr);
6631 unsigned NumIdentifiersLoaded
6632 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6633 IdentifiersLoaded.end(),
6634 (IdentifierInfo *)nullptr);
6635 unsigned NumMacrosLoaded
6636 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6637 MacrosLoaded.end(),
6638 (MacroInfo *)nullptr);
6639 unsigned NumSelectorsLoaded
6640 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6641 SelectorsLoaded.end(),
6642 Selector());
6643
6644 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6645 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6646 NumSLocEntriesRead, TotalNumSLocEntries,
6647 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6648 if (!TypesLoaded.empty())
6649 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6650 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6651 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6652 if (!DeclsLoaded.empty())
6653 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6654 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6655 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6656 if (!IdentifiersLoaded.empty())
6657 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6658 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6659 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6660 if (!MacrosLoaded.empty())
6661 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6662 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6663 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6664 if (!SelectorsLoaded.empty())
6665 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6666 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6667 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6668 if (TotalNumStatements)
6669 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6670 NumStatementsRead, TotalNumStatements,
6671 ((float)NumStatementsRead/TotalNumStatements * 100));
6672 if (TotalNumMacros)
6673 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6674 NumMacrosRead, TotalNumMacros,
6675 ((float)NumMacrosRead/TotalNumMacros * 100));
6676 if (TotalLexicalDeclContexts)
6677 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6678 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6679 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6680 * 100));
6681 if (TotalVisibleDeclContexts)
6682 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6683 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6684 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6685 * 100));
6686 if (TotalNumMethodPoolEntries) {
6687 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6688 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6689 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6690 * 100));
6691 }
6692 if (NumMethodPoolLookups) {
6693 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6694 NumMethodPoolHits, NumMethodPoolLookups,
6695 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6696 }
6697 if (NumMethodPoolTableLookups) {
6698 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6699 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6700 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6701 * 100.0));
6702 }
6703
6704 if (NumIdentifierLookupHits) {
6705 std::fprintf(stderr,
6706 " %u / %u identifier table lookups succeeded (%f%%)\n",
6707 NumIdentifierLookupHits, NumIdentifierLookups,
6708 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6709 }
6710
6711 if (GlobalIndex) {
6712 std::fprintf(stderr, "\n");
6713 GlobalIndex->printStats();
6714 }
6715
6716 std::fprintf(stderr, "\n");
6717 dump();
6718 std::fprintf(stderr, "\n");
6719 }
6720
6721 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6722 static void
dumpModuleIDMap(StringRef Name,const ContinuousRangeMap<Key,ModuleFile *,InitialCapacity> & Map)6723 dumpModuleIDMap(StringRef Name,
6724 const ContinuousRangeMap<Key, ModuleFile *,
6725 InitialCapacity> &Map) {
6726 if (Map.begin() == Map.end())
6727 return;
6728
6729 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6730 llvm::errs() << Name << ":\n";
6731 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6732 I != IEnd; ++I) {
6733 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6734 << "\n";
6735 }
6736 }
6737
dump()6738 void ASTReader::dump() {
6739 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6740 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6741 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6742 dumpModuleIDMap("Global type map", GlobalTypeMap);
6743 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6744 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6745 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6746 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6747 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6748 dumpModuleIDMap("Global preprocessed entity map",
6749 GlobalPreprocessedEntityMap);
6750
6751 llvm::errs() << "\n*** PCH/Modules Loaded:";
6752 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6753 MEnd = ModuleMgr.end();
6754 M != MEnd; ++M)
6755 (*M)->dump();
6756 }
6757
6758 /// Return the amount of memory used by memory buffers, breaking down
6759 /// by heap-backed versus mmap'ed memory.
getMemoryBufferSizes(MemoryBufferSizes & sizes) const6760 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6761 for (ModuleConstIterator I = ModuleMgr.begin(),
6762 E = ModuleMgr.end(); I != E; ++I) {
6763 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6764 size_t bytes = buf->getBufferSize();
6765 switch (buf->getBufferKind()) {
6766 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6767 sizes.malloc_bytes += bytes;
6768 break;
6769 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6770 sizes.mmap_bytes += bytes;
6771 break;
6772 }
6773 }
6774 }
6775 }
6776
InitializeSema(Sema & S)6777 void ASTReader::InitializeSema(Sema &S) {
6778 SemaObj = &S;
6779 S.addExternalSource(this);
6780
6781 // Makes sure any declarations that were deserialized "too early"
6782 // still get added to the identifier's declaration chains.
6783 for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
6784 pushExternalDeclIntoScope(PreloadedDecls[I],
6785 PreloadedDecls[I]->getDeclName());
6786 }
6787 PreloadedDecls.clear();
6788
6789 // FIXME: What happens if these are changed by a module import?
6790 if (!FPPragmaOptions.empty()) {
6791 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6792 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6793 }
6794
6795 // FIXME: What happens if these are changed by a module import?
6796 if (!OpenCLExtensions.empty()) {
6797 unsigned I = 0;
6798 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6799 #include "clang/Basic/OpenCLExtensions.def"
6800
6801 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6802 }
6803
6804 UpdateSema();
6805 }
6806
UpdateSema()6807 void ASTReader::UpdateSema() {
6808 assert(SemaObj && "no Sema to update");
6809
6810 // Load the offsets of the declarations that Sema references.
6811 // They will be lazily deserialized when needed.
6812 if (!SemaDeclRefs.empty()) {
6813 assert(SemaDeclRefs.size() % 2 == 0);
6814 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6815 if (!SemaObj->StdNamespace)
6816 SemaObj->StdNamespace = SemaDeclRefs[I];
6817 if (!SemaObj->StdBadAlloc)
6818 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6819 }
6820 SemaDeclRefs.clear();
6821 }
6822
6823 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6824 // encountered the pragma in the source.
6825 if(OptimizeOffPragmaLocation.isValid())
6826 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
6827 }
6828
get(const char * NameStart,const char * NameEnd)6829 IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6830 // Note that we are loading an identifier.
6831 Deserializing AnIdentifier(this);
6832 StringRef Name(NameStart, NameEnd - NameStart);
6833
6834 // If there is a global index, look there first to determine which modules
6835 // provably do not have any results for this identifier.
6836 GlobalModuleIndex::HitSet Hits;
6837 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
6838 if (!loadGlobalIndex()) {
6839 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6840 HitsPtr = &Hits;
6841 }
6842 }
6843 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
6844 NumIdentifierLookups,
6845 NumIdentifierLookupHits);
6846 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
6847 IdentifierInfo *II = Visitor.getIdentifierInfo();
6848 markIdentifierUpToDate(II);
6849 return II;
6850 }
6851
6852 namespace clang {
6853 /// \brief An identifier-lookup iterator that enumerates all of the
6854 /// identifiers stored within a set of AST files.
6855 class ASTIdentifierIterator : public IdentifierIterator {
6856 /// \brief The AST reader whose identifiers are being enumerated.
6857 const ASTReader &Reader;
6858
6859 /// \brief The current index into the chain of AST files stored in
6860 /// the AST reader.
6861 unsigned Index;
6862
6863 /// \brief The current position within the identifier lookup table
6864 /// of the current AST file.
6865 ASTIdentifierLookupTable::key_iterator Current;
6866
6867 /// \brief The end position within the identifier lookup table of
6868 /// the current AST file.
6869 ASTIdentifierLookupTable::key_iterator End;
6870
6871 public:
6872 explicit ASTIdentifierIterator(const ASTReader &Reader);
6873
6874 StringRef Next() override;
6875 };
6876 }
6877
ASTIdentifierIterator(const ASTReader & Reader)6878 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6879 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6880 ASTIdentifierLookupTable *IdTable
6881 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6882 Current = IdTable->key_begin();
6883 End = IdTable->key_end();
6884 }
6885
Next()6886 StringRef ASTIdentifierIterator::Next() {
6887 while (Current == End) {
6888 // If we have exhausted all of our AST files, we're done.
6889 if (Index == 0)
6890 return StringRef();
6891
6892 --Index;
6893 ASTIdentifierLookupTable *IdTable
6894 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
6895 IdentifierLookupTable;
6896 Current = IdTable->key_begin();
6897 End = IdTable->key_end();
6898 }
6899
6900 // We have any identifiers remaining in the current AST file; return
6901 // the next one.
6902 StringRef Result = *Current;
6903 ++Current;
6904 return Result;
6905 }
6906
getIdentifiers()6907 IdentifierIterator *ASTReader::getIdentifiers() {
6908 if (!loadGlobalIndex())
6909 return GlobalIndex->createIdentifierIterator();
6910
6911 return new ASTIdentifierIterator(*this);
6912 }
6913
6914 namespace clang { namespace serialization {
6915 class ReadMethodPoolVisitor {
6916 ASTReader &Reader;
6917 Selector Sel;
6918 unsigned PriorGeneration;
6919 unsigned InstanceBits;
6920 unsigned FactoryBits;
6921 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
6922 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
6923
6924 public:
ReadMethodPoolVisitor(ASTReader & Reader,Selector Sel,unsigned PriorGeneration)6925 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
6926 unsigned PriorGeneration)
6927 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
6928 InstanceBits(0), FactoryBits(0) { }
6929
visit(ModuleFile & M,void * UserData)6930 static bool visit(ModuleFile &M, void *UserData) {
6931 ReadMethodPoolVisitor *This
6932 = static_cast<ReadMethodPoolVisitor *>(UserData);
6933
6934 if (!M.SelectorLookupTable)
6935 return false;
6936
6937 // If we've already searched this module file, skip it now.
6938 if (M.Generation <= This->PriorGeneration)
6939 return true;
6940
6941 ++This->Reader.NumMethodPoolTableLookups;
6942 ASTSelectorLookupTable *PoolTable
6943 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
6944 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
6945 if (Pos == PoolTable->end())
6946 return false;
6947
6948 ++This->Reader.NumMethodPoolTableHits;
6949 ++This->Reader.NumSelectorsRead;
6950 // FIXME: Not quite happy with the statistics here. We probably should
6951 // disable this tracking when called via LoadSelector.
6952 // Also, should entries without methods count as misses?
6953 ++This->Reader.NumMethodPoolEntriesRead;
6954 ASTSelectorLookupTrait::data_type Data = *Pos;
6955 if (This->Reader.DeserializationListener)
6956 This->Reader.DeserializationListener->SelectorRead(Data.ID,
6957 This->Sel);
6958
6959 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
6960 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
6961 This->InstanceBits = Data.InstanceBits;
6962 This->FactoryBits = Data.FactoryBits;
6963 return true;
6964 }
6965
6966 /// \brief Retrieve the instance methods found by this visitor.
getInstanceMethods() const6967 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
6968 return InstanceMethods;
6969 }
6970
6971 /// \brief Retrieve the instance methods found by this visitor.
getFactoryMethods() const6972 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
6973 return FactoryMethods;
6974 }
6975
getInstanceBits() const6976 unsigned getInstanceBits() const { return InstanceBits; }
getFactoryBits() const6977 unsigned getFactoryBits() const { return FactoryBits; }
6978 };
6979 } } // end namespace clang::serialization
6980
6981 /// \brief Add the given set of methods to the method list.
addMethodsToPool(Sema & S,ArrayRef<ObjCMethodDecl * > Methods,ObjCMethodList & List)6982 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
6983 ObjCMethodList &List) {
6984 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
6985 S.addMethodToGlobalList(&List, Methods[I]);
6986 }
6987 }
6988
ReadMethodPool(Selector Sel)6989 void ASTReader::ReadMethodPool(Selector Sel) {
6990 // Get the selector generation and update it to the current generation.
6991 unsigned &Generation = SelectorGeneration[Sel];
6992 unsigned PriorGeneration = Generation;
6993 Generation = getGeneration();
6994
6995 // Search for methods defined with this selector.
6996 ++NumMethodPoolLookups;
6997 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
6998 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
6999
7000 if (Visitor.getInstanceMethods().empty() &&
7001 Visitor.getFactoryMethods().empty())
7002 return;
7003
7004 ++NumMethodPoolHits;
7005
7006 if (!getSema())
7007 return;
7008
7009 Sema &S = *getSema();
7010 Sema::GlobalMethodPool::iterator Pos
7011 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7012
7013 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7014 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
7015 Pos->second.first.setBits(Visitor.getInstanceBits());
7016 Pos->second.second.setBits(Visitor.getFactoryBits());
7017 }
7018
ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl * > & Namespaces)7019 void ASTReader::ReadKnownNamespaces(
7020 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7021 Namespaces.clear();
7022
7023 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7024 if (NamespaceDecl *Namespace
7025 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7026 Namespaces.push_back(Namespace);
7027 }
7028 }
7029
ReadUndefinedButUsed(llvm::DenseMap<NamedDecl *,SourceLocation> & Undefined)7030 void ASTReader::ReadUndefinedButUsed(
7031 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
7032 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7033 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
7034 SourceLocation Loc =
7035 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
7036 Undefined.insert(std::make_pair(D, Loc));
7037 }
7038 }
7039
ReadTentativeDefinitions(SmallVectorImpl<VarDecl * > & TentativeDefs)7040 void ASTReader::ReadTentativeDefinitions(
7041 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7042 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7043 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7044 if (Var)
7045 TentativeDefs.push_back(Var);
7046 }
7047 TentativeDefinitions.clear();
7048 }
7049
ReadUnusedFileScopedDecls(SmallVectorImpl<const DeclaratorDecl * > & Decls)7050 void ASTReader::ReadUnusedFileScopedDecls(
7051 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7052 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7053 DeclaratorDecl *D
7054 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7055 if (D)
7056 Decls.push_back(D);
7057 }
7058 UnusedFileScopedDecls.clear();
7059 }
7060
ReadDelegatingConstructors(SmallVectorImpl<CXXConstructorDecl * > & Decls)7061 void ASTReader::ReadDelegatingConstructors(
7062 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7063 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7064 CXXConstructorDecl *D
7065 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7066 if (D)
7067 Decls.push_back(D);
7068 }
7069 DelegatingCtorDecls.clear();
7070 }
7071
ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl * > & Decls)7072 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7073 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7074 TypedefNameDecl *D
7075 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7076 if (D)
7077 Decls.push_back(D);
7078 }
7079 ExtVectorDecls.clear();
7080 }
7081
ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl * > & Decls)7082 void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7083 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7084 CXXRecordDecl *D
7085 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7086 if (D)
7087 Decls.push_back(D);
7088 }
7089 DynamicClasses.clear();
7090 }
7091
7092 void
ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl * > & Decls)7093 ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7094 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7095 NamedDecl *D
7096 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
7097 if (D)
7098 Decls.push_back(D);
7099 }
7100 LocallyScopedExternCDecls.clear();
7101 }
7102
ReadReferencedSelectors(SmallVectorImpl<std::pair<Selector,SourceLocation>> & Sels)7103 void ASTReader::ReadReferencedSelectors(
7104 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7105 if (ReferencedSelectorsData.empty())
7106 return;
7107
7108 // If there are @selector references added them to its pool. This is for
7109 // implementation of -Wselector.
7110 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7111 unsigned I = 0;
7112 while (I < DataSize) {
7113 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7114 SourceLocation SelLoc
7115 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7116 Sels.push_back(std::make_pair(Sel, SelLoc));
7117 }
7118 ReferencedSelectorsData.clear();
7119 }
7120
ReadWeakUndeclaredIdentifiers(SmallVectorImpl<std::pair<IdentifierInfo *,WeakInfo>> & WeakIDs)7121 void ASTReader::ReadWeakUndeclaredIdentifiers(
7122 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7123 if (WeakUndeclaredIdentifiers.empty())
7124 return;
7125
7126 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7127 IdentifierInfo *WeakId
7128 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7129 IdentifierInfo *AliasId
7130 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7131 SourceLocation Loc
7132 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7133 bool Used = WeakUndeclaredIdentifiers[I++];
7134 WeakInfo WI(AliasId, Loc);
7135 WI.setUsed(Used);
7136 WeakIDs.push_back(std::make_pair(WeakId, WI));
7137 }
7138 WeakUndeclaredIdentifiers.clear();
7139 }
7140
ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> & VTables)7141 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7142 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7143 ExternalVTableUse VT;
7144 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7145 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7146 VT.DefinitionRequired = VTableUses[Idx++];
7147 VTables.push_back(VT);
7148 }
7149
7150 VTableUses.clear();
7151 }
7152
ReadPendingInstantiations(SmallVectorImpl<std::pair<ValueDecl *,SourceLocation>> & Pending)7153 void ASTReader::ReadPendingInstantiations(
7154 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7155 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7156 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7157 SourceLocation Loc
7158 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7159
7160 Pending.push_back(std::make_pair(D, Loc));
7161 }
7162 PendingInstantiations.clear();
7163 }
7164
ReadLateParsedTemplates(llvm::DenseMap<const FunctionDecl *,LateParsedTemplate * > & LPTMap)7165 void ASTReader::ReadLateParsedTemplates(
7166 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7167 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7168 /* In loop */) {
7169 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7170
7171 LateParsedTemplate *LT = new LateParsedTemplate;
7172 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7173
7174 ModuleFile *F = getOwningModuleFile(LT->D);
7175 assert(F && "No module");
7176
7177 unsigned TokN = LateParsedTemplates[Idx++];
7178 LT->Toks.reserve(TokN);
7179 for (unsigned T = 0; T < TokN; ++T)
7180 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7181
7182 LPTMap[FD] = LT;
7183 }
7184
7185 LateParsedTemplates.clear();
7186 }
7187
LoadSelector(Selector Sel)7188 void ASTReader::LoadSelector(Selector Sel) {
7189 // It would be complicated to avoid reading the methods anyway. So don't.
7190 ReadMethodPool(Sel);
7191 }
7192
SetIdentifierInfo(IdentifierID ID,IdentifierInfo * II)7193 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7194 assert(ID && "Non-zero identifier ID required");
7195 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7196 IdentifiersLoaded[ID - 1] = II;
7197 if (DeserializationListener)
7198 DeserializationListener->IdentifierRead(ID, II);
7199 }
7200
7201 /// \brief Set the globally-visible declarations associated with the given
7202 /// identifier.
7203 ///
7204 /// If the AST reader is currently in a state where the given declaration IDs
7205 /// cannot safely be resolved, they are queued until it is safe to resolve
7206 /// them.
7207 ///
7208 /// \param II an IdentifierInfo that refers to one or more globally-visible
7209 /// declarations.
7210 ///
7211 /// \param DeclIDs the set of declaration IDs with the name @p II that are
7212 /// visible at global scope.
7213 ///
7214 /// \param Decls if non-null, this vector will be populated with the set of
7215 /// deserialized declarations. These declarations will not be pushed into
7216 /// scope.
7217 void
SetGloballyVisibleDecls(IdentifierInfo * II,const SmallVectorImpl<uint32_t> & DeclIDs,SmallVectorImpl<Decl * > * Decls)7218 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7219 const SmallVectorImpl<uint32_t> &DeclIDs,
7220 SmallVectorImpl<Decl *> *Decls) {
7221 if (NumCurrentElementsDeserializing && !Decls) {
7222 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
7223 return;
7224 }
7225
7226 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7227 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7228 if (SemaObj) {
7229 // If we're simply supposed to record the declarations, do so now.
7230 if (Decls) {
7231 Decls->push_back(D);
7232 continue;
7233 }
7234
7235 // Introduce this declaration into the translation-unit scope
7236 // and add it to the declaration chain for this identifier, so
7237 // that (unqualified) name lookup will find it.
7238 pushExternalDeclIntoScope(D, II);
7239 } else {
7240 // Queue this declaration so that it will be added to the
7241 // translation unit scope and identifier's declaration chain
7242 // once a Sema object is known.
7243 PreloadedDecls.push_back(D);
7244 }
7245 }
7246 }
7247
DecodeIdentifierInfo(IdentifierID ID)7248 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
7249 if (ID == 0)
7250 return nullptr;
7251
7252 if (IdentifiersLoaded.empty()) {
7253 Error("no identifier table in AST file");
7254 return nullptr;
7255 }
7256
7257 ID -= 1;
7258 if (!IdentifiersLoaded[ID]) {
7259 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7260 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7261 ModuleFile *M = I->second;
7262 unsigned Index = ID - M->BaseIdentifierID;
7263 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7264
7265 // All of the strings in the AST file are preceded by a 16-bit length.
7266 // Extract that 16-bit length to avoid having to execute strlen().
7267 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7268 // unsigned integers. This is important to avoid integer overflow when
7269 // we cast them to 'unsigned'.
7270 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7271 unsigned StrLen = (((unsigned) StrLenPtr[0])
7272 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
7273 IdentifiersLoaded[ID]
7274 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
7275 if (DeserializationListener)
7276 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7277 }
7278
7279 return IdentifiersLoaded[ID];
7280 }
7281
getLocalIdentifier(ModuleFile & M,unsigned LocalID)7282 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7283 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
7284 }
7285
getGlobalIdentifierID(ModuleFile & M,unsigned LocalID)7286 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7287 if (LocalID < NUM_PREDEF_IDENT_IDS)
7288 return LocalID;
7289
7290 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7291 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7292 assert(I != M.IdentifierRemap.end()
7293 && "Invalid index into identifier index remap");
7294
7295 return LocalID + I->second;
7296 }
7297
getMacro(MacroID ID)7298 MacroInfo *ASTReader::getMacro(MacroID ID) {
7299 if (ID == 0)
7300 return nullptr;
7301
7302 if (MacrosLoaded.empty()) {
7303 Error("no macro table in AST file");
7304 return nullptr;
7305 }
7306
7307 ID -= NUM_PREDEF_MACRO_IDS;
7308 if (!MacrosLoaded[ID]) {
7309 GlobalMacroMapType::iterator I
7310 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7311 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7312 ModuleFile *M = I->second;
7313 unsigned Index = ID - M->BaseMacroID;
7314 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7315
7316 if (DeserializationListener)
7317 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7318 MacrosLoaded[ID]);
7319 }
7320
7321 return MacrosLoaded[ID];
7322 }
7323
getGlobalMacroID(ModuleFile & M,unsigned LocalID)7324 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7325 if (LocalID < NUM_PREDEF_MACRO_IDS)
7326 return LocalID;
7327
7328 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7329 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7330 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7331
7332 return LocalID + I->second;
7333 }
7334
7335 serialization::SubmoduleID
getGlobalSubmoduleID(ModuleFile & M,unsigned LocalID)7336 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7337 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7338 return LocalID;
7339
7340 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7341 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7342 assert(I != M.SubmoduleRemap.end()
7343 && "Invalid index into submodule index remap");
7344
7345 return LocalID + I->second;
7346 }
7347
getSubmodule(SubmoduleID GlobalID)7348 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7349 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7350 assert(GlobalID == 0 && "Unhandled global submodule ID");
7351 return nullptr;
7352 }
7353
7354 if (GlobalID > SubmodulesLoaded.size()) {
7355 Error("submodule ID out of range in AST file");
7356 return nullptr;
7357 }
7358
7359 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7360 }
7361
getModule(unsigned ID)7362 Module *ASTReader::getModule(unsigned ID) {
7363 return getSubmodule(ID);
7364 }
7365
getLocalSelector(ModuleFile & M,unsigned LocalID)7366 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7367 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7368 }
7369
DecodeSelector(serialization::SelectorID ID)7370 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7371 if (ID == 0)
7372 return Selector();
7373
7374 if (ID > SelectorsLoaded.size()) {
7375 Error("selector ID out of range in AST file");
7376 return Selector();
7377 }
7378
7379 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
7380 // Load this selector from the selector table.
7381 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7382 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7383 ModuleFile &M = *I->second;
7384 ASTSelectorLookupTrait Trait(*this, M);
7385 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7386 SelectorsLoaded[ID - 1] =
7387 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7388 if (DeserializationListener)
7389 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7390 }
7391
7392 return SelectorsLoaded[ID - 1];
7393 }
7394
GetExternalSelector(serialization::SelectorID ID)7395 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7396 return DecodeSelector(ID);
7397 }
7398
GetNumExternalSelectors()7399 uint32_t ASTReader::GetNumExternalSelectors() {
7400 // ID 0 (the null selector) is considered an external selector.
7401 return getTotalNumSelectors() + 1;
7402 }
7403
7404 serialization::SelectorID
getGlobalSelectorID(ModuleFile & M,unsigned LocalID) const7405 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7406 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7407 return LocalID;
7408
7409 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7410 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7411 assert(I != M.SelectorRemap.end()
7412 && "Invalid index into selector index remap");
7413
7414 return LocalID + I->second;
7415 }
7416
7417 DeclarationName
ReadDeclarationName(ModuleFile & F,const RecordData & Record,unsigned & Idx)7418 ASTReader::ReadDeclarationName(ModuleFile &F,
7419 const RecordData &Record, unsigned &Idx) {
7420 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7421 switch (Kind) {
7422 case DeclarationName::Identifier:
7423 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
7424
7425 case DeclarationName::ObjCZeroArgSelector:
7426 case DeclarationName::ObjCOneArgSelector:
7427 case DeclarationName::ObjCMultiArgSelector:
7428 return DeclarationName(ReadSelector(F, Record, Idx));
7429
7430 case DeclarationName::CXXConstructorName:
7431 return Context.DeclarationNames.getCXXConstructorName(
7432 Context.getCanonicalType(readType(F, Record, Idx)));
7433
7434 case DeclarationName::CXXDestructorName:
7435 return Context.DeclarationNames.getCXXDestructorName(
7436 Context.getCanonicalType(readType(F, Record, Idx)));
7437
7438 case DeclarationName::CXXConversionFunctionName:
7439 return Context.DeclarationNames.getCXXConversionFunctionName(
7440 Context.getCanonicalType(readType(F, Record, Idx)));
7441
7442 case DeclarationName::CXXOperatorName:
7443 return Context.DeclarationNames.getCXXOperatorName(
7444 (OverloadedOperatorKind)Record[Idx++]);
7445
7446 case DeclarationName::CXXLiteralOperatorName:
7447 return Context.DeclarationNames.getCXXLiteralOperatorName(
7448 GetIdentifierInfo(F, Record, Idx));
7449
7450 case DeclarationName::CXXUsingDirective:
7451 return DeclarationName::getUsingDirectiveName();
7452 }
7453
7454 llvm_unreachable("Invalid NameKind!");
7455 }
7456
ReadDeclarationNameLoc(ModuleFile & F,DeclarationNameLoc & DNLoc,DeclarationName Name,const RecordData & Record,unsigned & Idx)7457 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7458 DeclarationNameLoc &DNLoc,
7459 DeclarationName Name,
7460 const RecordData &Record, unsigned &Idx) {
7461 switch (Name.getNameKind()) {
7462 case DeclarationName::CXXConstructorName:
7463 case DeclarationName::CXXDestructorName:
7464 case DeclarationName::CXXConversionFunctionName:
7465 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7466 break;
7467
7468 case DeclarationName::CXXOperatorName:
7469 DNLoc.CXXOperatorName.BeginOpNameLoc
7470 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7471 DNLoc.CXXOperatorName.EndOpNameLoc
7472 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7473 break;
7474
7475 case DeclarationName::CXXLiteralOperatorName:
7476 DNLoc.CXXLiteralOperatorName.OpNameLoc
7477 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7478 break;
7479
7480 case DeclarationName::Identifier:
7481 case DeclarationName::ObjCZeroArgSelector:
7482 case DeclarationName::ObjCOneArgSelector:
7483 case DeclarationName::ObjCMultiArgSelector:
7484 case DeclarationName::CXXUsingDirective:
7485 break;
7486 }
7487 }
7488
ReadDeclarationNameInfo(ModuleFile & F,DeclarationNameInfo & NameInfo,const RecordData & Record,unsigned & Idx)7489 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7490 DeclarationNameInfo &NameInfo,
7491 const RecordData &Record, unsigned &Idx) {
7492 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7493 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7494 DeclarationNameLoc DNLoc;
7495 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7496 NameInfo.setInfo(DNLoc);
7497 }
7498
ReadQualifierInfo(ModuleFile & F,QualifierInfo & Info,const RecordData & Record,unsigned & Idx)7499 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7500 const RecordData &Record, unsigned &Idx) {
7501 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7502 unsigned NumTPLists = Record[Idx++];
7503 Info.NumTemplParamLists = NumTPLists;
7504 if (NumTPLists) {
7505 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7506 for (unsigned i=0; i != NumTPLists; ++i)
7507 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7508 }
7509 }
7510
7511 TemplateName
ReadTemplateName(ModuleFile & F,const RecordData & Record,unsigned & Idx)7512 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7513 unsigned &Idx) {
7514 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7515 switch (Kind) {
7516 case TemplateName::Template:
7517 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7518
7519 case TemplateName::OverloadedTemplate: {
7520 unsigned size = Record[Idx++];
7521 UnresolvedSet<8> Decls;
7522 while (size--)
7523 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7524
7525 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7526 }
7527
7528 case TemplateName::QualifiedTemplate: {
7529 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7530 bool hasTemplKeyword = Record[Idx++];
7531 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7532 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7533 }
7534
7535 case TemplateName::DependentTemplate: {
7536 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7537 if (Record[Idx++]) // isIdentifier
7538 return Context.getDependentTemplateName(NNS,
7539 GetIdentifierInfo(F, Record,
7540 Idx));
7541 return Context.getDependentTemplateName(NNS,
7542 (OverloadedOperatorKind)Record[Idx++]);
7543 }
7544
7545 case TemplateName::SubstTemplateTemplateParm: {
7546 TemplateTemplateParmDecl *param
7547 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7548 if (!param) return TemplateName();
7549 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7550 return Context.getSubstTemplateTemplateParm(param, replacement);
7551 }
7552
7553 case TemplateName::SubstTemplateTemplateParmPack: {
7554 TemplateTemplateParmDecl *Param
7555 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7556 if (!Param)
7557 return TemplateName();
7558
7559 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7560 if (ArgPack.getKind() != TemplateArgument::Pack)
7561 return TemplateName();
7562
7563 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7564 }
7565 }
7566
7567 llvm_unreachable("Unhandled template name kind!");
7568 }
7569
7570 TemplateArgument
ReadTemplateArgument(ModuleFile & F,const RecordData & Record,unsigned & Idx)7571 ASTReader::ReadTemplateArgument(ModuleFile &F,
7572 const RecordData &Record, unsigned &Idx) {
7573 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7574 switch (Kind) {
7575 case TemplateArgument::Null:
7576 return TemplateArgument();
7577 case TemplateArgument::Type:
7578 return TemplateArgument(readType(F, Record, Idx));
7579 case TemplateArgument::Declaration: {
7580 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7581 bool ForReferenceParam = Record[Idx++];
7582 return TemplateArgument(D, ForReferenceParam);
7583 }
7584 case TemplateArgument::NullPtr:
7585 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7586 case TemplateArgument::Integral: {
7587 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7588 QualType T = readType(F, Record, Idx);
7589 return TemplateArgument(Context, Value, T);
7590 }
7591 case TemplateArgument::Template:
7592 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7593 case TemplateArgument::TemplateExpansion: {
7594 TemplateName Name = ReadTemplateName(F, Record, Idx);
7595 Optional<unsigned> NumTemplateExpansions;
7596 if (unsigned NumExpansions = Record[Idx++])
7597 NumTemplateExpansions = NumExpansions - 1;
7598 return TemplateArgument(Name, NumTemplateExpansions);
7599 }
7600 case TemplateArgument::Expression:
7601 return TemplateArgument(ReadExpr(F));
7602 case TemplateArgument::Pack: {
7603 unsigned NumArgs = Record[Idx++];
7604 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7605 for (unsigned I = 0; I != NumArgs; ++I)
7606 Args[I] = ReadTemplateArgument(F, Record, Idx);
7607 return TemplateArgument(Args, NumArgs);
7608 }
7609 }
7610
7611 llvm_unreachable("Unhandled template argument kind!");
7612 }
7613
7614 TemplateParameterList *
ReadTemplateParameterList(ModuleFile & F,const RecordData & Record,unsigned & Idx)7615 ASTReader::ReadTemplateParameterList(ModuleFile &F,
7616 const RecordData &Record, unsigned &Idx) {
7617 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7618 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7619 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7620
7621 unsigned NumParams = Record[Idx++];
7622 SmallVector<NamedDecl *, 16> Params;
7623 Params.reserve(NumParams);
7624 while (NumParams--)
7625 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7626
7627 TemplateParameterList* TemplateParams =
7628 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7629 Params.data(), Params.size(), RAngleLoc);
7630 return TemplateParams;
7631 }
7632
7633 void
7634 ASTReader::
ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> & TemplArgs,ModuleFile & F,const RecordData & Record,unsigned & Idx)7635 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
7636 ModuleFile &F, const RecordData &Record,
7637 unsigned &Idx) {
7638 unsigned NumTemplateArgs = Record[Idx++];
7639 TemplArgs.reserve(NumTemplateArgs);
7640 while (NumTemplateArgs--)
7641 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7642 }
7643
7644 /// \brief Read a UnresolvedSet structure.
ReadUnresolvedSet(ModuleFile & F,LazyASTUnresolvedSet & Set,const RecordData & Record,unsigned & Idx)7645 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
7646 const RecordData &Record, unsigned &Idx) {
7647 unsigned NumDecls = Record[Idx++];
7648 Set.reserve(Context, NumDecls);
7649 while (NumDecls--) {
7650 DeclID ID = ReadDeclID(F, Record, Idx);
7651 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
7652 Set.addLazyDecl(Context, ID, AS);
7653 }
7654 }
7655
7656 CXXBaseSpecifier
ReadCXXBaseSpecifier(ModuleFile & F,const RecordData & Record,unsigned & Idx)7657 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7658 const RecordData &Record, unsigned &Idx) {
7659 bool isVirtual = static_cast<bool>(Record[Idx++]);
7660 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7661 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7662 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7663 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7664 SourceRange Range = ReadSourceRange(F, Record, Idx);
7665 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7666 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7667 EllipsisLoc);
7668 Result.setInheritConstructors(inheritConstructors);
7669 return Result;
7670 }
7671
7672 std::pair<CXXCtorInitializer **, unsigned>
ReadCXXCtorInitializers(ModuleFile & F,const RecordData & Record,unsigned & Idx)7673 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7674 unsigned &Idx) {
7675 CXXCtorInitializer **CtorInitializers = nullptr;
7676 unsigned NumInitializers = Record[Idx++];
7677 if (NumInitializers) {
7678 CtorInitializers
7679 = new (Context) CXXCtorInitializer*[NumInitializers];
7680 for (unsigned i=0; i != NumInitializers; ++i) {
7681 TypeSourceInfo *TInfo = nullptr;
7682 bool IsBaseVirtual = false;
7683 FieldDecl *Member = nullptr;
7684 IndirectFieldDecl *IndirectMember = nullptr;
7685
7686 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7687 switch (Type) {
7688 case CTOR_INITIALIZER_BASE:
7689 TInfo = GetTypeSourceInfo(F, Record, Idx);
7690 IsBaseVirtual = Record[Idx++];
7691 break;
7692
7693 case CTOR_INITIALIZER_DELEGATING:
7694 TInfo = GetTypeSourceInfo(F, Record, Idx);
7695 break;
7696
7697 case CTOR_INITIALIZER_MEMBER:
7698 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7699 break;
7700
7701 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7702 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7703 break;
7704 }
7705
7706 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7707 Expr *Init = ReadExpr(F);
7708 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7709 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7710 bool IsWritten = Record[Idx++];
7711 unsigned SourceOrderOrNumArrayIndices;
7712 SmallVector<VarDecl *, 8> Indices;
7713 if (IsWritten) {
7714 SourceOrderOrNumArrayIndices = Record[Idx++];
7715 } else {
7716 SourceOrderOrNumArrayIndices = Record[Idx++];
7717 Indices.reserve(SourceOrderOrNumArrayIndices);
7718 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7719 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7720 }
7721
7722 CXXCtorInitializer *BOMInit;
7723 if (Type == CTOR_INITIALIZER_BASE) {
7724 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7725 LParenLoc, Init, RParenLoc,
7726 MemberOrEllipsisLoc);
7727 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7728 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7729 Init, RParenLoc);
7730 } else if (IsWritten) {
7731 if (Member)
7732 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7733 LParenLoc, Init, RParenLoc);
7734 else
7735 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7736 MemberOrEllipsisLoc, LParenLoc,
7737 Init, RParenLoc);
7738 } else {
7739 if (IndirectMember) {
7740 assert(Indices.empty() && "Indirect field improperly initialized");
7741 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7742 MemberOrEllipsisLoc, LParenLoc,
7743 Init, RParenLoc);
7744 } else {
7745 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7746 LParenLoc, Init, RParenLoc,
7747 Indices.data(), Indices.size());
7748 }
7749 }
7750
7751 if (IsWritten)
7752 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7753 CtorInitializers[i] = BOMInit;
7754 }
7755 }
7756
7757 return std::make_pair(CtorInitializers, NumInitializers);
7758 }
7759
7760 NestedNameSpecifier *
ReadNestedNameSpecifier(ModuleFile & F,const RecordData & Record,unsigned & Idx)7761 ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7762 const RecordData &Record, unsigned &Idx) {
7763 unsigned N = Record[Idx++];
7764 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
7765 for (unsigned I = 0; I != N; ++I) {
7766 NestedNameSpecifier::SpecifierKind Kind
7767 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7768 switch (Kind) {
7769 case NestedNameSpecifier::Identifier: {
7770 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7771 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7772 break;
7773 }
7774
7775 case NestedNameSpecifier::Namespace: {
7776 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7777 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7778 break;
7779 }
7780
7781 case NestedNameSpecifier::NamespaceAlias: {
7782 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7783 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7784 break;
7785 }
7786
7787 case NestedNameSpecifier::TypeSpec:
7788 case NestedNameSpecifier::TypeSpecWithTemplate: {
7789 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7790 if (!T)
7791 return nullptr;
7792
7793 bool Template = Record[Idx++];
7794 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7795 break;
7796 }
7797
7798 case NestedNameSpecifier::Global: {
7799 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7800 // No associated value, and there can't be a prefix.
7801 break;
7802 }
7803 }
7804 Prev = NNS;
7805 }
7806 return NNS;
7807 }
7808
7809 NestedNameSpecifierLoc
ReadNestedNameSpecifierLoc(ModuleFile & F,const RecordData & Record,unsigned & Idx)7810 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7811 unsigned &Idx) {
7812 unsigned N = Record[Idx++];
7813 NestedNameSpecifierLocBuilder Builder;
7814 for (unsigned I = 0; I != N; ++I) {
7815 NestedNameSpecifier::SpecifierKind Kind
7816 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7817 switch (Kind) {
7818 case NestedNameSpecifier::Identifier: {
7819 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7820 SourceRange Range = ReadSourceRange(F, Record, Idx);
7821 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7822 break;
7823 }
7824
7825 case NestedNameSpecifier::Namespace: {
7826 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7827 SourceRange Range = ReadSourceRange(F, Record, Idx);
7828 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7829 break;
7830 }
7831
7832 case NestedNameSpecifier::NamespaceAlias: {
7833 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7834 SourceRange Range = ReadSourceRange(F, Record, Idx);
7835 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7836 break;
7837 }
7838
7839 case NestedNameSpecifier::TypeSpec:
7840 case NestedNameSpecifier::TypeSpecWithTemplate: {
7841 bool Template = Record[Idx++];
7842 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7843 if (!T)
7844 return NestedNameSpecifierLoc();
7845 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7846
7847 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7848 Builder.Extend(Context,
7849 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7850 T->getTypeLoc(), ColonColonLoc);
7851 break;
7852 }
7853
7854 case NestedNameSpecifier::Global: {
7855 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7856 Builder.MakeGlobal(Context, ColonColonLoc);
7857 break;
7858 }
7859 }
7860 }
7861
7862 return Builder.getWithLocInContext(Context);
7863 }
7864
7865 SourceRange
ReadSourceRange(ModuleFile & F,const RecordData & Record,unsigned & Idx)7866 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
7867 unsigned &Idx) {
7868 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
7869 SourceLocation end = ReadSourceLocation(F, Record, Idx);
7870 return SourceRange(beg, end);
7871 }
7872
7873 /// \brief Read an integral value
ReadAPInt(const RecordData & Record,unsigned & Idx)7874 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
7875 unsigned BitWidth = Record[Idx++];
7876 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
7877 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
7878 Idx += NumWords;
7879 return Result;
7880 }
7881
7882 /// \brief Read a signed integral value
ReadAPSInt(const RecordData & Record,unsigned & Idx)7883 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
7884 bool isUnsigned = Record[Idx++];
7885 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
7886 }
7887
7888 /// \brief Read a floating-point value
ReadAPFloat(const RecordData & Record,const llvm::fltSemantics & Sem,unsigned & Idx)7889 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
7890 const llvm::fltSemantics &Sem,
7891 unsigned &Idx) {
7892 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
7893 }
7894
7895 // \brief Read a string
ReadString(const RecordData & Record,unsigned & Idx)7896 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
7897 unsigned Len = Record[Idx++];
7898 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
7899 Idx += Len;
7900 return Result;
7901 }
7902
ReadVersionTuple(const RecordData & Record,unsigned & Idx)7903 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
7904 unsigned &Idx) {
7905 unsigned Major = Record[Idx++];
7906 unsigned Minor = Record[Idx++];
7907 unsigned Subminor = Record[Idx++];
7908 if (Minor == 0)
7909 return VersionTuple(Major);
7910 if (Subminor == 0)
7911 return VersionTuple(Major, Minor - 1);
7912 return VersionTuple(Major, Minor - 1, Subminor - 1);
7913 }
7914
ReadCXXTemporary(ModuleFile & F,const RecordData & Record,unsigned & Idx)7915 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
7916 const RecordData &Record,
7917 unsigned &Idx) {
7918 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
7919 return CXXTemporary::Create(Context, Decl);
7920 }
7921
Diag(unsigned DiagID)7922 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
7923 return Diag(CurrentImportLoc, DiagID);
7924 }
7925
Diag(SourceLocation Loc,unsigned DiagID)7926 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
7927 return Diags.Report(Loc, DiagID);
7928 }
7929
7930 /// \brief Retrieve the identifier table associated with the
7931 /// preprocessor.
getIdentifierTable()7932 IdentifierTable &ASTReader::getIdentifierTable() {
7933 return PP.getIdentifierTable();
7934 }
7935
7936 /// \brief Record that the given ID maps to the given switch-case
7937 /// statement.
RecordSwitchCaseID(SwitchCase * SC,unsigned ID)7938 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
7939 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
7940 "Already have a SwitchCase with this ID");
7941 (*CurrSwitchCaseStmts)[ID] = SC;
7942 }
7943
7944 /// \brief Retrieve the switch-case statement with the given ID.
getSwitchCaseWithID(unsigned ID)7945 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
7946 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
7947 return (*CurrSwitchCaseStmts)[ID];
7948 }
7949
ClearSwitchCaseIDs()7950 void ASTReader::ClearSwitchCaseIDs() {
7951 CurrSwitchCaseStmts->clear();
7952 }
7953
ReadComments()7954 void ASTReader::ReadComments() {
7955 std::vector<RawComment *> Comments;
7956 for (SmallVectorImpl<std::pair<BitstreamCursor,
7957 serialization::ModuleFile *> >::iterator
7958 I = CommentsCursors.begin(),
7959 E = CommentsCursors.end();
7960 I != E; ++I) {
7961 Comments.clear();
7962 BitstreamCursor &Cursor = I->first;
7963 serialization::ModuleFile &F = *I->second;
7964 SavedStreamPosition SavedPosition(Cursor);
7965
7966 RecordData Record;
7967 while (true) {
7968 llvm::BitstreamEntry Entry =
7969 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
7970
7971 switch (Entry.Kind) {
7972 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
7973 case llvm::BitstreamEntry::Error:
7974 Error("malformed block record in AST file");
7975 return;
7976 case llvm::BitstreamEntry::EndBlock:
7977 goto NextCursor;
7978 case llvm::BitstreamEntry::Record:
7979 // The interesting case.
7980 break;
7981 }
7982
7983 // Read a record.
7984 Record.clear();
7985 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
7986 case COMMENTS_RAW_COMMENT: {
7987 unsigned Idx = 0;
7988 SourceRange SR = ReadSourceRange(F, Record, Idx);
7989 RawComment::CommentKind Kind =
7990 (RawComment::CommentKind) Record[Idx++];
7991 bool IsTrailingComment = Record[Idx++];
7992 bool IsAlmostTrailingComment = Record[Idx++];
7993 Comments.push_back(new (Context) RawComment(
7994 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
7995 Context.getLangOpts().CommentOpts.ParseAllComments));
7996 break;
7997 }
7998 }
7999 }
8000 NextCursor:
8001 Context.Comments.addDeserializedComments(Comments);
8002 }
8003 }
8004
getOwningModuleNameForDiagnostic(const Decl * D)8005 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8006 // If we know the owning module, use it.
8007 if (Module *M = D->getOwningModule())
8008 return M->getFullModuleName();
8009
8010 // Otherwise, use the name of the top-level module the decl is within.
8011 if (ModuleFile *M = getOwningModuleFile(D))
8012 return M->ModuleName;
8013
8014 // Not from a module.
8015 return "";
8016 }
8017
finishPendingActions()8018 void ASTReader::finishPendingActions() {
8019 while (!PendingIdentifierInfos.empty() ||
8020 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
8021 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
8022 !PendingUpdateRecords.empty() || !PendingOdrMergeChecks.empty()) {
8023 // If any identifiers with corresponding top-level declarations have
8024 // been loaded, load those declarations now.
8025 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8026 TopLevelDeclsMap;
8027 TopLevelDeclsMap TopLevelDecls;
8028
8029 while (!PendingIdentifierInfos.empty()) {
8030 IdentifierInfo *II = PendingIdentifierInfos.back().first;
8031 SmallVector<uint32_t, 4> DeclIDs =
8032 std::move(PendingIdentifierInfos.back().second);
8033 PendingIdentifierInfos.pop_back();
8034
8035 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
8036 }
8037
8038 // For each decl chain that we wanted to complete while deserializing, mark
8039 // it as "still needs to be completed".
8040 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8041 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8042 }
8043 PendingIncompleteDeclChains.clear();
8044
8045 // Load pending declaration chains.
8046 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8047 loadPendingDeclChain(PendingDeclChains[I]);
8048 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8049 }
8050 PendingDeclChains.clear();
8051
8052 // Make the most recent of the top-level declarations visible.
8053 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8054 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
8055 IdentifierInfo *II = TLD->first;
8056 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
8057 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
8058 }
8059 }
8060
8061 // Load any pending macro definitions.
8062 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
8063 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8064 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8065 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8066 // Initialize the macro history from chained-PCHs ahead of module imports.
8067 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8068 ++IDIdx) {
8069 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8070 if (Info.M->Kind != MK_Module)
8071 resolvePendingMacro(II, Info);
8072 }
8073 // Handle module imports.
8074 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8075 ++IDIdx) {
8076 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8077 if (Info.M->Kind == MK_Module)
8078 resolvePendingMacro(II, Info);
8079 }
8080 }
8081 PendingMacroIDs.clear();
8082
8083 // Wire up the DeclContexts for Decls that we delayed setting until
8084 // recursive loading is completed.
8085 while (!PendingDeclContextInfos.empty()) {
8086 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8087 PendingDeclContextInfos.pop_front();
8088 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8089 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8090 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8091 }
8092
8093 // Perform any pending declaration updates.
8094 //
8095 // Don't do this if we have known-incomplete redecl chains: it relies on
8096 // being able to walk redeclaration chains.
8097 while (PendingDeclChains.empty() && !PendingUpdateRecords.empty()) {
8098 auto Update = PendingUpdateRecords.pop_back_val();
8099 ReadingKindTracker ReadingKind(Read_Decl, *this);
8100 loadDeclUpdateRecords(Update.first, Update.second);
8101 }
8102
8103 // Trigger the import of the full definition of each class that had any
8104 // odr-merging problems, so we can produce better diagnostics for them.
8105 for (auto &Merge : PendingOdrMergeFailures) {
8106 Merge.first->buildLookup();
8107 Merge.first->decls_begin();
8108 Merge.first->bases_begin();
8109 Merge.first->vbases_begin();
8110 for (auto *RD : Merge.second) {
8111 RD->decls_begin();
8112 RD->bases_begin();
8113 RD->vbases_begin();
8114 }
8115 }
8116
8117 // For each declaration from a merged context, check that the canonical
8118 // definition of that context also contains a declaration of the same
8119 // entity.
8120 while (!PendingOdrMergeChecks.empty()) {
8121 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8122
8123 // FIXME: Skip over implicit declarations for now. This matters for things
8124 // like implicitly-declared special member functions. This isn't entirely
8125 // correct; we can end up with multiple unmerged declarations of the same
8126 // implicit entity.
8127 if (D->isImplicit())
8128 continue;
8129
8130 DeclContext *CanonDef = D->getDeclContext();
8131 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
8132
8133 bool Found = false;
8134 const Decl *DCanon = D->getCanonicalDecl();
8135
8136 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8137 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8138 !Found && I != E; ++I) {
8139 for (auto RI : (*I)->redecls()) {
8140 if (RI->getLexicalDeclContext() == CanonDef) {
8141 // This declaration is present in the canonical definition. If it's
8142 // in the same redecl chain, it's the one we're looking for.
8143 if (RI->getCanonicalDecl() == DCanon)
8144 Found = true;
8145 else
8146 Candidates.push_back(cast<NamedDecl>(RI));
8147 break;
8148 }
8149 }
8150 }
8151
8152 if (!Found) {
8153 D->setInvalidDecl();
8154
8155 std::string CanonDefModule =
8156 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8157 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8158 << D << getOwningModuleNameForDiagnostic(D)
8159 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8160
8161 if (Candidates.empty())
8162 Diag(cast<Decl>(CanonDef)->getLocation(),
8163 diag::note_module_odr_violation_no_possible_decls) << D;
8164 else {
8165 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8166 Diag(Candidates[I]->getLocation(),
8167 diag::note_module_odr_violation_possible_decl)
8168 << Candidates[I];
8169 }
8170
8171 DiagnosedOdrMergeFailures.insert(CanonDef);
8172 }
8173 }
8174 }
8175
8176 // If we deserialized any C++ or Objective-C class definitions, any
8177 // Objective-C protocol definitions, or any redeclarable templates, make sure
8178 // that all redeclarations point to the definitions. Note that this can only
8179 // happen now, after the redeclaration chains have been fully wired.
8180 for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
8181 DEnd = PendingDefinitions.end();
8182 D != DEnd; ++D) {
8183 if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
8184 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
8185 // Make sure that the TagType points at the definition.
8186 const_cast<TagType*>(TagT)->decl = TD;
8187 }
8188
8189 if (auto RD = dyn_cast<CXXRecordDecl>(*D)) {
8190 for (auto R : RD->redecls())
8191 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
8192 }
8193
8194 continue;
8195 }
8196
8197 if (auto ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
8198 // Make sure that the ObjCInterfaceType points at the definition.
8199 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8200 ->Decl = ID;
8201
8202 for (auto R : ID->redecls())
8203 R->Data = ID->Data;
8204
8205 continue;
8206 }
8207
8208 if (auto PD = dyn_cast<ObjCProtocolDecl>(*D)) {
8209 for (auto R : PD->redecls())
8210 R->Data = PD->Data;
8211
8212 continue;
8213 }
8214
8215 auto RTD = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
8216 for (auto R : RTD->redecls())
8217 R->Common = RTD->Common;
8218 }
8219 PendingDefinitions.clear();
8220
8221 // Load the bodies of any functions or methods we've encountered. We do
8222 // this now (delayed) so that we can be sure that the declaration chains
8223 // have been fully wired up.
8224 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8225 PBEnd = PendingBodies.end();
8226 PB != PBEnd; ++PB) {
8227 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8228 // FIXME: Check for =delete/=default?
8229 // FIXME: Complain about ODR violations here?
8230 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8231 FD->setLazyBody(PB->second);
8232 continue;
8233 }
8234
8235 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8236 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8237 MD->setLazyBody(PB->second);
8238 }
8239 PendingBodies.clear();
8240
8241 // Issue any pending ODR-failure diagnostics.
8242 for (auto &Merge : PendingOdrMergeFailures) {
8243 if (!DiagnosedOdrMergeFailures.insert(Merge.first))
8244 continue;
8245
8246 bool Diagnosed = false;
8247 for (auto *RD : Merge.second) {
8248 // Multiple different declarations got merged together; tell the user
8249 // where they came from.
8250 if (Merge.first != RD) {
8251 // FIXME: Walk the definition, figure out what's different,
8252 // and diagnose that.
8253 if (!Diagnosed) {
8254 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8255 Diag(Merge.first->getLocation(),
8256 diag::err_module_odr_violation_different_definitions)
8257 << Merge.first << Module.empty() << Module;
8258 Diagnosed = true;
8259 }
8260
8261 Diag(RD->getLocation(),
8262 diag::note_module_odr_violation_different_definitions)
8263 << getOwningModuleNameForDiagnostic(RD);
8264 }
8265 }
8266
8267 if (!Diagnosed) {
8268 // All definitions are updates to the same declaration. This happens if a
8269 // module instantiates the declaration of a class template specialization
8270 // and two or more other modules instantiate its definition.
8271 //
8272 // FIXME: Indicate which modules had instantiations of this definition.
8273 // FIXME: How can this even happen?
8274 Diag(Merge.first->getLocation(),
8275 diag::err_module_odr_violation_different_instantiations)
8276 << Merge.first;
8277 }
8278 }
8279 PendingOdrMergeFailures.clear();
8280 }
8281
FinishedDeserializing()8282 void ASTReader::FinishedDeserializing() {
8283 assert(NumCurrentElementsDeserializing &&
8284 "FinishedDeserializing not paired with StartedDeserializing");
8285 if (NumCurrentElementsDeserializing == 1) {
8286 // We decrease NumCurrentElementsDeserializing only after pending actions
8287 // are finished, to avoid recursively re-calling finishPendingActions().
8288 finishPendingActions();
8289 }
8290 --NumCurrentElementsDeserializing;
8291
8292 if (NumCurrentElementsDeserializing == 0 && Consumer) {
8293 // We are not in recursive loading, so it's safe to pass the "interesting"
8294 // decls to the consumer.
8295 PassInterestingDeclsToConsumer();
8296 }
8297 }
8298
pushExternalDeclIntoScope(NamedDecl * D,DeclarationName Name)8299 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
8300 D = D->getMostRecentDecl();
8301
8302 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8303 SemaObj->TUScope->AddDecl(D);
8304 } else if (SemaObj->TUScope) {
8305 // Adding the decl to IdResolver may have failed because it was already in
8306 // (even though it was not added in scope). If it is already in, make sure
8307 // it gets in the scope as well.
8308 if (std::find(SemaObj->IdResolver.begin(Name),
8309 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8310 SemaObj->TUScope->AddDecl(D);
8311 }
8312 }
8313
ASTReader(Preprocessor & PP,ASTContext & Context,StringRef isysroot,bool DisableValidation,bool AllowASTWithCompilerErrors,bool AllowConfigurationMismatch,bool ValidateSystemInputs,bool UseGlobalIndex)8314 ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8315 bool DisableValidation, bool AllowASTWithCompilerErrors,
8316 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
8317 bool UseGlobalIndex)
8318 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
8319 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
8320 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8321 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8322 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8323 DisableValidation(DisableValidation),
8324 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8325 AllowConfigurationMismatch(AllowConfigurationMismatch),
8326 ValidateSystemInputs(ValidateSystemInputs),
8327 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
8328 CurrSwitchCaseStmts(&SwitchCaseStmts),
8329 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8330 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8331 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8332 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8333 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8334 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8335 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8336 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8337 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8338 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8339 ReadingKind(Read_None) {
8340 SourceMgr.setExternalSLocEntrySource(this);
8341 }
8342
~ASTReader()8343 ASTReader::~ASTReader() {
8344 if (OwnsDeserializationListener)
8345 delete DeserializationListener;
8346
8347 for (DeclContextVisibleUpdatesPending::iterator
8348 I = PendingVisibleUpdates.begin(),
8349 E = PendingVisibleUpdates.end();
8350 I != E; ++I) {
8351 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8352 F = I->second.end();
8353 J != F; ++J)
8354 delete J->first;
8355 }
8356 }
8357