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