xref: /freebsd/contrib/llvm-project/clang/lib/Serialization/ASTReader.cpp (revision 62987288060ff68c817b7056815aa9fb8ba8ecd7)
1 //===- ASTReader.cpp - AST File Reader ------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file defines the ASTReader class, which reads AST files.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "ASTCommon.h"
14 #include "ASTReaderInternals.h"
15 #include "clang/AST/ASTConsumer.h"
16 #include "clang/AST/ASTContext.h"
17 #include "clang/AST/ASTMutationListener.h"
18 #include "clang/AST/ASTStructuralEquivalence.h"
19 #include "clang/AST/ASTUnresolvedSet.h"
20 #include "clang/AST/AbstractTypeReader.h"
21 #include "clang/AST/Decl.h"
22 #include "clang/AST/DeclBase.h"
23 #include "clang/AST/DeclCXX.h"
24 #include "clang/AST/DeclFriend.h"
25 #include "clang/AST/DeclGroup.h"
26 #include "clang/AST/DeclObjC.h"
27 #include "clang/AST/DeclTemplate.h"
28 #include "clang/AST/DeclarationName.h"
29 #include "clang/AST/Expr.h"
30 #include "clang/AST/ExprCXX.h"
31 #include "clang/AST/ExternalASTSource.h"
32 #include "clang/AST/NestedNameSpecifier.h"
33 #include "clang/AST/ODRDiagsEmitter.h"
34 #include "clang/AST/OpenACCClause.h"
35 #include "clang/AST/OpenMPClause.h"
36 #include "clang/AST/RawCommentList.h"
37 #include "clang/AST/TemplateBase.h"
38 #include "clang/AST/TemplateName.h"
39 #include "clang/AST/Type.h"
40 #include "clang/AST/TypeLoc.h"
41 #include "clang/AST/TypeLocVisitor.h"
42 #include "clang/AST/UnresolvedSet.h"
43 #include "clang/Basic/ASTSourceDescriptor.h"
44 #include "clang/Basic/CommentOptions.h"
45 #include "clang/Basic/Diagnostic.h"
46 #include "clang/Basic/DiagnosticError.h"
47 #include "clang/Basic/DiagnosticIDs.h"
48 #include "clang/Basic/DiagnosticOptions.h"
49 #include "clang/Basic/DiagnosticSema.h"
50 #include "clang/Basic/ExceptionSpecificationType.h"
51 #include "clang/Basic/FileManager.h"
52 #include "clang/Basic/FileSystemOptions.h"
53 #include "clang/Basic/IdentifierTable.h"
54 #include "clang/Basic/LLVM.h"
55 #include "clang/Basic/LangOptions.h"
56 #include "clang/Basic/Module.h"
57 #include "clang/Basic/ObjCRuntime.h"
58 #include "clang/Basic/OpenACCKinds.h"
59 #include "clang/Basic/OpenMPKinds.h"
60 #include "clang/Basic/OperatorKinds.h"
61 #include "clang/Basic/PragmaKinds.h"
62 #include "clang/Basic/Sanitizers.h"
63 #include "clang/Basic/SourceLocation.h"
64 #include "clang/Basic/SourceManager.h"
65 #include "clang/Basic/SourceManagerInternals.h"
66 #include "clang/Basic/Specifiers.h"
67 #include "clang/Basic/TargetInfo.h"
68 #include "clang/Basic/TargetOptions.h"
69 #include "clang/Basic/TokenKinds.h"
70 #include "clang/Basic/Version.h"
71 #include "clang/Lex/HeaderSearch.h"
72 #include "clang/Lex/HeaderSearchOptions.h"
73 #include "clang/Lex/MacroInfo.h"
74 #include "clang/Lex/ModuleMap.h"
75 #include "clang/Lex/PreprocessingRecord.h"
76 #include "clang/Lex/Preprocessor.h"
77 #include "clang/Lex/PreprocessorOptions.h"
78 #include "clang/Lex/Token.h"
79 #include "clang/Sema/ObjCMethodList.h"
80 #include "clang/Sema/Scope.h"
81 #include "clang/Sema/Sema.h"
82 #include "clang/Sema/SemaCUDA.h"
83 #include "clang/Sema/SemaObjC.h"
84 #include "clang/Sema/Weak.h"
85 #include "clang/Serialization/ASTBitCodes.h"
86 #include "clang/Serialization/ASTDeserializationListener.h"
87 #include "clang/Serialization/ASTRecordReader.h"
88 #include "clang/Serialization/ContinuousRangeMap.h"
89 #include "clang/Serialization/GlobalModuleIndex.h"
90 #include "clang/Serialization/InMemoryModuleCache.h"
91 #include "clang/Serialization/ModuleFile.h"
92 #include "clang/Serialization/ModuleFileExtension.h"
93 #include "clang/Serialization/ModuleManager.h"
94 #include "clang/Serialization/PCHContainerOperations.h"
95 #include "clang/Serialization/SerializationDiagnostic.h"
96 #include "llvm/ADT/APFloat.h"
97 #include "llvm/ADT/APInt.h"
98 #include "llvm/ADT/APSInt.h"
99 #include "llvm/ADT/ArrayRef.h"
100 #include "llvm/ADT/DenseMap.h"
101 #include "llvm/ADT/FloatingPointMode.h"
102 #include "llvm/ADT/FoldingSet.h"
103 #include "llvm/ADT/Hashing.h"
104 #include "llvm/ADT/IntrusiveRefCntPtr.h"
105 #include "llvm/ADT/STLExtras.h"
106 #include "llvm/ADT/ScopeExit.h"
107 #include "llvm/ADT/SmallPtrSet.h"
108 #include "llvm/ADT/SmallString.h"
109 #include "llvm/ADT/SmallVector.h"
110 #include "llvm/ADT/StringExtras.h"
111 #include "llvm/ADT/StringMap.h"
112 #include "llvm/ADT/StringRef.h"
113 #include "llvm/ADT/iterator_range.h"
114 #include "llvm/Bitstream/BitstreamReader.h"
115 #include "llvm/Support/Casting.h"
116 #include "llvm/Support/Compiler.h"
117 #include "llvm/Support/Compression.h"
118 #include "llvm/Support/DJB.h"
119 #include "llvm/Support/Endian.h"
120 #include "llvm/Support/Error.h"
121 #include "llvm/Support/ErrorHandling.h"
122 #include "llvm/Support/FileSystem.h"
123 #include "llvm/Support/LEB128.h"
124 #include "llvm/Support/MemoryBuffer.h"
125 #include "llvm/Support/Path.h"
126 #include "llvm/Support/SaveAndRestore.h"
127 #include "llvm/Support/TimeProfiler.h"
128 #include "llvm/Support/Timer.h"
129 #include "llvm/Support/VersionTuple.h"
130 #include "llvm/Support/raw_ostream.h"
131 #include "llvm/TargetParser/Triple.h"
132 #include <algorithm>
133 #include <cassert>
134 #include <cstddef>
135 #include <cstdint>
136 #include <cstdio>
137 #include <ctime>
138 #include <iterator>
139 #include <limits>
140 #include <map>
141 #include <memory>
142 #include <optional>
143 #include <string>
144 #include <system_error>
145 #include <tuple>
146 #include <utility>
147 #include <vector>
148 
149 using namespace clang;
150 using namespace clang::serialization;
151 using namespace clang::serialization::reader;
152 using llvm::BitstreamCursor;
153 
154 //===----------------------------------------------------------------------===//
155 // ChainedASTReaderListener implementation
156 //===----------------------------------------------------------------------===//
157 
158 bool
ReadFullVersionInformation(StringRef FullVersion)159 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
160   return First->ReadFullVersionInformation(FullVersion) ||
161          Second->ReadFullVersionInformation(FullVersion);
162 }
163 
ReadModuleName(StringRef ModuleName)164 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
165   First->ReadModuleName(ModuleName);
166   Second->ReadModuleName(ModuleName);
167 }
168 
ReadModuleMapFile(StringRef ModuleMapPath)169 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
170   First->ReadModuleMapFile(ModuleMapPath);
171   Second->ReadModuleMapFile(ModuleMapPath);
172 }
173 
174 bool
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain,bool AllowCompatibleDifferences)175 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
176                                               bool Complain,
177                                               bool AllowCompatibleDifferences) {
178   return First->ReadLanguageOptions(LangOpts, Complain,
179                                     AllowCompatibleDifferences) ||
180          Second->ReadLanguageOptions(LangOpts, Complain,
181                                      AllowCompatibleDifferences);
182 }
183 
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain,bool AllowCompatibleDifferences)184 bool ChainedASTReaderListener::ReadTargetOptions(
185     const TargetOptions &TargetOpts, bool Complain,
186     bool AllowCompatibleDifferences) {
187   return First->ReadTargetOptions(TargetOpts, Complain,
188                                   AllowCompatibleDifferences) ||
189          Second->ReadTargetOptions(TargetOpts, Complain,
190                                    AllowCompatibleDifferences);
191 }
192 
ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,bool Complain)193 bool ChainedASTReaderListener::ReadDiagnosticOptions(
194     IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
195   return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
196          Second->ReadDiagnosticOptions(DiagOpts, Complain);
197 }
198 
199 bool
ReadFileSystemOptions(const FileSystemOptions & FSOpts,bool Complain)200 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
201                                                 bool Complain) {
202   return First->ReadFileSystemOptions(FSOpts, Complain) ||
203          Second->ReadFileSystemOptions(FSOpts, Complain);
204 }
205 
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef SpecificModuleCachePath,bool Complain)206 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
207     const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
208     bool Complain) {
209   return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
210                                         Complain) ||
211          Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
212                                          Complain);
213 }
214 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)215 bool ChainedASTReaderListener::ReadPreprocessorOptions(
216     const PreprocessorOptions &PPOpts, bool ReadMacros, bool Complain,
217     std::string &SuggestedPredefines) {
218   return First->ReadPreprocessorOptions(PPOpts, ReadMacros, Complain,
219                                         SuggestedPredefines) ||
220          Second->ReadPreprocessorOptions(PPOpts, ReadMacros, Complain,
221                                          SuggestedPredefines);
222 }
223 
ReadCounter(const serialization::ModuleFile & M,unsigned Value)224 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
225                                            unsigned Value) {
226   First->ReadCounter(M, Value);
227   Second->ReadCounter(M, Value);
228 }
229 
needsInputFileVisitation()230 bool ChainedASTReaderListener::needsInputFileVisitation() {
231   return First->needsInputFileVisitation() ||
232          Second->needsInputFileVisitation();
233 }
234 
needsSystemInputFileVisitation()235 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
236   return First->needsSystemInputFileVisitation() ||
237   Second->needsSystemInputFileVisitation();
238 }
239 
visitModuleFile(StringRef Filename,ModuleKind Kind)240 void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
241                                                ModuleKind Kind) {
242   First->visitModuleFile(Filename, Kind);
243   Second->visitModuleFile(Filename, Kind);
244 }
245 
visitInputFile(StringRef Filename,bool isSystem,bool isOverridden,bool isExplicitModule)246 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
247                                               bool isSystem,
248                                               bool isOverridden,
249                                               bool isExplicitModule) {
250   bool Continue = false;
251   if (First->needsInputFileVisitation() &&
252       (!isSystem || First->needsSystemInputFileVisitation()))
253     Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
254                                       isExplicitModule);
255   if (Second->needsInputFileVisitation() &&
256       (!isSystem || Second->needsSystemInputFileVisitation()))
257     Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
258                                        isExplicitModule);
259   return Continue;
260 }
261 
readModuleFileExtension(const ModuleFileExtensionMetadata & Metadata)262 void ChainedASTReaderListener::readModuleFileExtension(
263        const ModuleFileExtensionMetadata &Metadata) {
264   First->readModuleFileExtension(Metadata);
265   Second->readModuleFileExtension(Metadata);
266 }
267 
268 //===----------------------------------------------------------------------===//
269 // PCH validator implementation
270 //===----------------------------------------------------------------------===//
271 
272 ASTReaderListener::~ASTReaderListener() = default;
273 
274 /// Compare the given set of language options against an existing set of
275 /// language options.
276 ///
277 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
278 /// \param AllowCompatibleDifferences If true, differences between compatible
279 ///        language options will be permitted.
280 ///
281 /// \returns true if the languagae options mis-match, false otherwise.
checkLanguageOptions(const LangOptions & LangOpts,const LangOptions & ExistingLangOpts,DiagnosticsEngine * Diags,bool AllowCompatibleDifferences=true)282 static bool checkLanguageOptions(const LangOptions &LangOpts,
283                                  const LangOptions &ExistingLangOpts,
284                                  DiagnosticsEngine *Diags,
285                                  bool AllowCompatibleDifferences = true) {
286 #define LANGOPT(Name, Bits, Default, Description)                   \
287   if (ExistingLangOpts.Name != LangOpts.Name) {                     \
288     if (Diags) {                                                    \
289       if (Bits == 1)                                                \
290         Diags->Report(diag::err_pch_langopt_mismatch)               \
291           << Description << LangOpts.Name << ExistingLangOpts.Name; \
292       else                                                          \
293         Diags->Report(diag::err_pch_langopt_value_mismatch)         \
294           << Description;                                           \
295     }                                                               \
296     return true;                                                    \
297   }
298 
299 #define VALUE_LANGOPT(Name, Bits, Default, Description)   \
300   if (ExistingLangOpts.Name != LangOpts.Name) {           \
301     if (Diags)                                            \
302       Diags->Report(diag::err_pch_langopt_value_mismatch) \
303         << Description;                                   \
304     return true;                                          \
305   }
306 
307 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description)   \
308   if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) {  \
309     if (Diags)                                                 \
310       Diags->Report(diag::err_pch_langopt_value_mismatch)      \
311         << Description;                                        \
312     return true;                                               \
313   }
314 
315 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description)  \
316   if (!AllowCompatibleDifferences)                            \
317     LANGOPT(Name, Bits, Default, Description)
318 
319 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description)  \
320   if (!AllowCompatibleDifferences)                                 \
321     ENUM_LANGOPT(Name, Bits, Default, Description)
322 
323 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
324   if (!AllowCompatibleDifferences)                                 \
325     VALUE_LANGOPT(Name, Bits, Default, Description)
326 
327 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
328 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
329 #define BENIGN_VALUE_LANGOPT(Name, Bits, Default, Description)
330 #include "clang/Basic/LangOptions.def"
331 
332   if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
333     if (Diags)
334       Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
335     return true;
336   }
337 
338   if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
339     if (Diags)
340       Diags->Report(diag::err_pch_langopt_value_mismatch)
341       << "target Objective-C runtime";
342     return true;
343   }
344 
345   if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
346       LangOpts.CommentOpts.BlockCommandNames) {
347     if (Diags)
348       Diags->Report(diag::err_pch_langopt_value_mismatch)
349         << "block command names";
350     return true;
351   }
352 
353   // Sanitizer feature mismatches are treated as compatible differences. If
354   // compatible differences aren't allowed, we still only want to check for
355   // mismatches of non-modular sanitizers (the only ones which can affect AST
356   // generation).
357   if (!AllowCompatibleDifferences) {
358     SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
359     SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
360     SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
361     ExistingSanitizers.clear(ModularSanitizers);
362     ImportedSanitizers.clear(ModularSanitizers);
363     if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
364       const std::string Flag = "-fsanitize=";
365       if (Diags) {
366 #define SANITIZER(NAME, ID)                                                    \
367   {                                                                            \
368     bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID);         \
369     bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID);         \
370     if (InExistingModule != InImportedModule)                                  \
371       Diags->Report(diag::err_pch_targetopt_feature_mismatch)                  \
372           << InExistingModule << (Flag + NAME);                                \
373   }
374 #include "clang/Basic/Sanitizers.def"
375       }
376       return true;
377     }
378   }
379 
380   return false;
381 }
382 
383 /// Compare the given set of target options against an existing set of
384 /// target options.
385 ///
386 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
387 ///
388 /// \returns true if the target options mis-match, false otherwise.
checkTargetOptions(const TargetOptions & TargetOpts,const TargetOptions & ExistingTargetOpts,DiagnosticsEngine * Diags,bool AllowCompatibleDifferences=true)389 static bool checkTargetOptions(const TargetOptions &TargetOpts,
390                                const TargetOptions &ExistingTargetOpts,
391                                DiagnosticsEngine *Diags,
392                                bool AllowCompatibleDifferences = true) {
393 #define CHECK_TARGET_OPT(Field, Name)                             \
394   if (TargetOpts.Field != ExistingTargetOpts.Field) {             \
395     if (Diags)                                                    \
396       Diags->Report(diag::err_pch_targetopt_mismatch)             \
397         << Name << TargetOpts.Field << ExistingTargetOpts.Field;  \
398     return true;                                                  \
399   }
400 
401   // The triple and ABI must match exactly.
402   CHECK_TARGET_OPT(Triple, "target");
403   CHECK_TARGET_OPT(ABI, "target ABI");
404 
405   // We can tolerate different CPUs in many cases, notably when one CPU
406   // supports a strict superset of another. When allowing compatible
407   // differences skip this check.
408   if (!AllowCompatibleDifferences) {
409     CHECK_TARGET_OPT(CPU, "target CPU");
410     CHECK_TARGET_OPT(TuneCPU, "tune CPU");
411   }
412 
413 #undef CHECK_TARGET_OPT
414 
415   // Compare feature sets.
416   SmallVector<StringRef, 4> ExistingFeatures(
417                                              ExistingTargetOpts.FeaturesAsWritten.begin(),
418                                              ExistingTargetOpts.FeaturesAsWritten.end());
419   SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
420                                          TargetOpts.FeaturesAsWritten.end());
421   llvm::sort(ExistingFeatures);
422   llvm::sort(ReadFeatures);
423 
424   // We compute the set difference in both directions explicitly so that we can
425   // diagnose the differences differently.
426   SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
427   std::set_difference(
428       ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
429       ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
430   std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
431                       ExistingFeatures.begin(), ExistingFeatures.end(),
432                       std::back_inserter(UnmatchedReadFeatures));
433 
434   // If we are allowing compatible differences and the read feature set is
435   // a strict subset of the existing feature set, there is nothing to diagnose.
436   if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
437     return false;
438 
439   if (Diags) {
440     for (StringRef Feature : UnmatchedReadFeatures)
441       Diags->Report(diag::err_pch_targetopt_feature_mismatch)
442           << /* is-existing-feature */ false << Feature;
443     for (StringRef Feature : UnmatchedExistingFeatures)
444       Diags->Report(diag::err_pch_targetopt_feature_mismatch)
445           << /* is-existing-feature */ true << Feature;
446   }
447 
448   return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
449 }
450 
451 bool
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain,bool AllowCompatibleDifferences)452 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
453                                   bool Complain,
454                                   bool AllowCompatibleDifferences) {
455   const LangOptions &ExistingLangOpts = PP.getLangOpts();
456   return checkLanguageOptions(LangOpts, ExistingLangOpts,
457                               Complain ? &Reader.Diags : nullptr,
458                               AllowCompatibleDifferences);
459 }
460 
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain,bool AllowCompatibleDifferences)461 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
462                                      bool Complain,
463                                      bool AllowCompatibleDifferences) {
464   const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
465   return checkTargetOptions(TargetOpts, ExistingTargetOpts,
466                             Complain ? &Reader.Diags : nullptr,
467                             AllowCompatibleDifferences);
468 }
469 
470 namespace {
471 
472 using MacroDefinitionsMap =
473     llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
474 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
475 
476 } // namespace
477 
checkDiagnosticGroupMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,bool Complain)478 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
479                                          DiagnosticsEngine &Diags,
480                                          bool Complain) {
481   using Level = DiagnosticsEngine::Level;
482 
483   // Check current mappings for new -Werror mappings, and the stored mappings
484   // for cases that were explicitly mapped to *not* be errors that are now
485   // errors because of options like -Werror.
486   DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
487 
488   for (DiagnosticsEngine *MappingSource : MappingSources) {
489     for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
490       diag::kind DiagID = DiagIDMappingPair.first;
491       Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
492       if (CurLevel < DiagnosticsEngine::Error)
493         continue; // not significant
494       Level StoredLevel =
495           StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
496       if (StoredLevel < DiagnosticsEngine::Error) {
497         if (Complain)
498           Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
499               Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
500         return true;
501       }
502     }
503   }
504 
505   return false;
506 }
507 
isExtHandlingFromDiagsError(DiagnosticsEngine & Diags)508 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
509   diag::Severity Ext = Diags.getExtensionHandlingBehavior();
510   if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
511     return true;
512   return Ext >= diag::Severity::Error;
513 }
514 
checkDiagnosticMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,bool IsSystem,bool SystemHeaderWarningsInModule,bool Complain)515 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
516                                     DiagnosticsEngine &Diags, bool IsSystem,
517                                     bool SystemHeaderWarningsInModule,
518                                     bool Complain) {
519   // Top-level options
520   if (IsSystem) {
521     if (Diags.getSuppressSystemWarnings())
522       return false;
523     // If -Wsystem-headers was not enabled before, and it was not explicit,
524     // be conservative
525     if (StoredDiags.getSuppressSystemWarnings() &&
526         !SystemHeaderWarningsInModule) {
527       if (Complain)
528         Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
529       return true;
530     }
531   }
532 
533   if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
534     if (Complain)
535       Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
536     return true;
537   }
538 
539   if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
540       !StoredDiags.getEnableAllWarnings()) {
541     if (Complain)
542       Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
543     return true;
544   }
545 
546   if (isExtHandlingFromDiagsError(Diags) &&
547       !isExtHandlingFromDiagsError(StoredDiags)) {
548     if (Complain)
549       Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
550     return true;
551   }
552 
553   return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
554 }
555 
556 /// Return the top import module if it is implicit, nullptr otherwise.
getTopImportImplicitModule(ModuleManager & ModuleMgr,Preprocessor & PP)557 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr,
558                                           Preprocessor &PP) {
559   // If the original import came from a file explicitly generated by the user,
560   // don't check the diagnostic mappings.
561   // FIXME: currently this is approximated by checking whether this is not a
562   // module import of an implicitly-loaded module file.
563   // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
564   // the transitive closure of its imports, since unrelated modules cannot be
565   // imported until after this module finishes validation.
566   ModuleFile *TopImport = &*ModuleMgr.rbegin();
567   while (!TopImport->ImportedBy.empty())
568     TopImport = TopImport->ImportedBy[0];
569   if (TopImport->Kind != MK_ImplicitModule)
570     return nullptr;
571 
572   StringRef ModuleName = TopImport->ModuleName;
573   assert(!ModuleName.empty() && "diagnostic options read before module name");
574 
575   Module *M =
576       PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc);
577   assert(M && "missing module");
578   return M;
579 }
580 
ReadDiagnosticOptions(IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts,bool Complain)581 bool PCHValidator::ReadDiagnosticOptions(
582     IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
583   DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
584   IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
585   IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
586       new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
587   // This should never fail, because we would have processed these options
588   // before writing them to an ASTFile.
589   ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
590 
591   ModuleManager &ModuleMgr = Reader.getModuleManager();
592   assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
593 
594   Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
595   if (!TopM)
596     return false;
597 
598   Module *Importer = PP.getCurrentModule();
599 
600   DiagnosticOptions &ExistingOpts = ExistingDiags.getDiagnosticOptions();
601   bool SystemHeaderWarningsInModule =
602       Importer && llvm::is_contained(ExistingOpts.SystemHeaderWarningsModules,
603                                      Importer->Name);
604 
605   // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
606   // contains the union of their flags.
607   return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem,
608                                  SystemHeaderWarningsInModule, Complain);
609 }
610 
611 /// Collect the macro definitions provided by the given preprocessor
612 /// options.
613 static void
collectMacroDefinitions(const PreprocessorOptions & PPOpts,MacroDefinitionsMap & Macros,SmallVectorImpl<StringRef> * MacroNames=nullptr)614 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
615                         MacroDefinitionsMap &Macros,
616                         SmallVectorImpl<StringRef> *MacroNames = nullptr) {
617   for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
618     StringRef Macro = PPOpts.Macros[I].first;
619     bool IsUndef = PPOpts.Macros[I].second;
620 
621     std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
622     StringRef MacroName = MacroPair.first;
623     StringRef MacroBody = MacroPair.second;
624 
625     // For an #undef'd macro, we only care about the name.
626     if (IsUndef) {
627       if (MacroNames && !Macros.count(MacroName))
628         MacroNames->push_back(MacroName);
629 
630       Macros[MacroName] = std::make_pair("", true);
631       continue;
632     }
633 
634     // For a #define'd macro, figure out the actual definition.
635     if (MacroName.size() == Macro.size())
636       MacroBody = "1";
637     else {
638       // Note: GCC drops anything following an end-of-line character.
639       StringRef::size_type End = MacroBody.find_first_of("\n\r");
640       MacroBody = MacroBody.substr(0, End);
641     }
642 
643     if (MacroNames && !Macros.count(MacroName))
644       MacroNames->push_back(MacroName);
645     Macros[MacroName] = std::make_pair(MacroBody, false);
646   }
647 }
648 
649 enum OptionValidation {
650   OptionValidateNone,
651   OptionValidateContradictions,
652   OptionValidateStrictMatches,
653 };
654 
655 /// Check the preprocessor options deserialized from the control block
656 /// against the preprocessor options in an existing preprocessor.
657 ///
658 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
659 /// \param Validation If set to OptionValidateNone, ignore differences in
660 ///        preprocessor options. If set to OptionValidateContradictions,
661 ///        require that options passed both in the AST file and on the command
662 ///        line (-D or -U) match, but tolerate options missing in one or the
663 ///        other. If set to OptionValidateContradictions, require that there
664 ///        are no differences in the options between the two.
checkPreprocessorOptions(const PreprocessorOptions & PPOpts,const PreprocessorOptions & ExistingPPOpts,bool ReadMacros,DiagnosticsEngine * Diags,FileManager & FileMgr,std::string & SuggestedPredefines,const LangOptions & LangOpts,OptionValidation Validation=OptionValidateContradictions)665 static bool checkPreprocessorOptions(
666     const PreprocessorOptions &PPOpts,
667     const PreprocessorOptions &ExistingPPOpts, bool ReadMacros,
668     DiagnosticsEngine *Diags, FileManager &FileMgr,
669     std::string &SuggestedPredefines, const LangOptions &LangOpts,
670     OptionValidation Validation = OptionValidateContradictions) {
671   if (ReadMacros) {
672     // Check macro definitions.
673     MacroDefinitionsMap ASTFileMacros;
674     collectMacroDefinitions(PPOpts, ASTFileMacros);
675     MacroDefinitionsMap ExistingMacros;
676     SmallVector<StringRef, 4> ExistingMacroNames;
677     collectMacroDefinitions(ExistingPPOpts, ExistingMacros,
678                             &ExistingMacroNames);
679 
680     // Use a line marker to enter the <command line> file, as the defines and
681     // undefines here will have come from the command line.
682     SuggestedPredefines += "# 1 \"<command line>\" 1\n";
683 
684     for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
685       // Dig out the macro definition in the existing preprocessor options.
686       StringRef MacroName = ExistingMacroNames[I];
687       std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
688 
689       // Check whether we know anything about this macro name or not.
690       llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
691           ASTFileMacros.find(MacroName);
692       if (Validation == OptionValidateNone || Known == ASTFileMacros.end()) {
693         if (Validation == OptionValidateStrictMatches) {
694           // If strict matches are requested, don't tolerate any extra defines
695           // on the command line that are missing in the AST file.
696           if (Diags) {
697             Diags->Report(diag::err_pch_macro_def_undef) << MacroName << true;
698           }
699           return true;
700         }
701         // FIXME: Check whether this identifier was referenced anywhere in the
702         // AST file. If so, we should reject the AST file. Unfortunately, this
703         // information isn't in the control block. What shall we do about it?
704 
705         if (Existing.second) {
706           SuggestedPredefines += "#undef ";
707           SuggestedPredefines += MacroName.str();
708           SuggestedPredefines += '\n';
709         } else {
710           SuggestedPredefines += "#define ";
711           SuggestedPredefines += MacroName.str();
712           SuggestedPredefines += ' ';
713           SuggestedPredefines += Existing.first.str();
714           SuggestedPredefines += '\n';
715         }
716         continue;
717       }
718 
719       // If the macro was defined in one but undef'd in the other, we have a
720       // conflict.
721       if (Existing.second != Known->second.second) {
722         if (Diags) {
723           Diags->Report(diag::err_pch_macro_def_undef)
724               << MacroName << Known->second.second;
725         }
726         return true;
727       }
728 
729       // If the macro was #undef'd in both, or if the macro bodies are
730       // identical, it's fine.
731       if (Existing.second || Existing.first == Known->second.first) {
732         ASTFileMacros.erase(Known);
733         continue;
734       }
735 
736       // The macro bodies differ; complain.
737       if (Diags) {
738         Diags->Report(diag::err_pch_macro_def_conflict)
739             << MacroName << Known->second.first << Existing.first;
740       }
741       return true;
742     }
743 
744     // Leave the <command line> file and return to <built-in>.
745     SuggestedPredefines += "# 1 \"<built-in>\" 2\n";
746 
747     if (Validation == OptionValidateStrictMatches) {
748       // If strict matches are requested, don't tolerate any extra defines in
749       // the AST file that are missing on the command line.
750       for (const auto &MacroName : ASTFileMacros.keys()) {
751         if (Diags) {
752           Diags->Report(diag::err_pch_macro_def_undef) << MacroName << false;
753         }
754         return true;
755       }
756     }
757   }
758 
759   // Check whether we're using predefines.
760   if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines &&
761       Validation != OptionValidateNone) {
762     if (Diags) {
763       Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
764     }
765     return true;
766   }
767 
768   // Detailed record is important since it is used for the module cache hash.
769   if (LangOpts.Modules &&
770       PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord &&
771       Validation != OptionValidateNone) {
772     if (Diags) {
773       Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
774     }
775     return true;
776   }
777 
778   // Compute the #include and #include_macros lines we need.
779   for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
780     StringRef File = ExistingPPOpts.Includes[I];
781 
782     if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
783         !ExistingPPOpts.PCHThroughHeader.empty()) {
784       // In case the through header is an include, we must add all the includes
785       // to the predefines so the start point can be determined.
786       SuggestedPredefines += "#include \"";
787       SuggestedPredefines += File;
788       SuggestedPredefines += "\"\n";
789       continue;
790     }
791 
792     if (File == ExistingPPOpts.ImplicitPCHInclude)
793       continue;
794 
795     if (llvm::is_contained(PPOpts.Includes, File))
796       continue;
797 
798     SuggestedPredefines += "#include \"";
799     SuggestedPredefines += File;
800     SuggestedPredefines += "\"\n";
801   }
802 
803   for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
804     StringRef File = ExistingPPOpts.MacroIncludes[I];
805     if (llvm::is_contained(PPOpts.MacroIncludes, File))
806       continue;
807 
808     SuggestedPredefines += "#__include_macros \"";
809     SuggestedPredefines += File;
810     SuggestedPredefines += "\"\n##\n";
811   }
812 
813   return false;
814 }
815 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)816 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
817                                            bool ReadMacros, bool Complain,
818                                            std::string &SuggestedPredefines) {
819   const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
820 
821   return checkPreprocessorOptions(
822       PPOpts, ExistingPPOpts, ReadMacros, Complain ? &Reader.Diags : nullptr,
823       PP.getFileManager(), SuggestedPredefines, PP.getLangOpts());
824 }
825 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)826 bool SimpleASTReaderListener::ReadPreprocessorOptions(
827     const PreprocessorOptions &PPOpts, bool ReadMacros, bool Complain,
828     std::string &SuggestedPredefines) {
829   return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(), ReadMacros,
830                                   nullptr, PP.getFileManager(),
831                                   SuggestedPredefines, PP.getLangOpts(),
832                                   OptionValidateNone);
833 }
834 
835 /// Check that the specified and the existing module cache paths are equivalent.
836 ///
837 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
838 /// \returns true when the module cache paths differ.
checkModuleCachePath(llvm::vfs::FileSystem & VFS,StringRef SpecificModuleCachePath,StringRef ExistingModuleCachePath,DiagnosticsEngine * Diags,const LangOptions & LangOpts,const PreprocessorOptions & PPOpts)839 static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS,
840                                  StringRef SpecificModuleCachePath,
841                                  StringRef ExistingModuleCachePath,
842                                  DiagnosticsEngine *Diags,
843                                  const LangOptions &LangOpts,
844                                  const PreprocessorOptions &PPOpts) {
845   if (!LangOpts.Modules || PPOpts.AllowPCHWithDifferentModulesCachePath ||
846       SpecificModuleCachePath == ExistingModuleCachePath)
847     return false;
848   auto EqualOrErr =
849       VFS.equivalent(SpecificModuleCachePath, ExistingModuleCachePath);
850   if (EqualOrErr && *EqualOrErr)
851     return false;
852   if (Diags)
853     Diags->Report(diag::err_pch_modulecache_mismatch)
854         << SpecificModuleCachePath << ExistingModuleCachePath;
855   return true;
856 }
857 
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef SpecificModuleCachePath,bool Complain)858 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
859                                            StringRef SpecificModuleCachePath,
860                                            bool Complain) {
861   return checkModuleCachePath(Reader.getFileManager().getVirtualFileSystem(),
862                               SpecificModuleCachePath,
863                               PP.getHeaderSearchInfo().getModuleCachePath(),
864                               Complain ? &Reader.Diags : nullptr,
865                               PP.getLangOpts(), PP.getPreprocessorOpts());
866 }
867 
ReadCounter(const ModuleFile & M,unsigned Value)868 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
869   PP.setCounterValue(Value);
870 }
871 
872 //===----------------------------------------------------------------------===//
873 // AST reader implementation
874 //===----------------------------------------------------------------------===//
875 
readULEB(const unsigned char * & P)876 static uint64_t readULEB(const unsigned char *&P) {
877   unsigned Length = 0;
878   const char *Error = nullptr;
879 
880   uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
881   if (Error)
882     llvm::report_fatal_error(Error);
883   P += Length;
884   return Val;
885 }
886 
887 /// Read ULEB-encoded key length and data length.
888 static std::pair<unsigned, unsigned>
readULEBKeyDataLength(const unsigned char * & P)889 readULEBKeyDataLength(const unsigned char *&P) {
890   unsigned KeyLen = readULEB(P);
891   if ((unsigned)KeyLen != KeyLen)
892     llvm::report_fatal_error("key too large");
893 
894   unsigned DataLen = readULEB(P);
895   if ((unsigned)DataLen != DataLen)
896     llvm::report_fatal_error("data too large");
897 
898   return std::make_pair(KeyLen, DataLen);
899 }
900 
setDeserializationListener(ASTDeserializationListener * Listener,bool TakeOwnership)901 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
902                                            bool TakeOwnership) {
903   DeserializationListener = Listener;
904   OwnsDeserializationListener = TakeOwnership;
905 }
906 
ComputeHash(Selector Sel)907 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
908   return serialization::ComputeHash(Sel);
909 }
910 
get(ASTReader & Reader,ModuleFile & MF,DeclID Value)911 LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF, DeclID Value) {
912   LocalDeclID ID(Value);
913 #ifndef NDEBUG
914   if (!MF.ModuleOffsetMap.empty())
915     Reader.ReadModuleOffsetMap(MF);
916 
917   unsigned ModuleFileIndex = ID.getModuleFileIndex();
918   unsigned LocalDeclID = ID.getLocalDeclIndex();
919 
920   assert(ModuleFileIndex <= MF.TransitiveImports.size());
921 
922   ModuleFile *OwningModuleFile =
923       ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
924   assert(OwningModuleFile);
925 
926   unsigned LocalNumDecls = OwningModuleFile->LocalNumDecls;
927 
928   if (!ModuleFileIndex)
929     LocalNumDecls += NUM_PREDEF_DECL_IDS;
930 
931   assert(LocalDeclID < LocalNumDecls);
932 #endif
933   (void)Reader;
934   (void)MF;
935   return ID;
936 }
937 
get(ASTReader & Reader,ModuleFile & MF,unsigned ModuleFileIndex,unsigned LocalDeclID)938 LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF,
939                              unsigned ModuleFileIndex, unsigned LocalDeclID) {
940   DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID;
941   return LocalDeclID::get(Reader, MF, Value);
942 }
943 
944 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)945 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
946   return readULEBKeyDataLength(d);
947 }
948 
949 ASTSelectorLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)950 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
951   using namespace llvm::support;
952 
953   SelectorTable &SelTable = Reader.getContext().Selectors;
954   unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
955   const IdentifierInfo *FirstII = Reader.getLocalIdentifier(
956       F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
957   if (N == 0)
958     return SelTable.getNullarySelector(FirstII);
959   else if (N == 1)
960     return SelTable.getUnarySelector(FirstII);
961 
962   SmallVector<const IdentifierInfo *, 16> Args;
963   Args.push_back(FirstII);
964   for (unsigned I = 1; I != N; ++I)
965     Args.push_back(Reader.getLocalIdentifier(
966         F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
967 
968   return SelTable.getSelector(N, Args.data());
969 }
970 
971 ASTSelectorLookupTrait::data_type
ReadData(Selector,const unsigned char * d,unsigned DataLen)972 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
973                                  unsigned DataLen) {
974   using namespace llvm::support;
975 
976   data_type Result;
977 
978   Result.ID = Reader.getGlobalSelectorID(
979       F, endian::readNext<uint32_t, llvm::endianness::little>(d));
980   unsigned FullInstanceBits =
981       endian::readNext<uint16_t, llvm::endianness::little>(d);
982   unsigned FullFactoryBits =
983       endian::readNext<uint16_t, llvm::endianness::little>(d);
984   Result.InstanceBits = FullInstanceBits & 0x3;
985   Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
986   Result.FactoryBits = FullFactoryBits & 0x3;
987   Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
988   unsigned NumInstanceMethods = FullInstanceBits >> 3;
989   unsigned NumFactoryMethods = FullFactoryBits >> 3;
990 
991   // Load instance methods
992   for (unsigned I = 0; I != NumInstanceMethods; ++I) {
993     if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
994             F, LocalDeclID::get(
995                    Reader, F,
996                    endian::readNext<DeclID, llvm::endianness::little>(d))))
997       Result.Instance.push_back(Method);
998   }
999 
1000   // Load factory methods
1001   for (unsigned I = 0; I != NumFactoryMethods; ++I) {
1002     if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1003             F, LocalDeclID::get(
1004                    Reader, F,
1005                    endian::readNext<DeclID, llvm::endianness::little>(d))))
1006       Result.Factory.push_back(Method);
1007   }
1008 
1009   return Result;
1010 }
1011 
ComputeHash(const internal_key_type & a)1012 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
1013   return llvm::djbHash(a);
1014 }
1015 
1016 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)1017 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
1018   return readULEBKeyDataLength(d);
1019 }
1020 
1021 ASTIdentifierLookupTraitBase::internal_key_type
ReadKey(const unsigned char * d,unsigned n)1022 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
1023   assert(n >= 2 && d[n-1] == '\0');
1024   return StringRef((const char*) d, n-1);
1025 }
1026 
1027 /// Whether the given identifier is "interesting".
isInterestingIdentifier(ASTReader & Reader,const IdentifierInfo & II,bool IsModule)1028 static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II,
1029                                     bool IsModule) {
1030   bool IsInteresting =
1031       II.getNotableIdentifierID() != tok::NotableIdentifierKind::not_notable ||
1032       II.getBuiltinID() != Builtin::ID::NotBuiltin ||
1033       II.getObjCKeywordID() != tok::ObjCKeywordKind::objc_not_keyword;
1034   return II.hadMacroDefinition() || II.isPoisoned() ||
1035          (!IsModule && IsInteresting) || II.hasRevertedTokenIDToIdentifier() ||
1036          (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
1037           II.getFETokenInfo());
1038 }
1039 
readBit(unsigned & Bits)1040 static bool readBit(unsigned &Bits) {
1041   bool Value = Bits & 0x1;
1042   Bits >>= 1;
1043   return Value;
1044 }
1045 
ReadIdentifierID(const unsigned char * d)1046 IdentifierID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
1047   using namespace llvm::support;
1048 
1049   IdentifierID RawID =
1050       endian::readNext<IdentifierID, llvm::endianness::little>(d);
1051   return Reader.getGlobalIdentifierID(F, RawID >> 1);
1052 }
1053 
markIdentifierFromAST(ASTReader & Reader,IdentifierInfo & II)1054 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
1055   if (!II.isFromAST()) {
1056     II.setIsFromAST();
1057     bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
1058     if (isInterestingIdentifier(Reader, II, IsModule))
1059       II.setChangedSinceDeserialization();
1060   }
1061 }
1062 
ReadData(const internal_key_type & k,const unsigned char * d,unsigned DataLen)1063 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
1064                                                    const unsigned char* d,
1065                                                    unsigned DataLen) {
1066   using namespace llvm::support;
1067 
1068   IdentifierID RawID =
1069       endian::readNext<IdentifierID, llvm::endianness::little>(d);
1070   bool IsInteresting = RawID & 0x01;
1071 
1072   DataLen -= sizeof(IdentifierID);
1073 
1074   // Wipe out the "is interesting" bit.
1075   RawID = RawID >> 1;
1076 
1077   // Build the IdentifierInfo and link the identifier ID with it.
1078   IdentifierInfo *II = KnownII;
1079   if (!II) {
1080     II = &Reader.getIdentifierTable().getOwn(k);
1081     KnownII = II;
1082   }
1083   markIdentifierFromAST(Reader, *II);
1084   Reader.markIdentifierUpToDate(II);
1085 
1086   IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1087   if (!IsInteresting) {
1088     // For uninteresting identifiers, there's nothing else to do. Just notify
1089     // the reader that we've finished loading this identifier.
1090     Reader.SetIdentifierInfo(ID, II);
1091     return II;
1092   }
1093 
1094   unsigned ObjCOrBuiltinID =
1095       endian::readNext<uint16_t, llvm::endianness::little>(d);
1096   unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1097   bool CPlusPlusOperatorKeyword = readBit(Bits);
1098   bool HasRevertedTokenIDToIdentifier = readBit(Bits);
1099   bool Poisoned = readBit(Bits);
1100   bool ExtensionToken = readBit(Bits);
1101   bool HadMacroDefinition = readBit(Bits);
1102 
1103   assert(Bits == 0 && "Extra bits in the identifier?");
1104   DataLen -= sizeof(uint16_t) * 2;
1105 
1106   // Set or check the various bits in the IdentifierInfo structure.
1107   // Token IDs are read-only.
1108   if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1109     II->revertTokenIDToIdentifier();
1110   if (!F.isModule())
1111     II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1112   assert(II->isExtensionToken() == ExtensionToken &&
1113          "Incorrect extension token flag");
1114   (void)ExtensionToken;
1115   if (Poisoned)
1116     II->setIsPoisoned(true);
1117   assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
1118          "Incorrect C++ operator keyword flag");
1119   (void)CPlusPlusOperatorKeyword;
1120 
1121   // If this identifier is a macro, deserialize the macro
1122   // definition.
1123   if (HadMacroDefinition) {
1124     uint32_t MacroDirectivesOffset =
1125         endian::readNext<uint32_t, llvm::endianness::little>(d);
1126     DataLen -= 4;
1127 
1128     Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1129   }
1130 
1131   Reader.SetIdentifierInfo(ID, II);
1132 
1133   // Read all of the declarations visible at global scope with this
1134   // name.
1135   if (DataLen > 0) {
1136     SmallVector<GlobalDeclID, 4> DeclIDs;
1137     for (; DataLen > 0; DataLen -= sizeof(DeclID))
1138       DeclIDs.push_back(Reader.getGlobalDeclID(
1139           F, LocalDeclID::get(
1140                  Reader, F,
1141                  endian::readNext<DeclID, llvm::endianness::little>(d))));
1142     Reader.SetGloballyVisibleDecls(II, DeclIDs);
1143   }
1144 
1145   return II;
1146 }
1147 
DeclarationNameKey(DeclarationName Name)1148 DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
1149     : Kind(Name.getNameKind()) {
1150   switch (Kind) {
1151   case DeclarationName::Identifier:
1152     Data = (uint64_t)Name.getAsIdentifierInfo();
1153     break;
1154   case DeclarationName::ObjCZeroArgSelector:
1155   case DeclarationName::ObjCOneArgSelector:
1156   case DeclarationName::ObjCMultiArgSelector:
1157     Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1158     break;
1159   case DeclarationName::CXXOperatorName:
1160     Data = Name.getCXXOverloadedOperator();
1161     break;
1162   case DeclarationName::CXXLiteralOperatorName:
1163     Data = (uint64_t)Name.getCXXLiteralIdentifier();
1164     break;
1165   case DeclarationName::CXXDeductionGuideName:
1166     Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1167                ->getDeclName().getAsIdentifierInfo();
1168     break;
1169   case DeclarationName::CXXConstructorName:
1170   case DeclarationName::CXXDestructorName:
1171   case DeclarationName::CXXConversionFunctionName:
1172   case DeclarationName::CXXUsingDirective:
1173     Data = 0;
1174     break;
1175   }
1176 }
1177 
getHash() const1178 unsigned DeclarationNameKey::getHash() const {
1179   llvm::FoldingSetNodeID ID;
1180   ID.AddInteger(Kind);
1181 
1182   switch (Kind) {
1183   case DeclarationName::Identifier:
1184   case DeclarationName::CXXLiteralOperatorName:
1185   case DeclarationName::CXXDeductionGuideName:
1186     ID.AddString(((IdentifierInfo*)Data)->getName());
1187     break;
1188   case DeclarationName::ObjCZeroArgSelector:
1189   case DeclarationName::ObjCOneArgSelector:
1190   case DeclarationName::ObjCMultiArgSelector:
1191     ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1192     break;
1193   case DeclarationName::CXXOperatorName:
1194     ID.AddInteger((OverloadedOperatorKind)Data);
1195     break;
1196   case DeclarationName::CXXConstructorName:
1197   case DeclarationName::CXXDestructorName:
1198   case DeclarationName::CXXConversionFunctionName:
1199   case DeclarationName::CXXUsingDirective:
1200     break;
1201   }
1202 
1203   return ID.computeStableHash();
1204 }
1205 
1206 ModuleFile *
ReadFileRef(const unsigned char * & d)1207 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
1208   using namespace llvm::support;
1209 
1210   uint32_t ModuleFileID =
1211       endian::readNext<uint32_t, llvm::endianness::little>(d);
1212   return Reader.getLocalModuleFile(F, ModuleFileID);
1213 }
1214 
1215 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)1216 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
1217   return readULEBKeyDataLength(d);
1218 }
1219 
1220 ASTDeclContextNameLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)1221 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1222   using namespace llvm::support;
1223 
1224   auto Kind = (DeclarationName::NameKind)*d++;
1225   uint64_t Data;
1226   switch (Kind) {
1227   case DeclarationName::Identifier:
1228   case DeclarationName::CXXLiteralOperatorName:
1229   case DeclarationName::CXXDeductionGuideName:
1230     Data = (uint64_t)Reader.getLocalIdentifier(
1231         F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1232     break;
1233   case DeclarationName::ObjCZeroArgSelector:
1234   case DeclarationName::ObjCOneArgSelector:
1235   case DeclarationName::ObjCMultiArgSelector:
1236     Data = (uint64_t)Reader
1237                .getLocalSelector(
1238                    F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1239                .getAsOpaquePtr();
1240     break;
1241   case DeclarationName::CXXOperatorName:
1242     Data = *d++; // OverloadedOperatorKind
1243     break;
1244   case DeclarationName::CXXConstructorName:
1245   case DeclarationName::CXXDestructorName:
1246   case DeclarationName::CXXConversionFunctionName:
1247   case DeclarationName::CXXUsingDirective:
1248     Data = 0;
1249     break;
1250   }
1251 
1252   return DeclarationNameKey(Kind, Data);
1253 }
1254 
ReadDataInto(internal_key_type,const unsigned char * d,unsigned DataLen,data_type_builder & Val)1255 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1256                                                  const unsigned char *d,
1257                                                  unsigned DataLen,
1258                                                  data_type_builder &Val) {
1259   using namespace llvm::support;
1260 
1261   for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) {
1262     LocalDeclID ID = LocalDeclID::get(
1263         Reader, F, endian::readNext<DeclID, llvm::endianness::little>(d));
1264     Val.insert(Reader.getGlobalDeclID(F, ID));
1265   }
1266 }
1267 
ReadLexicalDeclContextStorage(ModuleFile & M,BitstreamCursor & Cursor,uint64_t Offset,DeclContext * DC)1268 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1269                                               BitstreamCursor &Cursor,
1270                                               uint64_t Offset,
1271                                               DeclContext *DC) {
1272   assert(Offset != 0);
1273 
1274   SavedStreamPosition SavedPosition(Cursor);
1275   if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1276     Error(std::move(Err));
1277     return true;
1278   }
1279 
1280   RecordData Record;
1281   StringRef Blob;
1282   Expected<unsigned> MaybeCode = Cursor.ReadCode();
1283   if (!MaybeCode) {
1284     Error(MaybeCode.takeError());
1285     return true;
1286   }
1287   unsigned Code = MaybeCode.get();
1288 
1289   Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1290   if (!MaybeRecCode) {
1291     Error(MaybeRecCode.takeError());
1292     return true;
1293   }
1294   unsigned RecCode = MaybeRecCode.get();
1295   if (RecCode != DECL_CONTEXT_LEXICAL) {
1296     Error("Expected lexical block");
1297     return true;
1298   }
1299 
1300   assert(!isa<TranslationUnitDecl>(DC) &&
1301          "expected a TU_UPDATE_LEXICAL record for TU");
1302   // If we are handling a C++ class template instantiation, we can see multiple
1303   // lexical updates for the same record. It's important that we select only one
1304   // of them, so that field numbering works properly. Just pick the first one we
1305   // see.
1306   auto &Lex = LexicalDecls[DC];
1307   if (!Lex.first) {
1308     Lex = std::make_pair(
1309         &M, llvm::ArrayRef(
1310                 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
1311                 Blob.size() / sizeof(DeclID)));
1312   }
1313   DC->setHasExternalLexicalStorage(true);
1314   return false;
1315 }
1316 
ReadVisibleDeclContextStorage(ModuleFile & M,BitstreamCursor & Cursor,uint64_t Offset,GlobalDeclID ID)1317 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1318                                               BitstreamCursor &Cursor,
1319                                               uint64_t Offset,
1320                                               GlobalDeclID ID) {
1321   assert(Offset != 0);
1322 
1323   SavedStreamPosition SavedPosition(Cursor);
1324   if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1325     Error(std::move(Err));
1326     return true;
1327   }
1328 
1329   RecordData Record;
1330   StringRef Blob;
1331   Expected<unsigned> MaybeCode = Cursor.ReadCode();
1332   if (!MaybeCode) {
1333     Error(MaybeCode.takeError());
1334     return true;
1335   }
1336   unsigned Code = MaybeCode.get();
1337 
1338   Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1339   if (!MaybeRecCode) {
1340     Error(MaybeRecCode.takeError());
1341     return true;
1342   }
1343   unsigned RecCode = MaybeRecCode.get();
1344   if (RecCode != DECL_CONTEXT_VISIBLE) {
1345     Error("Expected visible lookup table block");
1346     return true;
1347   }
1348 
1349   // We can't safely determine the primary context yet, so delay attaching the
1350   // lookup table until we're done with recursive deserialization.
1351   auto *Data = (const unsigned char*)Blob.data();
1352   PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1353   return false;
1354 }
1355 
Error(StringRef Msg) const1356 void ASTReader::Error(StringRef Msg) const {
1357   Error(diag::err_fe_pch_malformed, Msg);
1358   if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1359       !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1360     Diag(diag::note_module_cache_path)
1361       << PP.getHeaderSearchInfo().getModuleCachePath();
1362   }
1363 }
1364 
Error(unsigned DiagID,StringRef Arg1,StringRef Arg2,StringRef Arg3) const1365 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1366                       StringRef Arg3) const {
1367   if (Diags.isDiagnosticInFlight())
1368     Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3);
1369   else
1370     Diag(DiagID) << Arg1 << Arg2 << Arg3;
1371 }
1372 
Error(llvm::Error && Err) const1373 void ASTReader::Error(llvm::Error &&Err) const {
1374   llvm::Error RemainingErr =
1375       handleErrors(std::move(Err), [this](const DiagnosticError &E) {
1376         auto Diag = E.getDiagnostic().second;
1377 
1378         // Ideally we'd just emit it, but have to handle a possible in-flight
1379         // diagnostic. Note that the location is currently ignored as well.
1380         auto NumArgs = Diag.getStorage()->NumDiagArgs;
1381         assert(NumArgs <= 3 && "Can only have up to 3 arguments");
1382         StringRef Arg1, Arg2, Arg3;
1383         switch (NumArgs) {
1384         case 3:
1385           Arg3 = Diag.getStringArg(2);
1386           [[fallthrough]];
1387         case 2:
1388           Arg2 = Diag.getStringArg(1);
1389           [[fallthrough]];
1390         case 1:
1391           Arg1 = Diag.getStringArg(0);
1392         }
1393         Error(Diag.getDiagID(), Arg1, Arg2, Arg3);
1394       });
1395   if (RemainingErr)
1396     Error(toString(std::move(RemainingErr)));
1397 }
1398 
1399 //===----------------------------------------------------------------------===//
1400 // Source Manager Deserialization
1401 //===----------------------------------------------------------------------===//
1402 
1403 /// Read the line table in the source manager block.
ParseLineTable(ModuleFile & F,const RecordData & Record)1404 void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
1405   unsigned Idx = 0;
1406   LineTableInfo &LineTable = SourceMgr.getLineTable();
1407 
1408   // Parse the file names
1409   std::map<int, int> FileIDs;
1410   FileIDs[-1] = -1; // For unspecified filenames.
1411   for (unsigned I = 0; Record[Idx]; ++I) {
1412     // Extract the file name
1413     auto Filename = ReadPath(F, Record, Idx);
1414     FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1415   }
1416   ++Idx;
1417 
1418   // Parse the line entries
1419   std::vector<LineEntry> Entries;
1420   while (Idx < Record.size()) {
1421     FileID FID = ReadFileID(F, Record, Idx);
1422 
1423     // Extract the line entries
1424     unsigned NumEntries = Record[Idx++];
1425     assert(NumEntries && "no line entries for file ID");
1426     Entries.clear();
1427     Entries.reserve(NumEntries);
1428     for (unsigned I = 0; I != NumEntries; ++I) {
1429       unsigned FileOffset = Record[Idx++];
1430       unsigned LineNo = Record[Idx++];
1431       int FilenameID = FileIDs[Record[Idx++]];
1432       SrcMgr::CharacteristicKind FileKind
1433         = (SrcMgr::CharacteristicKind)Record[Idx++];
1434       unsigned IncludeOffset = Record[Idx++];
1435       Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1436                                        FileKind, IncludeOffset));
1437     }
1438     LineTable.AddEntry(FID, Entries);
1439   }
1440 }
1441 
1442 /// Read a source manager block
ReadSourceManagerBlock(ModuleFile & F)1443 llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1444   using namespace SrcMgr;
1445 
1446   BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1447 
1448   // Set the source-location entry cursor to the current position in
1449   // the stream. This cursor will be used to read the contents of the
1450   // source manager block initially, and then lazily read
1451   // source-location entries as needed.
1452   SLocEntryCursor = F.Stream;
1453 
1454   // The stream itself is going to skip over the source manager block.
1455   if (llvm::Error Err = F.Stream.SkipBlock())
1456     return Err;
1457 
1458   // Enter the source manager block.
1459   if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1460     return Err;
1461   F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1462 
1463   RecordData Record;
1464   while (true) {
1465     Expected<llvm::BitstreamEntry> MaybeE =
1466         SLocEntryCursor.advanceSkippingSubblocks();
1467     if (!MaybeE)
1468       return MaybeE.takeError();
1469     llvm::BitstreamEntry E = MaybeE.get();
1470 
1471     switch (E.Kind) {
1472     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1473     case llvm::BitstreamEntry::Error:
1474       return llvm::createStringError(std::errc::illegal_byte_sequence,
1475                                      "malformed block record in AST file");
1476     case llvm::BitstreamEntry::EndBlock:
1477       return llvm::Error::success();
1478     case llvm::BitstreamEntry::Record:
1479       // The interesting case.
1480       break;
1481     }
1482 
1483     // Read a record.
1484     Record.clear();
1485     StringRef Blob;
1486     Expected<unsigned> MaybeRecord =
1487         SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1488     if (!MaybeRecord)
1489       return MaybeRecord.takeError();
1490     switch (MaybeRecord.get()) {
1491     default:  // Default behavior: ignore.
1492       break;
1493 
1494     case SM_SLOC_FILE_ENTRY:
1495     case SM_SLOC_BUFFER_ENTRY:
1496     case SM_SLOC_EXPANSION_ENTRY:
1497       // Once we hit one of the source location entries, we're done.
1498       return llvm::Error::success();
1499     }
1500   }
1501 }
1502 
1503 llvm::Expected<SourceLocation::UIntTy>
readSLocOffset(ModuleFile * F,unsigned Index)1504 ASTReader::readSLocOffset(ModuleFile *F, unsigned Index) {
1505   BitstreamCursor &Cursor = F->SLocEntryCursor;
1506   SavedStreamPosition SavedPosition(Cursor);
1507   if (llvm::Error Err = Cursor.JumpToBit(F->SLocEntryOffsetsBase +
1508                                          F->SLocEntryOffsets[Index]))
1509     return std::move(Err);
1510 
1511   Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
1512   if (!MaybeEntry)
1513     return MaybeEntry.takeError();
1514 
1515   llvm::BitstreamEntry Entry = MaybeEntry.get();
1516   if (Entry.Kind != llvm::BitstreamEntry::Record)
1517     return llvm::createStringError(
1518         std::errc::illegal_byte_sequence,
1519         "incorrectly-formatted source location entry in AST file");
1520 
1521   RecordData Record;
1522   StringRef Blob;
1523   Expected<unsigned> MaybeSLOC = Cursor.readRecord(Entry.ID, Record, &Blob);
1524   if (!MaybeSLOC)
1525     return MaybeSLOC.takeError();
1526 
1527   switch (MaybeSLOC.get()) {
1528   default:
1529     return llvm::createStringError(
1530         std::errc::illegal_byte_sequence,
1531         "incorrectly-formatted source location entry in AST file");
1532   case SM_SLOC_FILE_ENTRY:
1533   case SM_SLOC_BUFFER_ENTRY:
1534   case SM_SLOC_EXPANSION_ENTRY:
1535     return F->SLocEntryBaseOffset + Record[0];
1536   }
1537 }
1538 
getSLocEntryID(SourceLocation::UIntTy SLocOffset)1539 int ASTReader::getSLocEntryID(SourceLocation::UIntTy SLocOffset) {
1540   auto SLocMapI =
1541       GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1542   assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1543          "Corrupted global sloc offset map");
1544   ModuleFile *F = SLocMapI->second;
1545 
1546   bool Invalid = false;
1547 
1548   auto It = llvm::upper_bound(
1549       llvm::index_range(0, F->LocalNumSLocEntries), SLocOffset,
1550       [&](SourceLocation::UIntTy Offset, std::size_t LocalIndex) {
1551         int ID = F->SLocEntryBaseID + LocalIndex;
1552         std::size_t Index = -ID - 2;
1553         if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1554           assert(!SourceMgr.SLocEntryLoaded[Index]);
1555           auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1556           if (!MaybeEntryOffset) {
1557             Error(MaybeEntryOffset.takeError());
1558             Invalid = true;
1559             return true;
1560           }
1561           SourceMgr.LoadedSLocEntryTable[Index] =
1562               SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1563           SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1564         }
1565         return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1566       });
1567 
1568   if (Invalid)
1569     return 0;
1570 
1571   // The iterator points to the first entry with start offset greater than the
1572   // offset of interest. The previous entry must contain the offset of interest.
1573   return F->SLocEntryBaseID + *std::prev(It);
1574 }
1575 
ReadSLocEntry(int ID)1576 bool ASTReader::ReadSLocEntry(int ID) {
1577   if (ID == 0)
1578     return false;
1579 
1580   if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1581     Error("source location entry ID out-of-range for AST file");
1582     return true;
1583   }
1584 
1585   // Local helper to read the (possibly-compressed) buffer data following the
1586   // entry record.
1587   auto ReadBuffer = [this](
1588       BitstreamCursor &SLocEntryCursor,
1589       StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1590     RecordData Record;
1591     StringRef Blob;
1592     Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1593     if (!MaybeCode) {
1594       Error(MaybeCode.takeError());
1595       return nullptr;
1596     }
1597     unsigned Code = MaybeCode.get();
1598 
1599     Expected<unsigned> MaybeRecCode =
1600         SLocEntryCursor.readRecord(Code, Record, &Blob);
1601     if (!MaybeRecCode) {
1602       Error(MaybeRecCode.takeError());
1603       return nullptr;
1604     }
1605     unsigned RecCode = MaybeRecCode.get();
1606 
1607     if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1608       // Inspect the first byte to differentiate zlib (\x78) and zstd
1609       // (little-endian 0xFD2FB528).
1610       const llvm::compression::Format F =
1611           Blob.size() > 0 && Blob.data()[0] == 0x78
1612               ? llvm::compression::Format::Zlib
1613               : llvm::compression::Format::Zstd;
1614       if (const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1615         Error(Reason);
1616         return nullptr;
1617       }
1618       SmallVector<uint8_t, 0> Decompressed;
1619       if (llvm::Error E = llvm::compression::decompress(
1620               F, llvm::arrayRefFromStringRef(Blob), Decompressed, Record[0])) {
1621         Error("could not decompress embedded file contents: " +
1622               llvm::toString(std::move(E)));
1623         return nullptr;
1624       }
1625       return llvm::MemoryBuffer::getMemBufferCopy(
1626           llvm::toStringRef(Decompressed), Name);
1627     } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1628       return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1629     } else {
1630       Error("AST record has invalid code");
1631       return nullptr;
1632     }
1633   };
1634 
1635   ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1636   if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1637           F->SLocEntryOffsetsBase +
1638           F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1639     Error(std::move(Err));
1640     return true;
1641   }
1642 
1643   BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1644   SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset;
1645 
1646   ++NumSLocEntriesRead;
1647   Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1648   if (!MaybeEntry) {
1649     Error(MaybeEntry.takeError());
1650     return true;
1651   }
1652   llvm::BitstreamEntry Entry = MaybeEntry.get();
1653 
1654   if (Entry.Kind != llvm::BitstreamEntry::Record) {
1655     Error("incorrectly-formatted source location entry in AST file");
1656     return true;
1657   }
1658 
1659   RecordData Record;
1660   StringRef Blob;
1661   Expected<unsigned> MaybeSLOC =
1662       SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1663   if (!MaybeSLOC) {
1664     Error(MaybeSLOC.takeError());
1665     return true;
1666   }
1667   switch (MaybeSLOC.get()) {
1668   default:
1669     Error("incorrectly-formatted source location entry in AST file");
1670     return true;
1671 
1672   case SM_SLOC_FILE_ENTRY: {
1673     // We will detect whether a file changed and return 'Failure' for it, but
1674     // we will also try to fail gracefully by setting up the SLocEntry.
1675     unsigned InputID = Record[4];
1676     InputFile IF = getInputFile(*F, InputID);
1677     OptionalFileEntryRef File = IF.getFile();
1678     bool OverriddenBuffer = IF.isOverridden();
1679 
1680     // Note that we only check if a File was returned. If it was out-of-date
1681     // we have complained but we will continue creating a FileID to recover
1682     // gracefully.
1683     if (!File)
1684       return true;
1685 
1686     SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1687     if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1688       // This is the module's main file.
1689       IncludeLoc = getImportLocation(F);
1690     }
1691     SrcMgr::CharacteristicKind
1692       FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1693     FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
1694                                         BaseOffset + Record[0]);
1695     SrcMgr::FileInfo &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
1696     FileInfo.NumCreatedFIDs = Record[5];
1697     if (Record[3])
1698       FileInfo.setHasLineDirectives();
1699 
1700     unsigned NumFileDecls = Record[7];
1701     if (NumFileDecls && ContextObj) {
1702       const unaligned_decl_id_t *FirstDecl = F->FileSortedDecls + Record[6];
1703       assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1704       FileDeclIDs[FID] =
1705           FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
1706     }
1707 
1708     const SrcMgr::ContentCache &ContentCache =
1709         SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
1710     if (OverriddenBuffer && !ContentCache.BufferOverridden &&
1711         ContentCache.ContentsEntry == ContentCache.OrigEntry &&
1712         !ContentCache.getBufferIfLoaded()) {
1713       auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1714       if (!Buffer)
1715         return true;
1716       SourceMgr.overrideFileContents(*File, std::move(Buffer));
1717     }
1718 
1719     break;
1720   }
1721 
1722   case SM_SLOC_BUFFER_ENTRY: {
1723     const char *Name = Blob.data();
1724     unsigned Offset = Record[0];
1725     SrcMgr::CharacteristicKind
1726       FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1727     SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1728     if (IncludeLoc.isInvalid() && F->isModule()) {
1729       IncludeLoc = getImportLocation(F);
1730     }
1731 
1732     auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1733     if (!Buffer)
1734       return true;
1735     FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1736                                         BaseOffset + Offset, IncludeLoc);
1737     if (Record[3]) {
1738       auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
1739       FileInfo.setHasLineDirectives();
1740     }
1741     break;
1742   }
1743 
1744   case SM_SLOC_EXPANSION_ENTRY: {
1745     LocSeq::State Seq;
1746     SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1], Seq);
1747     SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2], Seq);
1748     SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3], Seq);
1749     SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
1750                                  Record[5], Record[4], ID,
1751                                  BaseOffset + Record[0]);
1752     break;
1753   }
1754   }
1755 
1756   return false;
1757 }
1758 
getModuleImportLoc(int ID)1759 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1760   if (ID == 0)
1761     return std::make_pair(SourceLocation(), "");
1762 
1763   if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1764     Error("source location entry ID out-of-range for AST file");
1765     return std::make_pair(SourceLocation(), "");
1766   }
1767 
1768   // Find which module file this entry lands in.
1769   ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1770   if (!M->isModule())
1771     return std::make_pair(SourceLocation(), "");
1772 
1773   // FIXME: Can we map this down to a particular submodule? That would be
1774   // ideal.
1775   return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1776 }
1777 
1778 /// Find the location where the module F is imported.
getImportLocation(ModuleFile * F)1779 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1780   if (F->ImportLoc.isValid())
1781     return F->ImportLoc;
1782 
1783   // Otherwise we have a PCH. It's considered to be "imported" at the first
1784   // location of its includer.
1785   if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1786     // Main file is the importer.
1787     assert(SourceMgr.getMainFileID().isValid() && "missing main file");
1788     return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1789   }
1790   return F->ImportedBy[0]->FirstLoc;
1791 }
1792 
1793 /// Enter a subblock of the specified BlockID with the specified cursor. Read
1794 /// the abbreviations that are at the top of the block and then leave the cursor
1795 /// pointing into the block.
ReadBlockAbbrevs(BitstreamCursor & Cursor,unsigned BlockID,uint64_t * StartOfBlockOffset)1796 llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
1797                                         unsigned BlockID,
1798                                         uint64_t *StartOfBlockOffset) {
1799   if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
1800     return Err;
1801 
1802   if (StartOfBlockOffset)
1803     *StartOfBlockOffset = Cursor.GetCurrentBitNo();
1804 
1805   while (true) {
1806     uint64_t Offset = Cursor.GetCurrentBitNo();
1807     Expected<unsigned> MaybeCode = Cursor.ReadCode();
1808     if (!MaybeCode)
1809       return MaybeCode.takeError();
1810     unsigned Code = MaybeCode.get();
1811 
1812     // We expect all abbrevs to be at the start of the block.
1813     if (Code != llvm::bitc::DEFINE_ABBREV) {
1814       if (llvm::Error Err = Cursor.JumpToBit(Offset))
1815         return Err;
1816       return llvm::Error::success();
1817     }
1818     if (llvm::Error Err = Cursor.ReadAbbrevRecord())
1819       return Err;
1820   }
1821 }
1822 
ReadToken(ModuleFile & M,const RecordDataImpl & Record,unsigned & Idx)1823 Token ASTReader::ReadToken(ModuleFile &M, const RecordDataImpl &Record,
1824                            unsigned &Idx) {
1825   Token Tok;
1826   Tok.startToken();
1827   Tok.setLocation(ReadSourceLocation(M, Record, Idx));
1828   Tok.setKind((tok::TokenKind)Record[Idx++]);
1829   Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1830 
1831   if (Tok.isAnnotation()) {
1832     Tok.setAnnotationEndLoc(ReadSourceLocation(M, Record, Idx));
1833     switch (Tok.getKind()) {
1834     case tok::annot_pragma_loop_hint: {
1835       auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo;
1836       Info->PragmaName = ReadToken(M, Record, Idx);
1837       Info->Option = ReadToken(M, Record, Idx);
1838       unsigned NumTokens = Record[Idx++];
1839       SmallVector<Token, 4> Toks;
1840       Toks.reserve(NumTokens);
1841       for (unsigned I = 0; I < NumTokens; ++I)
1842         Toks.push_back(ReadToken(M, Record, Idx));
1843       Info->Toks = llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
1844       Tok.setAnnotationValue(static_cast<void *>(Info));
1845       break;
1846     }
1847     case tok::annot_pragma_pack: {
1848       auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo;
1849       Info->Action = static_cast<Sema::PragmaMsStackAction>(Record[Idx++]);
1850       auto SlotLabel = ReadString(Record, Idx);
1851       Info->SlotLabel =
1852           llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
1853       Info->Alignment = ReadToken(M, Record, Idx);
1854       Tok.setAnnotationValue(static_cast<void *>(Info));
1855       break;
1856     }
1857     // Some annotation tokens do not use the PtrData field.
1858     case tok::annot_pragma_openmp:
1859     case tok::annot_pragma_openmp_end:
1860     case tok::annot_pragma_unused:
1861     case tok::annot_pragma_openacc:
1862     case tok::annot_pragma_openacc_end:
1863       break;
1864     default:
1865       llvm_unreachable("missing deserialization code for annotation token");
1866     }
1867   } else {
1868     Tok.setLength(Record[Idx++]);
1869     if (IdentifierInfo *II = getLocalIdentifier(M, Record[Idx++]))
1870       Tok.setIdentifierInfo(II);
1871   }
1872   return Tok;
1873 }
1874 
ReadMacroRecord(ModuleFile & F,uint64_t Offset)1875 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1876   BitstreamCursor &Stream = F.MacroCursor;
1877 
1878   // Keep track of where we are in the stream, then jump back there
1879   // after reading this macro.
1880   SavedStreamPosition SavedPosition(Stream);
1881 
1882   if (llvm::Error Err = Stream.JumpToBit(Offset)) {
1883     // FIXME this drops errors on the floor.
1884     consumeError(std::move(Err));
1885     return nullptr;
1886   }
1887   RecordData Record;
1888   SmallVector<IdentifierInfo*, 16> MacroParams;
1889   MacroInfo *Macro = nullptr;
1890   llvm::MutableArrayRef<Token> MacroTokens;
1891 
1892   while (true) {
1893     // Advance to the next record, but if we get to the end of the block, don't
1894     // pop it (removing all the abbreviations from the cursor) since we want to
1895     // be able to reseek within the block and read entries.
1896     unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1897     Expected<llvm::BitstreamEntry> MaybeEntry =
1898         Stream.advanceSkippingSubblocks(Flags);
1899     if (!MaybeEntry) {
1900       Error(MaybeEntry.takeError());
1901       return Macro;
1902     }
1903     llvm::BitstreamEntry Entry = MaybeEntry.get();
1904 
1905     switch (Entry.Kind) {
1906     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1907     case llvm::BitstreamEntry::Error:
1908       Error("malformed block record in AST file");
1909       return Macro;
1910     case llvm::BitstreamEntry::EndBlock:
1911       return Macro;
1912     case llvm::BitstreamEntry::Record:
1913       // The interesting case.
1914       break;
1915     }
1916 
1917     // Read a record.
1918     Record.clear();
1919     PreprocessorRecordTypes RecType;
1920     if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
1921       RecType = (PreprocessorRecordTypes)MaybeRecType.get();
1922     else {
1923       Error(MaybeRecType.takeError());
1924       return Macro;
1925     }
1926     switch (RecType) {
1927     case PP_MODULE_MACRO:
1928     case PP_MACRO_DIRECTIVE_HISTORY:
1929       return Macro;
1930 
1931     case PP_MACRO_OBJECT_LIKE:
1932     case PP_MACRO_FUNCTION_LIKE: {
1933       // If we already have a macro, that means that we've hit the end
1934       // of the definition of the macro we were looking for. We're
1935       // done.
1936       if (Macro)
1937         return Macro;
1938 
1939       unsigned NextIndex = 1; // Skip identifier ID.
1940       SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1941       MacroInfo *MI = PP.AllocateMacroInfo(Loc);
1942       MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1943       MI->setIsUsed(Record[NextIndex++]);
1944       MI->setUsedForHeaderGuard(Record[NextIndex++]);
1945       MacroTokens = MI->allocateTokens(Record[NextIndex++],
1946                                        PP.getPreprocessorAllocator());
1947       if (RecType == PP_MACRO_FUNCTION_LIKE) {
1948         // Decode function-like macro info.
1949         bool isC99VarArgs = Record[NextIndex++];
1950         bool isGNUVarArgs = Record[NextIndex++];
1951         bool hasCommaPasting = Record[NextIndex++];
1952         MacroParams.clear();
1953         unsigned NumArgs = Record[NextIndex++];
1954         for (unsigned i = 0; i != NumArgs; ++i)
1955           MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1956 
1957         // Install function-like macro info.
1958         MI->setIsFunctionLike();
1959         if (isC99VarArgs) MI->setIsC99Varargs();
1960         if (isGNUVarArgs) MI->setIsGNUVarargs();
1961         if (hasCommaPasting) MI->setHasCommaPasting();
1962         MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
1963       }
1964 
1965       // Remember that we saw this macro last so that we add the tokens that
1966       // form its body to it.
1967       Macro = MI;
1968 
1969       if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1970           Record[NextIndex]) {
1971         // We have a macro definition. Register the association
1972         PreprocessedEntityID
1973             GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1974         PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1975         PreprocessingRecord::PPEntityID PPID =
1976             PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1977         MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1978             PPRec.getPreprocessedEntity(PPID));
1979         if (PPDef)
1980           PPRec.RegisterMacroDefinition(Macro, PPDef);
1981       }
1982 
1983       ++NumMacrosRead;
1984       break;
1985     }
1986 
1987     case PP_TOKEN: {
1988       // If we see a TOKEN before a PP_MACRO_*, then the file is
1989       // erroneous, just pretend we didn't see this.
1990       if (!Macro) break;
1991       if (MacroTokens.empty()) {
1992         Error("unexpected number of macro tokens for a macro in AST file");
1993         return Macro;
1994       }
1995 
1996       unsigned Idx = 0;
1997       MacroTokens[0] = ReadToken(F, Record, Idx);
1998       MacroTokens = MacroTokens.drop_front();
1999       break;
2000     }
2001     }
2002   }
2003 }
2004 
2005 PreprocessedEntityID
getGlobalPreprocessedEntityID(ModuleFile & M,unsigned LocalID) const2006 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
2007                                          unsigned LocalID) const {
2008   if (!M.ModuleOffsetMap.empty())
2009     ReadModuleOffsetMap(M);
2010 
2011   ContinuousRangeMap<uint32_t, int, 2>::const_iterator
2012     I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
2013   assert(I != M.PreprocessedEntityRemap.end()
2014          && "Invalid index into preprocessed entity index remap");
2015 
2016   return LocalID + I->second;
2017 }
2018 
getFile(const internal_key_type & Key)2019 const FileEntry *HeaderFileInfoTrait::getFile(const internal_key_type &Key) {
2020   FileManager &FileMgr = Reader.getFileManager();
2021   if (!Key.Imported) {
2022     if (auto File = FileMgr.getFile(Key.Filename))
2023       return *File;
2024     return nullptr;
2025   }
2026 
2027   std::string Resolved = std::string(Key.Filename);
2028   Reader.ResolveImportedPath(M, Resolved);
2029   if (auto File = FileMgr.getFile(Resolved))
2030     return *File;
2031   return nullptr;
2032 }
2033 
ComputeHash(internal_key_ref ikey)2034 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
2035   uint8_t buf[sizeof(ikey.Size) + sizeof(ikey.ModTime)];
2036   memcpy(buf, &ikey.Size, sizeof(ikey.Size));
2037   memcpy(buf + sizeof(ikey.Size), &ikey.ModTime, sizeof(ikey.ModTime));
2038   return llvm::xxh3_64bits(buf);
2039 }
2040 
2041 HeaderFileInfoTrait::internal_key_type
GetInternalKey(external_key_type ekey)2042 HeaderFileInfoTrait::GetInternalKey(external_key_type ekey) {
2043   internal_key_type ikey = {ekey.getSize(),
2044                             M.HasTimestamps ? ekey.getModificationTime() : 0,
2045                             ekey.getName(), /*Imported*/ false};
2046   return ikey;
2047 }
2048 
EqualKey(internal_key_ref a,internal_key_ref b)2049 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
2050   if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
2051     return false;
2052 
2053   if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
2054     return true;
2055 
2056   // Determine whether the actual files are equivalent.
2057   const FileEntry *FEA = getFile(a);
2058   const FileEntry *FEB = getFile(b);
2059   return FEA && FEA == FEB;
2060 }
2061 
2062 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)2063 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
2064   return readULEBKeyDataLength(d);
2065 }
2066 
2067 HeaderFileInfoTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)2068 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
2069   using namespace llvm::support;
2070 
2071   internal_key_type ikey;
2072   ikey.Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2073   ikey.ModTime =
2074       time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2075   ikey.Filename = (const char *)d;
2076   ikey.Imported = true;
2077   return ikey;
2078 }
2079 
2080 HeaderFileInfoTrait::data_type
ReadData(internal_key_ref key,const unsigned char * d,unsigned DataLen)2081 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
2082                               unsigned DataLen) {
2083   using namespace llvm::support;
2084 
2085   const unsigned char *End = d + DataLen;
2086   HeaderFileInfo HFI;
2087   unsigned Flags = *d++;
2088 
2089   bool Included = (Flags >> 6) & 0x01;
2090   if (Included)
2091     if (const FileEntry *FE = getFile(key))
2092       // Not using \c Preprocessor::markIncluded(), since that would attempt to
2093       // deserialize this header file info again.
2094       Reader.getPreprocessor().getIncludedFiles().insert(FE);
2095 
2096   // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
2097   HFI.isImport |= (Flags >> 5) & 0x01;
2098   HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
2099   HFI.DirInfo = (Flags >> 1) & 0x07;
2100   HFI.IndexHeaderMapHeader = Flags & 0x01;
2101   HFI.LazyControllingMacro = Reader.getGlobalIdentifierID(
2102       M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2103   if (unsigned FrameworkOffset =
2104           endian::readNext<uint32_t, llvm::endianness::little>(d)) {
2105     // The framework offset is 1 greater than the actual offset,
2106     // since 0 is used as an indicator for "no framework name".
2107     StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
2108     HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
2109   }
2110 
2111   assert((End - d) % 4 == 0 &&
2112          "Wrong data length in HeaderFileInfo deserialization");
2113   while (d != End) {
2114     uint32_t LocalSMID =
2115         endian::readNext<uint32_t, llvm::endianness::little>(d);
2116     auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 7);
2117     LocalSMID >>= 3;
2118 
2119     // This header is part of a module. Associate it with the module to enable
2120     // implicit module import.
2121     SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2122     Module *Mod = Reader.getSubmodule(GlobalSMID);
2123     FileManager &FileMgr = Reader.getFileManager();
2124     ModuleMap &ModMap =
2125         Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2126 
2127     std::string Filename = std::string(key.Filename);
2128     if (key.Imported)
2129       Reader.ResolveImportedPath(M, Filename);
2130     if (auto FE = FileMgr.getOptionalFileRef(Filename)) {
2131       // FIXME: NameAsWritten
2132       Module::Header H = {std::string(key.Filename), "", *FE};
2133       ModMap.addHeader(Mod, H, HeaderRole, /*Imported=*/true);
2134     }
2135     HFI.mergeModuleMembership(HeaderRole);
2136   }
2137 
2138   // This HeaderFileInfo was externally loaded.
2139   HFI.External = true;
2140   HFI.IsValid = true;
2141   return HFI;
2142 }
2143 
addPendingMacro(IdentifierInfo * II,ModuleFile * M,uint32_t MacroDirectivesOffset)2144 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M,
2145                                 uint32_t MacroDirectivesOffset) {
2146   assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
2147   PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2148 }
2149 
ReadDefinedMacros()2150 void ASTReader::ReadDefinedMacros() {
2151   // Note that we are loading defined macros.
2152   Deserializing Macros(this);
2153 
2154   for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
2155     BitstreamCursor &MacroCursor = I.MacroCursor;
2156 
2157     // If there was no preprocessor block, skip this file.
2158     if (MacroCursor.getBitcodeBytes().empty())
2159       continue;
2160 
2161     BitstreamCursor Cursor = MacroCursor;
2162     if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2163       Error(std::move(Err));
2164       return;
2165     }
2166 
2167     RecordData Record;
2168     while (true) {
2169       Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
2170       if (!MaybeE) {
2171         Error(MaybeE.takeError());
2172         return;
2173       }
2174       llvm::BitstreamEntry E = MaybeE.get();
2175 
2176       switch (E.Kind) {
2177       case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2178       case llvm::BitstreamEntry::Error:
2179         Error("malformed block record in AST file");
2180         return;
2181       case llvm::BitstreamEntry::EndBlock:
2182         goto NextCursor;
2183 
2184       case llvm::BitstreamEntry::Record: {
2185         Record.clear();
2186         Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
2187         if (!MaybeRecord) {
2188           Error(MaybeRecord.takeError());
2189           return;
2190         }
2191         switch (MaybeRecord.get()) {
2192         default:  // Default behavior: ignore.
2193           break;
2194 
2195         case PP_MACRO_OBJECT_LIKE:
2196         case PP_MACRO_FUNCTION_LIKE: {
2197           IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
2198           if (II->isOutOfDate())
2199             updateOutOfDateIdentifier(*II);
2200           break;
2201         }
2202 
2203         case PP_TOKEN:
2204           // Ignore tokens.
2205           break;
2206         }
2207         break;
2208       }
2209       }
2210     }
2211     NextCursor:  ;
2212   }
2213 }
2214 
2215 namespace {
2216 
2217   /// Visitor class used to look up identifirs in an AST file.
2218   class IdentifierLookupVisitor {
2219     StringRef Name;
2220     unsigned NameHash;
2221     unsigned PriorGeneration;
2222     unsigned &NumIdentifierLookups;
2223     unsigned &NumIdentifierLookupHits;
2224     IdentifierInfo *Found = nullptr;
2225 
2226   public:
IdentifierLookupVisitor(StringRef Name,unsigned PriorGeneration,unsigned & NumIdentifierLookups,unsigned & NumIdentifierLookupHits)2227     IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2228                             unsigned &NumIdentifierLookups,
2229                             unsigned &NumIdentifierLookupHits)
2230       : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2231         PriorGeneration(PriorGeneration),
2232         NumIdentifierLookups(NumIdentifierLookups),
2233         NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2234 
operator ()(ModuleFile & M)2235     bool operator()(ModuleFile &M) {
2236       // If we've already searched this module file, skip it now.
2237       if (M.Generation <= PriorGeneration)
2238         return true;
2239 
2240       ASTIdentifierLookupTable *IdTable
2241         = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
2242       if (!IdTable)
2243         return false;
2244 
2245       ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2246                                      Found);
2247       ++NumIdentifierLookups;
2248       ASTIdentifierLookupTable::iterator Pos =
2249           IdTable->find_hashed(Name, NameHash, &Trait);
2250       if (Pos == IdTable->end())
2251         return false;
2252 
2253       // Dereferencing the iterator has the effect of building the
2254       // IdentifierInfo node and populating it with the various
2255       // declarations it needs.
2256       ++NumIdentifierLookupHits;
2257       Found = *Pos;
2258       return true;
2259     }
2260 
2261     // Retrieve the identifier info found within the module
2262     // files.
getIdentifierInfo() const2263     IdentifierInfo *getIdentifierInfo() const { return Found; }
2264   };
2265 
2266 } // namespace
2267 
updateOutOfDateIdentifier(const IdentifierInfo & II)2268 void ASTReader::updateOutOfDateIdentifier(const IdentifierInfo &II) {
2269   // Note that we are loading an identifier.
2270   Deserializing AnIdentifier(this);
2271 
2272   unsigned PriorGeneration = 0;
2273   if (getContext().getLangOpts().Modules)
2274     PriorGeneration = IdentifierGeneration[&II];
2275 
2276   // If there is a global index, look there first to determine which modules
2277   // provably do not have any results for this identifier.
2278   GlobalModuleIndex::HitSet Hits;
2279   GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2280   if (!loadGlobalIndex()) {
2281     if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2282       HitsPtr = &Hits;
2283     }
2284   }
2285 
2286   IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2287                                   NumIdentifierLookups,
2288                                   NumIdentifierLookupHits);
2289   ModuleMgr.visit(Visitor, HitsPtr);
2290   markIdentifierUpToDate(&II);
2291 }
2292 
markIdentifierUpToDate(const IdentifierInfo * II)2293 void ASTReader::markIdentifierUpToDate(const IdentifierInfo *II) {
2294   if (!II)
2295     return;
2296 
2297   const_cast<IdentifierInfo *>(II)->setOutOfDate(false);
2298 
2299   // Update the generation for this identifier.
2300   if (getContext().getLangOpts().Modules)
2301     IdentifierGeneration[II] = getGeneration();
2302 }
2303 
resolvePendingMacro(IdentifierInfo * II,const PendingMacroInfo & PMInfo)2304 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
2305                                     const PendingMacroInfo &PMInfo) {
2306   ModuleFile &M = *PMInfo.M;
2307 
2308   BitstreamCursor &Cursor = M.MacroCursor;
2309   SavedStreamPosition SavedPosition(Cursor);
2310   if (llvm::Error Err =
2311           Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2312     Error(std::move(Err));
2313     return;
2314   }
2315 
2316   struct ModuleMacroRecord {
2317     SubmoduleID SubModID;
2318     MacroInfo *MI;
2319     SmallVector<SubmoduleID, 8> Overrides;
2320   };
2321   llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
2322 
2323   // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2324   // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2325   // macro histroy.
2326   RecordData Record;
2327   while (true) {
2328     Expected<llvm::BitstreamEntry> MaybeEntry =
2329         Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2330     if (!MaybeEntry) {
2331       Error(MaybeEntry.takeError());
2332       return;
2333     }
2334     llvm::BitstreamEntry Entry = MaybeEntry.get();
2335 
2336     if (Entry.Kind != llvm::BitstreamEntry::Record) {
2337       Error("malformed block record in AST file");
2338       return;
2339     }
2340 
2341     Record.clear();
2342     Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2343     if (!MaybePP) {
2344       Error(MaybePP.takeError());
2345       return;
2346     }
2347     switch ((PreprocessorRecordTypes)MaybePP.get()) {
2348     case PP_MACRO_DIRECTIVE_HISTORY:
2349       break;
2350 
2351     case PP_MODULE_MACRO: {
2352       ModuleMacros.push_back(ModuleMacroRecord());
2353       auto &Info = ModuleMacros.back();
2354       Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
2355       Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
2356       for (int I = 2, N = Record.size(); I != N; ++I)
2357         Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2358       continue;
2359     }
2360 
2361     default:
2362       Error("malformed block record in AST file");
2363       return;
2364     }
2365 
2366     // We found the macro directive history; that's the last record
2367     // for this macro.
2368     break;
2369   }
2370 
2371   // Module macros are listed in reverse dependency order.
2372   {
2373     std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2374     llvm::SmallVector<ModuleMacro*, 8> Overrides;
2375     for (auto &MMR : ModuleMacros) {
2376       Overrides.clear();
2377       for (unsigned ModID : MMR.Overrides) {
2378         Module *Mod = getSubmodule(ModID);
2379         auto *Macro = PP.getModuleMacro(Mod, II);
2380         assert(Macro && "missing definition for overridden macro");
2381         Overrides.push_back(Macro);
2382       }
2383 
2384       bool Inserted = false;
2385       Module *Owner = getSubmodule(MMR.SubModID);
2386       PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2387     }
2388   }
2389 
2390   // Don't read the directive history for a module; we don't have anywhere
2391   // to put it.
2392   if (M.isModule())
2393     return;
2394 
2395   // Deserialize the macro directives history in reverse source-order.
2396   MacroDirective *Latest = nullptr, *Earliest = nullptr;
2397   unsigned Idx = 0, N = Record.size();
2398   while (Idx < N) {
2399     MacroDirective *MD = nullptr;
2400     SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
2401     MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
2402     switch (K) {
2403     case MacroDirective::MD_Define: {
2404       MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2405       MD = PP.AllocateDefMacroDirective(MI, Loc);
2406       break;
2407     }
2408     case MacroDirective::MD_Undefine:
2409       MD = PP.AllocateUndefMacroDirective(Loc);
2410       break;
2411     case MacroDirective::MD_Visibility:
2412       bool isPublic = Record[Idx++];
2413       MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2414       break;
2415     }
2416 
2417     if (!Latest)
2418       Latest = MD;
2419     if (Earliest)
2420       Earliest->setPrevious(MD);
2421     Earliest = MD;
2422   }
2423 
2424   if (Latest)
2425     PP.setLoadedMacroDirective(II, Earliest, Latest);
2426 }
2427 
shouldDisableValidationForFile(const serialization::ModuleFile & M) const2428 bool ASTReader::shouldDisableValidationForFile(
2429     const serialization::ModuleFile &M) const {
2430   if (DisableValidationKind == DisableValidationForModuleKind::None)
2431     return false;
2432 
2433   // If a PCH is loaded and validation is disabled for PCH then disable
2434   // validation for the PCH and the modules it loads.
2435   ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);
2436 
2437   switch (K) {
2438   case MK_MainFile:
2439   case MK_Preamble:
2440   case MK_PCH:
2441     return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2442   case MK_ImplicitModule:
2443   case MK_ExplicitModule:
2444   case MK_PrebuiltModule:
2445     return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2446   }
2447 
2448   return false;
2449 }
2450 
getInputFileInfo(ModuleFile & F,unsigned ID)2451 InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
2452   // If this ID is bogus, just return an empty input file.
2453   if (ID == 0 || ID > F.InputFileInfosLoaded.size())
2454     return InputFileInfo();
2455 
2456   // If we've already loaded this input file, return it.
2457   if (!F.InputFileInfosLoaded[ID - 1].Filename.empty())
2458     return F.InputFileInfosLoaded[ID - 1];
2459 
2460   // Go find this input file.
2461   BitstreamCursor &Cursor = F.InputFilesCursor;
2462   SavedStreamPosition SavedPosition(Cursor);
2463   if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2464                                          F.InputFileOffsets[ID - 1])) {
2465     // FIXME this drops errors on the floor.
2466     consumeError(std::move(Err));
2467   }
2468 
2469   Expected<unsigned> MaybeCode = Cursor.ReadCode();
2470   if (!MaybeCode) {
2471     // FIXME this drops errors on the floor.
2472     consumeError(MaybeCode.takeError());
2473   }
2474   unsigned Code = MaybeCode.get();
2475   RecordData Record;
2476   StringRef Blob;
2477 
2478   if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2479     assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
2480            "invalid record type for input file");
2481   else {
2482     // FIXME this drops errors on the floor.
2483     consumeError(Maybe.takeError());
2484   }
2485 
2486   assert(Record[0] == ID && "Bogus stored ID or offset");
2487   InputFileInfo R;
2488   R.StoredSize = static_cast<off_t>(Record[1]);
2489   R.StoredTime = static_cast<time_t>(Record[2]);
2490   R.Overridden = static_cast<bool>(Record[3]);
2491   R.Transient = static_cast<bool>(Record[4]);
2492   R.TopLevel = static_cast<bool>(Record[5]);
2493   R.ModuleMap = static_cast<bool>(Record[6]);
2494   std::tie(R.FilenameAsRequested, R.Filename) = [&]() {
2495     uint16_t AsRequestedLength = Record[7];
2496 
2497     std::string NameAsRequested = Blob.substr(0, AsRequestedLength).str();
2498     std::string Name = Blob.substr(AsRequestedLength).str();
2499 
2500     ResolveImportedPath(F, NameAsRequested);
2501     ResolveImportedPath(F, Name);
2502 
2503     if (Name.empty())
2504       Name = NameAsRequested;
2505 
2506     return std::make_pair(std::move(NameAsRequested), std::move(Name));
2507   }();
2508 
2509   Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2510   if (!MaybeEntry) // FIXME this drops errors on the floor.
2511     consumeError(MaybeEntry.takeError());
2512   llvm::BitstreamEntry Entry = MaybeEntry.get();
2513   assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2514          "expected record type for input file hash");
2515 
2516   Record.clear();
2517   if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2518     assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2519            "invalid record type for input file hash");
2520   else {
2521     // FIXME this drops errors on the floor.
2522     consumeError(Maybe.takeError());
2523   }
2524   R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2525                   static_cast<uint64_t>(Record[0]);
2526 
2527   // Note that we've loaded this input file info.
2528   F.InputFileInfosLoaded[ID - 1] = R;
2529   return R;
2530 }
2531 
2532 static unsigned moduleKindForDiagnostic(ModuleKind Kind);
getInputFile(ModuleFile & F,unsigned ID,bool Complain)2533 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2534   // If this ID is bogus, just return an empty input file.
2535   if (ID == 0 || ID > F.InputFilesLoaded.size())
2536     return InputFile();
2537 
2538   // If we've already loaded this input file, return it.
2539   if (F.InputFilesLoaded[ID-1].getFile())
2540     return F.InputFilesLoaded[ID-1];
2541 
2542   if (F.InputFilesLoaded[ID-1].isNotFound())
2543     return InputFile();
2544 
2545   // Go find this input file.
2546   BitstreamCursor &Cursor = F.InputFilesCursor;
2547   SavedStreamPosition SavedPosition(Cursor);
2548   if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2549                                          F.InputFileOffsets[ID - 1])) {
2550     // FIXME this drops errors on the floor.
2551     consumeError(std::move(Err));
2552   }
2553 
2554   InputFileInfo FI = getInputFileInfo(F, ID);
2555   off_t StoredSize = FI.StoredSize;
2556   time_t StoredTime = FI.StoredTime;
2557   bool Overridden = FI.Overridden;
2558   bool Transient = FI.Transient;
2559   StringRef Filename = FI.FilenameAsRequested;
2560   uint64_t StoredContentHash = FI.ContentHash;
2561 
2562   // For standard C++ modules, we don't need to check the inputs.
2563   bool SkipChecks = F.StandardCXXModule;
2564 
2565   const HeaderSearchOptions &HSOpts =
2566       PP.getHeaderSearchInfo().getHeaderSearchOpts();
2567 
2568   // The option ForceCheckCXX20ModulesInputFiles is only meaningful for C++20
2569   // modules.
2570   if (F.StandardCXXModule && HSOpts.ForceCheckCXX20ModulesInputFiles) {
2571     SkipChecks = false;
2572     Overridden = false;
2573   }
2574 
2575   auto File = FileMgr.getOptionalFileRef(Filename, /*OpenFile=*/false);
2576 
2577   // For an overridden file, create a virtual file with the stored
2578   // size/timestamp.
2579   if ((Overridden || Transient || SkipChecks) && !File)
2580     File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime);
2581 
2582   if (!File) {
2583     if (Complain) {
2584       std::string ErrorStr = "could not find file '";
2585       ErrorStr += Filename;
2586       ErrorStr += "' referenced by AST file '";
2587       ErrorStr += F.FileName;
2588       ErrorStr += "'";
2589       Error(ErrorStr);
2590     }
2591     // Record that we didn't find the file.
2592     F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2593     return InputFile();
2594   }
2595 
2596   // Check if there was a request to override the contents of the file
2597   // that was part of the precompiled header. Overriding such a file
2598   // can lead to problems when lexing using the source locations from the
2599   // PCH.
2600   SourceManager &SM = getSourceManager();
2601   // FIXME: Reject if the overrides are different.
2602   if ((!Overridden && !Transient) && !SkipChecks &&
2603       SM.isFileOverridden(*File)) {
2604     if (Complain)
2605       Error(diag::err_fe_pch_file_overridden, Filename);
2606 
2607     // After emitting the diagnostic, bypass the overriding file to recover
2608     // (this creates a separate FileEntry).
2609     File = SM.bypassFileContentsOverride(*File);
2610     if (!File) {
2611       F.InputFilesLoaded[ID - 1] = InputFile::getNotFound();
2612       return InputFile();
2613     }
2614   }
2615 
2616   struct Change {
2617     enum ModificationKind {
2618       Size,
2619       ModTime,
2620       Content,
2621       None,
2622     } Kind;
2623     std::optional<int64_t> Old = std::nullopt;
2624     std::optional<int64_t> New = std::nullopt;
2625   };
2626   auto HasInputContentChanged = [&](Change OriginalChange) {
2627     assert(ValidateASTInputFilesContent &&
2628            "We should only check the content of the inputs with "
2629            "ValidateASTInputFilesContent enabled.");
2630 
2631     if (StoredContentHash == 0)
2632       return OriginalChange;
2633 
2634     auto MemBuffOrError = FileMgr.getBufferForFile(*File);
2635     if (!MemBuffOrError) {
2636       if (!Complain)
2637         return OriginalChange;
2638       std::string ErrorStr = "could not get buffer for file '";
2639       ErrorStr += File->getName();
2640       ErrorStr += "'";
2641       Error(ErrorStr);
2642       return OriginalChange;
2643     }
2644 
2645     auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2646     if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2647       return Change{Change::None};
2648 
2649     return Change{Change::Content};
2650   };
2651   auto HasInputFileChanged = [&]() {
2652     if (StoredSize != File->getSize())
2653       return Change{Change::Size, StoredSize, File->getSize()};
2654     if (!shouldDisableValidationForFile(F) && StoredTime &&
2655         StoredTime != File->getModificationTime()) {
2656       Change MTimeChange = {Change::ModTime, StoredTime,
2657                             File->getModificationTime()};
2658 
2659       // In case the modification time changes but not the content,
2660       // accept the cached file as legit.
2661       if (ValidateASTInputFilesContent)
2662         return HasInputContentChanged(MTimeChange);
2663 
2664       return MTimeChange;
2665     }
2666     return Change{Change::None};
2667   };
2668 
2669   bool IsOutOfDate = false;
2670   auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2671   // When ForceCheckCXX20ModulesInputFiles and ValidateASTInputFilesContent
2672   // enabled, it is better to check the contents of the inputs. Since we can't
2673   // get correct modified time information for inputs from overriden inputs.
2674   if (HSOpts.ForceCheckCXX20ModulesInputFiles && ValidateASTInputFilesContent &&
2675       F.StandardCXXModule && FileChange.Kind == Change::None)
2676     FileChange = HasInputContentChanged(FileChange);
2677 
2678   // When we have StoredTime equal to zero and ValidateASTInputFilesContent,
2679   // it is better to check the content of the input files because we cannot rely
2680   // on the file modification time, which will be the same (zero) for these
2681   // files.
2682   if (!StoredTime && ValidateASTInputFilesContent &&
2683       FileChange.Kind == Change::None)
2684     FileChange = HasInputContentChanged(FileChange);
2685 
2686   // For an overridden file, there is nothing to validate.
2687   if (!Overridden && FileChange.Kind != Change::None) {
2688     if (Complain && !Diags.isDiagnosticInFlight()) {
2689       // Build a list of the PCH imports that got us here (in reverse).
2690       SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2691       while (!ImportStack.back()->ImportedBy.empty())
2692         ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2693 
2694       // The top-level PCH is stale.
2695       StringRef TopLevelPCHName(ImportStack.back()->FileName);
2696       Diag(diag::err_fe_ast_file_modified)
2697           << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
2698           << TopLevelPCHName << FileChange.Kind
2699           << (FileChange.Old && FileChange.New)
2700           << llvm::itostr(FileChange.Old.value_or(0))
2701           << llvm::itostr(FileChange.New.value_or(0));
2702 
2703       // Print the import stack.
2704       if (ImportStack.size() > 1) {
2705         Diag(diag::note_pch_required_by)
2706           << Filename << ImportStack[0]->FileName;
2707         for (unsigned I = 1; I < ImportStack.size(); ++I)
2708           Diag(diag::note_pch_required_by)
2709             << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2710       }
2711 
2712       Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2713     }
2714 
2715     IsOutOfDate = true;
2716   }
2717   // FIXME: If the file is overridden and we've already opened it,
2718   // issue an error (or split it into a separate FileEntry).
2719 
2720   InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
2721 
2722   // Note that we've loaded this input file.
2723   F.InputFilesLoaded[ID-1] = IF;
2724   return IF;
2725 }
2726 
2727 /// If we are loading a relocatable PCH or module file, and the filename
2728 /// is not an absolute path, add the system or module root to the beginning of
2729 /// the file name.
ResolveImportedPath(ModuleFile & M,std::string & Filename)2730 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2731   // Resolve relative to the base directory, if we have one.
2732   if (!M.BaseDirectory.empty())
2733     return ResolveImportedPath(Filename, M.BaseDirectory);
2734 }
2735 
ResolveImportedPath(std::string & Filename,StringRef Prefix)2736 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2737   if (Filename.empty() || llvm::sys::path::is_absolute(Filename) ||
2738       Filename == "<built-in>" || Filename == "<command line>")
2739     return;
2740 
2741   SmallString<128> Buffer;
2742   llvm::sys::path::append(Buffer, Prefix, Filename);
2743   Filename.assign(Buffer.begin(), Buffer.end());
2744 }
2745 
isDiagnosedResult(ASTReader::ASTReadResult ARR,unsigned Caps)2746 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2747   switch (ARR) {
2748   case ASTReader::Failure: return true;
2749   case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2750   case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2751   case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2752   case ASTReader::ConfigurationMismatch:
2753     return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2754   case ASTReader::HadErrors: return true;
2755   case ASTReader::Success: return false;
2756   }
2757 
2758   llvm_unreachable("unknown ASTReadResult");
2759 }
2760 
ReadOptionsBlock(BitstreamCursor & Stream,unsigned ClientLoadCapabilities,bool AllowCompatibleConfigurationMismatch,ASTReaderListener & Listener,std::string & SuggestedPredefines)2761 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2762     BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2763     bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2764     std::string &SuggestedPredefines) {
2765   if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
2766     // FIXME this drops errors on the floor.
2767     consumeError(std::move(Err));
2768     return Failure;
2769   }
2770 
2771   // Read all of the records in the options block.
2772   RecordData Record;
2773   ASTReadResult Result = Success;
2774   while (true) {
2775     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2776     if (!MaybeEntry) {
2777       // FIXME this drops errors on the floor.
2778       consumeError(MaybeEntry.takeError());
2779       return Failure;
2780     }
2781     llvm::BitstreamEntry Entry = MaybeEntry.get();
2782 
2783     switch (Entry.Kind) {
2784     case llvm::BitstreamEntry::Error:
2785     case llvm::BitstreamEntry::SubBlock:
2786       return Failure;
2787 
2788     case llvm::BitstreamEntry::EndBlock:
2789       return Result;
2790 
2791     case llvm::BitstreamEntry::Record:
2792       // The interesting case.
2793       break;
2794     }
2795 
2796     // Read and process a record.
2797     Record.clear();
2798     Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
2799     if (!MaybeRecordType) {
2800       // FIXME this drops errors on the floor.
2801       consumeError(MaybeRecordType.takeError());
2802       return Failure;
2803     }
2804     switch ((OptionsRecordTypes)MaybeRecordType.get()) {
2805     case LANGUAGE_OPTIONS: {
2806       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2807       if (ParseLanguageOptions(Record, Complain, Listener,
2808                                AllowCompatibleConfigurationMismatch))
2809         Result = ConfigurationMismatch;
2810       break;
2811     }
2812 
2813     case TARGET_OPTIONS: {
2814       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2815       if (ParseTargetOptions(Record, Complain, Listener,
2816                              AllowCompatibleConfigurationMismatch))
2817         Result = ConfigurationMismatch;
2818       break;
2819     }
2820 
2821     case FILE_SYSTEM_OPTIONS: {
2822       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2823       if (!AllowCompatibleConfigurationMismatch &&
2824           ParseFileSystemOptions(Record, Complain, Listener))
2825         Result = ConfigurationMismatch;
2826       break;
2827     }
2828 
2829     case HEADER_SEARCH_OPTIONS: {
2830       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2831       if (!AllowCompatibleConfigurationMismatch &&
2832           ParseHeaderSearchOptions(Record, Complain, Listener))
2833         Result = ConfigurationMismatch;
2834       break;
2835     }
2836 
2837     case PREPROCESSOR_OPTIONS:
2838       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2839       if (!AllowCompatibleConfigurationMismatch &&
2840           ParsePreprocessorOptions(Record, Complain, Listener,
2841                                    SuggestedPredefines))
2842         Result = ConfigurationMismatch;
2843       break;
2844     }
2845   }
2846 }
2847 
2848 ASTReader::ASTReadResult
ReadControlBlock(ModuleFile & F,SmallVectorImpl<ImportedModule> & Loaded,const ModuleFile * ImportedBy,unsigned ClientLoadCapabilities)2849 ASTReader::ReadControlBlock(ModuleFile &F,
2850                             SmallVectorImpl<ImportedModule> &Loaded,
2851                             const ModuleFile *ImportedBy,
2852                             unsigned ClientLoadCapabilities) {
2853   BitstreamCursor &Stream = F.Stream;
2854 
2855   if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2856     Error(std::move(Err));
2857     return Failure;
2858   }
2859 
2860   // Lambda to read the unhashed control block the first time it's called.
2861   //
2862   // For PCM files, the unhashed control block cannot be read until after the
2863   // MODULE_NAME record.  However, PCH files have no MODULE_NAME, and yet still
2864   // need to look ahead before reading the IMPORTS record.  For consistency,
2865   // this block is always read somehow (see BitstreamEntry::EndBlock).
2866   bool HasReadUnhashedControlBlock = false;
2867   auto readUnhashedControlBlockOnce = [&]() {
2868     if (!HasReadUnhashedControlBlock) {
2869       HasReadUnhashedControlBlock = true;
2870       if (ASTReadResult Result =
2871               readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
2872         return Result;
2873     }
2874     return Success;
2875   };
2876 
2877   bool DisableValidation = shouldDisableValidationForFile(F);
2878 
2879   // Read all of the records and blocks in the control block.
2880   RecordData Record;
2881   unsigned NumInputs = 0;
2882   unsigned NumUserInputs = 0;
2883   StringRef BaseDirectoryAsWritten;
2884   while (true) {
2885     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2886     if (!MaybeEntry) {
2887       Error(MaybeEntry.takeError());
2888       return Failure;
2889     }
2890     llvm::BitstreamEntry Entry = MaybeEntry.get();
2891 
2892     switch (Entry.Kind) {
2893     case llvm::BitstreamEntry::Error:
2894       Error("malformed block record in AST file");
2895       return Failure;
2896     case llvm::BitstreamEntry::EndBlock: {
2897       // Validate the module before returning.  This call catches an AST with
2898       // no module name and no imports.
2899       if (ASTReadResult Result = readUnhashedControlBlockOnce())
2900         return Result;
2901 
2902       // Validate input files.
2903       const HeaderSearchOptions &HSOpts =
2904           PP.getHeaderSearchInfo().getHeaderSearchOpts();
2905 
2906       // All user input files reside at the index range [0, NumUserInputs), and
2907       // system input files reside at [NumUserInputs, NumInputs). For explicitly
2908       // loaded module files, ignore missing inputs.
2909       if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2910           F.Kind != MK_PrebuiltModule) {
2911         bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2912 
2913         // If we are reading a module, we will create a verification timestamp,
2914         // so we verify all input files.  Otherwise, verify only user input
2915         // files.
2916 
2917         unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
2918         if (HSOpts.ModulesValidateOncePerBuildSession &&
2919             F.InputFilesValidationTimestamp > HSOpts.BuildSessionTimestamp &&
2920             F.Kind == MK_ImplicitModule)
2921           N = NumUserInputs;
2922 
2923         for (unsigned I = 0; I < N; ++I) {
2924           InputFile IF = getInputFile(F, I+1, Complain);
2925           if (!IF.getFile() || IF.isOutOfDate())
2926             return OutOfDate;
2927         }
2928       }
2929 
2930       if (Listener)
2931         Listener->visitModuleFile(F.FileName, F.Kind);
2932 
2933       if (Listener && Listener->needsInputFileVisitation()) {
2934         unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2935                                                                 : NumUserInputs;
2936         for (unsigned I = 0; I < N; ++I) {
2937           bool IsSystem = I >= NumUserInputs;
2938           InputFileInfo FI = getInputFileInfo(F, I + 1);
2939           Listener->visitInputFile(
2940               FI.FilenameAsRequested, IsSystem, FI.Overridden,
2941               F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule);
2942         }
2943       }
2944 
2945       return Success;
2946     }
2947 
2948     case llvm::BitstreamEntry::SubBlock:
2949       switch (Entry.ID) {
2950       case INPUT_FILES_BLOCK_ID:
2951         F.InputFilesCursor = Stream;
2952         if (llvm::Error Err = Stream.SkipBlock()) {
2953           Error(std::move(Err));
2954           return Failure;
2955         }
2956         if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2957           Error("malformed block record in AST file");
2958           return Failure;
2959         }
2960         F.InputFilesOffsetBase = F.InputFilesCursor.GetCurrentBitNo();
2961         continue;
2962 
2963       case OPTIONS_BLOCK_ID:
2964         // If we're reading the first module for this group, check its options
2965         // are compatible with ours. For modules it imports, no further checking
2966         // is required, because we checked them when we built it.
2967         if (Listener && !ImportedBy) {
2968           // Should we allow the configuration of the module file to differ from
2969           // the configuration of the current translation unit in a compatible
2970           // way?
2971           //
2972           // FIXME: Allow this for files explicitly specified with -include-pch.
2973           bool AllowCompatibleConfigurationMismatch =
2974               F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
2975 
2976           ASTReadResult Result =
2977               ReadOptionsBlock(Stream, ClientLoadCapabilities,
2978                                AllowCompatibleConfigurationMismatch, *Listener,
2979                                SuggestedPredefines);
2980           if (Result == Failure) {
2981             Error("malformed block record in AST file");
2982             return Result;
2983           }
2984 
2985           if (DisableValidation ||
2986               (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2987             Result = Success;
2988 
2989           // If we can't load the module, exit early since we likely
2990           // will rebuild the module anyway. The stream may be in the
2991           // middle of a block.
2992           if (Result != Success)
2993             return Result;
2994         } else if (llvm::Error Err = Stream.SkipBlock()) {
2995           Error(std::move(Err));
2996           return Failure;
2997         }
2998         continue;
2999 
3000       default:
3001         if (llvm::Error Err = Stream.SkipBlock()) {
3002           Error(std::move(Err));
3003           return Failure;
3004         }
3005         continue;
3006       }
3007 
3008     case llvm::BitstreamEntry::Record:
3009       // The interesting case.
3010       break;
3011     }
3012 
3013     // Read and process a record.
3014     Record.clear();
3015     StringRef Blob;
3016     Expected<unsigned> MaybeRecordType =
3017         Stream.readRecord(Entry.ID, Record, &Blob);
3018     if (!MaybeRecordType) {
3019       Error(MaybeRecordType.takeError());
3020       return Failure;
3021     }
3022     switch ((ControlRecordTypes)MaybeRecordType.get()) {
3023     case METADATA: {
3024       if (Record[0] != VERSION_MAJOR && !DisableValidation) {
3025         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3026           Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
3027                                         : diag::err_pch_version_too_new);
3028         return VersionMismatch;
3029       }
3030 
3031       bool hasErrors = Record[7];
3032       if (hasErrors && !DisableValidation) {
3033         // If requested by the caller and the module hasn't already been read
3034         // or compiled, mark modules on error as out-of-date.
3035         if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3036             canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3037           return OutOfDate;
3038 
3039         if (!AllowASTWithCompilerErrors) {
3040           Diag(diag::err_pch_with_compiler_errors);
3041           return HadErrors;
3042         }
3043       }
3044       if (hasErrors) {
3045         Diags.ErrorOccurred = true;
3046         Diags.UncompilableErrorOccurred = true;
3047         Diags.UnrecoverableErrorOccurred = true;
3048       }
3049 
3050       F.RelocatablePCH = Record[4];
3051       // Relative paths in a relocatable PCH are relative to our sysroot.
3052       if (F.RelocatablePCH)
3053         F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
3054 
3055       F.StandardCXXModule = Record[5];
3056 
3057       F.HasTimestamps = Record[6];
3058 
3059       const std::string &CurBranch = getClangFullRepositoryVersion();
3060       StringRef ASTBranch = Blob;
3061       if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3062         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3063           Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
3064         return VersionMismatch;
3065       }
3066       break;
3067     }
3068 
3069     case IMPORTS: {
3070       // Validate the AST before processing any imports (otherwise, untangling
3071       // them can be error-prone and expensive).  A module will have a name and
3072       // will already have been validated, but this catches the PCH case.
3073       if (ASTReadResult Result = readUnhashedControlBlockOnce())
3074         return Result;
3075 
3076       // Load each of the imported PCH files.
3077       unsigned Idx = 0, N = Record.size();
3078       while (Idx < N) {
3079         // Read information about the AST file.
3080         ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
3081         // Whether we're importing a standard c++ module.
3082         bool IsImportingStdCXXModule = Record[Idx++];
3083         // The import location will be the local one for now; we will adjust
3084         // all import locations of module imports after the global source
3085         // location info are setup, in ReadAST.
3086         auto [ImportLoc, ImportModuleFileIndex] =
3087             ReadUntranslatedSourceLocation(Record[Idx++]);
3088         // The import location must belong to the current module file itself.
3089         assert(ImportModuleFileIndex == 0);
3090         off_t StoredSize = !IsImportingStdCXXModule ? (off_t)Record[Idx++] : 0;
3091         time_t StoredModTime =
3092             !IsImportingStdCXXModule ? (time_t)Record[Idx++] : 0;
3093 
3094         ASTFileSignature StoredSignature;
3095         if (!IsImportingStdCXXModule) {
3096           auto FirstSignatureByte = Record.begin() + Idx;
3097           StoredSignature = ASTFileSignature::create(
3098               FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size);
3099           Idx += ASTFileSignature::size;
3100         }
3101 
3102         std::string ImportedName = ReadString(Record, Idx);
3103         std::string ImportedFile;
3104 
3105         // For prebuilt and explicit modules first consult the file map for
3106         // an override. Note that here we don't search prebuilt module
3107         // directories if we're not importing standard c++ module, only the
3108         // explicit name to file mappings. Also, we will still verify the
3109         // size/signature making sure it is essentially the same file but
3110         // perhaps in a different location.
3111         if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
3112           ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3113               ImportedName, /*FileMapOnly*/ !IsImportingStdCXXModule);
3114 
3115         // For C++20 Modules, we won't record the path to the imported modules
3116         // in the BMI
3117         if (!IsImportingStdCXXModule) {
3118           if (ImportedFile.empty()) {
3119             // Use BaseDirectoryAsWritten to ensure we use the same path in the
3120             // ModuleCache as when writing.
3121             ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx);
3122           } else
3123             SkipPath(Record, Idx);
3124         } else if (ImportedFile.empty()) {
3125           Diag(clang::diag::err_failed_to_find_module_file) << ImportedName;
3126           return Missing;
3127         }
3128 
3129         // If our client can't cope with us being out of date, we can't cope with
3130         // our dependency being missing.
3131         unsigned Capabilities = ClientLoadCapabilities;
3132         if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3133           Capabilities &= ~ARR_Missing;
3134 
3135         // Load the AST file.
3136         auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3137                                   Loaded, StoredSize, StoredModTime,
3138                                   StoredSignature, Capabilities);
3139 
3140         // If we diagnosed a problem, produce a backtrace.
3141         bool recompilingFinalized =
3142             Result == OutOfDate && (Capabilities & ARR_OutOfDate) &&
3143             getModuleManager().getModuleCache().isPCMFinal(F.FileName);
3144         if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized)
3145           Diag(diag::note_module_file_imported_by)
3146               << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3147         if (recompilingFinalized)
3148           Diag(diag::note_module_file_conflict);
3149 
3150         switch (Result) {
3151         case Failure: return Failure;
3152           // If we have to ignore the dependency, we'll have to ignore this too.
3153         case Missing:
3154         case OutOfDate: return OutOfDate;
3155         case VersionMismatch: return VersionMismatch;
3156         case ConfigurationMismatch: return ConfigurationMismatch;
3157         case HadErrors: return HadErrors;
3158         case Success: break;
3159         }
3160       }
3161       break;
3162     }
3163 
3164     case ORIGINAL_FILE:
3165       F.OriginalSourceFileID = FileID::get(Record[0]);
3166       F.ActualOriginalSourceFileName = std::string(Blob);
3167       F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
3168       ResolveImportedPath(F, F.OriginalSourceFileName);
3169       break;
3170 
3171     case ORIGINAL_FILE_ID:
3172       F.OriginalSourceFileID = FileID::get(Record[0]);
3173       break;
3174 
3175     case MODULE_NAME:
3176       F.ModuleName = std::string(Blob);
3177       Diag(diag::remark_module_import)
3178           << F.ModuleName << F.FileName << (ImportedBy ? true : false)
3179           << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
3180       if (Listener)
3181         Listener->ReadModuleName(F.ModuleName);
3182 
3183       // Validate the AST as soon as we have a name so we can exit early on
3184       // failure.
3185       if (ASTReadResult Result = readUnhashedControlBlockOnce())
3186         return Result;
3187 
3188       break;
3189 
3190     case MODULE_DIRECTORY: {
3191       // Save the BaseDirectory as written in the PCM for computing the module
3192       // filename for the ModuleCache.
3193       BaseDirectoryAsWritten = Blob;
3194       assert(!F.ModuleName.empty() &&
3195              "MODULE_DIRECTORY found before MODULE_NAME");
3196       F.BaseDirectory = std::string(Blob);
3197       if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3198         break;
3199       // If we've already loaded a module map file covering this module, we may
3200       // have a better path for it (relative to the current build).
3201       Module *M = PP.getHeaderSearchInfo().lookupModule(
3202           F.ModuleName, SourceLocation(), /*AllowSearch*/ true,
3203           /*AllowExtraModuleMapSearch*/ true);
3204       if (M && M->Directory) {
3205         // If we're implicitly loading a module, the base directory can't
3206         // change between the build and use.
3207         // Don't emit module relocation error if we have -fno-validate-pch
3208         if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3209                   DisableValidationForModuleKind::Module) &&
3210             F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
3211           auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3212           if (!BuildDir || *BuildDir != M->Directory) {
3213             if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3214               Diag(diag::err_imported_module_relocated)
3215                   << F.ModuleName << Blob << M->Directory->getName();
3216             return OutOfDate;
3217           }
3218         }
3219         F.BaseDirectory = std::string(M->Directory->getName());
3220       }
3221       break;
3222     }
3223 
3224     case MODULE_MAP_FILE:
3225       if (ASTReadResult Result =
3226               ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
3227         return Result;
3228       break;
3229 
3230     case INPUT_FILE_OFFSETS:
3231       NumInputs = Record[0];
3232       NumUserInputs = Record[1];
3233       F.InputFileOffsets =
3234           (const llvm::support::unaligned_uint64_t *)Blob.data();
3235       F.InputFilesLoaded.resize(NumInputs);
3236       F.InputFileInfosLoaded.resize(NumInputs);
3237       F.NumUserInputFiles = NumUserInputs;
3238       break;
3239     }
3240   }
3241 }
3242 
ReadASTBlock(ModuleFile & F,unsigned ClientLoadCapabilities)3243 llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3244                                     unsigned ClientLoadCapabilities) {
3245   BitstreamCursor &Stream = F.Stream;
3246 
3247   if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
3248     return Err;
3249   F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
3250 
3251   // Read all of the records and blocks for the AST file.
3252   RecordData Record;
3253   while (true) {
3254     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3255     if (!MaybeEntry)
3256       return MaybeEntry.takeError();
3257     llvm::BitstreamEntry Entry = MaybeEntry.get();
3258 
3259     switch (Entry.Kind) {
3260     case llvm::BitstreamEntry::Error:
3261       return llvm::createStringError(
3262           std::errc::illegal_byte_sequence,
3263           "error at end of module block in AST file");
3264     case llvm::BitstreamEntry::EndBlock:
3265       // Outside of C++, we do not store a lookup map for the translation unit.
3266       // Instead, mark it as needing a lookup map to be built if this module
3267       // contains any declarations lexically within it (which it always does!).
3268       // This usually has no cost, since we very rarely need the lookup map for
3269       // the translation unit outside C++.
3270       if (ASTContext *Ctx = ContextObj) {
3271         DeclContext *DC = Ctx->getTranslationUnitDecl();
3272         if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
3273           DC->setMustBuildLookupTable();
3274       }
3275 
3276       return llvm::Error::success();
3277     case llvm::BitstreamEntry::SubBlock:
3278       switch (Entry.ID) {
3279       case DECLTYPES_BLOCK_ID:
3280         // We lazily load the decls block, but we want to set up the
3281         // DeclsCursor cursor to point into it.  Clone our current bitcode
3282         // cursor to it, enter the block and read the abbrevs in that block.
3283         // With the main cursor, we just skip over it.
3284         F.DeclsCursor = Stream;
3285         if (llvm::Error Err = Stream.SkipBlock())
3286           return Err;
3287         if (llvm::Error Err = ReadBlockAbbrevs(
3288                 F.DeclsCursor, DECLTYPES_BLOCK_ID, &F.DeclsBlockStartOffset))
3289           return Err;
3290         break;
3291 
3292       case PREPROCESSOR_BLOCK_ID:
3293         F.MacroCursor = Stream;
3294         if (!PP.getExternalSource())
3295           PP.setExternalSource(this);
3296 
3297         if (llvm::Error Err = Stream.SkipBlock())
3298           return Err;
3299         if (llvm::Error Err =
3300                 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3301           return Err;
3302         F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3303         break;
3304 
3305       case PREPROCESSOR_DETAIL_BLOCK_ID:
3306         F.PreprocessorDetailCursor = Stream;
3307 
3308         if (llvm::Error Err = Stream.SkipBlock()) {
3309           return Err;
3310         }
3311         if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3312                                                PREPROCESSOR_DETAIL_BLOCK_ID))
3313           return Err;
3314         F.PreprocessorDetailStartOffset
3315         = F.PreprocessorDetailCursor.GetCurrentBitNo();
3316 
3317         if (!PP.getPreprocessingRecord())
3318           PP.createPreprocessingRecord();
3319         if (!PP.getPreprocessingRecord()->getExternalSource())
3320           PP.getPreprocessingRecord()->SetExternalSource(*this);
3321         break;
3322 
3323       case SOURCE_MANAGER_BLOCK_ID:
3324         if (llvm::Error Err = ReadSourceManagerBlock(F))
3325           return Err;
3326         break;
3327 
3328       case SUBMODULE_BLOCK_ID:
3329         if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3330           return Err;
3331         break;
3332 
3333       case COMMENTS_BLOCK_ID: {
3334         BitstreamCursor C = Stream;
3335 
3336         if (llvm::Error Err = Stream.SkipBlock())
3337           return Err;
3338         if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3339           return Err;
3340         CommentsCursors.push_back(std::make_pair(C, &F));
3341         break;
3342       }
3343 
3344       default:
3345         if (llvm::Error Err = Stream.SkipBlock())
3346           return Err;
3347         break;
3348       }
3349       continue;
3350 
3351     case llvm::BitstreamEntry::Record:
3352       // The interesting case.
3353       break;
3354     }
3355 
3356     // Read and process a record.
3357     Record.clear();
3358     StringRef Blob;
3359     Expected<unsigned> MaybeRecordType =
3360         Stream.readRecord(Entry.ID, Record, &Blob);
3361     if (!MaybeRecordType)
3362       return MaybeRecordType.takeError();
3363     ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3364 
3365     // If we're not loading an AST context, we don't care about most records.
3366     if (!ContextObj) {
3367       switch (RecordType) {
3368       case IDENTIFIER_TABLE:
3369       case IDENTIFIER_OFFSET:
3370       case INTERESTING_IDENTIFIERS:
3371       case STATISTICS:
3372       case PP_ASSUME_NONNULL_LOC:
3373       case PP_CONDITIONAL_STACK:
3374       case PP_COUNTER_VALUE:
3375       case SOURCE_LOCATION_OFFSETS:
3376       case MODULE_OFFSET_MAP:
3377       case SOURCE_MANAGER_LINE_TABLE:
3378       case PPD_ENTITIES_OFFSETS:
3379       case HEADER_SEARCH_TABLE:
3380       case IMPORTED_MODULES:
3381       case MACRO_OFFSET:
3382         break;
3383       default:
3384         continue;
3385       }
3386     }
3387 
3388     switch (RecordType) {
3389     default:  // Default behavior: ignore.
3390       break;
3391 
3392     case TYPE_OFFSET: {
3393       if (F.LocalNumTypes != 0)
3394         return llvm::createStringError(
3395             std::errc::illegal_byte_sequence,
3396             "duplicate TYPE_OFFSET record in AST file");
3397       F.TypeOffsets = reinterpret_cast<const UnalignedUInt64 *>(Blob.data());
3398       F.LocalNumTypes = Record[0];
3399       F.BaseTypeIndex = getTotalNumTypes();
3400 
3401       if (F.LocalNumTypes > 0)
3402         TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3403 
3404       break;
3405     }
3406 
3407     case DECL_OFFSET: {
3408       if (F.LocalNumDecls != 0)
3409         return llvm::createStringError(
3410             std::errc::illegal_byte_sequence,
3411             "duplicate DECL_OFFSET record in AST file");
3412       F.DeclOffsets = (const DeclOffset *)Blob.data();
3413       F.LocalNumDecls = Record[0];
3414       F.BaseDeclIndex = getTotalNumDecls();
3415 
3416       if (F.LocalNumDecls > 0)
3417         DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3418 
3419       break;
3420     }
3421 
3422     case TU_UPDATE_LEXICAL: {
3423       DeclContext *TU = ContextObj->getTranslationUnitDecl();
3424       LexicalContents Contents(
3425           reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
3426           static_cast<unsigned int>(Blob.size() / sizeof(DeclID)));
3427       TULexicalDecls.push_back(std::make_pair(&F, Contents));
3428       TU->setHasExternalLexicalStorage(true);
3429       break;
3430     }
3431 
3432     case UPDATE_VISIBLE: {
3433       unsigned Idx = 0;
3434       GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3435       auto *Data = (const unsigned char*)Blob.data();
3436       PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
3437       // If we've already loaded the decl, perform the updates when we finish
3438       // loading this block.
3439       if (Decl *D = GetExistingDecl(ID))
3440         PendingUpdateRecords.push_back(
3441             PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3442       break;
3443     }
3444 
3445     case IDENTIFIER_TABLE:
3446       F.IdentifierTableData =
3447           reinterpret_cast<const unsigned char *>(Blob.data());
3448       if (Record[0]) {
3449         F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3450             F.IdentifierTableData + Record[0],
3451             F.IdentifierTableData + sizeof(uint32_t),
3452             F.IdentifierTableData,
3453             ASTIdentifierLookupTrait(*this, F));
3454 
3455         PP.getIdentifierTable().setExternalIdentifierLookup(this);
3456       }
3457       break;
3458 
3459     case IDENTIFIER_OFFSET: {
3460       if (F.LocalNumIdentifiers != 0)
3461         return llvm::createStringError(
3462             std::errc::illegal_byte_sequence,
3463             "duplicate IDENTIFIER_OFFSET record in AST file");
3464       F.IdentifierOffsets = (const uint32_t *)Blob.data();
3465       F.LocalNumIdentifiers = Record[0];
3466       F.BaseIdentifierID = getTotalNumIdentifiers();
3467 
3468       if (F.LocalNumIdentifiers > 0)
3469         IdentifiersLoaded.resize(IdentifiersLoaded.size()
3470                                  + F.LocalNumIdentifiers);
3471       break;
3472     }
3473 
3474     case INTERESTING_IDENTIFIERS:
3475       F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
3476       break;
3477 
3478     case EAGERLY_DESERIALIZED_DECLS:
3479       // FIXME: Skip reading this record if our ASTConsumer doesn't care
3480       // about "interesting" decls (for instance, if we're building a module).
3481       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3482         EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
3483       break;
3484 
3485     case MODULAR_CODEGEN_DECLS:
3486       // FIXME: Skip reading this record if our ASTConsumer doesn't care about
3487       // them (ie: if we're not codegenerating this module).
3488       if (F.Kind == MK_MainFile ||
3489           getContext().getLangOpts().BuildingPCHWithObjectFile)
3490         for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3491           EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
3492       break;
3493 
3494     case SPECIAL_TYPES:
3495       if (SpecialTypes.empty()) {
3496         for (unsigned I = 0, N = Record.size(); I != N; ++I)
3497           SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
3498         break;
3499       }
3500 
3501       if (SpecialTypes.size() != Record.size())
3502         return llvm::createStringError(std::errc::illegal_byte_sequence,
3503                                        "invalid special-types record");
3504 
3505       for (unsigned I = 0, N = Record.size(); I != N; ++I) {
3506         serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
3507         if (!SpecialTypes[I])
3508           SpecialTypes[I] = ID;
3509         // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
3510         // merge step?
3511       }
3512       break;
3513 
3514     case STATISTICS:
3515       TotalNumStatements += Record[0];
3516       TotalNumMacros += Record[1];
3517       TotalLexicalDeclContexts += Record[2];
3518       TotalVisibleDeclContexts += Record[3];
3519       break;
3520 
3521     case UNUSED_FILESCOPED_DECLS:
3522       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3523         UnusedFileScopedDecls.push_back(ReadDeclID(F, Record, I));
3524       break;
3525 
3526     case DELEGATING_CTORS:
3527       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3528         DelegatingCtorDecls.push_back(ReadDeclID(F, Record, I));
3529       break;
3530 
3531     case WEAK_UNDECLARED_IDENTIFIERS:
3532       if (Record.size() % 3 != 0)
3533         return llvm::createStringError(std::errc::illegal_byte_sequence,
3534                                        "invalid weak identifiers record");
3535 
3536       // FIXME: Ignore weak undeclared identifiers from non-original PCH
3537       // files. This isn't the way to do it :)
3538       WeakUndeclaredIdentifiers.clear();
3539 
3540       // Translate the weak, undeclared identifiers into global IDs.
3541       for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3542         WeakUndeclaredIdentifiers.push_back(
3543           getGlobalIdentifierID(F, Record[I++]));
3544         WeakUndeclaredIdentifiers.push_back(
3545           getGlobalIdentifierID(F, Record[I++]));
3546         WeakUndeclaredIdentifiers.push_back(
3547             ReadSourceLocation(F, Record, I).getRawEncoding());
3548       }
3549       break;
3550 
3551     case SELECTOR_OFFSETS: {
3552       F.SelectorOffsets = (const uint32_t *)Blob.data();
3553       F.LocalNumSelectors = Record[0];
3554       unsigned LocalBaseSelectorID = Record[1];
3555       F.BaseSelectorID = getTotalNumSelectors();
3556 
3557       if (F.LocalNumSelectors > 0) {
3558         // Introduce the global -> local mapping for selectors within this
3559         // module.
3560         GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3561 
3562         // Introduce the local -> global mapping for selectors within this
3563         // module.
3564         F.SelectorRemap.insertOrReplace(
3565           std::make_pair(LocalBaseSelectorID,
3566                          F.BaseSelectorID - LocalBaseSelectorID));
3567 
3568         SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3569       }
3570       break;
3571     }
3572 
3573     case METHOD_POOL:
3574       F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3575       if (Record[0])
3576         F.SelectorLookupTable
3577           = ASTSelectorLookupTable::Create(
3578                         F.SelectorLookupTableData + Record[0],
3579                         F.SelectorLookupTableData,
3580                         ASTSelectorLookupTrait(*this, F));
3581       TotalNumMethodPoolEntries += Record[1];
3582       break;
3583 
3584     case REFERENCED_SELECTOR_POOL:
3585       if (!Record.empty()) {
3586         for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3587           ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3588                                                                 Record[Idx++]));
3589           ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3590                                               getRawEncoding());
3591         }
3592       }
3593       break;
3594 
3595     case PP_ASSUME_NONNULL_LOC: {
3596       unsigned Idx = 0;
3597       if (!Record.empty())
3598         PP.setPreambleRecordedPragmaAssumeNonNullLoc(
3599             ReadSourceLocation(F, Record, Idx));
3600       break;
3601     }
3602 
3603     case PP_UNSAFE_BUFFER_USAGE: {
3604       if (!Record.empty()) {
3605         SmallVector<SourceLocation, 64> SrcLocs;
3606         unsigned Idx = 0;
3607         while (Idx < Record.size())
3608           SrcLocs.push_back(ReadSourceLocation(F, Record, Idx));
3609         PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
3610       }
3611       break;
3612     }
3613 
3614     case PP_CONDITIONAL_STACK:
3615       if (!Record.empty()) {
3616         unsigned Idx = 0, End = Record.size() - 1;
3617         bool ReachedEOFWhileSkipping = Record[Idx++];
3618         std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3619         if (ReachedEOFWhileSkipping) {
3620           SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3621           SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3622           bool FoundNonSkipPortion = Record[Idx++];
3623           bool FoundElse = Record[Idx++];
3624           SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3625           SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3626                            FoundElse, ElseLoc);
3627         }
3628         SmallVector<PPConditionalInfo, 4> ConditionalStack;
3629         while (Idx < End) {
3630           auto Loc = ReadSourceLocation(F, Record, Idx);
3631           bool WasSkipping = Record[Idx++];
3632           bool FoundNonSkip = Record[Idx++];
3633           bool FoundElse = Record[Idx++];
3634           ConditionalStack.push_back(
3635               {Loc, WasSkipping, FoundNonSkip, FoundElse});
3636         }
3637         PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
3638       }
3639       break;
3640 
3641     case PP_COUNTER_VALUE:
3642       if (!Record.empty() && Listener)
3643         Listener->ReadCounter(F, Record[0]);
3644       break;
3645 
3646     case FILE_SORTED_DECLS:
3647       F.FileSortedDecls = (const unaligned_decl_id_t *)Blob.data();
3648       F.NumFileSortedDecls = Record[0];
3649       break;
3650 
3651     case SOURCE_LOCATION_OFFSETS: {
3652       F.SLocEntryOffsets = (const uint32_t *)Blob.data();
3653       F.LocalNumSLocEntries = Record[0];
3654       SourceLocation::UIntTy SLocSpaceSize = Record[1];
3655       F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset;
3656       std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
3657           SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
3658                                               SLocSpaceSize);
3659       if (!F.SLocEntryBaseID) {
3660         if (!Diags.isDiagnosticInFlight()) {
3661           Diags.Report(SourceLocation(), diag::remark_sloc_usage);
3662           SourceMgr.noteSLocAddressSpaceUsage(Diags);
3663         }
3664         return llvm::createStringError(std::errc::invalid_argument,
3665                                        "ran out of source locations");
3666       }
3667       // Make our entry in the range map. BaseID is negative and growing, so
3668       // we invert it. Because we invert it, though, we need the other end of
3669       // the range.
3670       unsigned RangeStart =
3671           unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3672       GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3673       F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3674 
3675       // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3676       assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0);
3677       GlobalSLocOffsetMap.insert(
3678           std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3679                            - SLocSpaceSize,&F));
3680 
3681       TotalNumSLocEntries += F.LocalNumSLocEntries;
3682       break;
3683     }
3684 
3685     case MODULE_OFFSET_MAP:
3686       F.ModuleOffsetMap = Blob;
3687       break;
3688 
3689     case SOURCE_MANAGER_LINE_TABLE:
3690       ParseLineTable(F, Record);
3691       break;
3692 
3693     case EXT_VECTOR_DECLS:
3694       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3695         ExtVectorDecls.push_back(ReadDeclID(F, Record, I));
3696       break;
3697 
3698     case VTABLE_USES:
3699       if (Record.size() % 3 != 0)
3700         return llvm::createStringError(std::errc::illegal_byte_sequence,
3701                                        "Invalid VTABLE_USES record");
3702 
3703       // Later tables overwrite earlier ones.
3704       // FIXME: Modules will have some trouble with this. This is clearly not
3705       // the right way to do this.
3706       VTableUses.clear();
3707 
3708       for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3709         VTableUses.push_back(
3710             {ReadDeclID(F, Record, Idx),
3711              ReadSourceLocation(F, Record, Idx).getRawEncoding(),
3712              (bool)Record[Idx++]});
3713       }
3714       break;
3715 
3716     case PENDING_IMPLICIT_INSTANTIATIONS:
3717 
3718       if (Record.size() % 2 != 0)
3719         return llvm::createStringError(
3720             std::errc::illegal_byte_sequence,
3721             "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3722 
3723       for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3724         PendingInstantiations.push_back(
3725             {ReadDeclID(F, Record, I),
3726              ReadSourceLocation(F, Record, I).getRawEncoding()});
3727       }
3728       break;
3729 
3730     case SEMA_DECL_REFS:
3731       if (Record.size() != 3)
3732         return llvm::createStringError(std::errc::illegal_byte_sequence,
3733                                        "Invalid SEMA_DECL_REFS block");
3734       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3735         SemaDeclRefs.push_back(ReadDeclID(F, Record, I));
3736       break;
3737 
3738     case PPD_ENTITIES_OFFSETS: {
3739       F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3740       assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3741       F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3742 
3743       unsigned LocalBasePreprocessedEntityID = Record[0];
3744 
3745       unsigned StartingID;
3746       if (!PP.getPreprocessingRecord())
3747         PP.createPreprocessingRecord();
3748       if (!PP.getPreprocessingRecord()->getExternalSource())
3749         PP.getPreprocessingRecord()->SetExternalSource(*this);
3750       StartingID
3751         = PP.getPreprocessingRecord()
3752             ->allocateLoadedEntities(F.NumPreprocessedEntities);
3753       F.BasePreprocessedEntityID = StartingID;
3754 
3755       if (F.NumPreprocessedEntities > 0) {
3756         // Introduce the global -> local mapping for preprocessed entities in
3757         // this module.
3758         GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3759 
3760         // Introduce the local -> global mapping for preprocessed entities in
3761         // this module.
3762         F.PreprocessedEntityRemap.insertOrReplace(
3763           std::make_pair(LocalBasePreprocessedEntityID,
3764             F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3765       }
3766 
3767       break;
3768     }
3769 
3770     case PPD_SKIPPED_RANGES: {
3771       F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
3772       assert(Blob.size() % sizeof(PPSkippedRange) == 0);
3773       F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
3774 
3775       if (!PP.getPreprocessingRecord())
3776         PP.createPreprocessingRecord();
3777       if (!PP.getPreprocessingRecord()->getExternalSource())
3778         PP.getPreprocessingRecord()->SetExternalSource(*this);
3779       F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
3780           ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
3781 
3782       if (F.NumPreprocessedSkippedRanges > 0)
3783         GlobalSkippedRangeMap.insert(
3784             std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
3785       break;
3786     }
3787 
3788     case DECL_UPDATE_OFFSETS:
3789       if (Record.size() % 2 != 0)
3790         return llvm::createStringError(
3791             std::errc::illegal_byte_sequence,
3792             "invalid DECL_UPDATE_OFFSETS block in AST file");
3793       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
3794         GlobalDeclID ID = ReadDeclID(F, Record, I);
3795         DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++]));
3796 
3797         // If we've already loaded the decl, perform the updates when we finish
3798         // loading this block.
3799         if (Decl *D = GetExistingDecl(ID))
3800           PendingUpdateRecords.push_back(
3801               PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3802       }
3803       break;
3804 
3805     case DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD: {
3806       if (Record.size() % 3 != 0)
3807         return llvm::createStringError(
3808             std::errc::illegal_byte_sequence,
3809             "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
3810             "file");
3811       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
3812         GlobalDeclID ID = ReadDeclID(F, Record, I);
3813 
3814         uint64_t BaseOffset = F.DeclsBlockStartOffset;
3815         assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!");
3816         uint64_t LocalLexicalOffset = Record[I++];
3817         uint64_t LexicalOffset =
3818             LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
3819         uint64_t LocalVisibleOffset = Record[I++];
3820         uint64_t VisibleOffset =
3821             LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
3822 
3823         DelayedNamespaceOffsetMap[ID] = {LexicalOffset, VisibleOffset};
3824 
3825         assert(!GetExistingDecl(ID) &&
3826                "We shouldn't load the namespace in the front of delayed "
3827                "namespace lexical and visible block");
3828       }
3829       break;
3830     }
3831 
3832     case OBJC_CATEGORIES_MAP:
3833       if (F.LocalNumObjCCategoriesInMap != 0)
3834         return llvm::createStringError(
3835             std::errc::illegal_byte_sequence,
3836             "duplicate OBJC_CATEGORIES_MAP record in AST file");
3837 
3838       F.LocalNumObjCCategoriesInMap = Record[0];
3839       F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3840       break;
3841 
3842     case OBJC_CATEGORIES:
3843       F.ObjCCategories.swap(Record);
3844       break;
3845 
3846     case CUDA_SPECIAL_DECL_REFS:
3847       // Later tables overwrite earlier ones.
3848       // FIXME: Modules will have trouble with this.
3849       CUDASpecialDeclRefs.clear();
3850       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3851         CUDASpecialDeclRefs.push_back(ReadDeclID(F, Record, I));
3852       break;
3853 
3854     case HEADER_SEARCH_TABLE:
3855       F.HeaderFileInfoTableData = Blob.data();
3856       F.LocalNumHeaderFileInfos = Record[1];
3857       if (Record[0]) {
3858         F.HeaderFileInfoTable
3859           = HeaderFileInfoLookupTable::Create(
3860                    (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3861                    (const unsigned char *)F.HeaderFileInfoTableData,
3862                    HeaderFileInfoTrait(*this, F,
3863                                        &PP.getHeaderSearchInfo(),
3864                                        Blob.data() + Record[2]));
3865 
3866         PP.getHeaderSearchInfo().SetExternalSource(this);
3867         if (!PP.getHeaderSearchInfo().getExternalLookup())
3868           PP.getHeaderSearchInfo().SetExternalLookup(this);
3869       }
3870       break;
3871 
3872     case FP_PRAGMA_OPTIONS:
3873       // Later tables overwrite earlier ones.
3874       FPPragmaOptions.swap(Record);
3875       break;
3876 
3877     case OPENCL_EXTENSIONS:
3878       for (unsigned I = 0, E = Record.size(); I != E; ) {
3879         auto Name = ReadString(Record, I);
3880         auto &OptInfo = OpenCLExtensions.OptMap[Name];
3881         OptInfo.Supported = Record[I++] != 0;
3882         OptInfo.Enabled = Record[I++] != 0;
3883         OptInfo.WithPragma = Record[I++] != 0;
3884         OptInfo.Avail = Record[I++];
3885         OptInfo.Core = Record[I++];
3886         OptInfo.Opt = Record[I++];
3887       }
3888       break;
3889 
3890     case TENTATIVE_DEFINITIONS:
3891       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3892         TentativeDefinitions.push_back(ReadDeclID(F, Record, I));
3893       break;
3894 
3895     case KNOWN_NAMESPACES:
3896       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3897         KnownNamespaces.push_back(ReadDeclID(F, Record, I));
3898       break;
3899 
3900     case UNDEFINED_BUT_USED:
3901       if (Record.size() % 2 != 0)
3902         return llvm::createStringError(std::errc::illegal_byte_sequence,
3903                                        "invalid undefined-but-used record");
3904       for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3905         UndefinedButUsed.push_back(
3906             {ReadDeclID(F, Record, I),
3907              ReadSourceLocation(F, Record, I).getRawEncoding()});
3908       }
3909       break;
3910 
3911     case DELETE_EXPRS_TO_ANALYZE:
3912       for (unsigned I = 0, N = Record.size(); I != N;) {
3913         DelayedDeleteExprs.push_back(ReadDeclID(F, Record, I).getRawValue());
3914         const uint64_t Count = Record[I++];
3915         DelayedDeleteExprs.push_back(Count);
3916         for (uint64_t C = 0; C < Count; ++C) {
3917           DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3918           bool IsArrayForm = Record[I++] == 1;
3919           DelayedDeleteExprs.push_back(IsArrayForm);
3920         }
3921       }
3922       break;
3923 
3924     case VTABLES_TO_EMIT:
3925       if (F.Kind == MK_MainFile ||
3926           getContext().getLangOpts().BuildingPCHWithObjectFile)
3927         for (unsigned I = 0, N = Record.size(); I != N;)
3928           VTablesToEmit.push_back(ReadDeclID(F, Record, I));
3929       break;
3930 
3931     case IMPORTED_MODULES:
3932       if (!F.isModule()) {
3933         // If we aren't loading a module (which has its own exports), make
3934         // all of the imported modules visible.
3935         // FIXME: Deal with macros-only imports.
3936         for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3937           unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3938           SourceLocation Loc = ReadSourceLocation(F, Record, I);
3939           if (GlobalID) {
3940             PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3941             if (DeserializationListener)
3942               DeserializationListener->ModuleImportRead(GlobalID, Loc);
3943           }
3944         }
3945       }
3946       break;
3947 
3948     case MACRO_OFFSET: {
3949       if (F.LocalNumMacros != 0)
3950         return llvm::createStringError(
3951             std::errc::illegal_byte_sequence,
3952             "duplicate MACRO_OFFSET record in AST file");
3953       F.MacroOffsets = (const uint32_t *)Blob.data();
3954       F.LocalNumMacros = Record[0];
3955       unsigned LocalBaseMacroID = Record[1];
3956       F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset;
3957       F.BaseMacroID = getTotalNumMacros();
3958 
3959       if (F.LocalNumMacros > 0) {
3960         // Introduce the global -> local mapping for macros within this module.
3961         GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3962 
3963         // Introduce the local -> global mapping for macros within this module.
3964         F.MacroRemap.insertOrReplace(
3965           std::make_pair(LocalBaseMacroID,
3966                          F.BaseMacroID - LocalBaseMacroID));
3967 
3968         MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3969       }
3970       break;
3971     }
3972 
3973     case LATE_PARSED_TEMPLATE:
3974       LateParsedTemplates.emplace_back(
3975           std::piecewise_construct, std::forward_as_tuple(&F),
3976           std::forward_as_tuple(Record.begin(), Record.end()));
3977       break;
3978 
3979     case OPTIMIZE_PRAGMA_OPTIONS:
3980       if (Record.size() != 1)
3981         return llvm::createStringError(std::errc::illegal_byte_sequence,
3982                                        "invalid pragma optimize record");
3983       OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3984       break;
3985 
3986     case MSSTRUCT_PRAGMA_OPTIONS:
3987       if (Record.size() != 1)
3988         return llvm::createStringError(std::errc::illegal_byte_sequence,
3989                                        "invalid pragma ms_struct record");
3990       PragmaMSStructState = Record[0];
3991       break;
3992 
3993     case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3994       if (Record.size() != 2)
3995         return llvm::createStringError(
3996             std::errc::illegal_byte_sequence,
3997             "invalid pragma pointers to members record");
3998       PragmaMSPointersToMembersState = Record[0];
3999       PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
4000       break;
4001 
4002     case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
4003       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4004         UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, Record, I));
4005       break;
4006 
4007     case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
4008       if (Record.size() != 1)
4009         return llvm::createStringError(std::errc::illegal_byte_sequence,
4010                                        "invalid cuda pragma options record");
4011       ForceHostDeviceDepth = Record[0];
4012       break;
4013 
4014     case ALIGN_PACK_PRAGMA_OPTIONS: {
4015       if (Record.size() < 3)
4016         return llvm::createStringError(std::errc::illegal_byte_sequence,
4017                                        "invalid pragma pack record");
4018       PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
4019       PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
4020       unsigned NumStackEntries = Record[2];
4021       unsigned Idx = 3;
4022       // Reset the stack when importing a new module.
4023       PragmaAlignPackStack.clear();
4024       for (unsigned I = 0; I < NumStackEntries; ++I) {
4025         PragmaAlignPackStackEntry Entry;
4026         Entry.Value = ReadAlignPackInfo(Record[Idx++]);
4027         Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4028         Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4029         PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
4030         Entry.SlotLabel = PragmaAlignPackStrings.back();
4031         PragmaAlignPackStack.push_back(Entry);
4032       }
4033       break;
4034     }
4035 
4036     case FLOAT_CONTROL_PRAGMA_OPTIONS: {
4037       if (Record.size() < 3)
4038         return llvm::createStringError(std::errc::illegal_byte_sequence,
4039                                        "invalid pragma float control record");
4040       FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
4041       FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
4042       unsigned NumStackEntries = Record[2];
4043       unsigned Idx = 3;
4044       // Reset the stack when importing a new module.
4045       FpPragmaStack.clear();
4046       for (unsigned I = 0; I < NumStackEntries; ++I) {
4047         FpPragmaStackEntry Entry;
4048         Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
4049         Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4050         Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4051         FpPragmaStrings.push_back(ReadString(Record, Idx));
4052         Entry.SlotLabel = FpPragmaStrings.back();
4053         FpPragmaStack.push_back(Entry);
4054       }
4055       break;
4056     }
4057 
4058     case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
4059       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4060         DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, Record, I));
4061       break;
4062     }
4063   }
4064 }
4065 
ReadModuleOffsetMap(ModuleFile & F) const4066 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4067   assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
4068 
4069   // Additional remapping information.
4070   const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
4071   const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
4072   F.ModuleOffsetMap = StringRef();
4073 
4074   using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
4075   RemapBuilder MacroRemap(F.MacroRemap);
4076   RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
4077   RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
4078   RemapBuilder SelectorRemap(F.SelectorRemap);
4079 
4080   auto &ImportedModuleVector = F.TransitiveImports;
4081   assert(ImportedModuleVector.empty());
4082 
4083   while (Data < DataEnd) {
4084     // FIXME: Looking up dependency modules by filename is horrible. Let's
4085     // start fixing this with prebuilt, explicit and implicit modules and see
4086     // how it goes...
4087     using namespace llvm::support;
4088     ModuleKind Kind = static_cast<ModuleKind>(
4089         endian::readNext<uint8_t, llvm::endianness::little>(Data));
4090     uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(Data);
4091     StringRef Name = StringRef((const char*)Data, Len);
4092     Data += Len;
4093     ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule ||
4094                               Kind == MK_ImplicitModule
4095                           ? ModuleMgr.lookupByModuleName(Name)
4096                           : ModuleMgr.lookupByFileName(Name));
4097     if (!OM) {
4098       std::string Msg = "refers to unknown module, cannot find ";
4099       Msg.append(std::string(Name));
4100       Error(Msg);
4101       return;
4102     }
4103 
4104     ImportedModuleVector.push_back(OM);
4105 
4106     uint32_t MacroIDOffset =
4107         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4108     uint32_t PreprocessedEntityIDOffset =
4109         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4110     uint32_t SubmoduleIDOffset =
4111         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4112     uint32_t SelectorIDOffset =
4113         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4114 
4115     auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
4116                          RemapBuilder &Remap) {
4117       constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4118       if (Offset != None)
4119         Remap.insert(std::make_pair(Offset,
4120                                     static_cast<int>(BaseOffset - Offset)));
4121     };
4122 
4123     mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
4124     mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
4125               PreprocessedEntityRemap);
4126     mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
4127     mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
4128   }
4129 }
4130 
4131 ASTReader::ASTReadResult
ReadModuleMapFileBlock(RecordData & Record,ModuleFile & F,const ModuleFile * ImportedBy,unsigned ClientLoadCapabilities)4132 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
4133                                   const ModuleFile *ImportedBy,
4134                                   unsigned ClientLoadCapabilities) {
4135   unsigned Idx = 0;
4136   F.ModuleMapPath = ReadPath(F, Record, Idx);
4137 
4138   // Try to resolve ModuleName in the current header search context and
4139   // verify that it is found in the same module map file as we saved. If the
4140   // top-level AST file is a main file, skip this check because there is no
4141   // usable header search context.
4142   assert(!F.ModuleName.empty() &&
4143          "MODULE_NAME should come before MODULE_MAP_FILE");
4144   if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
4145       F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
4146     // An implicitly-loaded module file should have its module listed in some
4147     // module map file that we've already loaded.
4148     Module *M =
4149         PP.getHeaderSearchInfo().lookupModule(F.ModuleName, F.ImportLoc);
4150     auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4151     OptionalFileEntryRef ModMap =
4152         M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4153     // Don't emit module relocation error if we have -fno-validate-pch
4154     if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4155               DisableValidationForModuleKind::Module) &&
4156         !ModMap) {
4157       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
4158         if (auto ASTFE = M ? M->getASTFile() : std::nullopt) {
4159           // This module was defined by an imported (explicit) module.
4160           Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
4161                                                << ASTFE->getName();
4162         } else {
4163           // This module was built with a different module map.
4164           Diag(diag::err_imported_module_not_found)
4165               << F.ModuleName << F.FileName
4166               << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath
4167               << !ImportedBy;
4168           // In case it was imported by a PCH, there's a chance the user is
4169           // just missing to include the search path to the directory containing
4170           // the modulemap.
4171           if (ImportedBy && ImportedBy->Kind == MK_PCH)
4172             Diag(diag::note_imported_by_pch_module_not_found)
4173                 << llvm::sys::path::parent_path(F.ModuleMapPath);
4174         }
4175       }
4176       return OutOfDate;
4177     }
4178 
4179     assert(M && M->Name == F.ModuleName && "found module with different name");
4180 
4181     // Check the primary module map file.
4182     auto StoredModMap = FileMgr.getFile(F.ModuleMapPath);
4183     if (!StoredModMap || *StoredModMap != ModMap) {
4184       assert(ModMap && "found module is missing module map file");
4185       assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
4186              "top-level import should be verified");
4187       bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
4188       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4189         Diag(diag::err_imported_module_modmap_changed)
4190             << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
4191             << ModMap->getName() << F.ModuleMapPath << NotImported;
4192       return OutOfDate;
4193     }
4194 
4195     ModuleMap::AdditionalModMapsSet AdditionalStoredMaps;
4196     for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
4197       // FIXME: we should use input files rather than storing names.
4198       std::string Filename = ReadPath(F, Record, Idx);
4199       auto SF = FileMgr.getOptionalFileRef(Filename, false, false);
4200       if (!SF) {
4201         if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4202           Error("could not find file '" + Filename +"' referenced by AST file");
4203         return OutOfDate;
4204       }
4205       AdditionalStoredMaps.insert(*SF);
4206     }
4207 
4208     // Check any additional module map files (e.g. module.private.modulemap)
4209     // that are not in the pcm.
4210     if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4211       for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4212         // Remove files that match
4213         // Note: SmallPtrSet::erase is really remove
4214         if (!AdditionalStoredMaps.erase(ModMap)) {
4215           if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4216             Diag(diag::err_module_different_modmap)
4217               << F.ModuleName << /*new*/0 << ModMap.getName();
4218           return OutOfDate;
4219         }
4220       }
4221     }
4222 
4223     // Check any additional module map files that are in the pcm, but not
4224     // found in header search. Cases that match are already removed.
4225     for (FileEntryRef ModMap : AdditionalStoredMaps) {
4226       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4227         Diag(diag::err_module_different_modmap)
4228           << F.ModuleName << /*not new*/1 << ModMap.getName();
4229       return OutOfDate;
4230     }
4231   }
4232 
4233   if (Listener)
4234     Listener->ReadModuleMapFile(F.ModuleMapPath);
4235   return Success;
4236 }
4237 
4238 /// Move the given method to the back of the global list of methods.
moveMethodToBackOfGlobalList(Sema & S,ObjCMethodDecl * Method)4239 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
4240   // Find the entry for this selector in the method pool.
4241   SemaObjC::GlobalMethodPool::iterator Known =
4242       S.ObjC().MethodPool.find(Method->getSelector());
4243   if (Known == S.ObjC().MethodPool.end())
4244     return;
4245 
4246   // Retrieve the appropriate method list.
4247   ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4248                                                     : Known->second.second;
4249   bool Found = false;
4250   for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4251     if (!Found) {
4252       if (List->getMethod() == Method) {
4253         Found = true;
4254       } else {
4255         // Keep searching.
4256         continue;
4257       }
4258     }
4259 
4260     if (List->getNext())
4261       List->setMethod(List->getNext()->getMethod());
4262     else
4263       List->setMethod(Method);
4264   }
4265 }
4266 
makeNamesVisible(const HiddenNames & Names,Module * Owner)4267 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4268   assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
4269   for (Decl *D : Names) {
4270     bool wasHidden = !D->isUnconditionallyVisible();
4271     D->setVisibleDespiteOwningModule();
4272 
4273     if (wasHidden && SemaObj) {
4274       if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4275         moveMethodToBackOfGlobalList(*SemaObj, Method);
4276       }
4277     }
4278   }
4279 }
4280 
makeModuleVisible(Module * Mod,Module::NameVisibilityKind NameVisibility,SourceLocation ImportLoc)4281 void ASTReader::makeModuleVisible(Module *Mod,
4282                                   Module::NameVisibilityKind NameVisibility,
4283                                   SourceLocation ImportLoc) {
4284   llvm::SmallPtrSet<Module *, 4> Visited;
4285   SmallVector<Module *, 4> Stack;
4286   Stack.push_back(Mod);
4287   while (!Stack.empty()) {
4288     Mod = Stack.pop_back_val();
4289 
4290     if (NameVisibility <= Mod->NameVisibility) {
4291       // This module already has this level of visibility (or greater), so
4292       // there is nothing more to do.
4293       continue;
4294     }
4295 
4296     if (Mod->isUnimportable()) {
4297       // Modules that aren't importable cannot be made visible.
4298       continue;
4299     }
4300 
4301     // Update the module's name visibility.
4302     Mod->NameVisibility = NameVisibility;
4303 
4304     // If we've already deserialized any names from this module,
4305     // mark them as visible.
4306     HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4307     if (Hidden != HiddenNamesMap.end()) {
4308       auto HiddenNames = std::move(*Hidden);
4309       HiddenNamesMap.erase(Hidden);
4310       makeNamesVisible(HiddenNames.second, HiddenNames.first);
4311       assert(!HiddenNamesMap.contains(Mod) &&
4312              "making names visible added hidden names");
4313     }
4314 
4315     // Push any exported modules onto the stack to be marked as visible.
4316     SmallVector<Module *, 16> Exports;
4317     Mod->getExportedModules(Exports);
4318     for (SmallVectorImpl<Module *>::iterator
4319            I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4320       Module *Exported = *I;
4321       if (Visited.insert(Exported).second)
4322         Stack.push_back(Exported);
4323     }
4324   }
4325 }
4326 
4327 /// We've merged the definition \p MergedDef into the existing definition
4328 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4329 /// visible.
mergeDefinitionVisibility(NamedDecl * Def,NamedDecl * MergedDef)4330 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
4331                                           NamedDecl *MergedDef) {
4332   if (!Def->isUnconditionallyVisible()) {
4333     // If MergedDef is visible or becomes visible, make the definition visible.
4334     if (MergedDef->isUnconditionallyVisible())
4335       Def->setVisibleDespiteOwningModule();
4336     else {
4337       getContext().mergeDefinitionIntoModule(
4338           Def, MergedDef->getImportedOwningModule(),
4339           /*NotifyListeners*/ false);
4340       PendingMergedDefinitionsToDeduplicate.insert(Def);
4341     }
4342   }
4343 }
4344 
loadGlobalIndex()4345 bool ASTReader::loadGlobalIndex() {
4346   if (GlobalIndex)
4347     return false;
4348 
4349   if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4350       !PP.getLangOpts().Modules)
4351     return true;
4352 
4353   // Try to load the global index.
4354   TriedLoadingGlobalIndex = true;
4355   StringRef ModuleCachePath
4356     = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
4357   std::pair<GlobalModuleIndex *, llvm::Error> Result =
4358       GlobalModuleIndex::readIndex(ModuleCachePath);
4359   if (llvm::Error Err = std::move(Result.second)) {
4360     assert(!Result.first);
4361     consumeError(std::move(Err)); // FIXME this drops errors on the floor.
4362     return true;
4363   }
4364 
4365   GlobalIndex.reset(Result.first);
4366   ModuleMgr.setGlobalIndex(GlobalIndex.get());
4367   return false;
4368 }
4369 
isGlobalIndexUnavailable() const4370 bool ASTReader::isGlobalIndexUnavailable() const {
4371   return PP.getLangOpts().Modules && UseGlobalIndex &&
4372          !hasGlobalIndex() && TriedLoadingGlobalIndex;
4373 }
4374 
updateModuleTimestamp(ModuleFile & MF)4375 static void updateModuleTimestamp(ModuleFile &MF) {
4376   // Overwrite the timestamp file contents so that file's mtime changes.
4377   std::string TimestampFilename = MF.getTimestampFilename();
4378   std::error_code EC;
4379   llvm::raw_fd_ostream OS(TimestampFilename, EC,
4380                           llvm::sys::fs::OF_TextWithCRLF);
4381   if (EC)
4382     return;
4383   OS << "Timestamp file\n";
4384   OS.close();
4385   OS.clear_error(); // Avoid triggering a fatal error.
4386 }
4387 
4388 /// Given a cursor at the start of an AST file, scan ahead and drop the
4389 /// cursor into the start of the given block ID, returning false on success and
4390 /// true on failure.
SkipCursorToBlock(BitstreamCursor & Cursor,unsigned BlockID)4391 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4392   while (true) {
4393     Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4394     if (!MaybeEntry) {
4395       // FIXME this drops errors on the floor.
4396       consumeError(MaybeEntry.takeError());
4397       return true;
4398     }
4399     llvm::BitstreamEntry Entry = MaybeEntry.get();
4400 
4401     switch (Entry.Kind) {
4402     case llvm::BitstreamEntry::Error:
4403     case llvm::BitstreamEntry::EndBlock:
4404       return true;
4405 
4406     case llvm::BitstreamEntry::Record:
4407       // Ignore top-level records.
4408       if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4409         break;
4410       else {
4411         // FIXME this drops errors on the floor.
4412         consumeError(Skipped.takeError());
4413         return true;
4414       }
4415 
4416     case llvm::BitstreamEntry::SubBlock:
4417       if (Entry.ID == BlockID) {
4418         if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4419           // FIXME this drops the error on the floor.
4420           consumeError(std::move(Err));
4421           return true;
4422         }
4423         // Found it!
4424         return false;
4425       }
4426 
4427       if (llvm::Error Err = Cursor.SkipBlock()) {
4428         // FIXME this drops the error on the floor.
4429         consumeError(std::move(Err));
4430         return true;
4431       }
4432     }
4433   }
4434 }
4435 
ReadAST(StringRef FileName,ModuleKind Type,SourceLocation ImportLoc,unsigned ClientLoadCapabilities,ModuleFile ** NewLoadedModuleFile)4436 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, ModuleKind Type,
4437                                             SourceLocation ImportLoc,
4438                                             unsigned ClientLoadCapabilities,
4439                                             ModuleFile **NewLoadedModuleFile) {
4440   llvm::TimeTraceScope scope("ReadAST", FileName);
4441 
4442   llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4443   llvm::SaveAndRestore<std::optional<ModuleKind>> SetCurModuleKindRAII(
4444       CurrentDeserializingModuleKind, Type);
4445 
4446   // Defer any pending actions until we get to the end of reading the AST file.
4447   Deserializing AnASTFile(this);
4448 
4449   // Bump the generation number.
4450   unsigned PreviousGeneration = 0;
4451   if (ContextObj)
4452     PreviousGeneration = incrementGeneration(*ContextObj);
4453 
4454   unsigned NumModules = ModuleMgr.size();
4455   SmallVector<ImportedModule, 4> Loaded;
4456   if (ASTReadResult ReadResult =
4457           ReadASTCore(FileName, Type, ImportLoc,
4458                       /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
4459                       ClientLoadCapabilities)) {
4460     ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4461 
4462     // If we find that any modules are unusable, the global index is going
4463     // to be out-of-date. Just remove it.
4464     GlobalIndex.reset();
4465     ModuleMgr.setGlobalIndex(nullptr);
4466     return ReadResult;
4467   }
4468 
4469   if (NewLoadedModuleFile && !Loaded.empty())
4470     *NewLoadedModuleFile = Loaded.back().Mod;
4471 
4472   // Here comes stuff that we only do once the entire chain is loaded. Do *not*
4473   // remove modules from this point. Various fields are updated during reading
4474   // the AST block and removing the modules would result in dangling pointers.
4475   // They are generally only incidentally dereferenced, ie. a binary search
4476   // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
4477   // be dereferenced but it wouldn't actually be used.
4478 
4479   // Load the AST blocks of all of the modules that we loaded. We can still
4480   // hit errors parsing the ASTs at this point.
4481   for (ImportedModule &M : Loaded) {
4482     ModuleFile &F = *M.Mod;
4483     llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
4484 
4485     // Read the AST block.
4486     if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4487       Error(std::move(Err));
4488       return Failure;
4489     }
4490 
4491     // The AST block should always have a definition for the main module.
4492     if (F.isModule() && !F.DidReadTopLevelSubmodule) {
4493       Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
4494       return Failure;
4495     }
4496 
4497     // Read the extension blocks.
4498     while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
4499       if (llvm::Error Err = ReadExtensionBlock(F)) {
4500         Error(std::move(Err));
4501         return Failure;
4502       }
4503     }
4504 
4505     // Once read, set the ModuleFile bit base offset and update the size in
4506     // bits of all files we've seen.
4507     F.GlobalBitOffset = TotalModulesSizeInBits;
4508     TotalModulesSizeInBits += F.SizeInBits;
4509     GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
4510   }
4511 
4512   // Preload source locations and interesting indentifiers.
4513   for (ImportedModule &M : Loaded) {
4514     ModuleFile &F = *M.Mod;
4515 
4516     // Map the original source file ID into the ID space of the current
4517     // compilation.
4518     if (F.OriginalSourceFileID.isValid())
4519       F.OriginalSourceFileID = TranslateFileID(F, F.OriginalSourceFileID);
4520 
4521     for (auto Offset : F.PreloadIdentifierOffsets) {
4522       const unsigned char *Data = F.IdentifierTableData + Offset;
4523 
4524       ASTIdentifierLookupTrait Trait(*this, F);
4525       auto KeyDataLen = Trait.ReadKeyDataLength(Data);
4526       auto Key = Trait.ReadKey(Data, KeyDataLen.first);
4527 
4528       IdentifierInfo *II;
4529       if (!PP.getLangOpts().CPlusPlus) {
4530         // Identifiers present in both the module file and the importing
4531         // instance are marked out-of-date so that they can be deserialized
4532         // on next use via ASTReader::updateOutOfDateIdentifier().
4533         // Identifiers present in the module file but not in the importing
4534         // instance are ignored for now, preventing growth of the identifier
4535         // table. They will be deserialized on first use via ASTReader::get().
4536         auto It = PP.getIdentifierTable().find(Key);
4537         if (It == PP.getIdentifierTable().end())
4538           continue;
4539         II = It->second;
4540       } else {
4541         // With C++ modules, not many identifiers are considered interesting.
4542         // All identifiers in the module file can be placed into the identifier
4543         // table of the importing instance and marked as out-of-date. This makes
4544         // ASTReader::get() a no-op, and deserialization will take place on
4545         // first/next use via ASTReader::updateOutOfDateIdentifier().
4546         II = &PP.getIdentifierTable().getOwn(Key);
4547       }
4548 
4549       II->setOutOfDate(true);
4550 
4551       // Mark this identifier as being from an AST file so that we can track
4552       // whether we need to serialize it.
4553       markIdentifierFromAST(*this, *II);
4554 
4555       // Associate the ID with the identifier so that the writer can reuse it.
4556       auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
4557       SetIdentifierInfo(ID, II);
4558     }
4559   }
4560 
4561   // Builtins and library builtins have already been initialized. Mark all
4562   // identifiers as out-of-date, so that they are deserialized on first use.
4563   if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
4564     for (auto &Id : PP.getIdentifierTable())
4565       Id.second->setOutOfDate(true);
4566 
4567   // Mark selectors as out of date.
4568   for (const auto &Sel : SelectorGeneration)
4569     SelectorOutOfDate[Sel.first] = true;
4570 
4571   // Setup the import locations and notify the module manager that we've
4572   // committed to these module files.
4573   for (ImportedModule &M : Loaded) {
4574     ModuleFile &F = *M.Mod;
4575 
4576     ModuleMgr.moduleFileAccepted(&F);
4577 
4578     // Set the import location.
4579     F.DirectImportLoc = ImportLoc;
4580     // FIXME: We assume that locations from PCH / preamble do not need
4581     // any translation.
4582     if (!M.ImportedBy)
4583       F.ImportLoc = M.ImportLoc;
4584     else
4585       F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
4586   }
4587 
4588   // Resolve any unresolved module exports.
4589   for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4590     UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4591     SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4592     Module *ResolvedMod = getSubmodule(GlobalID);
4593 
4594     switch (Unresolved.Kind) {
4595     case UnresolvedModuleRef::Conflict:
4596       if (ResolvedMod) {
4597         Module::Conflict Conflict;
4598         Conflict.Other = ResolvedMod;
4599         Conflict.Message = Unresolved.String.str();
4600         Unresolved.Mod->Conflicts.push_back(Conflict);
4601       }
4602       continue;
4603 
4604     case UnresolvedModuleRef::Import:
4605       if (ResolvedMod)
4606         Unresolved.Mod->Imports.insert(ResolvedMod);
4607       continue;
4608 
4609     case UnresolvedModuleRef::Affecting:
4610       if (ResolvedMod)
4611         Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
4612       continue;
4613 
4614     case UnresolvedModuleRef::Export:
4615       if (ResolvedMod || Unresolved.IsWildcard)
4616         Unresolved.Mod->Exports.push_back(
4617           Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4618       continue;
4619     }
4620   }
4621   UnresolvedModuleRefs.clear();
4622 
4623   // FIXME: How do we load the 'use'd modules? They may not be submodules.
4624   // Might be unnecessary as use declarations are only used to build the
4625   // module itself.
4626 
4627   if (ContextObj)
4628     InitializeContext();
4629 
4630   if (SemaObj)
4631     UpdateSema();
4632 
4633   if (DeserializationListener)
4634     DeserializationListener->ReaderInitialized(this);
4635 
4636   ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
4637   if (PrimaryModule.OriginalSourceFileID.isValid()) {
4638     // If this AST file is a precompiled preamble, then set the
4639     // preamble file ID of the source manager to the file source file
4640     // from which the preamble was built.
4641     if (Type == MK_Preamble) {
4642       SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4643     } else if (Type == MK_MainFile) {
4644       SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4645     }
4646   }
4647 
4648   // For any Objective-C class definitions we have already loaded, make sure
4649   // that we load any additional categories.
4650   if (ContextObj) {
4651     for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4652       loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4653                          ObjCClassesLoaded[I], PreviousGeneration);
4654     }
4655   }
4656 
4657   HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
4658   if (HSOpts.ModulesValidateOncePerBuildSession) {
4659     // Now we are certain that the module and all modules it depends on are
4660     // up-to-date. For implicitly-built module files, ensure the corresponding
4661     // timestamp files are up-to-date in this build session.
4662     for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4663       ImportedModule &M = Loaded[I];
4664       if (M.Mod->Kind == MK_ImplicitModule &&
4665           M.Mod->InputFilesValidationTimestamp < HSOpts.BuildSessionTimestamp)
4666         updateModuleTimestamp(*M.Mod);
4667     }
4668   }
4669 
4670   return Success;
4671 }
4672 
4673 static ASTFileSignature readASTFileSignature(StringRef PCH);
4674 
4675 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'.
doesntStartWithASTFileMagic(BitstreamCursor & Stream)4676 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
4677   // FIXME checking magic headers is done in other places such as
4678   // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
4679   // always done the same. Unify it all with a helper.
4680   if (!Stream.canSkipToPos(4))
4681     return llvm::createStringError(std::errc::illegal_byte_sequence,
4682                                    "file too small to contain AST file magic");
4683   for (unsigned C : {'C', 'P', 'C', 'H'})
4684     if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
4685       if (Res.get() != C)
4686         return llvm::createStringError(
4687             std::errc::illegal_byte_sequence,
4688             "file doesn't start with AST file magic");
4689     } else
4690       return Res.takeError();
4691   return llvm::Error::success();
4692 }
4693 
moduleKindForDiagnostic(ModuleKind Kind)4694 static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4695   switch (Kind) {
4696   case MK_PCH:
4697     return 0; // PCH
4698   case MK_ImplicitModule:
4699   case MK_ExplicitModule:
4700   case MK_PrebuiltModule:
4701     return 1; // module
4702   case MK_MainFile:
4703   case MK_Preamble:
4704     return 2; // main source file
4705   }
4706   llvm_unreachable("unknown module kind");
4707 }
4708 
4709 ASTReader::ASTReadResult
ReadASTCore(StringRef FileName,ModuleKind Type,SourceLocation ImportLoc,ModuleFile * ImportedBy,SmallVectorImpl<ImportedModule> & Loaded,off_t ExpectedSize,time_t ExpectedModTime,ASTFileSignature ExpectedSignature,unsigned ClientLoadCapabilities)4710 ASTReader::ReadASTCore(StringRef FileName,
4711                        ModuleKind Type,
4712                        SourceLocation ImportLoc,
4713                        ModuleFile *ImportedBy,
4714                        SmallVectorImpl<ImportedModule> &Loaded,
4715                        off_t ExpectedSize, time_t ExpectedModTime,
4716                        ASTFileSignature ExpectedSignature,
4717                        unsigned ClientLoadCapabilities) {
4718   ModuleFile *M;
4719   std::string ErrorStr;
4720   ModuleManager::AddModuleResult AddResult
4721     = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
4722                           getGeneration(), ExpectedSize, ExpectedModTime,
4723                           ExpectedSignature, readASTFileSignature,
4724                           M, ErrorStr);
4725 
4726   switch (AddResult) {
4727   case ModuleManager::AlreadyLoaded:
4728     Diag(diag::remark_module_import)
4729         << M->ModuleName << M->FileName << (ImportedBy ? true : false)
4730         << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
4731     return Success;
4732 
4733   case ModuleManager::NewlyLoaded:
4734     // Load module file below.
4735     break;
4736 
4737   case ModuleManager::Missing:
4738     // The module file was missing; if the client can handle that, return
4739     // it.
4740     if (ClientLoadCapabilities & ARR_Missing)
4741       return Missing;
4742 
4743     // Otherwise, return an error.
4744     Diag(diag::err_ast_file_not_found)
4745         << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
4746         << ErrorStr;
4747     return Failure;
4748 
4749   case ModuleManager::OutOfDate:
4750     // We couldn't load the module file because it is out-of-date. If the
4751     // client can handle out-of-date, return it.
4752     if (ClientLoadCapabilities & ARR_OutOfDate)
4753       return OutOfDate;
4754 
4755     // Otherwise, return an error.
4756     Diag(diag::err_ast_file_out_of_date)
4757         << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
4758         << ErrorStr;
4759     return Failure;
4760   }
4761 
4762   assert(M && "Missing module file");
4763 
4764   bool ShouldFinalizePCM = false;
4765   auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
4766     auto &MC = getModuleManager().getModuleCache();
4767     if (ShouldFinalizePCM)
4768       MC.finalizePCM(FileName);
4769     else
4770       MC.tryToDropPCM(FileName);
4771   });
4772   ModuleFile &F = *M;
4773   BitstreamCursor &Stream = F.Stream;
4774   Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
4775   F.SizeInBits = F.Buffer->getBufferSize() * 8;
4776 
4777   // Sniff for the signature.
4778   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4779     Diag(diag::err_ast_file_invalid)
4780         << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
4781     return Failure;
4782   }
4783 
4784   // This is used for compatibility with older PCH formats.
4785   bool HaveReadControlBlock = false;
4786   while (true) {
4787     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4788     if (!MaybeEntry) {
4789       Error(MaybeEntry.takeError());
4790       return Failure;
4791     }
4792     llvm::BitstreamEntry Entry = MaybeEntry.get();
4793 
4794     switch (Entry.Kind) {
4795     case llvm::BitstreamEntry::Error:
4796     case llvm::BitstreamEntry::Record:
4797     case llvm::BitstreamEntry::EndBlock:
4798       Error("invalid record at top-level of AST file");
4799       return Failure;
4800 
4801     case llvm::BitstreamEntry::SubBlock:
4802       break;
4803     }
4804 
4805     switch (Entry.ID) {
4806     case CONTROL_BLOCK_ID:
4807       HaveReadControlBlock = true;
4808       switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
4809       case Success:
4810         // Check that we didn't try to load a non-module AST file as a module.
4811         //
4812         // FIXME: Should we also perform the converse check? Loading a module as
4813         // a PCH file sort of works, but it's a bit wonky.
4814         if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
4815              Type == MK_PrebuiltModule) &&
4816             F.ModuleName.empty()) {
4817           auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
4818           if (Result != OutOfDate ||
4819               (ClientLoadCapabilities & ARR_OutOfDate) == 0)
4820             Diag(diag::err_module_file_not_module) << FileName;
4821           return Result;
4822         }
4823         break;
4824 
4825       case Failure: return Failure;
4826       case Missing: return Missing;
4827       case OutOfDate: return OutOfDate;
4828       case VersionMismatch: return VersionMismatch;
4829       case ConfigurationMismatch: return ConfigurationMismatch;
4830       case HadErrors: return HadErrors;
4831       }
4832       break;
4833 
4834     case AST_BLOCK_ID:
4835       if (!HaveReadControlBlock) {
4836         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
4837           Diag(diag::err_pch_version_too_old);
4838         return VersionMismatch;
4839       }
4840 
4841       // Record that we've loaded this module.
4842       Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
4843       ShouldFinalizePCM = true;
4844       return Success;
4845 
4846     default:
4847       if (llvm::Error Err = Stream.SkipBlock()) {
4848         Error(std::move(Err));
4849         return Failure;
4850       }
4851       break;
4852     }
4853   }
4854 
4855   llvm_unreachable("unexpected break; expected return");
4856 }
4857 
4858 ASTReader::ASTReadResult
readUnhashedControlBlock(ModuleFile & F,bool WasImportedBy,unsigned ClientLoadCapabilities)4859 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
4860                                     unsigned ClientLoadCapabilities) {
4861   const HeaderSearchOptions &HSOpts =
4862       PP.getHeaderSearchInfo().getHeaderSearchOpts();
4863   bool AllowCompatibleConfigurationMismatch =
4864       F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4865   bool DisableValidation = shouldDisableValidationForFile(F);
4866 
4867   ASTReadResult Result = readUnhashedControlBlockImpl(
4868       &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
4869       Listener.get(),
4870       WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
4871 
4872   // If F was directly imported by another module, it's implicitly validated by
4873   // the importing module.
4874   if (DisableValidation || WasImportedBy ||
4875       (AllowConfigurationMismatch && Result == ConfigurationMismatch))
4876     return Success;
4877 
4878   if (Result == Failure) {
4879     Error("malformed block record in AST file");
4880     return Failure;
4881   }
4882 
4883   if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
4884     // If this module has already been finalized in the ModuleCache, we're stuck
4885     // with it; we can only load a single version of each module.
4886     //
4887     // This can happen when a module is imported in two contexts: in one, as a
4888     // user module; in another, as a system module (due to an import from
4889     // another module marked with the [system] flag).  It usually indicates a
4890     // bug in the module map: this module should also be marked with [system].
4891     //
4892     // If -Wno-system-headers (the default), and the first import is as a
4893     // system module, then validation will fail during the as-user import,
4894     // since -Werror flags won't have been validated.  However, it's reasonable
4895     // to treat this consistently as a system module.
4896     //
4897     // If -Wsystem-headers, the PCM on disk was built with
4898     // -Wno-system-headers, and the first import is as a user module, then
4899     // validation will fail during the as-system import since the PCM on disk
4900     // doesn't guarantee that -Werror was respected.  However, the -Werror
4901     // flags were checked during the initial as-user import.
4902     if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) {
4903       Diag(diag::warn_module_system_bit_conflict) << F.FileName;
4904       return Success;
4905     }
4906   }
4907 
4908   return Result;
4909 }
4910 
readUnhashedControlBlockImpl(ModuleFile * F,llvm::StringRef StreamData,unsigned ClientLoadCapabilities,bool AllowCompatibleConfigurationMismatch,ASTReaderListener * Listener,bool ValidateDiagnosticOptions)4911 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
4912     ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
4913     bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
4914     bool ValidateDiagnosticOptions) {
4915   // Initialize a stream.
4916   BitstreamCursor Stream(StreamData);
4917 
4918   // Sniff for the signature.
4919   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4920     // FIXME this drops the error on the floor.
4921     consumeError(std::move(Err));
4922     return Failure;
4923   }
4924 
4925   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
4926   if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
4927     return Failure;
4928 
4929   // Read all of the records in the options block.
4930   RecordData Record;
4931   ASTReadResult Result = Success;
4932   while (true) {
4933     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4934     if (!MaybeEntry) {
4935       // FIXME this drops the error on the floor.
4936       consumeError(MaybeEntry.takeError());
4937       return Failure;
4938     }
4939     llvm::BitstreamEntry Entry = MaybeEntry.get();
4940 
4941     switch (Entry.Kind) {
4942     case llvm::BitstreamEntry::Error:
4943     case llvm::BitstreamEntry::SubBlock:
4944       return Failure;
4945 
4946     case llvm::BitstreamEntry::EndBlock:
4947       return Result;
4948 
4949     case llvm::BitstreamEntry::Record:
4950       // The interesting case.
4951       break;
4952     }
4953 
4954     // Read and process a record.
4955     Record.clear();
4956     StringRef Blob;
4957     Expected<unsigned> MaybeRecordType =
4958         Stream.readRecord(Entry.ID, Record, &Blob);
4959     if (!MaybeRecordType) {
4960       // FIXME this drops the error.
4961       return Failure;
4962     }
4963     switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
4964     case SIGNATURE:
4965       if (F) {
4966         F->Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
4967         assert(F->Signature != ASTFileSignature::createDummy() &&
4968                "Dummy AST file signature not backpatched in ASTWriter.");
4969       }
4970       break;
4971     case AST_BLOCK_HASH:
4972       if (F) {
4973         F->ASTBlockHash = ASTFileSignature::create(Blob.begin(), Blob.end());
4974         assert(F->ASTBlockHash != ASTFileSignature::createDummy() &&
4975                "Dummy AST block hash not backpatched in ASTWriter.");
4976       }
4977       break;
4978     case DIAGNOSTIC_OPTIONS: {
4979       bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
4980       if (Listener && ValidateDiagnosticOptions &&
4981           !AllowCompatibleConfigurationMismatch &&
4982           ParseDiagnosticOptions(Record, Complain, *Listener))
4983         Result = OutOfDate; // Don't return early.  Read the signature.
4984       break;
4985     }
4986     case HEADER_SEARCH_PATHS: {
4987       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
4988       if (Listener && !AllowCompatibleConfigurationMismatch &&
4989           ParseHeaderSearchPaths(Record, Complain, *Listener))
4990         Result = ConfigurationMismatch;
4991       break;
4992     }
4993     case DIAG_PRAGMA_MAPPINGS:
4994       if (!F)
4995         break;
4996       if (F->PragmaDiagMappings.empty())
4997         F->PragmaDiagMappings.swap(Record);
4998       else
4999         F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
5000                                      Record.begin(), Record.end());
5001       break;
5002     case HEADER_SEARCH_ENTRY_USAGE:
5003       if (F)
5004         F->SearchPathUsage = ReadBitVector(Record, Blob);
5005       break;
5006     case VFS_USAGE:
5007       if (F)
5008         F->VFSUsage = ReadBitVector(Record, Blob);
5009       break;
5010     }
5011   }
5012 }
5013 
5014 /// Parse a record and blob containing module file extension metadata.
parseModuleFileExtensionMetadata(const SmallVectorImpl<uint64_t> & Record,StringRef Blob,ModuleFileExtensionMetadata & Metadata)5015 static bool parseModuleFileExtensionMetadata(
5016               const SmallVectorImpl<uint64_t> &Record,
5017               StringRef Blob,
5018               ModuleFileExtensionMetadata &Metadata) {
5019   if (Record.size() < 4) return true;
5020 
5021   Metadata.MajorVersion = Record[0];
5022   Metadata.MinorVersion = Record[1];
5023 
5024   unsigned BlockNameLen = Record[2];
5025   unsigned UserInfoLen = Record[3];
5026 
5027   if (BlockNameLen + UserInfoLen > Blob.size()) return true;
5028 
5029   Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5030   Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
5031                                   Blob.data() + BlockNameLen + UserInfoLen);
5032   return false;
5033 }
5034 
ReadExtensionBlock(ModuleFile & F)5035 llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
5036   BitstreamCursor &Stream = F.Stream;
5037 
5038   RecordData Record;
5039   while (true) {
5040     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5041     if (!MaybeEntry)
5042       return MaybeEntry.takeError();
5043     llvm::BitstreamEntry Entry = MaybeEntry.get();
5044 
5045     switch (Entry.Kind) {
5046     case llvm::BitstreamEntry::SubBlock:
5047       if (llvm::Error Err = Stream.SkipBlock())
5048         return Err;
5049       continue;
5050     case llvm::BitstreamEntry::EndBlock:
5051       return llvm::Error::success();
5052     case llvm::BitstreamEntry::Error:
5053       return llvm::createStringError(std::errc::illegal_byte_sequence,
5054                                      "malformed block record in AST file");
5055     case llvm::BitstreamEntry::Record:
5056       break;
5057     }
5058 
5059     Record.clear();
5060     StringRef Blob;
5061     Expected<unsigned> MaybeRecCode =
5062         Stream.readRecord(Entry.ID, Record, &Blob);
5063     if (!MaybeRecCode)
5064       return MaybeRecCode.takeError();
5065     switch (MaybeRecCode.get()) {
5066     case EXTENSION_METADATA: {
5067       ModuleFileExtensionMetadata Metadata;
5068       if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5069         return llvm::createStringError(
5070             std::errc::illegal_byte_sequence,
5071             "malformed EXTENSION_METADATA in AST file");
5072 
5073       // Find a module file extension with this block name.
5074       auto Known = ModuleFileExtensions.find(Metadata.BlockName);
5075       if (Known == ModuleFileExtensions.end()) break;
5076 
5077       // Form a reader.
5078       if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
5079                                                              F, Stream)) {
5080         F.ExtensionReaders.push_back(std::move(Reader));
5081       }
5082 
5083       break;
5084     }
5085     }
5086   }
5087 
5088   return llvm::Error::success();
5089 }
5090 
InitializeContext()5091 void ASTReader::InitializeContext() {
5092   assert(ContextObj && "no context to initialize");
5093   ASTContext &Context = *ContextObj;
5094 
5095   // If there's a listener, notify them that we "read" the translation unit.
5096   if (DeserializationListener)
5097     DeserializationListener->DeclRead(
5098         GlobalDeclID(PREDEF_DECL_TRANSLATION_UNIT_ID),
5099         Context.getTranslationUnitDecl());
5100 
5101   // FIXME: Find a better way to deal with collisions between these
5102   // built-in types. Right now, we just ignore the problem.
5103 
5104   // Load the special types.
5105   if (SpecialTypes.size() >= NumSpecialTypeIDs) {
5106     if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
5107       if (!Context.CFConstantStringTypeDecl)
5108         Context.setCFConstantStringType(GetType(String));
5109     }
5110 
5111     if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) {
5112       QualType FileType = GetType(File);
5113       if (FileType.isNull()) {
5114         Error("FILE type is NULL");
5115         return;
5116       }
5117 
5118       if (!Context.FILEDecl) {
5119         if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
5120           Context.setFILEDecl(Typedef->getDecl());
5121         else {
5122           const TagType *Tag = FileType->getAs<TagType>();
5123           if (!Tag) {
5124             Error("Invalid FILE type in AST file");
5125             return;
5126           }
5127           Context.setFILEDecl(Tag->getDecl());
5128         }
5129       }
5130     }
5131 
5132     if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
5133       QualType Jmp_bufType = GetType(Jmp_buf);
5134       if (Jmp_bufType.isNull()) {
5135         Error("jmp_buf type is NULL");
5136         return;
5137       }
5138 
5139       if (!Context.jmp_bufDecl) {
5140         if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
5141           Context.setjmp_bufDecl(Typedef->getDecl());
5142         else {
5143           const TagType *Tag = Jmp_bufType->getAs<TagType>();
5144           if (!Tag) {
5145             Error("Invalid jmp_buf type in AST file");
5146             return;
5147           }
5148           Context.setjmp_bufDecl(Tag->getDecl());
5149         }
5150       }
5151     }
5152 
5153     if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
5154       QualType Sigjmp_bufType = GetType(Sigjmp_buf);
5155       if (Sigjmp_bufType.isNull()) {
5156         Error("sigjmp_buf type is NULL");
5157         return;
5158       }
5159 
5160       if (!Context.sigjmp_bufDecl) {
5161         if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
5162           Context.setsigjmp_bufDecl(Typedef->getDecl());
5163         else {
5164           const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
5165           assert(Tag && "Invalid sigjmp_buf type in AST file");
5166           Context.setsigjmp_bufDecl(Tag->getDecl());
5167         }
5168       }
5169     }
5170 
5171     if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
5172       if (Context.ObjCIdRedefinitionType.isNull())
5173         Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
5174     }
5175 
5176     if (TypeID ObjCClassRedef =
5177             SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
5178       if (Context.ObjCClassRedefinitionType.isNull())
5179         Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
5180     }
5181 
5182     if (TypeID ObjCSelRedef =
5183             SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
5184       if (Context.ObjCSelRedefinitionType.isNull())
5185         Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
5186     }
5187 
5188     if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
5189       QualType Ucontext_tType = GetType(Ucontext_t);
5190       if (Ucontext_tType.isNull()) {
5191         Error("ucontext_t type is NULL");
5192         return;
5193       }
5194 
5195       if (!Context.ucontext_tDecl) {
5196         if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
5197           Context.setucontext_tDecl(Typedef->getDecl());
5198         else {
5199           const TagType *Tag = Ucontext_tType->getAs<TagType>();
5200           assert(Tag && "Invalid ucontext_t type in AST file");
5201           Context.setucontext_tDecl(Tag->getDecl());
5202         }
5203       }
5204     }
5205   }
5206 
5207   ReadPragmaDiagnosticMappings(Context.getDiagnostics());
5208 
5209   // If there were any CUDA special declarations, deserialize them.
5210   if (!CUDASpecialDeclRefs.empty()) {
5211     assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
5212     Context.setcudaConfigureCallDecl(
5213                            cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5214   }
5215 
5216   // Re-export any modules that were imported by a non-module AST file.
5217   // FIXME: This does not make macro-only imports visible again.
5218   for (auto &Import : PendingImportedModules) {
5219     if (Module *Imported = getSubmodule(Import.ID)) {
5220       makeModuleVisible(Imported, Module::AllVisible,
5221                         /*ImportLoc=*/Import.ImportLoc);
5222       if (Import.ImportLoc.isValid())
5223         PP.makeModuleVisible(Imported, Import.ImportLoc);
5224       // This updates visibility for Preprocessor only. For Sema, which can be
5225       // nullptr here, we do the same later, in UpdateSema().
5226     }
5227   }
5228 
5229   // Hand off these modules to Sema.
5230   PendingImportedModulesSema.append(PendingImportedModules);
5231   PendingImportedModules.clear();
5232 }
5233 
finalizeForWriting()5234 void ASTReader::finalizeForWriting() {
5235   // Nothing to do for now.
5236 }
5237 
5238 /// Reads and return the signature record from \p PCH's control block, or
5239 /// else returns 0.
readASTFileSignature(StringRef PCH)5240 static ASTFileSignature readASTFileSignature(StringRef PCH) {
5241   BitstreamCursor Stream(PCH);
5242   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5243     // FIXME this drops the error on the floor.
5244     consumeError(std::move(Err));
5245     return ASTFileSignature();
5246   }
5247 
5248   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5249   if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
5250     return ASTFileSignature();
5251 
5252   // Scan for SIGNATURE inside the diagnostic options block.
5253   ASTReader::RecordData Record;
5254   while (true) {
5255     Expected<llvm::BitstreamEntry> MaybeEntry =
5256         Stream.advanceSkippingSubblocks();
5257     if (!MaybeEntry) {
5258       // FIXME this drops the error on the floor.
5259       consumeError(MaybeEntry.takeError());
5260       return ASTFileSignature();
5261     }
5262     llvm::BitstreamEntry Entry = MaybeEntry.get();
5263 
5264     if (Entry.Kind != llvm::BitstreamEntry::Record)
5265       return ASTFileSignature();
5266 
5267     Record.clear();
5268     StringRef Blob;
5269     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5270     if (!MaybeRecord) {
5271       // FIXME this drops the error on the floor.
5272       consumeError(MaybeRecord.takeError());
5273       return ASTFileSignature();
5274     }
5275     if (SIGNATURE == MaybeRecord.get()) {
5276       auto Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5277       assert(Signature != ASTFileSignature::createDummy() &&
5278              "Dummy AST file signature not backpatched in ASTWriter.");
5279       return Signature;
5280     }
5281   }
5282 }
5283 
5284 /// Retrieve the name of the original source file name
5285 /// directly from the AST file, without actually loading the AST
5286 /// file.
getOriginalSourceFile(const std::string & ASTFileName,FileManager & FileMgr,const PCHContainerReader & PCHContainerRdr,DiagnosticsEngine & Diags)5287 std::string ASTReader::getOriginalSourceFile(
5288     const std::string &ASTFileName, FileManager &FileMgr,
5289     const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5290   // Open the AST file.
5291   auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
5292                                          /*RequiresNullTerminator=*/false);
5293   if (!Buffer) {
5294     Diags.Report(diag::err_fe_unable_to_read_pch_file)
5295         << ASTFileName << Buffer.getError().message();
5296     return std::string();
5297   }
5298 
5299   // Initialize the stream
5300   BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5301 
5302   // Sniff for the signature.
5303   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5304     Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5305     return std::string();
5306   }
5307 
5308   // Scan for the CONTROL_BLOCK_ID block.
5309   if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5310     Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5311     return std::string();
5312   }
5313 
5314   // Scan for ORIGINAL_FILE inside the control block.
5315   RecordData Record;
5316   while (true) {
5317     Expected<llvm::BitstreamEntry> MaybeEntry =
5318         Stream.advanceSkippingSubblocks();
5319     if (!MaybeEntry) {
5320       // FIXME this drops errors on the floor.
5321       consumeError(MaybeEntry.takeError());
5322       return std::string();
5323     }
5324     llvm::BitstreamEntry Entry = MaybeEntry.get();
5325 
5326     if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5327       return std::string();
5328 
5329     if (Entry.Kind != llvm::BitstreamEntry::Record) {
5330       Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5331       return std::string();
5332     }
5333 
5334     Record.clear();
5335     StringRef Blob;
5336     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5337     if (!MaybeRecord) {
5338       // FIXME this drops the errors on the floor.
5339       consumeError(MaybeRecord.takeError());
5340       return std::string();
5341     }
5342     if (ORIGINAL_FILE == MaybeRecord.get())
5343       return Blob.str();
5344   }
5345 }
5346 
5347 namespace {
5348 
5349   class SimplePCHValidator : public ASTReaderListener {
5350     const LangOptions &ExistingLangOpts;
5351     const TargetOptions &ExistingTargetOpts;
5352     const PreprocessorOptions &ExistingPPOpts;
5353     std::string ExistingModuleCachePath;
5354     FileManager &FileMgr;
5355     bool StrictOptionMatches;
5356 
5357   public:
SimplePCHValidator(const LangOptions & ExistingLangOpts,const TargetOptions & ExistingTargetOpts,const PreprocessorOptions & ExistingPPOpts,StringRef ExistingModuleCachePath,FileManager & FileMgr,bool StrictOptionMatches)5358     SimplePCHValidator(const LangOptions &ExistingLangOpts,
5359                        const TargetOptions &ExistingTargetOpts,
5360                        const PreprocessorOptions &ExistingPPOpts,
5361                        StringRef ExistingModuleCachePath, FileManager &FileMgr,
5362                        bool StrictOptionMatches)
5363         : ExistingLangOpts(ExistingLangOpts),
5364           ExistingTargetOpts(ExistingTargetOpts),
5365           ExistingPPOpts(ExistingPPOpts),
5366           ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr),
5367           StrictOptionMatches(StrictOptionMatches) {}
5368 
ReadLanguageOptions(const LangOptions & LangOpts,bool Complain,bool AllowCompatibleDifferences)5369     bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
5370                              bool AllowCompatibleDifferences) override {
5371       return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
5372                                   AllowCompatibleDifferences);
5373     }
5374 
ReadTargetOptions(const TargetOptions & TargetOpts,bool Complain,bool AllowCompatibleDifferences)5375     bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
5376                            bool AllowCompatibleDifferences) override {
5377       return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
5378                                 AllowCompatibleDifferences);
5379     }
5380 
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef SpecificModuleCachePath,bool Complain)5381     bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5382                                  StringRef SpecificModuleCachePath,
5383                                  bool Complain) override {
5384       return checkModuleCachePath(
5385           FileMgr.getVirtualFileSystem(), SpecificModuleCachePath,
5386           ExistingModuleCachePath, nullptr, ExistingLangOpts, ExistingPPOpts);
5387     }
5388 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)5389     bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5390                                  bool ReadMacros, bool Complain,
5391                                  std::string &SuggestedPredefines) override {
5392       return checkPreprocessorOptions(
5393           PPOpts, ExistingPPOpts, ReadMacros, /*Diags=*/nullptr, FileMgr,
5394           SuggestedPredefines, ExistingLangOpts,
5395           StrictOptionMatches ? OptionValidateStrictMatches
5396                               : OptionValidateContradictions);
5397     }
5398   };
5399 
5400 } // namespace
5401 
readASTFileControlBlock(StringRef Filename,FileManager & FileMgr,const InMemoryModuleCache & ModuleCache,const PCHContainerReader & PCHContainerRdr,bool FindModuleFileExtensions,ASTReaderListener & Listener,bool ValidateDiagnosticOptions,unsigned ClientLoadCapabilities)5402 bool ASTReader::readASTFileControlBlock(
5403     StringRef Filename, FileManager &FileMgr,
5404     const InMemoryModuleCache &ModuleCache,
5405     const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
5406     ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
5407     unsigned ClientLoadCapabilities) {
5408   // Open the AST file.
5409   std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5410   llvm::MemoryBuffer *Buffer = ModuleCache.lookupPCM(Filename);
5411   if (!Buffer) {
5412     // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
5413     // read again later, but we do not have the context here to determine if it
5414     // is safe to change the result of InMemoryModuleCache::getPCMState().
5415 
5416     // FIXME: This allows use of the VFS; we do not allow use of the
5417     // VFS when actually loading a module.
5418     auto BufferOrErr = FileMgr.getBufferForFile(Filename);
5419     if (!BufferOrErr)
5420       return true;
5421     OwnedBuffer = std::move(*BufferOrErr);
5422     Buffer = OwnedBuffer.get();
5423   }
5424 
5425   // Initialize the stream
5426   StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5427   BitstreamCursor Stream(Bytes);
5428 
5429   // Sniff for the signature.
5430   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5431     consumeError(std::move(Err)); // FIXME this drops errors on the floor.
5432     return true;
5433   }
5434 
5435   // Scan for the CONTROL_BLOCK_ID block.
5436   if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
5437     return true;
5438 
5439   bool NeedsInputFiles = Listener.needsInputFileVisitation();
5440   bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5441   bool NeedsImports = Listener.needsImportVisitation();
5442   BitstreamCursor InputFilesCursor;
5443   uint64_t InputFilesOffsetBase = 0;
5444 
5445   RecordData Record;
5446   std::string ModuleDir;
5447   bool DoneWithControlBlock = false;
5448   while (!DoneWithControlBlock) {
5449     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5450     if (!MaybeEntry) {
5451       // FIXME this drops the error on the floor.
5452       consumeError(MaybeEntry.takeError());
5453       return true;
5454     }
5455     llvm::BitstreamEntry Entry = MaybeEntry.get();
5456 
5457     switch (Entry.Kind) {
5458     case llvm::BitstreamEntry::SubBlock: {
5459       switch (Entry.ID) {
5460       case OPTIONS_BLOCK_ID: {
5461         std::string IgnoredSuggestedPredefines;
5462         if (ReadOptionsBlock(Stream, ClientLoadCapabilities,
5463                              /*AllowCompatibleConfigurationMismatch*/ false,
5464                              Listener, IgnoredSuggestedPredefines) != Success)
5465           return true;
5466         break;
5467       }
5468 
5469       case INPUT_FILES_BLOCK_ID:
5470         InputFilesCursor = Stream;
5471         if (llvm::Error Err = Stream.SkipBlock()) {
5472           // FIXME this drops the error on the floor.
5473           consumeError(std::move(Err));
5474           return true;
5475         }
5476         if (NeedsInputFiles &&
5477             ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
5478           return true;
5479         InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5480         break;
5481 
5482       default:
5483         if (llvm::Error Err = Stream.SkipBlock()) {
5484           // FIXME this drops the error on the floor.
5485           consumeError(std::move(Err));
5486           return true;
5487         }
5488         break;
5489       }
5490 
5491       continue;
5492     }
5493 
5494     case llvm::BitstreamEntry::EndBlock:
5495       DoneWithControlBlock = true;
5496       break;
5497 
5498     case llvm::BitstreamEntry::Error:
5499       return true;
5500 
5501     case llvm::BitstreamEntry::Record:
5502       break;
5503     }
5504 
5505     if (DoneWithControlBlock) break;
5506 
5507     Record.clear();
5508     StringRef Blob;
5509     Expected<unsigned> MaybeRecCode =
5510         Stream.readRecord(Entry.ID, Record, &Blob);
5511     if (!MaybeRecCode) {
5512       // FIXME this drops the error.
5513       return Failure;
5514     }
5515     switch ((ControlRecordTypes)MaybeRecCode.get()) {
5516     case METADATA:
5517       if (Record[0] != VERSION_MAJOR)
5518         return true;
5519       if (Listener.ReadFullVersionInformation(Blob))
5520         return true;
5521       break;
5522     case MODULE_NAME:
5523       Listener.ReadModuleName(Blob);
5524       break;
5525     case MODULE_DIRECTORY:
5526       ModuleDir = std::string(Blob);
5527       break;
5528     case MODULE_MAP_FILE: {
5529       unsigned Idx = 0;
5530       auto Path = ReadString(Record, Idx);
5531       ResolveImportedPath(Path, ModuleDir);
5532       Listener.ReadModuleMapFile(Path);
5533       break;
5534     }
5535     case INPUT_FILE_OFFSETS: {
5536       if (!NeedsInputFiles)
5537         break;
5538 
5539       unsigned NumInputFiles = Record[0];
5540       unsigned NumUserFiles = Record[1];
5541       const llvm::support::unaligned_uint64_t *InputFileOffs =
5542           (const llvm::support::unaligned_uint64_t *)Blob.data();
5543       for (unsigned I = 0; I != NumInputFiles; ++I) {
5544         // Go find this input file.
5545         bool isSystemFile = I >= NumUserFiles;
5546 
5547         if (isSystemFile && !NeedsSystemInputFiles)
5548           break; // the rest are system input files
5549 
5550         BitstreamCursor &Cursor = InputFilesCursor;
5551         SavedStreamPosition SavedPosition(Cursor);
5552         if (llvm::Error Err =
5553                 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
5554           // FIXME this drops errors on the floor.
5555           consumeError(std::move(Err));
5556         }
5557 
5558         Expected<unsigned> MaybeCode = Cursor.ReadCode();
5559         if (!MaybeCode) {
5560           // FIXME this drops errors on the floor.
5561           consumeError(MaybeCode.takeError());
5562         }
5563         unsigned Code = MaybeCode.get();
5564 
5565         RecordData Record;
5566         StringRef Blob;
5567         bool shouldContinue = false;
5568         Expected<unsigned> MaybeRecordType =
5569             Cursor.readRecord(Code, Record, &Blob);
5570         if (!MaybeRecordType) {
5571           // FIXME this drops errors on the floor.
5572           consumeError(MaybeRecordType.takeError());
5573         }
5574         switch ((InputFileRecordTypes)MaybeRecordType.get()) {
5575         case INPUT_FILE_HASH:
5576           break;
5577         case INPUT_FILE:
5578           bool Overridden = static_cast<bool>(Record[3]);
5579           std::string Filename = std::string(Blob);
5580           ResolveImportedPath(Filename, ModuleDir);
5581           shouldContinue = Listener.visitInputFile(
5582               Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
5583           break;
5584         }
5585         if (!shouldContinue)
5586           break;
5587       }
5588       break;
5589     }
5590 
5591     case IMPORTS: {
5592       if (!NeedsImports)
5593         break;
5594 
5595       unsigned Idx = 0, N = Record.size();
5596       while (Idx < N) {
5597         // Read information about the AST file.
5598 
5599         // Skip Kind
5600         Idx++;
5601         bool IsStandardCXXModule = Record[Idx++];
5602 
5603         // Skip ImportLoc
5604         Idx++;
5605 
5606         // In C++20 Modules, we don't record the path to imported
5607         // modules in the BMI files.
5608         if (IsStandardCXXModule) {
5609           std::string ModuleName = ReadString(Record, Idx);
5610           Listener.visitImport(ModuleName, /*Filename=*/"");
5611           continue;
5612         }
5613 
5614         // Skip Size, ModTime and Signature
5615         Idx += 1 + 1 + ASTFileSignature::size;
5616         std::string ModuleName = ReadString(Record, Idx);
5617         std::string Filename = ReadString(Record, Idx);
5618         ResolveImportedPath(Filename, ModuleDir);
5619         Listener.visitImport(ModuleName, Filename);
5620       }
5621       break;
5622     }
5623 
5624     default:
5625       // No other validation to perform.
5626       break;
5627     }
5628   }
5629 
5630   // Look for module file extension blocks, if requested.
5631   if (FindModuleFileExtensions) {
5632     BitstreamCursor SavedStream = Stream;
5633     while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
5634       bool DoneWithExtensionBlock = false;
5635       while (!DoneWithExtensionBlock) {
5636         Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5637         if (!MaybeEntry) {
5638           // FIXME this drops the error.
5639           return true;
5640         }
5641         llvm::BitstreamEntry Entry = MaybeEntry.get();
5642 
5643         switch (Entry.Kind) {
5644         case llvm::BitstreamEntry::SubBlock:
5645           if (llvm::Error Err = Stream.SkipBlock()) {
5646             // FIXME this drops the error on the floor.
5647             consumeError(std::move(Err));
5648             return true;
5649           }
5650           continue;
5651 
5652         case llvm::BitstreamEntry::EndBlock:
5653           DoneWithExtensionBlock = true;
5654           continue;
5655 
5656         case llvm::BitstreamEntry::Error:
5657           return true;
5658 
5659         case llvm::BitstreamEntry::Record:
5660           break;
5661         }
5662 
5663        Record.clear();
5664        StringRef Blob;
5665        Expected<unsigned> MaybeRecCode =
5666            Stream.readRecord(Entry.ID, Record, &Blob);
5667        if (!MaybeRecCode) {
5668          // FIXME this drops the error.
5669          return true;
5670        }
5671        switch (MaybeRecCode.get()) {
5672        case EXTENSION_METADATA: {
5673          ModuleFileExtensionMetadata Metadata;
5674          if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5675            return true;
5676 
5677          Listener.readModuleFileExtension(Metadata);
5678          break;
5679        }
5680        }
5681       }
5682     }
5683     Stream = SavedStream;
5684   }
5685 
5686   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5687   if (readUnhashedControlBlockImpl(
5688           nullptr, Bytes, ClientLoadCapabilities,
5689           /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
5690           ValidateDiagnosticOptions) != Success)
5691     return true;
5692 
5693   return false;
5694 }
5695 
isAcceptableASTFile(StringRef Filename,FileManager & FileMgr,const InMemoryModuleCache & ModuleCache,const PCHContainerReader & PCHContainerRdr,const LangOptions & LangOpts,const TargetOptions & TargetOpts,const PreprocessorOptions & PPOpts,StringRef ExistingModuleCachePath,bool RequireStrictOptionMatches)5696 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
5697                                     const InMemoryModuleCache &ModuleCache,
5698                                     const PCHContainerReader &PCHContainerRdr,
5699                                     const LangOptions &LangOpts,
5700                                     const TargetOptions &TargetOpts,
5701                                     const PreprocessorOptions &PPOpts,
5702                                     StringRef ExistingModuleCachePath,
5703                                     bool RequireStrictOptionMatches) {
5704   SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
5705                                ExistingModuleCachePath, FileMgr,
5706                                RequireStrictOptionMatches);
5707   return !readASTFileControlBlock(Filename, FileMgr, ModuleCache,
5708                                   PCHContainerRdr,
5709                                   /*FindModuleFileExtensions=*/false, validator,
5710                                   /*ValidateDiagnosticOptions=*/true);
5711 }
5712 
ReadSubmoduleBlock(ModuleFile & F,unsigned ClientLoadCapabilities)5713 llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
5714                                           unsigned ClientLoadCapabilities) {
5715   // Enter the submodule block.
5716   if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID))
5717     return Err;
5718 
5719   ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
5720   bool First = true;
5721   Module *CurrentModule = nullptr;
5722   RecordData Record;
5723   while (true) {
5724     Expected<llvm::BitstreamEntry> MaybeEntry =
5725         F.Stream.advanceSkippingSubblocks();
5726     if (!MaybeEntry)
5727       return MaybeEntry.takeError();
5728     llvm::BitstreamEntry Entry = MaybeEntry.get();
5729 
5730     switch (Entry.Kind) {
5731     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
5732     case llvm::BitstreamEntry::Error:
5733       return llvm::createStringError(std::errc::illegal_byte_sequence,
5734                                      "malformed block record in AST file");
5735     case llvm::BitstreamEntry::EndBlock:
5736       return llvm::Error::success();
5737     case llvm::BitstreamEntry::Record:
5738       // The interesting case.
5739       break;
5740     }
5741 
5742     // Read a record.
5743     StringRef Blob;
5744     Record.clear();
5745     Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob);
5746     if (!MaybeKind)
5747       return MaybeKind.takeError();
5748     unsigned Kind = MaybeKind.get();
5749 
5750     if ((Kind == SUBMODULE_METADATA) != First)
5751       return llvm::createStringError(
5752           std::errc::illegal_byte_sequence,
5753           "submodule metadata record should be at beginning of block");
5754     First = false;
5755 
5756     // Submodule information is only valid if we have a current module.
5757     // FIXME: Should we error on these cases?
5758     if (!CurrentModule && Kind != SUBMODULE_METADATA &&
5759         Kind != SUBMODULE_DEFINITION)
5760       continue;
5761 
5762     switch (Kind) {
5763     default:  // Default behavior: ignore.
5764       break;
5765 
5766     case SUBMODULE_DEFINITION: {
5767       if (Record.size() < 13)
5768         return llvm::createStringError(std::errc::illegal_byte_sequence,
5769                                        "malformed module definition");
5770 
5771       StringRef Name = Blob;
5772       unsigned Idx = 0;
5773       SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
5774       SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
5775       Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
5776       SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
5777       bool IsFramework = Record[Idx++];
5778       bool IsExplicit = Record[Idx++];
5779       bool IsSystem = Record[Idx++];
5780       bool IsExternC = Record[Idx++];
5781       bool InferSubmodules = Record[Idx++];
5782       bool InferExplicitSubmodules = Record[Idx++];
5783       bool InferExportWildcard = Record[Idx++];
5784       bool ConfigMacrosExhaustive = Record[Idx++];
5785       bool ModuleMapIsPrivate = Record[Idx++];
5786       bool NamedModuleHasInit = Record[Idx++];
5787 
5788       Module *ParentModule = nullptr;
5789       if (Parent)
5790         ParentModule = getSubmodule(Parent);
5791 
5792       // Retrieve this (sub)module from the module map, creating it if
5793       // necessary.
5794       CurrentModule =
5795           ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
5796               .first;
5797 
5798       // FIXME: Call ModMap.setInferredModuleAllowedBy()
5799 
5800       SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
5801       if (GlobalIndex >= SubmodulesLoaded.size() ||
5802           SubmodulesLoaded[GlobalIndex])
5803         return llvm::createStringError(std::errc::invalid_argument,
5804                                        "too many submodules");
5805 
5806       if (!ParentModule) {
5807         if (OptionalFileEntryRef CurFile = CurrentModule->getASTFile()) {
5808           // Don't emit module relocation error if we have -fno-validate-pch
5809           if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
5810                     DisableValidationForModuleKind::Module) &&
5811               CurFile != F.File) {
5812             auto ConflictError =
5813                 PartialDiagnostic(diag::err_module_file_conflict,
5814                                   ContextObj->DiagAllocator)
5815                 << CurrentModule->getTopLevelModuleName() << CurFile->getName()
5816                 << F.File.getName();
5817             return DiagnosticError::create(CurrentImportLoc, ConflictError);
5818           }
5819         }
5820 
5821         F.DidReadTopLevelSubmodule = true;
5822         CurrentModule->setASTFile(F.File);
5823         CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
5824       }
5825 
5826       CurrentModule->Kind = Kind;
5827       CurrentModule->DefinitionLoc = DefinitionLoc;
5828       CurrentModule->Signature = F.Signature;
5829       CurrentModule->IsFromModuleFile = true;
5830       CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
5831       CurrentModule->IsExternC = IsExternC;
5832       CurrentModule->InferSubmodules = InferSubmodules;
5833       CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
5834       CurrentModule->InferExportWildcard = InferExportWildcard;
5835       CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
5836       CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
5837       CurrentModule->NamedModuleHasInit = NamedModuleHasInit;
5838       if (DeserializationListener)
5839         DeserializationListener->ModuleRead(GlobalID, CurrentModule);
5840 
5841       SubmodulesLoaded[GlobalIndex] = CurrentModule;
5842 
5843       // Clear out data that will be replaced by what is in the module file.
5844       CurrentModule->LinkLibraries.clear();
5845       CurrentModule->ConfigMacros.clear();
5846       CurrentModule->UnresolvedConflicts.clear();
5847       CurrentModule->Conflicts.clear();
5848 
5849       // The module is available unless it's missing a requirement; relevant
5850       // requirements will be (re-)added by SUBMODULE_REQUIRES records.
5851       // Missing headers that were present when the module was built do not
5852       // make it unavailable -- if we got this far, this must be an explicitly
5853       // imported module file.
5854       CurrentModule->Requirements.clear();
5855       CurrentModule->MissingHeaders.clear();
5856       CurrentModule->IsUnimportable =
5857           ParentModule && ParentModule->IsUnimportable;
5858       CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
5859       break;
5860     }
5861 
5862     case SUBMODULE_UMBRELLA_HEADER: {
5863       // FIXME: This doesn't work for framework modules as `Filename` is the
5864       //        name as written in the module file and does not include
5865       //        `Headers/`, so this path will never exist.
5866       std::string Filename = std::string(Blob);
5867       ResolveImportedPath(F, Filename);
5868       if (auto Umbrella = PP.getFileManager().getOptionalFileRef(Filename)) {
5869         if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
5870           // FIXME: NameAsWritten
5871           ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob, "");
5872         }
5873         // Note that it's too late at this point to return out of date if the
5874         // name from the PCM doesn't match up with the one in the module map,
5875         // but also quite unlikely since we will have already checked the
5876         // modification time and size of the module map file itself.
5877       }
5878       break;
5879     }
5880 
5881     case SUBMODULE_HEADER:
5882     case SUBMODULE_EXCLUDED_HEADER:
5883     case SUBMODULE_PRIVATE_HEADER:
5884       // We lazily associate headers with their modules via the HeaderInfo table.
5885       // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
5886       // of complete filenames or remove it entirely.
5887       break;
5888 
5889     case SUBMODULE_TEXTUAL_HEADER:
5890     case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
5891       // FIXME: Textual headers are not marked in the HeaderInfo table. Load
5892       // them here.
5893       break;
5894 
5895     case SUBMODULE_TOPHEADER: {
5896       std::string HeaderName(Blob);
5897       ResolveImportedPath(F, HeaderName);
5898       CurrentModule->addTopHeaderFilename(HeaderName);
5899       break;
5900     }
5901 
5902     case SUBMODULE_UMBRELLA_DIR: {
5903       // See comments in SUBMODULE_UMBRELLA_HEADER
5904       std::string Dirname = std::string(Blob);
5905       ResolveImportedPath(F, Dirname);
5906       if (auto Umbrella =
5907               PP.getFileManager().getOptionalDirectoryRef(Dirname)) {
5908         if (!CurrentModule->getUmbrellaDirAsWritten()) {
5909           // FIXME: NameAsWritten
5910           ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
5911         }
5912       }
5913       break;
5914     }
5915 
5916     case SUBMODULE_METADATA: {
5917       F.BaseSubmoduleID = getTotalNumSubmodules();
5918       F.LocalNumSubmodules = Record[0];
5919       unsigned LocalBaseSubmoduleID = Record[1];
5920       if (F.LocalNumSubmodules > 0) {
5921         // Introduce the global -> local mapping for submodules within this
5922         // module.
5923         GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
5924 
5925         // Introduce the local -> global mapping for submodules within this
5926         // module.
5927         F.SubmoduleRemap.insertOrReplace(
5928           std::make_pair(LocalBaseSubmoduleID,
5929                          F.BaseSubmoduleID - LocalBaseSubmoduleID));
5930 
5931         SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
5932       }
5933       break;
5934     }
5935 
5936     case SUBMODULE_IMPORTS:
5937       for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5938         UnresolvedModuleRef Unresolved;
5939         Unresolved.File = &F;
5940         Unresolved.Mod = CurrentModule;
5941         Unresolved.ID = Record[Idx];
5942         Unresolved.Kind = UnresolvedModuleRef::Import;
5943         Unresolved.IsWildcard = false;
5944         UnresolvedModuleRefs.push_back(Unresolved);
5945       }
5946       break;
5947 
5948     case SUBMODULE_AFFECTING_MODULES:
5949       for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5950         UnresolvedModuleRef Unresolved;
5951         Unresolved.File = &F;
5952         Unresolved.Mod = CurrentModule;
5953         Unresolved.ID = Record[Idx];
5954         Unresolved.Kind = UnresolvedModuleRef::Affecting;
5955         Unresolved.IsWildcard = false;
5956         UnresolvedModuleRefs.push_back(Unresolved);
5957       }
5958       break;
5959 
5960     case SUBMODULE_EXPORTS:
5961       for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
5962         UnresolvedModuleRef Unresolved;
5963         Unresolved.File = &F;
5964         Unresolved.Mod = CurrentModule;
5965         Unresolved.ID = Record[Idx];
5966         Unresolved.Kind = UnresolvedModuleRef::Export;
5967         Unresolved.IsWildcard = Record[Idx + 1];
5968         UnresolvedModuleRefs.push_back(Unresolved);
5969       }
5970 
5971       // Once we've loaded the set of exports, there's no reason to keep
5972       // the parsed, unresolved exports around.
5973       CurrentModule->UnresolvedExports.clear();
5974       break;
5975 
5976     case SUBMODULE_REQUIRES:
5977       CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
5978                                     PP.getTargetInfo());
5979       break;
5980 
5981     case SUBMODULE_LINK_LIBRARY:
5982       ModMap.resolveLinkAsDependencies(CurrentModule);
5983       CurrentModule->LinkLibraries.push_back(
5984           Module::LinkLibrary(std::string(Blob), Record[0]));
5985       break;
5986 
5987     case SUBMODULE_CONFIG_MACRO:
5988       CurrentModule->ConfigMacros.push_back(Blob.str());
5989       break;
5990 
5991     case SUBMODULE_CONFLICT: {
5992       UnresolvedModuleRef Unresolved;
5993       Unresolved.File = &F;
5994       Unresolved.Mod = CurrentModule;
5995       Unresolved.ID = Record[0];
5996       Unresolved.Kind = UnresolvedModuleRef::Conflict;
5997       Unresolved.IsWildcard = false;
5998       Unresolved.String = Blob;
5999       UnresolvedModuleRefs.push_back(Unresolved);
6000       break;
6001     }
6002 
6003     case SUBMODULE_INITIALIZERS: {
6004       if (!ContextObj)
6005         break;
6006       SmallVector<GlobalDeclID, 16> Inits;
6007       for (unsigned I = 0; I < Record.size(); /*in loop*/)
6008         Inits.push_back(ReadDeclID(F, Record, I));
6009       ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6010       break;
6011     }
6012 
6013     case SUBMODULE_EXPORT_AS:
6014       CurrentModule->ExportAsModule = Blob.str();
6015       ModMap.addLinkAsDependency(CurrentModule);
6016       break;
6017     }
6018   }
6019 }
6020 
6021 /// Parse the record that corresponds to a LangOptions data
6022 /// structure.
6023 ///
6024 /// This routine parses the language options from the AST file and then gives
6025 /// them to the AST listener if one is set.
6026 ///
6027 /// \returns true if the listener deems the file unacceptable, false otherwise.
ParseLanguageOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener,bool AllowCompatibleDifferences)6028 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
6029                                      bool Complain,
6030                                      ASTReaderListener &Listener,
6031                                      bool AllowCompatibleDifferences) {
6032   LangOptions LangOpts;
6033   unsigned Idx = 0;
6034 #define LANGOPT(Name, Bits, Default, Description) \
6035   LangOpts.Name = Record[Idx++];
6036 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
6037   LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6038 #include "clang/Basic/LangOptions.def"
6039 #define SANITIZER(NAME, ID)                                                    \
6040   LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6041 #include "clang/Basic/Sanitizers.def"
6042 
6043   for (unsigned N = Record[Idx++]; N; --N)
6044     LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
6045 
6046   ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
6047   VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
6048   LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6049 
6050   LangOpts.CurrentModule = ReadString(Record, Idx);
6051 
6052   // Comment options.
6053   for (unsigned N = Record[Idx++]; N; --N) {
6054     LangOpts.CommentOpts.BlockCommandNames.push_back(
6055       ReadString(Record, Idx));
6056   }
6057   LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
6058 
6059   // OpenMP offloading options.
6060   for (unsigned N = Record[Idx++]; N; --N) {
6061     LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
6062   }
6063 
6064   LangOpts.OMPHostIRFile = ReadString(Record, Idx);
6065 
6066   return Listener.ReadLanguageOptions(LangOpts, Complain,
6067                                       AllowCompatibleDifferences);
6068 }
6069 
ParseTargetOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener,bool AllowCompatibleDifferences)6070 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
6071                                    ASTReaderListener &Listener,
6072                                    bool AllowCompatibleDifferences) {
6073   unsigned Idx = 0;
6074   TargetOptions TargetOpts;
6075   TargetOpts.Triple = ReadString(Record, Idx);
6076   TargetOpts.CPU = ReadString(Record, Idx);
6077   TargetOpts.TuneCPU = ReadString(Record, Idx);
6078   TargetOpts.ABI = ReadString(Record, Idx);
6079   for (unsigned N = Record[Idx++]; N; --N) {
6080     TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
6081   }
6082   for (unsigned N = Record[Idx++]; N; --N) {
6083     TargetOpts.Features.push_back(ReadString(Record, Idx));
6084   }
6085 
6086   return Listener.ReadTargetOptions(TargetOpts, Complain,
6087                                     AllowCompatibleDifferences);
6088 }
6089 
ParseDiagnosticOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)6090 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
6091                                        ASTReaderListener &Listener) {
6092   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
6093   unsigned Idx = 0;
6094 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
6095 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6096   DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
6097 #include "clang/Basic/DiagnosticOptions.def"
6098 
6099   for (unsigned N = Record[Idx++]; N; --N)
6100     DiagOpts->Warnings.push_back(ReadString(Record, Idx));
6101   for (unsigned N = Record[Idx++]; N; --N)
6102     DiagOpts->Remarks.push_back(ReadString(Record, Idx));
6103 
6104   return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
6105 }
6106 
ParseFileSystemOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)6107 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
6108                                        ASTReaderListener &Listener) {
6109   FileSystemOptions FSOpts;
6110   unsigned Idx = 0;
6111   FSOpts.WorkingDir = ReadString(Record, Idx);
6112   return Listener.ReadFileSystemOptions(FSOpts, Complain);
6113 }
6114 
ParseHeaderSearchOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)6115 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
6116                                          bool Complain,
6117                                          ASTReaderListener &Listener) {
6118   HeaderSearchOptions HSOpts;
6119   unsigned Idx = 0;
6120   HSOpts.Sysroot = ReadString(Record, Idx);
6121 
6122   HSOpts.ResourceDir = ReadString(Record, Idx);
6123   HSOpts.ModuleCachePath = ReadString(Record, Idx);
6124   HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
6125   HSOpts.DisableModuleHash = Record[Idx++];
6126   HSOpts.ImplicitModuleMaps = Record[Idx++];
6127   HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
6128   HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
6129   HSOpts.UseBuiltinIncludes = Record[Idx++];
6130   HSOpts.UseStandardSystemIncludes = Record[Idx++];
6131   HSOpts.UseStandardCXXIncludes = Record[Idx++];
6132   HSOpts.UseLibcxx = Record[Idx++];
6133   std::string SpecificModuleCachePath = ReadString(Record, Idx);
6134 
6135   return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
6136                                           Complain);
6137 }
6138 
ParseHeaderSearchPaths(const RecordData & Record,bool Complain,ASTReaderListener & Listener)6139 bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
6140                                        ASTReaderListener &Listener) {
6141   HeaderSearchOptions HSOpts;
6142   unsigned Idx = 0;
6143 
6144   // Include entries.
6145   for (unsigned N = Record[Idx++]; N; --N) {
6146     std::string Path = ReadString(Record, Idx);
6147     frontend::IncludeDirGroup Group
6148       = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
6149     bool IsFramework = Record[Idx++];
6150     bool IgnoreSysRoot = Record[Idx++];
6151     HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6152                                     IgnoreSysRoot);
6153   }
6154 
6155   // System header prefixes.
6156   for (unsigned N = Record[Idx++]; N; --N) {
6157     std::string Prefix = ReadString(Record, Idx);
6158     bool IsSystemHeader = Record[Idx++];
6159     HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
6160   }
6161 
6162   // VFS overlay files.
6163   for (unsigned N = Record[Idx++]; N; --N) {
6164     std::string VFSOverlayFile = ReadString(Record, Idx);
6165     HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6166   }
6167 
6168   return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
6169 }
6170 
ParsePreprocessorOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener,std::string & SuggestedPredefines)6171 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
6172                                          bool Complain,
6173                                          ASTReaderListener &Listener,
6174                                          std::string &SuggestedPredefines) {
6175   PreprocessorOptions PPOpts;
6176   unsigned Idx = 0;
6177 
6178   // Macro definitions/undefs
6179   bool ReadMacros = Record[Idx++];
6180   if (ReadMacros) {
6181     for (unsigned N = Record[Idx++]; N; --N) {
6182       std::string Macro = ReadString(Record, Idx);
6183       bool IsUndef = Record[Idx++];
6184       PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
6185     }
6186   }
6187 
6188   // Includes
6189   for (unsigned N = Record[Idx++]; N; --N) {
6190     PPOpts.Includes.push_back(ReadString(Record, Idx));
6191   }
6192 
6193   // Macro Includes
6194   for (unsigned N = Record[Idx++]; N; --N) {
6195     PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
6196   }
6197 
6198   PPOpts.UsePredefines = Record[Idx++];
6199   PPOpts.DetailedRecord = Record[Idx++];
6200   PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
6201   PPOpts.ObjCXXARCStandardLibrary =
6202     static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
6203   SuggestedPredefines.clear();
6204   return Listener.ReadPreprocessorOptions(PPOpts, ReadMacros, Complain,
6205                                           SuggestedPredefines);
6206 }
6207 
6208 std::pair<ModuleFile *, unsigned>
getModulePreprocessedEntity(unsigned GlobalIndex)6209 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
6210   GlobalPreprocessedEntityMapType::iterator
6211   I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6212   assert(I != GlobalPreprocessedEntityMap.end() &&
6213          "Corrupted global preprocessed entity map");
6214   ModuleFile *M = I->second;
6215   unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
6216   return std::make_pair(M, LocalIndex);
6217 }
6218 
6219 llvm::iterator_range<PreprocessingRecord::iterator>
getModulePreprocessedEntities(ModuleFile & Mod) const6220 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
6221   if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6222     return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
6223                                              Mod.NumPreprocessedEntities);
6224 
6225   return llvm::make_range(PreprocessingRecord::iterator(),
6226                           PreprocessingRecord::iterator());
6227 }
6228 
canRecoverFromOutOfDate(StringRef ModuleFileName,unsigned int ClientLoadCapabilities)6229 bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6230                                         unsigned int ClientLoadCapabilities) {
6231   return ClientLoadCapabilities & ARR_OutOfDate &&
6232          !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName);
6233 }
6234 
6235 llvm::iterator_range<ASTReader::ModuleDeclIterator>
getModuleFileLevelDecls(ModuleFile & Mod)6236 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
6237   return llvm::make_range(
6238       ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
6239       ModuleDeclIterator(this, &Mod,
6240                          Mod.FileSortedDecls + Mod.NumFileSortedDecls));
6241 }
6242 
ReadSkippedRange(unsigned GlobalIndex)6243 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
6244   auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6245   assert(I != GlobalSkippedRangeMap.end() &&
6246     "Corrupted global skipped range map");
6247   ModuleFile *M = I->second;
6248   unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
6249   assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6250   PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
6251   SourceRange Range(ReadSourceLocation(*M, RawRange.getBegin()),
6252                     ReadSourceLocation(*M, RawRange.getEnd()));
6253   assert(Range.isValid());
6254   return Range;
6255 }
6256 
ReadPreprocessedEntity(unsigned Index)6257 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
6258   PreprocessedEntityID PPID = Index+1;
6259   std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6260   ModuleFile &M = *PPInfo.first;
6261   unsigned LocalIndex = PPInfo.second;
6262   const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6263 
6264   if (!PP.getPreprocessingRecord()) {
6265     Error("no preprocessing record");
6266     return nullptr;
6267   }
6268 
6269   SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
6270   if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
6271           M.MacroOffsetsBase + PPOffs.getOffset())) {
6272     Error(std::move(Err));
6273     return nullptr;
6274   }
6275 
6276   Expected<llvm::BitstreamEntry> MaybeEntry =
6277       M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
6278   if (!MaybeEntry) {
6279     Error(MaybeEntry.takeError());
6280     return nullptr;
6281   }
6282   llvm::BitstreamEntry Entry = MaybeEntry.get();
6283 
6284   if (Entry.Kind != llvm::BitstreamEntry::Record)
6285     return nullptr;
6286 
6287   // Read the record.
6288   SourceRange Range(ReadSourceLocation(M, PPOffs.getBegin()),
6289                     ReadSourceLocation(M, PPOffs.getEnd()));
6290   PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
6291   StringRef Blob;
6292   RecordData Record;
6293   Expected<unsigned> MaybeRecType =
6294       M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
6295   if (!MaybeRecType) {
6296     Error(MaybeRecType.takeError());
6297     return nullptr;
6298   }
6299   switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
6300   case PPD_MACRO_EXPANSION: {
6301     bool isBuiltin = Record[0];
6302     IdentifierInfo *Name = nullptr;
6303     MacroDefinitionRecord *Def = nullptr;
6304     if (isBuiltin)
6305       Name = getLocalIdentifier(M, Record[1]);
6306     else {
6307       PreprocessedEntityID GlobalID =
6308           getGlobalPreprocessedEntityID(M, Record[1]);
6309       Def = cast<MacroDefinitionRecord>(
6310           PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
6311     }
6312 
6313     MacroExpansion *ME;
6314     if (isBuiltin)
6315       ME = new (PPRec) MacroExpansion(Name, Range);
6316     else
6317       ME = new (PPRec) MacroExpansion(Def, Range);
6318 
6319     return ME;
6320   }
6321 
6322   case PPD_MACRO_DEFINITION: {
6323     // Decode the identifier info and then check again; if the macro is
6324     // still defined and associated with the identifier,
6325     IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
6326     MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
6327 
6328     if (DeserializationListener)
6329       DeserializationListener->MacroDefinitionRead(PPID, MD);
6330 
6331     return MD;
6332   }
6333 
6334   case PPD_INCLUSION_DIRECTIVE: {
6335     const char *FullFileNameStart = Blob.data() + Record[0];
6336     StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
6337     OptionalFileEntryRef File;
6338     if (!FullFileName.empty())
6339       File = PP.getFileManager().getOptionalFileRef(FullFileName);
6340 
6341     // FIXME: Stable encoding
6342     InclusionDirective::InclusionKind Kind
6343       = static_cast<InclusionDirective::InclusionKind>(Record[2]);
6344     InclusionDirective *ID
6345       = new (PPRec) InclusionDirective(PPRec, Kind,
6346                                        StringRef(Blob.data(), Record[0]),
6347                                        Record[1], Record[3],
6348                                        File,
6349                                        Range);
6350     return ID;
6351   }
6352   }
6353 
6354   llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
6355 }
6356 
6357 /// Find the next module that contains entities and return the ID
6358 /// of the first entry.
6359 ///
6360 /// \param SLocMapI points at a chunk of a module that contains no
6361 /// preprocessed entities or the entities it contains are not the ones we are
6362 /// looking for.
findNextPreprocessedEntity(GlobalSLocOffsetMapType::const_iterator SLocMapI) const6363 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
6364                        GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
6365   ++SLocMapI;
6366   for (GlobalSLocOffsetMapType::const_iterator
6367          EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6368     ModuleFile &M = *SLocMapI->second;
6369     if (M.NumPreprocessedEntities)
6370       return M.BasePreprocessedEntityID;
6371   }
6372 
6373   return getTotalNumPreprocessedEntities();
6374 }
6375 
6376 namespace {
6377 
6378 struct PPEntityComp {
6379   const ASTReader &Reader;
6380   ModuleFile &M;
6381 
PPEntityComp__anon09454b220d11::PPEntityComp6382   PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6383 
operator ()__anon09454b220d11::PPEntityComp6384   bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
6385     SourceLocation LHS = getLoc(L);
6386     SourceLocation RHS = getLoc(R);
6387     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6388   }
6389 
operator ()__anon09454b220d11::PPEntityComp6390   bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
6391     SourceLocation LHS = getLoc(L);
6392     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6393   }
6394 
operator ()__anon09454b220d11::PPEntityComp6395   bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
6396     SourceLocation RHS = getLoc(R);
6397     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6398   }
6399 
getLoc__anon09454b220d11::PPEntityComp6400   SourceLocation getLoc(const PPEntityOffset &PPE) const {
6401     return Reader.ReadSourceLocation(M, PPE.getBegin());
6402   }
6403 };
6404 
6405 } // namespace
6406 
findPreprocessedEntity(SourceLocation Loc,bool EndsAfter) const6407 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
6408                                                        bool EndsAfter) const {
6409   if (SourceMgr.isLocalSourceLocation(Loc))
6410     return getTotalNumPreprocessedEntities();
6411 
6412   GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6413       SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6414   assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6415          "Corrupted global sloc offset map");
6416 
6417   if (SLocMapI->second->NumPreprocessedEntities == 0)
6418     return findNextPreprocessedEntity(SLocMapI);
6419 
6420   ModuleFile &M = *SLocMapI->second;
6421 
6422   using pp_iterator = const PPEntityOffset *;
6423 
6424   pp_iterator pp_begin = M.PreprocessedEntityOffsets;
6425   pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
6426 
6427   size_t Count = M.NumPreprocessedEntities;
6428   size_t Half;
6429   pp_iterator First = pp_begin;
6430   pp_iterator PPI;
6431 
6432   if (EndsAfter) {
6433     PPI = std::upper_bound(pp_begin, pp_end, Loc,
6434                            PPEntityComp(*this, M));
6435   } else {
6436     // Do a binary search manually instead of using std::lower_bound because
6437     // The end locations of entities may be unordered (when a macro expansion
6438     // is inside another macro argument), but for this case it is not important
6439     // whether we get the first macro expansion or its containing macro.
6440     while (Count > 0) {
6441       Half = Count / 2;
6442       PPI = First;
6443       std::advance(PPI, Half);
6444       if (SourceMgr.isBeforeInTranslationUnit(
6445               ReadSourceLocation(M, PPI->getEnd()), Loc)) {
6446         First = PPI;
6447         ++First;
6448         Count = Count - Half - 1;
6449       } else
6450         Count = Half;
6451     }
6452   }
6453 
6454   if (PPI == pp_end)
6455     return findNextPreprocessedEntity(SLocMapI);
6456 
6457   return M.BasePreprocessedEntityID + (PPI - pp_begin);
6458 }
6459 
6460 /// Returns a pair of [Begin, End) indices of preallocated
6461 /// preprocessed entities that \arg Range encompasses.
6462 std::pair<unsigned, unsigned>
findPreprocessedEntitiesInRange(SourceRange Range)6463     ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
6464   if (Range.isInvalid())
6465     return std::make_pair(0,0);
6466   assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6467 
6468   PreprocessedEntityID BeginID =
6469       findPreprocessedEntity(Range.getBegin(), false);
6470   PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
6471   return std::make_pair(BeginID, EndID);
6472 }
6473 
6474 /// Optionally returns true or false if the preallocated preprocessed
6475 /// entity with index \arg Index came from file \arg FID.
isPreprocessedEntityInFileID(unsigned Index,FileID FID)6476 std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
6477                                                             FileID FID) {
6478   if (FID.isInvalid())
6479     return false;
6480 
6481   std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6482   ModuleFile &M = *PPInfo.first;
6483   unsigned LocalIndex = PPInfo.second;
6484   const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6485 
6486   SourceLocation Loc = ReadSourceLocation(M, PPOffs.getBegin());
6487   if (Loc.isInvalid())
6488     return false;
6489 
6490   if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6491     return true;
6492   else
6493     return false;
6494 }
6495 
6496 namespace {
6497 
6498   /// Visitor used to search for information about a header file.
6499   class HeaderFileInfoVisitor {
6500   FileEntryRef FE;
6501     std::optional<HeaderFileInfo> HFI;
6502 
6503   public:
HeaderFileInfoVisitor(FileEntryRef FE)6504     explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {}
6505 
operator ()(ModuleFile & M)6506     bool operator()(ModuleFile &M) {
6507       HeaderFileInfoLookupTable *Table
6508         = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
6509       if (!Table)
6510         return false;
6511 
6512       // Look in the on-disk hash table for an entry for this file name.
6513       HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
6514       if (Pos == Table->end())
6515         return false;
6516 
6517       HFI = *Pos;
6518       return true;
6519     }
6520 
getHeaderFileInfo() const6521     std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
6522   };
6523 
6524 } // namespace
6525 
GetHeaderFileInfo(FileEntryRef FE)6526 HeaderFileInfo ASTReader::GetHeaderFileInfo(FileEntryRef FE) {
6527   HeaderFileInfoVisitor Visitor(FE);
6528   ModuleMgr.visit(Visitor);
6529   if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
6530       return *HFI;
6531 
6532   return HeaderFileInfo();
6533 }
6534 
ReadPragmaDiagnosticMappings(DiagnosticsEngine & Diag)6535 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
6536   using DiagState = DiagnosticsEngine::DiagState;
6537   SmallVector<DiagState *, 32> DiagStates;
6538 
6539   for (ModuleFile &F : ModuleMgr) {
6540     unsigned Idx = 0;
6541     auto &Record = F.PragmaDiagMappings;
6542     if (Record.empty())
6543       continue;
6544 
6545     DiagStates.clear();
6546 
6547     auto ReadDiagState = [&](const DiagState &BasedOn,
6548                              bool IncludeNonPragmaStates) {
6549       unsigned BackrefID = Record[Idx++];
6550       if (BackrefID != 0)
6551         return DiagStates[BackrefID - 1];
6552 
6553       // A new DiagState was created here.
6554       Diag.DiagStates.push_back(BasedOn);
6555       DiagState *NewState = &Diag.DiagStates.back();
6556       DiagStates.push_back(NewState);
6557       unsigned Size = Record[Idx++];
6558       assert(Idx + Size * 2 <= Record.size() &&
6559              "Invalid data, not enough diag/map pairs");
6560       while (Size--) {
6561         unsigned DiagID = Record[Idx++];
6562         DiagnosticMapping NewMapping =
6563             DiagnosticMapping::deserialize(Record[Idx++]);
6564         if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
6565           continue;
6566 
6567         DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
6568 
6569         // If this mapping was specified as a warning but the severity was
6570         // upgraded due to diagnostic settings, simulate the current diagnostic
6571         // settings (and use a warning).
6572         if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
6573           NewMapping.setSeverity(diag::Severity::Warning);
6574           NewMapping.setUpgradedFromWarning(false);
6575         }
6576 
6577         Mapping = NewMapping;
6578       }
6579       return NewState;
6580     };
6581 
6582     // Read the first state.
6583     DiagState *FirstState;
6584     if (F.Kind == MK_ImplicitModule) {
6585       // Implicitly-built modules are reused with different diagnostic
6586       // settings.  Use the initial diagnostic state from Diag to simulate this
6587       // compilation's diagnostic settings.
6588       FirstState = Diag.DiagStatesByLoc.FirstDiagState;
6589       DiagStates.push_back(FirstState);
6590 
6591       // Skip the initial diagnostic state from the serialized module.
6592       assert(Record[1] == 0 &&
6593              "Invalid data, unexpected backref in initial state");
6594       Idx = 3 + Record[2] * 2;
6595       assert(Idx < Record.size() &&
6596              "Invalid data, not enough state change pairs in initial state");
6597     } else if (F.isModule()) {
6598       // For an explicit module, preserve the flags from the module build
6599       // command line (-w, -Weverything, -Werror, ...) along with any explicit
6600       // -Wblah flags.
6601       unsigned Flags = Record[Idx++];
6602       DiagState Initial;
6603       Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
6604       Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
6605       Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
6606       Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
6607       Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
6608       Initial.ExtBehavior = (diag::Severity)Flags;
6609       FirstState = ReadDiagState(Initial, true);
6610 
6611       assert(F.OriginalSourceFileID.isValid());
6612 
6613       // Set up the root buffer of the module to start with the initial
6614       // diagnostic state of the module itself, to cover files that contain no
6615       // explicit transitions (for which we did not serialize anything).
6616       Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
6617           .StateTransitions.push_back({FirstState, 0});
6618     } else {
6619       // For prefix ASTs, start with whatever the user configured on the
6620       // command line.
6621       Idx++; // Skip flags.
6622       FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
6623     }
6624 
6625     // Read the state transitions.
6626     unsigned NumLocations = Record[Idx++];
6627     while (NumLocations--) {
6628       assert(Idx < Record.size() &&
6629              "Invalid data, missing pragma diagnostic states");
6630       FileID FID = ReadFileID(F, Record, Idx);
6631       assert(FID.isValid() && "invalid FileID for transition");
6632       unsigned Transitions = Record[Idx++];
6633 
6634       // Note that we don't need to set up Parent/ParentOffset here, because
6635       // we won't be changing the diagnostic state within imported FileIDs
6636       // (other than perhaps appending to the main source file, which has no
6637       // parent).
6638       auto &F = Diag.DiagStatesByLoc.Files[FID];
6639       F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
6640       for (unsigned I = 0; I != Transitions; ++I) {
6641         unsigned Offset = Record[Idx++];
6642         auto *State = ReadDiagState(*FirstState, false);
6643         F.StateTransitions.push_back({State, Offset});
6644       }
6645     }
6646 
6647     // Read the final state.
6648     assert(Idx < Record.size() &&
6649            "Invalid data, missing final pragma diagnostic state");
6650     SourceLocation CurStateLoc = ReadSourceLocation(F, Record[Idx++]);
6651     auto *CurState = ReadDiagState(*FirstState, false);
6652 
6653     if (!F.isModule()) {
6654       Diag.DiagStatesByLoc.CurDiagState = CurState;
6655       Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
6656 
6657       // Preserve the property that the imaginary root file describes the
6658       // current state.
6659       FileID NullFile;
6660       auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
6661       if (T.empty())
6662         T.push_back({CurState, 0});
6663       else
6664         T[0].State = CurState;
6665     }
6666 
6667     // Don't try to read these mappings again.
6668     Record.clear();
6669   }
6670 }
6671 
6672 /// Get the correct cursor and offset for loading a type.
TypeCursorForIndex(TypeID ID)6673 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) {
6674   auto [M, Index] = translateTypeIDToIndex(ID);
6675   return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() +
6676                                M->DeclsBlockStartOffset);
6677 }
6678 
getTypeClassForCode(TypeCode code)6679 static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
6680   switch (code) {
6681 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
6682   case TYPE_##CODE_ID: return Type::CLASS_ID;
6683 #include "clang/Serialization/TypeBitCodes.def"
6684   default:
6685     return std::nullopt;
6686   }
6687 }
6688 
6689 /// Read and return the type with the given index..
6690 ///
6691 /// The index is the type ID, shifted and minus the number of predefs. This
6692 /// routine actually reads the record corresponding to the type at the given
6693 /// location. It is a helper routine for GetType, which deals with reading type
6694 /// IDs.
readTypeRecord(TypeID ID)6695 QualType ASTReader::readTypeRecord(TypeID ID) {
6696   assert(ContextObj && "reading type with no AST context");
6697   ASTContext &Context = *ContextObj;
6698   RecordLocation Loc = TypeCursorForIndex(ID);
6699   BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
6700 
6701   // Keep track of where we are in the stream, then jump back there
6702   // after reading this type.
6703   SavedStreamPosition SavedPosition(DeclsCursor);
6704 
6705   ReadingKindTracker ReadingKind(Read_Type, *this);
6706 
6707   // Note that we are loading a type record.
6708   Deserializing AType(this);
6709 
6710   if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
6711     Error(std::move(Err));
6712     return QualType();
6713   }
6714   Expected<unsigned> RawCode = DeclsCursor.ReadCode();
6715   if (!RawCode) {
6716     Error(RawCode.takeError());
6717     return QualType();
6718   }
6719 
6720   ASTRecordReader Record(*this, *Loc.F);
6721   Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
6722   if (!Code) {
6723     Error(Code.takeError());
6724     return QualType();
6725   }
6726   if (Code.get() == TYPE_EXT_QUAL) {
6727     QualType baseType = Record.readQualType();
6728     Qualifiers quals = Record.readQualifiers();
6729     return Context.getQualifiedType(baseType, quals);
6730   }
6731 
6732   auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
6733   if (!maybeClass) {
6734     Error("Unexpected code for type");
6735     return QualType();
6736   }
6737 
6738   serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
6739   return TypeReader.read(*maybeClass);
6740 }
6741 
6742 namespace clang {
6743 
6744 class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
6745   using LocSeq = SourceLocationSequence;
6746 
6747   ASTRecordReader &Reader;
6748   LocSeq *Seq;
6749 
readSourceLocation()6750   SourceLocation readSourceLocation() { return Reader.readSourceLocation(Seq); }
readSourceRange()6751   SourceRange readSourceRange() { return Reader.readSourceRange(Seq); }
6752 
GetTypeSourceInfo()6753   TypeSourceInfo *GetTypeSourceInfo() {
6754     return Reader.readTypeSourceInfo();
6755   }
6756 
ReadNestedNameSpecifierLoc()6757   NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
6758     return Reader.readNestedNameSpecifierLoc();
6759   }
6760 
ReadAttr()6761   Attr *ReadAttr() {
6762     return Reader.readAttr();
6763   }
6764 
6765 public:
TypeLocReader(ASTRecordReader & Reader,LocSeq * Seq)6766   TypeLocReader(ASTRecordReader &Reader, LocSeq *Seq)
6767       : Reader(Reader), Seq(Seq) {}
6768 
6769   // We want compile-time assurance that we've enumerated all of
6770   // these, so unfortunately we have to declare them first, then
6771   // define them out-of-line.
6772 #define ABSTRACT_TYPELOC(CLASS, PARENT)
6773 #define TYPELOC(CLASS, PARENT) \
6774   void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
6775 #include "clang/AST/TypeLocNodes.def"
6776 
6777   void VisitFunctionTypeLoc(FunctionTypeLoc);
6778   void VisitArrayTypeLoc(ArrayTypeLoc);
6779 };
6780 
6781 } // namespace clang
6782 
VisitQualifiedTypeLoc(QualifiedTypeLoc TL)6783 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
6784   // nothing to do
6785 }
6786 
VisitBuiltinTypeLoc(BuiltinTypeLoc TL)6787 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6788   TL.setBuiltinLoc(readSourceLocation());
6789   if (TL.needsExtraLocalData()) {
6790     TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
6791     TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
6792     TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
6793     TL.setModeAttr(Reader.readInt());
6794   }
6795 }
6796 
VisitComplexTypeLoc(ComplexTypeLoc TL)6797 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
6798   TL.setNameLoc(readSourceLocation());
6799 }
6800 
VisitPointerTypeLoc(PointerTypeLoc TL)6801 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
6802   TL.setStarLoc(readSourceLocation());
6803 }
6804 
VisitDecayedTypeLoc(DecayedTypeLoc TL)6805 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
6806   // nothing to do
6807 }
6808 
VisitAdjustedTypeLoc(AdjustedTypeLoc TL)6809 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
6810   // nothing to do
6811 }
6812 
VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL)6813 void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
6814   // nothing to do
6815 }
6816 
VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL)6817 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6818   TL.setExpansionLoc(readSourceLocation());
6819 }
6820 
VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL)6821 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6822   TL.setCaretLoc(readSourceLocation());
6823 }
6824 
VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL)6825 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6826   TL.setAmpLoc(readSourceLocation());
6827 }
6828 
VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL)6829 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6830   TL.setAmpAmpLoc(readSourceLocation());
6831 }
6832 
VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL)6833 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6834   TL.setStarLoc(readSourceLocation());
6835   TL.setClassTInfo(GetTypeSourceInfo());
6836 }
6837 
VisitArrayTypeLoc(ArrayTypeLoc TL)6838 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
6839   TL.setLBracketLoc(readSourceLocation());
6840   TL.setRBracketLoc(readSourceLocation());
6841   if (Reader.readBool())
6842     TL.setSizeExpr(Reader.readExpr());
6843   else
6844     TL.setSizeExpr(nullptr);
6845 }
6846 
VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL)6847 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
6848   VisitArrayTypeLoc(TL);
6849 }
6850 
VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL)6851 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
6852   VisitArrayTypeLoc(TL);
6853 }
6854 
VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL)6855 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
6856   VisitArrayTypeLoc(TL);
6857 }
6858 
VisitDependentSizedArrayTypeLoc(DependentSizedArrayTypeLoc TL)6859 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
6860                                             DependentSizedArrayTypeLoc TL) {
6861   VisitArrayTypeLoc(TL);
6862 }
6863 
VisitDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc TL)6864 void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
6865     DependentAddressSpaceTypeLoc TL) {
6866 
6867     TL.setAttrNameLoc(readSourceLocation());
6868     TL.setAttrOperandParensRange(readSourceRange());
6869     TL.setAttrExprOperand(Reader.readExpr());
6870 }
6871 
VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL)6872 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
6873                                         DependentSizedExtVectorTypeLoc TL) {
6874   TL.setNameLoc(readSourceLocation());
6875 }
6876 
VisitVectorTypeLoc(VectorTypeLoc TL)6877 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
6878   TL.setNameLoc(readSourceLocation());
6879 }
6880 
VisitDependentVectorTypeLoc(DependentVectorTypeLoc TL)6881 void TypeLocReader::VisitDependentVectorTypeLoc(
6882     DependentVectorTypeLoc TL) {
6883   TL.setNameLoc(readSourceLocation());
6884 }
6885 
VisitExtVectorTypeLoc(ExtVectorTypeLoc TL)6886 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6887   TL.setNameLoc(readSourceLocation());
6888 }
6889 
VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL)6890 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
6891   TL.setAttrNameLoc(readSourceLocation());
6892   TL.setAttrOperandParensRange(readSourceRange());
6893   TL.setAttrRowOperand(Reader.readExpr());
6894   TL.setAttrColumnOperand(Reader.readExpr());
6895 }
6896 
VisitDependentSizedMatrixTypeLoc(DependentSizedMatrixTypeLoc TL)6897 void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
6898     DependentSizedMatrixTypeLoc TL) {
6899   TL.setAttrNameLoc(readSourceLocation());
6900   TL.setAttrOperandParensRange(readSourceRange());
6901   TL.setAttrRowOperand(Reader.readExpr());
6902   TL.setAttrColumnOperand(Reader.readExpr());
6903 }
6904 
VisitFunctionTypeLoc(FunctionTypeLoc TL)6905 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6906   TL.setLocalRangeBegin(readSourceLocation());
6907   TL.setLParenLoc(readSourceLocation());
6908   TL.setRParenLoc(readSourceLocation());
6909   TL.setExceptionSpecRange(readSourceRange());
6910   TL.setLocalRangeEnd(readSourceLocation());
6911   for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
6912     TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
6913   }
6914 }
6915 
VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL)6916 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
6917   VisitFunctionTypeLoc(TL);
6918 }
6919 
VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL)6920 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
6921   VisitFunctionTypeLoc(TL);
6922 }
6923 
VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL)6924 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6925   TL.setNameLoc(readSourceLocation());
6926 }
6927 
VisitUsingTypeLoc(UsingTypeLoc TL)6928 void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
6929   TL.setNameLoc(readSourceLocation());
6930 }
6931 
VisitTypedefTypeLoc(TypedefTypeLoc TL)6932 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6933   TL.setNameLoc(readSourceLocation());
6934 }
6935 
VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL)6936 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6937   TL.setTypeofLoc(readSourceLocation());
6938   TL.setLParenLoc(readSourceLocation());
6939   TL.setRParenLoc(readSourceLocation());
6940 }
6941 
VisitTypeOfTypeLoc(TypeOfTypeLoc TL)6942 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6943   TL.setTypeofLoc(readSourceLocation());
6944   TL.setLParenLoc(readSourceLocation());
6945   TL.setRParenLoc(readSourceLocation());
6946   TL.setUnmodifiedTInfo(GetTypeSourceInfo());
6947 }
6948 
VisitDecltypeTypeLoc(DecltypeTypeLoc TL)6949 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
6950   TL.setDecltypeLoc(readSourceLocation());
6951   TL.setRParenLoc(readSourceLocation());
6952 }
6953 
VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL)6954 void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
6955   TL.setEllipsisLoc(readSourceLocation());
6956 }
6957 
VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL)6958 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6959   TL.setKWLoc(readSourceLocation());
6960   TL.setLParenLoc(readSourceLocation());
6961   TL.setRParenLoc(readSourceLocation());
6962   TL.setUnderlyingTInfo(GetTypeSourceInfo());
6963 }
6964 
readConceptReference()6965 ConceptReference *ASTRecordReader::readConceptReference() {
6966   auto NNS = readNestedNameSpecifierLoc();
6967   auto TemplateKWLoc = readSourceLocation();
6968   auto ConceptNameLoc = readDeclarationNameInfo();
6969   auto FoundDecl = readDeclAs<NamedDecl>();
6970   auto NamedConcept = readDeclAs<ConceptDecl>();
6971   auto *CR = ConceptReference::Create(
6972       getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
6973       (readBool() ? readASTTemplateArgumentListInfo() : nullptr));
6974   return CR;
6975 }
6976 
VisitAutoTypeLoc(AutoTypeLoc TL)6977 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
6978   TL.setNameLoc(readSourceLocation());
6979   if (Reader.readBool())
6980     TL.setConceptReference(Reader.readConceptReference());
6981   if (Reader.readBool())
6982     TL.setRParenLoc(readSourceLocation());
6983 }
6984 
VisitDeducedTemplateSpecializationTypeLoc(DeducedTemplateSpecializationTypeLoc TL)6985 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
6986     DeducedTemplateSpecializationTypeLoc TL) {
6987   TL.setTemplateNameLoc(readSourceLocation());
6988 }
6989 
VisitRecordTypeLoc(RecordTypeLoc TL)6990 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6991   TL.setNameLoc(readSourceLocation());
6992 }
6993 
VisitEnumTypeLoc(EnumTypeLoc TL)6994 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6995   TL.setNameLoc(readSourceLocation());
6996 }
6997 
VisitAttributedTypeLoc(AttributedTypeLoc TL)6998 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6999   TL.setAttr(ReadAttr());
7000 }
7001 
VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL)7002 void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7003   // Nothing to do
7004 }
7005 
VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL)7006 void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7007   // Nothing to do.
7008 }
7009 
VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)7010 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7011   TL.setNameLoc(readSourceLocation());
7012 }
7013 
VisitSubstTemplateTypeParmTypeLoc(SubstTemplateTypeParmTypeLoc TL)7014 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7015                                             SubstTemplateTypeParmTypeLoc TL) {
7016   TL.setNameLoc(readSourceLocation());
7017 }
7018 
VisitSubstTemplateTypeParmPackTypeLoc(SubstTemplateTypeParmPackTypeLoc TL)7019 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7020                                           SubstTemplateTypeParmPackTypeLoc TL) {
7021   TL.setNameLoc(readSourceLocation());
7022 }
7023 
VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL)7024 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7025                                            TemplateSpecializationTypeLoc TL) {
7026   TL.setTemplateKeywordLoc(readSourceLocation());
7027   TL.setTemplateNameLoc(readSourceLocation());
7028   TL.setLAngleLoc(readSourceLocation());
7029   TL.setRAngleLoc(readSourceLocation());
7030   for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
7031     TL.setArgLocInfo(i,
7032                      Reader.readTemplateArgumentLocInfo(
7033                          TL.getTypePtr()->template_arguments()[i].getKind()));
7034 }
7035 
VisitParenTypeLoc(ParenTypeLoc TL)7036 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7037   TL.setLParenLoc(readSourceLocation());
7038   TL.setRParenLoc(readSourceLocation());
7039 }
7040 
VisitElaboratedTypeLoc(ElaboratedTypeLoc TL)7041 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
7042   TL.setElaboratedKeywordLoc(readSourceLocation());
7043   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7044 }
7045 
VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL)7046 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
7047   TL.setNameLoc(readSourceLocation());
7048 }
7049 
VisitDependentNameTypeLoc(DependentNameTypeLoc TL)7050 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7051   TL.setElaboratedKeywordLoc(readSourceLocation());
7052   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7053   TL.setNameLoc(readSourceLocation());
7054 }
7055 
VisitDependentTemplateSpecializationTypeLoc(DependentTemplateSpecializationTypeLoc TL)7056 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
7057        DependentTemplateSpecializationTypeLoc TL) {
7058   TL.setElaboratedKeywordLoc(readSourceLocation());
7059   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7060   TL.setTemplateKeywordLoc(readSourceLocation());
7061   TL.setTemplateNameLoc(readSourceLocation());
7062   TL.setLAngleLoc(readSourceLocation());
7063   TL.setRAngleLoc(readSourceLocation());
7064   for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
7065     TL.setArgLocInfo(I,
7066                      Reader.readTemplateArgumentLocInfo(
7067                          TL.getTypePtr()->template_arguments()[I].getKind()));
7068 }
7069 
VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL)7070 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7071   TL.setEllipsisLoc(readSourceLocation());
7072 }
7073 
VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL)7074 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7075   TL.setNameLoc(readSourceLocation());
7076   TL.setNameEndLoc(readSourceLocation());
7077 }
7078 
VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL)7079 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7080   if (TL.getNumProtocols()) {
7081     TL.setProtocolLAngleLoc(readSourceLocation());
7082     TL.setProtocolRAngleLoc(readSourceLocation());
7083   }
7084   for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7085     TL.setProtocolLoc(i, readSourceLocation());
7086 }
7087 
VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL)7088 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7089   TL.setHasBaseTypeAsWritten(Reader.readBool());
7090   TL.setTypeArgsLAngleLoc(readSourceLocation());
7091   TL.setTypeArgsRAngleLoc(readSourceLocation());
7092   for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
7093     TL.setTypeArgTInfo(i, GetTypeSourceInfo());
7094   TL.setProtocolLAngleLoc(readSourceLocation());
7095   TL.setProtocolRAngleLoc(readSourceLocation());
7096   for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7097     TL.setProtocolLoc(i, readSourceLocation());
7098 }
7099 
VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL)7100 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7101   TL.setStarLoc(readSourceLocation());
7102 }
7103 
VisitAtomicTypeLoc(AtomicTypeLoc TL)7104 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7105   TL.setKWLoc(readSourceLocation());
7106   TL.setLParenLoc(readSourceLocation());
7107   TL.setRParenLoc(readSourceLocation());
7108 }
7109 
VisitPipeTypeLoc(PipeTypeLoc TL)7110 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7111   TL.setKWLoc(readSourceLocation());
7112 }
7113 
VisitBitIntTypeLoc(clang::BitIntTypeLoc TL)7114 void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7115   TL.setNameLoc(readSourceLocation());
7116 }
VisitDependentBitIntTypeLoc(clang::DependentBitIntTypeLoc TL)7117 void TypeLocReader::VisitDependentBitIntTypeLoc(
7118     clang::DependentBitIntTypeLoc TL) {
7119   TL.setNameLoc(readSourceLocation());
7120 }
7121 
readTypeLoc(TypeLoc TL,LocSeq * ParentSeq)7122 void ASTRecordReader::readTypeLoc(TypeLoc TL, LocSeq *ParentSeq) {
7123   LocSeq::State Seq(ParentSeq);
7124   TypeLocReader TLR(*this, Seq);
7125   for (; !TL.isNull(); TL = TL.getNextTypeLoc())
7126     TLR.Visit(TL);
7127 }
7128 
readTypeSourceInfo()7129 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() {
7130   QualType InfoTy = readType();
7131   if (InfoTy.isNull())
7132     return nullptr;
7133 
7134   TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
7135   readTypeLoc(TInfo->getTypeLoc());
7136   return TInfo;
7137 }
7138 
getIndexForTypeID(serialization::TypeID ID)7139 static unsigned getIndexForTypeID(serialization::TypeID ID) {
7140   return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth;
7141 }
7142 
getModuleFileIndexForTypeID(serialization::TypeID ID)7143 static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID) {
7144   return ID >> 32;
7145 }
7146 
isPredefinedType(serialization::TypeID ID)7147 static bool isPredefinedType(serialization::TypeID ID) {
7148   // We don't need to erase the higher bits since if these bits are not 0,
7149   // it must be larger than NUM_PREDEF_TYPE_IDS.
7150   return (ID >> Qualifiers::FastWidth) < NUM_PREDEF_TYPE_IDS;
7151 }
7152 
7153 std::pair<ModuleFile *, unsigned>
translateTypeIDToIndex(serialization::TypeID ID) const7154 ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const {
7155   assert(!isPredefinedType(ID) &&
7156          "Predefined type shouldn't be in TypesLoaded");
7157   unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID);
7158   assert(ModuleFileIndex && "Untranslated Local Decl?");
7159 
7160   ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7161   assert(OwningModuleFile &&
7162          "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7163 
7164   return {OwningModuleFile,
7165           OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)};
7166 }
7167 
GetType(TypeID ID)7168 QualType ASTReader::GetType(TypeID ID) {
7169   assert(ContextObj && "reading type with no AST context");
7170   ASTContext &Context = *ContextObj;
7171 
7172   unsigned FastQuals = ID & Qualifiers::FastMask;
7173 
7174   if (isPredefinedType(ID)) {
7175     QualType T;
7176     unsigned Index = getIndexForTypeID(ID);
7177     switch ((PredefinedTypeIDs)Index) {
7178     case PREDEF_TYPE_LAST_ID:
7179       // We should never use this one.
7180       llvm_unreachable("Invalid predefined type");
7181       break;
7182     case PREDEF_TYPE_NULL_ID:
7183       return QualType();
7184     case PREDEF_TYPE_VOID_ID:
7185       T = Context.VoidTy;
7186       break;
7187     case PREDEF_TYPE_BOOL_ID:
7188       T = Context.BoolTy;
7189       break;
7190     case PREDEF_TYPE_CHAR_U_ID:
7191     case PREDEF_TYPE_CHAR_S_ID:
7192       // FIXME: Check that the signedness of CharTy is correct!
7193       T = Context.CharTy;
7194       break;
7195     case PREDEF_TYPE_UCHAR_ID:
7196       T = Context.UnsignedCharTy;
7197       break;
7198     case PREDEF_TYPE_USHORT_ID:
7199       T = Context.UnsignedShortTy;
7200       break;
7201     case PREDEF_TYPE_UINT_ID:
7202       T = Context.UnsignedIntTy;
7203       break;
7204     case PREDEF_TYPE_ULONG_ID:
7205       T = Context.UnsignedLongTy;
7206       break;
7207     case PREDEF_TYPE_ULONGLONG_ID:
7208       T = Context.UnsignedLongLongTy;
7209       break;
7210     case PREDEF_TYPE_UINT128_ID:
7211       T = Context.UnsignedInt128Ty;
7212       break;
7213     case PREDEF_TYPE_SCHAR_ID:
7214       T = Context.SignedCharTy;
7215       break;
7216     case PREDEF_TYPE_WCHAR_ID:
7217       T = Context.WCharTy;
7218       break;
7219     case PREDEF_TYPE_SHORT_ID:
7220       T = Context.ShortTy;
7221       break;
7222     case PREDEF_TYPE_INT_ID:
7223       T = Context.IntTy;
7224       break;
7225     case PREDEF_TYPE_LONG_ID:
7226       T = Context.LongTy;
7227       break;
7228     case PREDEF_TYPE_LONGLONG_ID:
7229       T = Context.LongLongTy;
7230       break;
7231     case PREDEF_TYPE_INT128_ID:
7232       T = Context.Int128Ty;
7233       break;
7234     case PREDEF_TYPE_BFLOAT16_ID:
7235       T = Context.BFloat16Ty;
7236       break;
7237     case PREDEF_TYPE_HALF_ID:
7238       T = Context.HalfTy;
7239       break;
7240     case PREDEF_TYPE_FLOAT_ID:
7241       T = Context.FloatTy;
7242       break;
7243     case PREDEF_TYPE_DOUBLE_ID:
7244       T = Context.DoubleTy;
7245       break;
7246     case PREDEF_TYPE_LONGDOUBLE_ID:
7247       T = Context.LongDoubleTy;
7248       break;
7249     case PREDEF_TYPE_SHORT_ACCUM_ID:
7250       T = Context.ShortAccumTy;
7251       break;
7252     case PREDEF_TYPE_ACCUM_ID:
7253       T = Context.AccumTy;
7254       break;
7255     case PREDEF_TYPE_LONG_ACCUM_ID:
7256       T = Context.LongAccumTy;
7257       break;
7258     case PREDEF_TYPE_USHORT_ACCUM_ID:
7259       T = Context.UnsignedShortAccumTy;
7260       break;
7261     case PREDEF_TYPE_UACCUM_ID:
7262       T = Context.UnsignedAccumTy;
7263       break;
7264     case PREDEF_TYPE_ULONG_ACCUM_ID:
7265       T = Context.UnsignedLongAccumTy;
7266       break;
7267     case PREDEF_TYPE_SHORT_FRACT_ID:
7268       T = Context.ShortFractTy;
7269       break;
7270     case PREDEF_TYPE_FRACT_ID:
7271       T = Context.FractTy;
7272       break;
7273     case PREDEF_TYPE_LONG_FRACT_ID:
7274       T = Context.LongFractTy;
7275       break;
7276     case PREDEF_TYPE_USHORT_FRACT_ID:
7277       T = Context.UnsignedShortFractTy;
7278       break;
7279     case PREDEF_TYPE_UFRACT_ID:
7280       T = Context.UnsignedFractTy;
7281       break;
7282     case PREDEF_TYPE_ULONG_FRACT_ID:
7283       T = Context.UnsignedLongFractTy;
7284       break;
7285     case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
7286       T = Context.SatShortAccumTy;
7287       break;
7288     case PREDEF_TYPE_SAT_ACCUM_ID:
7289       T = Context.SatAccumTy;
7290       break;
7291     case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
7292       T = Context.SatLongAccumTy;
7293       break;
7294     case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
7295       T = Context.SatUnsignedShortAccumTy;
7296       break;
7297     case PREDEF_TYPE_SAT_UACCUM_ID:
7298       T = Context.SatUnsignedAccumTy;
7299       break;
7300     case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
7301       T = Context.SatUnsignedLongAccumTy;
7302       break;
7303     case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
7304       T = Context.SatShortFractTy;
7305       break;
7306     case PREDEF_TYPE_SAT_FRACT_ID:
7307       T = Context.SatFractTy;
7308       break;
7309     case PREDEF_TYPE_SAT_LONG_FRACT_ID:
7310       T = Context.SatLongFractTy;
7311       break;
7312     case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
7313       T = Context.SatUnsignedShortFractTy;
7314       break;
7315     case PREDEF_TYPE_SAT_UFRACT_ID:
7316       T = Context.SatUnsignedFractTy;
7317       break;
7318     case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
7319       T = Context.SatUnsignedLongFractTy;
7320       break;
7321     case PREDEF_TYPE_FLOAT16_ID:
7322       T = Context.Float16Ty;
7323       break;
7324     case PREDEF_TYPE_FLOAT128_ID:
7325       T = Context.Float128Ty;
7326       break;
7327     case PREDEF_TYPE_IBM128_ID:
7328       T = Context.Ibm128Ty;
7329       break;
7330     case PREDEF_TYPE_OVERLOAD_ID:
7331       T = Context.OverloadTy;
7332       break;
7333     case PREDEF_TYPE_UNRESOLVED_TEMPLATE:
7334       T = Context.UnresolvedTemplateTy;
7335       break;
7336     case PREDEF_TYPE_BOUND_MEMBER:
7337       T = Context.BoundMemberTy;
7338       break;
7339     case PREDEF_TYPE_PSEUDO_OBJECT:
7340       T = Context.PseudoObjectTy;
7341       break;
7342     case PREDEF_TYPE_DEPENDENT_ID:
7343       T = Context.DependentTy;
7344       break;
7345     case PREDEF_TYPE_UNKNOWN_ANY:
7346       T = Context.UnknownAnyTy;
7347       break;
7348     case PREDEF_TYPE_NULLPTR_ID:
7349       T = Context.NullPtrTy;
7350       break;
7351     case PREDEF_TYPE_CHAR8_ID:
7352       T = Context.Char8Ty;
7353       break;
7354     case PREDEF_TYPE_CHAR16_ID:
7355       T = Context.Char16Ty;
7356       break;
7357     case PREDEF_TYPE_CHAR32_ID:
7358       T = Context.Char32Ty;
7359       break;
7360     case PREDEF_TYPE_OBJC_ID:
7361       T = Context.ObjCBuiltinIdTy;
7362       break;
7363     case PREDEF_TYPE_OBJC_CLASS:
7364       T = Context.ObjCBuiltinClassTy;
7365       break;
7366     case PREDEF_TYPE_OBJC_SEL:
7367       T = Context.ObjCBuiltinSelTy;
7368       break;
7369 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7370     case PREDEF_TYPE_##Id##_ID: \
7371       T = Context.SingletonId; \
7372       break;
7373 #include "clang/Basic/OpenCLImageTypes.def"
7374 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7375     case PREDEF_TYPE_##Id##_ID: \
7376       T = Context.Id##Ty; \
7377       break;
7378 #include "clang/Basic/OpenCLExtensionTypes.def"
7379     case PREDEF_TYPE_SAMPLER_ID:
7380       T = Context.OCLSamplerTy;
7381       break;
7382     case PREDEF_TYPE_EVENT_ID:
7383       T = Context.OCLEventTy;
7384       break;
7385     case PREDEF_TYPE_CLK_EVENT_ID:
7386       T = Context.OCLClkEventTy;
7387       break;
7388     case PREDEF_TYPE_QUEUE_ID:
7389       T = Context.OCLQueueTy;
7390       break;
7391     case PREDEF_TYPE_RESERVE_ID_ID:
7392       T = Context.OCLReserveIDTy;
7393       break;
7394     case PREDEF_TYPE_AUTO_DEDUCT:
7395       T = Context.getAutoDeductType();
7396       break;
7397     case PREDEF_TYPE_AUTO_RREF_DEDUCT:
7398       T = Context.getAutoRRefDeductType();
7399       break;
7400     case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
7401       T = Context.ARCUnbridgedCastTy;
7402       break;
7403     case PREDEF_TYPE_BUILTIN_FN:
7404       T = Context.BuiltinFnTy;
7405       break;
7406     case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX:
7407       T = Context.IncompleteMatrixIdxTy;
7408       break;
7409     case PREDEF_TYPE_ARRAY_SECTION:
7410       T = Context.ArraySectionTy;
7411       break;
7412     case PREDEF_TYPE_OMP_ARRAY_SHAPING:
7413       T = Context.OMPArrayShapingTy;
7414       break;
7415     case PREDEF_TYPE_OMP_ITERATOR:
7416       T = Context.OMPIteratorTy;
7417       break;
7418 #define SVE_TYPE(Name, Id, SingletonId) \
7419     case PREDEF_TYPE_##Id##_ID: \
7420       T = Context.SingletonId; \
7421       break;
7422 #include "clang/Basic/AArch64SVEACLETypes.def"
7423 #define PPC_VECTOR_TYPE(Name, Id, Size) \
7424     case PREDEF_TYPE_##Id##_ID: \
7425       T = Context.Id##Ty; \
7426       break;
7427 #include "clang/Basic/PPCTypes.def"
7428 #define RVV_TYPE(Name, Id, SingletonId) \
7429     case PREDEF_TYPE_##Id##_ID: \
7430       T = Context.SingletonId; \
7431       break;
7432 #include "clang/Basic/RISCVVTypes.def"
7433 #define WASM_TYPE(Name, Id, SingletonId)                                       \
7434   case PREDEF_TYPE_##Id##_ID:                                                  \
7435     T = Context.SingletonId;                                                   \
7436     break;
7437 #include "clang/Basic/WebAssemblyReferenceTypes.def"
7438 #define AMDGPU_TYPE(Name, Id, SingletonId)                                     \
7439   case PREDEF_TYPE_##Id##_ID:                                                  \
7440     T = Context.SingletonId;                                                   \
7441     break;
7442 #include "clang/Basic/AMDGPUTypes.def"
7443     }
7444 
7445     assert(!T.isNull() && "Unknown predefined type");
7446     return T.withFastQualifiers(FastQuals);
7447   }
7448 
7449   unsigned Index = translateTypeIDToIndex(ID).second;
7450 
7451   assert(Index < TypesLoaded.size() && "Type index out-of-range");
7452   if (TypesLoaded[Index].isNull()) {
7453     TypesLoaded[Index] = readTypeRecord(ID);
7454     if (TypesLoaded[Index].isNull())
7455       return QualType();
7456 
7457     TypesLoaded[Index]->setFromAST();
7458     if (DeserializationListener)
7459       DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
7460                                         TypesLoaded[Index]);
7461   }
7462 
7463   return TypesLoaded[Index].withFastQualifiers(FastQuals);
7464 }
7465 
getLocalType(ModuleFile & F,LocalTypeID LocalID)7466 QualType ASTReader::getLocalType(ModuleFile &F, LocalTypeID LocalID) {
7467   return GetType(getGlobalTypeID(F, LocalID));
7468 }
7469 
getGlobalTypeID(ModuleFile & F,LocalTypeID LocalID) const7470 serialization::TypeID ASTReader::getGlobalTypeID(ModuleFile &F,
7471                                                  LocalTypeID LocalID) const {
7472   if (isPredefinedType(LocalID))
7473     return LocalID;
7474 
7475   if (!F.ModuleOffsetMap.empty())
7476     ReadModuleOffsetMap(F);
7477 
7478   unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID);
7479   LocalID &= llvm::maskTrailingOnes<TypeID>(32);
7480 
7481   if (ModuleFileIndex == 0)
7482     LocalID -= NUM_PREDEF_TYPE_IDS << Qualifiers::FastWidth;
7483 
7484   ModuleFile &MF =
7485       ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F;
7486   ModuleFileIndex = MF.Index + 1;
7487   return ((uint64_t)ModuleFileIndex << 32) | LocalID;
7488 }
7489 
7490 TemplateArgumentLocInfo
readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)7491 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) {
7492   switch (Kind) {
7493   case TemplateArgument::Expression:
7494     return readExpr();
7495   case TemplateArgument::Type:
7496     return readTypeSourceInfo();
7497   case TemplateArgument::Template: {
7498     NestedNameSpecifierLoc QualifierLoc =
7499       readNestedNameSpecifierLoc();
7500     SourceLocation TemplateNameLoc = readSourceLocation();
7501     return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7502                                    TemplateNameLoc, SourceLocation());
7503   }
7504   case TemplateArgument::TemplateExpansion: {
7505     NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc();
7506     SourceLocation TemplateNameLoc = readSourceLocation();
7507     SourceLocation EllipsisLoc = readSourceLocation();
7508     return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7509                                    TemplateNameLoc, EllipsisLoc);
7510   }
7511   case TemplateArgument::Null:
7512   case TemplateArgument::Integral:
7513   case TemplateArgument::Declaration:
7514   case TemplateArgument::NullPtr:
7515   case TemplateArgument::StructuralValue:
7516   case TemplateArgument::Pack:
7517     // FIXME: Is this right?
7518     return TemplateArgumentLocInfo();
7519   }
7520   llvm_unreachable("unexpected template argument loc");
7521 }
7522 
readTemplateArgumentLoc()7523 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() {
7524   TemplateArgument Arg = readTemplateArgument();
7525 
7526   if (Arg.getKind() == TemplateArgument::Expression) {
7527     if (readBool()) // bool InfoHasSameExpr.
7528       return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
7529   }
7530   return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind()));
7531 }
7532 
readTemplateArgumentListInfo(TemplateArgumentListInfo & Result)7533 void ASTRecordReader::readTemplateArgumentListInfo(
7534     TemplateArgumentListInfo &Result) {
7535   Result.setLAngleLoc(readSourceLocation());
7536   Result.setRAngleLoc(readSourceLocation());
7537   unsigned NumArgsAsWritten = readInt();
7538   for (unsigned i = 0; i != NumArgsAsWritten; ++i)
7539     Result.addArgument(readTemplateArgumentLoc());
7540 }
7541 
7542 const ASTTemplateArgumentListInfo *
readASTTemplateArgumentListInfo()7543 ASTRecordReader::readASTTemplateArgumentListInfo() {
7544   TemplateArgumentListInfo Result;
7545   readTemplateArgumentListInfo(Result);
7546   return ASTTemplateArgumentListInfo::Create(getContext(), Result);
7547 }
7548 
GetExternalDecl(GlobalDeclID ID)7549 Decl *ASTReader::GetExternalDecl(GlobalDeclID ID) { return GetDecl(ID); }
7550 
CompleteRedeclChain(const Decl * D)7551 void ASTReader::CompleteRedeclChain(const Decl *D) {
7552   if (NumCurrentElementsDeserializing) {
7553     // We arrange to not care about the complete redeclaration chain while we're
7554     // deserializing. Just remember that the AST has marked this one as complete
7555     // but that it's not actually complete yet, so we know we still need to
7556     // complete it later.
7557     PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7558     return;
7559   }
7560 
7561   if (!D->getDeclContext()) {
7562     assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
7563     return;
7564   }
7565 
7566   const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7567 
7568   // If this is a named declaration, complete it by looking it up
7569   // within its context.
7570   //
7571   // FIXME: Merging a function definition should merge
7572   // all mergeable entities within it.
7573   if (isa<TranslationUnitDecl, NamespaceDecl, RecordDecl, EnumDecl>(DC)) {
7574     if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
7575       if (!getContext().getLangOpts().CPlusPlus &&
7576           isa<TranslationUnitDecl>(DC)) {
7577         // Outside of C++, we don't have a lookup table for the TU, so update
7578         // the identifier instead. (For C++ modules, we don't store decls
7579         // in the serialized identifier table, so we do the lookup in the TU.)
7580         auto *II = Name.getAsIdentifierInfo();
7581         assert(II && "non-identifier name in C?");
7582         if (II->isOutOfDate())
7583           updateOutOfDateIdentifier(*II);
7584       } else
7585         DC->lookup(Name);
7586     } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
7587       // Find all declarations of this kind from the relevant context.
7588       for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7589         auto *DC = cast<DeclContext>(DCDecl);
7590         SmallVector<Decl*, 8> Decls;
7591         FindExternalLexicalDecls(
7592             DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7593       }
7594     }
7595   }
7596 
7597   if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
7598     CTSD->getSpecializedTemplate()->LoadLazySpecializations();
7599   if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
7600     VTSD->getSpecializedTemplate()->LoadLazySpecializations();
7601   if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7602     if (auto *Template = FD->getPrimaryTemplate())
7603       Template->LoadLazySpecializations();
7604   }
7605 }
7606 
7607 CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)7608 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7609   RecordLocation Loc = getLocalBitOffset(Offset);
7610   BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7611   SavedStreamPosition SavedPosition(Cursor);
7612   if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7613     Error(std::move(Err));
7614     return nullptr;
7615   }
7616   ReadingKindTracker ReadingKind(Read_Decl, *this);
7617   Deserializing D(this);
7618 
7619   Expected<unsigned> MaybeCode = Cursor.ReadCode();
7620   if (!MaybeCode) {
7621     Error(MaybeCode.takeError());
7622     return nullptr;
7623   }
7624   unsigned Code = MaybeCode.get();
7625 
7626   ASTRecordReader Record(*this, *Loc.F);
7627   Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
7628   if (!MaybeRecCode) {
7629     Error(MaybeRecCode.takeError());
7630     return nullptr;
7631   }
7632   if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
7633     Error("malformed AST file: missing C++ ctor initializers");
7634     return nullptr;
7635   }
7636 
7637   return Record.readCXXCtorInitializers();
7638 }
7639 
GetExternalCXXBaseSpecifiers(uint64_t Offset)7640 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
7641   assert(ContextObj && "reading base specifiers with no AST context");
7642   ASTContext &Context = *ContextObj;
7643 
7644   RecordLocation Loc = getLocalBitOffset(Offset);
7645   BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7646   SavedStreamPosition SavedPosition(Cursor);
7647   if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7648     Error(std::move(Err));
7649     return nullptr;
7650   }
7651   ReadingKindTracker ReadingKind(Read_Decl, *this);
7652   Deserializing D(this);
7653 
7654   Expected<unsigned> MaybeCode = Cursor.ReadCode();
7655   if (!MaybeCode) {
7656     Error(MaybeCode.takeError());
7657     return nullptr;
7658   }
7659   unsigned Code = MaybeCode.get();
7660 
7661   ASTRecordReader Record(*this, *Loc.F);
7662   Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
7663   if (!MaybeRecCode) {
7664     Error(MaybeCode.takeError());
7665     return nullptr;
7666   }
7667   unsigned RecCode = MaybeRecCode.get();
7668 
7669   if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
7670     Error("malformed AST file: missing C++ base specifiers");
7671     return nullptr;
7672   }
7673 
7674   unsigned NumBases = Record.readInt();
7675   void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
7676   CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
7677   for (unsigned I = 0; I != NumBases; ++I)
7678     Bases[I] = Record.readCXXBaseSpecifier();
7679   return Bases;
7680 }
7681 
getGlobalDeclID(ModuleFile & F,LocalDeclID LocalID) const7682 GlobalDeclID ASTReader::getGlobalDeclID(ModuleFile &F,
7683                                         LocalDeclID LocalID) const {
7684   if (LocalID < NUM_PREDEF_DECL_IDS)
7685     return GlobalDeclID(LocalID.getRawValue());
7686 
7687   unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex();
7688   DeclID ID = LocalID.getLocalDeclIndex();
7689 
7690   if (!F.ModuleOffsetMap.empty())
7691     ReadModuleOffsetMap(F);
7692 
7693   ModuleFile *OwningModuleFile =
7694       OwningModuleFileIndex == 0
7695           ? &F
7696           : F.TransitiveImports[OwningModuleFileIndex - 1];
7697 
7698   if (OwningModuleFileIndex == 0)
7699     ID -= NUM_PREDEF_DECL_IDS;
7700 
7701   uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1;
7702   return GlobalDeclID(NewModuleFileIndex, ID);
7703 }
7704 
isDeclIDFromModule(GlobalDeclID ID,ModuleFile & M) const7705 bool ASTReader::isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const {
7706   // Predefined decls aren't from any module.
7707   if (ID < NUM_PREDEF_DECL_IDS)
7708     return false;
7709 
7710   unsigned ModuleFileIndex = ID.getModuleFileIndex();
7711   return M.Index == ModuleFileIndex - 1;
7712 }
7713 
getOwningModuleFile(GlobalDeclID ID) const7714 ModuleFile *ASTReader::getOwningModuleFile(GlobalDeclID ID) const {
7715   // Predefined decls aren't from any module.
7716   if (ID < NUM_PREDEF_DECL_IDS)
7717     return nullptr;
7718 
7719   uint64_t ModuleFileIndex = ID.getModuleFileIndex();
7720   assert(ModuleFileIndex && "Untranslated Local Decl?");
7721 
7722   return &getModuleManager()[ModuleFileIndex - 1];
7723 }
7724 
getOwningModuleFile(const Decl * D) const7725 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) const {
7726   if (!D->isFromASTFile())
7727     return nullptr;
7728 
7729   return getOwningModuleFile(D->getGlobalID());
7730 }
7731 
getSourceLocationForDeclID(GlobalDeclID ID)7732 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
7733   if (ID < NUM_PREDEF_DECL_IDS)
7734     return SourceLocation();
7735 
7736   if (Decl *D = GetExistingDecl(ID))
7737     return D->getLocation();
7738 
7739   SourceLocation Loc;
7740   DeclCursorForID(ID, Loc);
7741   return Loc;
7742 }
7743 
getPredefinedDecl(ASTContext & Context,PredefinedDeclIDs ID)7744 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
7745   switch (ID) {
7746   case PREDEF_DECL_NULL_ID:
7747     return nullptr;
7748 
7749   case PREDEF_DECL_TRANSLATION_UNIT_ID:
7750     return Context.getTranslationUnitDecl();
7751 
7752   case PREDEF_DECL_OBJC_ID_ID:
7753     return Context.getObjCIdDecl();
7754 
7755   case PREDEF_DECL_OBJC_SEL_ID:
7756     return Context.getObjCSelDecl();
7757 
7758   case PREDEF_DECL_OBJC_CLASS_ID:
7759     return Context.getObjCClassDecl();
7760 
7761   case PREDEF_DECL_OBJC_PROTOCOL_ID:
7762     return Context.getObjCProtocolDecl();
7763 
7764   case PREDEF_DECL_INT_128_ID:
7765     return Context.getInt128Decl();
7766 
7767   case PREDEF_DECL_UNSIGNED_INT_128_ID:
7768     return Context.getUInt128Decl();
7769 
7770   case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7771     return Context.getObjCInstanceTypeDecl();
7772 
7773   case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7774     return Context.getBuiltinVaListDecl();
7775 
7776   case PREDEF_DECL_VA_LIST_TAG:
7777     return Context.getVaListTagDecl();
7778 
7779   case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7780     return Context.getBuiltinMSVaListDecl();
7781 
7782   case PREDEF_DECL_BUILTIN_MS_GUID_ID:
7783     return Context.getMSGuidTagDecl();
7784 
7785   case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7786     return Context.getExternCContextDecl();
7787 
7788   case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7789     return Context.getMakeIntegerSeqDecl();
7790 
7791   case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7792     return Context.getCFConstantStringDecl();
7793 
7794   case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7795     return Context.getCFConstantStringTagDecl();
7796 
7797   case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7798     return Context.getTypePackElementDecl();
7799   }
7800   llvm_unreachable("PredefinedDeclIDs unknown enum value");
7801 }
7802 
translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const7803 unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const {
7804   ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
7805   if (!OwningModuleFile) {
7806     assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?");
7807     return GlobalID.getRawValue();
7808   }
7809 
7810   return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex();
7811 }
7812 
GetExistingDecl(GlobalDeclID ID)7813 Decl *ASTReader::GetExistingDecl(GlobalDeclID ID) {
7814   assert(ContextObj && "reading decl with no AST context");
7815 
7816   if (ID < NUM_PREDEF_DECL_IDS) {
7817     Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
7818     if (D) {
7819       // Track that we have merged the declaration with ID \p ID into the
7820       // pre-existing predefined declaration \p D.
7821       auto &Merged = KeyDecls[D->getCanonicalDecl()];
7822       if (Merged.empty())
7823         Merged.push_back(ID);
7824     }
7825     return D;
7826   }
7827 
7828   unsigned Index = translateGlobalDeclIDToIndex(ID);
7829 
7830   if (Index >= DeclsLoaded.size()) {
7831     assert(0 && "declaration ID out-of-range for AST file");
7832     Error("declaration ID out-of-range for AST file");
7833     return nullptr;
7834   }
7835 
7836   return DeclsLoaded[Index];
7837 }
7838 
GetDecl(GlobalDeclID ID)7839 Decl *ASTReader::GetDecl(GlobalDeclID ID) {
7840   if (ID < NUM_PREDEF_DECL_IDS)
7841     return GetExistingDecl(ID);
7842 
7843   unsigned Index = translateGlobalDeclIDToIndex(ID);
7844 
7845   if (Index >= DeclsLoaded.size()) {
7846     assert(0 && "declaration ID out-of-range for AST file");
7847     Error("declaration ID out-of-range for AST file");
7848     return nullptr;
7849   }
7850 
7851   if (!DeclsLoaded[Index]) {
7852     ReadDeclRecord(ID);
7853     if (DeserializationListener)
7854       DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
7855   }
7856 
7857   return DeclsLoaded[Index];
7858 }
7859 
mapGlobalIDToModuleFileGlobalID(ModuleFile & M,GlobalDeclID GlobalID)7860 LocalDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
7861                                                        GlobalDeclID GlobalID) {
7862   if (GlobalID < NUM_PREDEF_DECL_IDS)
7863     return LocalDeclID::get(*this, M, GlobalID.getRawValue());
7864 
7865   if (!M.ModuleOffsetMap.empty())
7866     ReadModuleOffsetMap(M);
7867 
7868   ModuleFile *Owner = getOwningModuleFile(GlobalID);
7869   DeclID ID = GlobalID.getLocalDeclIndex();
7870 
7871   if (Owner == &M) {
7872     ID += NUM_PREDEF_DECL_IDS;
7873     return LocalDeclID::get(*this, M, ID);
7874   }
7875 
7876   uint64_t OrignalModuleFileIndex = 0;
7877   for (unsigned I = 0; I < M.TransitiveImports.size(); I++)
7878     if (M.TransitiveImports[I] == Owner) {
7879       OrignalModuleFileIndex = I + 1;
7880       break;
7881     }
7882 
7883   if (!OrignalModuleFileIndex)
7884     return LocalDeclID();
7885 
7886   return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID);
7887 }
7888 
ReadDeclID(ModuleFile & F,const RecordDataImpl & Record,unsigned & Idx)7889 GlobalDeclID ASTReader::ReadDeclID(ModuleFile &F, const RecordDataImpl &Record,
7890                                    unsigned &Idx) {
7891   if (Idx >= Record.size()) {
7892     Error("Corrupted AST file");
7893     return GlobalDeclID(0);
7894   }
7895 
7896   return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
7897 }
7898 
7899 /// Resolve the offset of a statement into a statement.
7900 ///
7901 /// This operation will read a new statement from the external
7902 /// source each time it is called, and is meant to be used via a
7903 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
GetExternalDeclStmt(uint64_t Offset)7904 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
7905   // Switch case IDs are per Decl.
7906   ClearSwitchCaseIDs();
7907 
7908   // Offset here is a global offset across the entire chain.
7909   RecordLocation Loc = getLocalBitOffset(Offset);
7910   if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
7911     Error(std::move(Err));
7912     return nullptr;
7913   }
7914   assert(NumCurrentElementsDeserializing == 0 &&
7915          "should not be called while already deserializing");
7916   Deserializing D(this);
7917   return ReadStmtFromStream(*Loc.F);
7918 }
7919 
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Decls)7920 void ASTReader::FindExternalLexicalDecls(
7921     const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
7922     SmallVectorImpl<Decl *> &Decls) {
7923   bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
7924 
7925   auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
7926     assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
7927     for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
7928       auto K = (Decl::Kind)+LexicalDecls[I];
7929       if (!IsKindWeWant(K))
7930         continue;
7931 
7932       auto ID = (DeclID) + LexicalDecls[I + 1];
7933 
7934       // Don't add predefined declarations to the lexical context more
7935       // than once.
7936       if (ID < NUM_PREDEF_DECL_IDS) {
7937         if (PredefsVisited[ID])
7938           continue;
7939 
7940         PredefsVisited[ID] = true;
7941       }
7942 
7943       if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) {
7944         assert(D->getKind() == K && "wrong kind for lexical decl");
7945         if (!DC->isDeclInLexicalTraversal(D))
7946           Decls.push_back(D);
7947       }
7948     }
7949   };
7950 
7951   if (isa<TranslationUnitDecl>(DC)) {
7952     for (const auto &Lexical : TULexicalDecls)
7953       Visit(Lexical.first, Lexical.second);
7954   } else {
7955     auto I = LexicalDecls.find(DC);
7956     if (I != LexicalDecls.end())
7957       Visit(I->second.first, I->second.second);
7958   }
7959 
7960   ++NumLexicalDeclContextsRead;
7961 }
7962 
7963 namespace {
7964 
7965 class UnalignedDeclIDComp {
7966   ASTReader &Reader;
7967   ModuleFile &Mod;
7968 
7969 public:
UnalignedDeclIDComp(ASTReader & Reader,ModuleFile & M)7970   UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M)
7971       : Reader(Reader), Mod(M) {}
7972 
operator ()(unaligned_decl_id_t L,unaligned_decl_id_t R) const7973   bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const {
7974     SourceLocation LHS = getLocation(L);
7975     SourceLocation RHS = getLocation(R);
7976     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7977   }
7978 
operator ()(SourceLocation LHS,unaligned_decl_id_t R) const7979   bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const {
7980     SourceLocation RHS = getLocation(R);
7981     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7982   }
7983 
operator ()(unaligned_decl_id_t L,SourceLocation RHS) const7984   bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const {
7985     SourceLocation LHS = getLocation(L);
7986     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
7987   }
7988 
getLocation(unaligned_decl_id_t ID) const7989   SourceLocation getLocation(unaligned_decl_id_t ID) const {
7990     return Reader.getSourceManager().getFileLoc(
7991         Reader.getSourceLocationForDeclID(
7992             Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID))));
7993   }
7994 };
7995 
7996 } // namespace
7997 
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)7998 void ASTReader::FindFileRegionDecls(FileID File,
7999                                     unsigned Offset, unsigned Length,
8000                                     SmallVectorImpl<Decl *> &Decls) {
8001   SourceManager &SM = getSourceManager();
8002 
8003   llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
8004   if (I == FileDeclIDs.end())
8005     return;
8006 
8007   FileDeclsInfo &DInfo = I->second;
8008   if (DInfo.Decls.empty())
8009     return;
8010 
8011   SourceLocation
8012     BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
8013   SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
8014 
8015   UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod);
8016   ArrayRef<unaligned_decl_id_t>::iterator BeginIt =
8017       llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8018   if (BeginIt != DInfo.Decls.begin())
8019     --BeginIt;
8020 
8021   // If we are pointing at a top-level decl inside an objc container, we need
8022   // to backtrack until we find it otherwise we will fail to report that the
8023   // region overlaps with an objc container.
8024   while (BeginIt != DInfo.Decls.begin() &&
8025          GetDecl(getGlobalDeclID(*DInfo.Mod,
8026                                  LocalDeclID::get(*this, *DInfo.Mod, *BeginIt)))
8027              ->isTopLevelDeclInObjCContainer())
8028     --BeginIt;
8029 
8030   ArrayRef<unaligned_decl_id_t>::iterator EndIt =
8031       llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8032   if (EndIt != DInfo.Decls.end())
8033     ++EndIt;
8034 
8035   for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt;
8036        ++DIt)
8037     Decls.push_back(GetDecl(getGlobalDeclID(
8038         *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt))));
8039 }
8040 
8041 bool
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)8042 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
8043                                           DeclarationName Name) {
8044   assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
8045          "DeclContext has no visible decls in storage");
8046   if (!Name)
8047     return false;
8048 
8049   auto It = Lookups.find(DC);
8050   if (It == Lookups.end())
8051     return false;
8052 
8053   Deserializing LookupResults(this);
8054 
8055   // Load the list of declarations.
8056   SmallVector<NamedDecl *, 64> Decls;
8057   llvm::SmallPtrSet<NamedDecl *, 8> Found;
8058 
8059   for (GlobalDeclID ID : It->second.Table.find(Name)) {
8060     NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8061     if (ND->getDeclName() == Name && Found.insert(ND).second)
8062       Decls.push_back(ND);
8063   }
8064 
8065   ++NumVisibleDeclContextsRead;
8066   SetExternalVisibleDeclsForName(DC, Name, Decls);
8067   return !Decls.empty();
8068 }
8069 
completeVisibleDeclsMap(const DeclContext * DC)8070 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
8071   if (!DC->hasExternalVisibleStorage())
8072     return;
8073 
8074   auto It = Lookups.find(DC);
8075   assert(It != Lookups.end() &&
8076          "have external visible storage but no lookup tables");
8077 
8078   DeclsMap Decls;
8079 
8080   for (GlobalDeclID ID : It->second.Table.findAll()) {
8081     NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8082     Decls[ND->getDeclName()].push_back(ND);
8083   }
8084 
8085   ++NumVisibleDeclContextsRead;
8086 
8087   for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
8088     SetExternalVisibleDeclsForName(DC, I->first, I->second);
8089   }
8090   const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
8091 }
8092 
8093 const serialization::reader::DeclContextLookupTable *
getLoadedLookupTables(DeclContext * Primary) const8094 ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
8095   auto I = Lookups.find(Primary);
8096   return I == Lookups.end() ? nullptr : &I->second;
8097 }
8098 
8099 /// Under non-PCH compilation the consumer receives the objc methods
8100 /// before receiving the implementation, and codegen depends on this.
8101 /// We simulate this by deserializing and passing to consumer the methods of the
8102 /// implementation before passing the deserialized implementation decl.
PassObjCImplDeclToConsumer(ObjCImplDecl * ImplD,ASTConsumer * Consumer)8103 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
8104                                        ASTConsumer *Consumer) {
8105   assert(ImplD && Consumer);
8106 
8107   for (auto *I : ImplD->methods())
8108     Consumer->HandleInterestingDecl(DeclGroupRef(I));
8109 
8110   Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
8111 }
8112 
PassInterestingDeclToConsumer(Decl * D)8113 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8114   if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8115     PassObjCImplDeclToConsumer(ImplD, Consumer);
8116   else
8117     Consumer->HandleInterestingDecl(DeclGroupRef(D));
8118 }
8119 
PassVTableToConsumer(CXXRecordDecl * RD)8120 void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8121   Consumer->HandleVTable(RD);
8122 }
8123 
StartTranslationUnit(ASTConsumer * Consumer)8124 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
8125   this->Consumer = Consumer;
8126 
8127   if (Consumer)
8128     PassInterestingDeclsToConsumer();
8129 
8130   if (DeserializationListener)
8131     DeserializationListener->ReaderInitialized(this);
8132 }
8133 
PrintStats()8134 void ASTReader::PrintStats() {
8135   std::fprintf(stderr, "*** AST File Statistics:\n");
8136 
8137   unsigned NumTypesLoaded =
8138       TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), QualType());
8139   unsigned NumDeclsLoaded =
8140       DeclsLoaded.size() -
8141       llvm::count(DeclsLoaded.materialized(), (Decl *)nullptr);
8142   unsigned NumIdentifiersLoaded =
8143       IdentifiersLoaded.size() -
8144       llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
8145   unsigned NumMacrosLoaded =
8146       MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
8147   unsigned NumSelectorsLoaded =
8148       SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
8149 
8150   if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
8151     std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
8152                  NumSLocEntriesRead, TotalNumSLocEntries,
8153                  ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
8154   if (!TypesLoaded.empty())
8155     std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
8156                  NumTypesLoaded, (unsigned)TypesLoaded.size(),
8157                  ((float)NumTypesLoaded/TypesLoaded.size() * 100));
8158   if (!DeclsLoaded.empty())
8159     std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
8160                  NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
8161                  ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
8162   if (!IdentifiersLoaded.empty())
8163     std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
8164                  NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
8165                  ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
8166   if (!MacrosLoaded.empty())
8167     std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
8168                  NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
8169                  ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
8170   if (!SelectorsLoaded.empty())
8171     std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
8172                  NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
8173                  ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
8174   if (TotalNumStatements)
8175     std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
8176                  NumStatementsRead, TotalNumStatements,
8177                  ((float)NumStatementsRead/TotalNumStatements * 100));
8178   if (TotalNumMacros)
8179     std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
8180                  NumMacrosRead, TotalNumMacros,
8181                  ((float)NumMacrosRead/TotalNumMacros * 100));
8182   if (TotalLexicalDeclContexts)
8183     std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
8184                  NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
8185                  ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
8186                   * 100));
8187   if (TotalVisibleDeclContexts)
8188     std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
8189                  NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
8190                  ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
8191                   * 100));
8192   if (TotalNumMethodPoolEntries)
8193     std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
8194                  NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
8195                  ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
8196                   * 100));
8197   if (NumMethodPoolLookups)
8198     std::fprintf(stderr, "  %u/%u method pool lookups succeeded (%f%%)\n",
8199                  NumMethodPoolHits, NumMethodPoolLookups,
8200                  ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
8201   if (NumMethodPoolTableLookups)
8202     std::fprintf(stderr, "  %u/%u method pool table lookups succeeded (%f%%)\n",
8203                  NumMethodPoolTableHits, NumMethodPoolTableLookups,
8204                  ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
8205                   * 100.0));
8206   if (NumIdentifierLookupHits)
8207     std::fprintf(stderr,
8208                  "  %u / %u identifier table lookups succeeded (%f%%)\n",
8209                  NumIdentifierLookupHits, NumIdentifierLookups,
8210                  (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
8211 
8212   if (GlobalIndex) {
8213     std::fprintf(stderr, "\n");
8214     GlobalIndex->printStats();
8215   }
8216 
8217   std::fprintf(stderr, "\n");
8218   dump();
8219   std::fprintf(stderr, "\n");
8220 }
8221 
8222 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
8223 LLVM_DUMP_METHOD static void
dumpModuleIDMap(StringRef Name,const ContinuousRangeMap<Key,ModuleFile *,InitialCapacity> & Map)8224 dumpModuleIDMap(StringRef Name,
8225                 const ContinuousRangeMap<Key, ModuleFile *,
8226                                          InitialCapacity> &Map) {
8227   if (Map.begin() == Map.end())
8228     return;
8229 
8230   using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
8231 
8232   llvm::errs() << Name << ":\n";
8233   for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
8234        I != IEnd; ++I)
8235     llvm::errs() << "  " << (DeclID)I->first << " -> " << I->second->FileName
8236                  << "\n";
8237 }
8238 
dump()8239 LLVM_DUMP_METHOD void ASTReader::dump() {
8240   llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
8241   dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
8242   dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
8243   dumpModuleIDMap("Global macro map", GlobalMacroMap);
8244   dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
8245   dumpModuleIDMap("Global selector map", GlobalSelectorMap);
8246   dumpModuleIDMap("Global preprocessed entity map",
8247                   GlobalPreprocessedEntityMap);
8248 
8249   llvm::errs() << "\n*** PCH/Modules Loaded:";
8250   for (ModuleFile &M : ModuleMgr)
8251     M.dump();
8252 }
8253 
8254 /// Return the amount of memory used by memory buffers, breaking down
8255 /// by heap-backed versus mmap'ed memory.
getMemoryBufferSizes(MemoryBufferSizes & sizes) const8256 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
8257   for (ModuleFile &I : ModuleMgr) {
8258     if (llvm::MemoryBuffer *buf = I.Buffer) {
8259       size_t bytes = buf->getBufferSize();
8260       switch (buf->getBufferKind()) {
8261         case llvm::MemoryBuffer::MemoryBuffer_Malloc:
8262           sizes.malloc_bytes += bytes;
8263           break;
8264         case llvm::MemoryBuffer::MemoryBuffer_MMap:
8265           sizes.mmap_bytes += bytes;
8266           break;
8267       }
8268     }
8269   }
8270 }
8271 
InitializeSema(Sema & S)8272 void ASTReader::InitializeSema(Sema &S) {
8273   SemaObj = &S;
8274   S.addExternalSource(this);
8275 
8276   // Makes sure any declarations that were deserialized "too early"
8277   // still get added to the identifier's declaration chains.
8278   for (GlobalDeclID ID : PreloadedDeclIDs) {
8279     NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
8280     pushExternalDeclIntoScope(D, D->getDeclName());
8281   }
8282   PreloadedDeclIDs.clear();
8283 
8284   // FIXME: What happens if these are changed by a module import?
8285   if (!FPPragmaOptions.empty()) {
8286     assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
8287     FPOptionsOverride NewOverrides =
8288         FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
8289     SemaObj->CurFPFeatures =
8290         NewOverrides.applyOverrides(SemaObj->getLangOpts());
8291   }
8292 
8293   SemaObj->OpenCLFeatures = OpenCLExtensions;
8294 
8295   UpdateSema();
8296 }
8297 
UpdateSema()8298 void ASTReader::UpdateSema() {
8299   assert(SemaObj && "no Sema to update");
8300 
8301   // Load the offsets of the declarations that Sema references.
8302   // They will be lazily deserialized when needed.
8303   if (!SemaDeclRefs.empty()) {
8304     assert(SemaDeclRefs.size() % 3 == 0);
8305     for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
8306       if (!SemaObj->StdNamespace)
8307         SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
8308       if (!SemaObj->StdBadAlloc)
8309         SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
8310       if (!SemaObj->StdAlignValT)
8311         SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
8312     }
8313     SemaDeclRefs.clear();
8314   }
8315 
8316   // Update the state of pragmas. Use the same API as if we had encountered the
8317   // pragma in the source.
8318   if(OptimizeOffPragmaLocation.isValid())
8319     SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
8320   if (PragmaMSStructState != -1)
8321     SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
8322   if (PointersToMembersPragmaLocation.isValid()) {
8323     SemaObj->ActOnPragmaMSPointersToMembers(
8324         (LangOptions::PragmaMSPointersToMembersKind)
8325             PragmaMSPointersToMembersState,
8326         PointersToMembersPragmaLocation);
8327   }
8328   SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
8329 
8330   if (PragmaAlignPackCurrentValue) {
8331     // The bottom of the stack might have a default value. It must be adjusted
8332     // to the current value to ensure that the packing state is preserved after
8333     // popping entries that were included/imported from a PCH/module.
8334     bool DropFirst = false;
8335     if (!PragmaAlignPackStack.empty() &&
8336         PragmaAlignPackStack.front().Location.isInvalid()) {
8337       assert(PragmaAlignPackStack.front().Value ==
8338                  SemaObj->AlignPackStack.DefaultValue &&
8339              "Expected a default alignment value");
8340       SemaObj->AlignPackStack.Stack.emplace_back(
8341           PragmaAlignPackStack.front().SlotLabel,
8342           SemaObj->AlignPackStack.CurrentValue,
8343           SemaObj->AlignPackStack.CurrentPragmaLocation,
8344           PragmaAlignPackStack.front().PushLocation);
8345       DropFirst = true;
8346     }
8347     for (const auto &Entry :
8348          llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
8349       SemaObj->AlignPackStack.Stack.emplace_back(
8350           Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
8351     }
8352     if (PragmaAlignPackCurrentLocation.isInvalid()) {
8353       assert(*PragmaAlignPackCurrentValue ==
8354                  SemaObj->AlignPackStack.DefaultValue &&
8355              "Expected a default align and pack value");
8356       // Keep the current values.
8357     } else {
8358       SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
8359       SemaObj->AlignPackStack.CurrentPragmaLocation =
8360           PragmaAlignPackCurrentLocation;
8361     }
8362   }
8363   if (FpPragmaCurrentValue) {
8364     // The bottom of the stack might have a default value. It must be adjusted
8365     // to the current value to ensure that fp-pragma state is preserved after
8366     // popping entries that were included/imported from a PCH/module.
8367     bool DropFirst = false;
8368     if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
8369       assert(FpPragmaStack.front().Value ==
8370                  SemaObj->FpPragmaStack.DefaultValue &&
8371              "Expected a default pragma float_control value");
8372       SemaObj->FpPragmaStack.Stack.emplace_back(
8373           FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
8374           SemaObj->FpPragmaStack.CurrentPragmaLocation,
8375           FpPragmaStack.front().PushLocation);
8376       DropFirst = true;
8377     }
8378     for (const auto &Entry :
8379          llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
8380       SemaObj->FpPragmaStack.Stack.emplace_back(
8381           Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
8382     if (FpPragmaCurrentLocation.isInvalid()) {
8383       assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
8384              "Expected a default pragma float_control value");
8385       // Keep the current values.
8386     } else {
8387       SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
8388       SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
8389     }
8390   }
8391 
8392   // For non-modular AST files, restore visiblity of modules.
8393   for (auto &Import : PendingImportedModulesSema) {
8394     if (Import.ImportLoc.isInvalid())
8395       continue;
8396     if (Module *Imported = getSubmodule(Import.ID)) {
8397       SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
8398     }
8399   }
8400   PendingImportedModulesSema.clear();
8401 }
8402 
get(StringRef Name)8403 IdentifierInfo *ASTReader::get(StringRef Name) {
8404   // Note that we are loading an identifier.
8405   Deserializing AnIdentifier(this);
8406 
8407   IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
8408                                   NumIdentifierLookups,
8409                                   NumIdentifierLookupHits);
8410 
8411   // We don't need to do identifier table lookups in C++ modules (we preload
8412   // all interesting declarations, and don't need to use the scope for name
8413   // lookups). Perform the lookup in PCH files, though, since we don't build
8414   // a complete initial identifier table if we're carrying on from a PCH.
8415   if (PP.getLangOpts().CPlusPlus) {
8416     for (auto *F : ModuleMgr.pch_modules())
8417       if (Visitor(*F))
8418         break;
8419   } else {
8420     // If there is a global index, look there first to determine which modules
8421     // provably do not have any results for this identifier.
8422     GlobalModuleIndex::HitSet Hits;
8423     GlobalModuleIndex::HitSet *HitsPtr = nullptr;
8424     if (!loadGlobalIndex()) {
8425       if (GlobalIndex->lookupIdentifier(Name, Hits)) {
8426         HitsPtr = &Hits;
8427       }
8428     }
8429 
8430     ModuleMgr.visit(Visitor, HitsPtr);
8431   }
8432 
8433   IdentifierInfo *II = Visitor.getIdentifierInfo();
8434   markIdentifierUpToDate(II);
8435   return II;
8436 }
8437 
8438 namespace clang {
8439 
8440   /// An identifier-lookup iterator that enumerates all of the
8441   /// identifiers stored within a set of AST files.
8442   class ASTIdentifierIterator : public IdentifierIterator {
8443     /// The AST reader whose identifiers are being enumerated.
8444     const ASTReader &Reader;
8445 
8446     /// The current index into the chain of AST files stored in
8447     /// the AST reader.
8448     unsigned Index;
8449 
8450     /// The current position within the identifier lookup table
8451     /// of the current AST file.
8452     ASTIdentifierLookupTable::key_iterator Current;
8453 
8454     /// The end position within the identifier lookup table of
8455     /// the current AST file.
8456     ASTIdentifierLookupTable::key_iterator End;
8457 
8458     /// Whether to skip any modules in the ASTReader.
8459     bool SkipModules;
8460 
8461   public:
8462     explicit ASTIdentifierIterator(const ASTReader &Reader,
8463                                    bool SkipModules = false);
8464 
8465     StringRef Next() override;
8466   };
8467 
8468 } // namespace clang
8469 
ASTIdentifierIterator(const ASTReader & Reader,bool SkipModules)8470 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
8471                                              bool SkipModules)
8472     : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
8473 }
8474 
Next()8475 StringRef ASTIdentifierIterator::Next() {
8476   while (Current == End) {
8477     // If we have exhausted all of our AST files, we're done.
8478     if (Index == 0)
8479       return StringRef();
8480 
8481     --Index;
8482     ModuleFile &F = Reader.ModuleMgr[Index];
8483     if (SkipModules && F.isModule())
8484       continue;
8485 
8486     ASTIdentifierLookupTable *IdTable =
8487         (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
8488     Current = IdTable->key_begin();
8489     End = IdTable->key_end();
8490   }
8491 
8492   // We have any identifiers remaining in the current AST file; return
8493   // the next one.
8494   StringRef Result = *Current;
8495   ++Current;
8496   return Result;
8497 }
8498 
8499 namespace {
8500 
8501 /// A utility for appending two IdentifierIterators.
8502 class ChainedIdentifierIterator : public IdentifierIterator {
8503   std::unique_ptr<IdentifierIterator> Current;
8504   std::unique_ptr<IdentifierIterator> Queued;
8505 
8506 public:
ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,std::unique_ptr<IdentifierIterator> Second)8507   ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
8508                             std::unique_ptr<IdentifierIterator> Second)
8509       : Current(std::move(First)), Queued(std::move(Second)) {}
8510 
Next()8511   StringRef Next() override {
8512     if (!Current)
8513       return StringRef();
8514 
8515     StringRef result = Current->Next();
8516     if (!result.empty())
8517       return result;
8518 
8519     // Try the queued iterator, which may itself be empty.
8520     Current.reset();
8521     std::swap(Current, Queued);
8522     return Next();
8523   }
8524 };
8525 
8526 } // namespace
8527 
getIdentifiers()8528 IdentifierIterator *ASTReader::getIdentifiers() {
8529   if (!loadGlobalIndex()) {
8530     std::unique_ptr<IdentifierIterator> ReaderIter(
8531         new ASTIdentifierIterator(*this, /*SkipModules=*/true));
8532     std::unique_ptr<IdentifierIterator> ModulesIter(
8533         GlobalIndex->createIdentifierIterator());
8534     return new ChainedIdentifierIterator(std::move(ReaderIter),
8535                                          std::move(ModulesIter));
8536   }
8537 
8538   return new ASTIdentifierIterator(*this);
8539 }
8540 
8541 namespace clang {
8542 namespace serialization {
8543 
8544   class ReadMethodPoolVisitor {
8545     ASTReader &Reader;
8546     Selector Sel;
8547     unsigned PriorGeneration;
8548     unsigned InstanceBits = 0;
8549     unsigned FactoryBits = 0;
8550     bool InstanceHasMoreThanOneDecl = false;
8551     bool FactoryHasMoreThanOneDecl = false;
8552     SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
8553     SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
8554 
8555   public:
ReadMethodPoolVisitor(ASTReader & Reader,Selector Sel,unsigned PriorGeneration)8556     ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
8557                           unsigned PriorGeneration)
8558         : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
8559 
operator ()(ModuleFile & M)8560     bool operator()(ModuleFile &M) {
8561       if (!M.SelectorLookupTable)
8562         return false;
8563 
8564       // If we've already searched this module file, skip it now.
8565       if (M.Generation <= PriorGeneration)
8566         return true;
8567 
8568       ++Reader.NumMethodPoolTableLookups;
8569       ASTSelectorLookupTable *PoolTable
8570         = (ASTSelectorLookupTable*)M.SelectorLookupTable;
8571       ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
8572       if (Pos == PoolTable->end())
8573         return false;
8574 
8575       ++Reader.NumMethodPoolTableHits;
8576       ++Reader.NumSelectorsRead;
8577       // FIXME: Not quite happy with the statistics here. We probably should
8578       // disable this tracking when called via LoadSelector.
8579       // Also, should entries without methods count as misses?
8580       ++Reader.NumMethodPoolEntriesRead;
8581       ASTSelectorLookupTrait::data_type Data = *Pos;
8582       if (Reader.DeserializationListener)
8583         Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
8584 
8585       // Append methods in the reverse order, so that later we can process them
8586       // in the order they appear in the source code by iterating through
8587       // the vector in the reverse order.
8588       InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
8589       FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
8590       InstanceBits = Data.InstanceBits;
8591       FactoryBits = Data.FactoryBits;
8592       InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
8593       FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
8594       return false;
8595     }
8596 
8597     /// Retrieve the instance methods found by this visitor.
getInstanceMethods() const8598     ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
8599       return InstanceMethods;
8600     }
8601 
8602     /// Retrieve the instance methods found by this visitor.
getFactoryMethods() const8603     ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
8604       return FactoryMethods;
8605     }
8606 
getInstanceBits() const8607     unsigned getInstanceBits() const { return InstanceBits; }
getFactoryBits() const8608     unsigned getFactoryBits() const { return FactoryBits; }
8609 
instanceHasMoreThanOneDecl() const8610     bool instanceHasMoreThanOneDecl() const {
8611       return InstanceHasMoreThanOneDecl;
8612     }
8613 
factoryHasMoreThanOneDecl() const8614     bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
8615   };
8616 
8617 } // namespace serialization
8618 } // namespace clang
8619 
8620 /// Add the given set of methods to the method list.
addMethodsToPool(Sema & S,ArrayRef<ObjCMethodDecl * > Methods,ObjCMethodList & List)8621 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
8622                              ObjCMethodList &List) {
8623   for (ObjCMethodDecl *M : llvm::reverse(Methods))
8624     S.ObjC().addMethodToGlobalList(&List, M);
8625 }
8626 
ReadMethodPool(Selector Sel)8627 void ASTReader::ReadMethodPool(Selector Sel) {
8628   // Get the selector generation and update it to the current generation.
8629   unsigned &Generation = SelectorGeneration[Sel];
8630   unsigned PriorGeneration = Generation;
8631   Generation = getGeneration();
8632   SelectorOutOfDate[Sel] = false;
8633 
8634   // Search for methods defined with this selector.
8635   ++NumMethodPoolLookups;
8636   ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
8637   ModuleMgr.visit(Visitor);
8638 
8639   if (Visitor.getInstanceMethods().empty() &&
8640       Visitor.getFactoryMethods().empty())
8641     return;
8642 
8643   ++NumMethodPoolHits;
8644 
8645   if (!getSema())
8646     return;
8647 
8648   Sema &S = *getSema();
8649   SemaObjC::GlobalMethodPool::iterator Pos =
8650       S.ObjC()
8651           .MethodPool
8652           .insert(std::make_pair(Sel, SemaObjC::GlobalMethodPool::Lists()))
8653           .first;
8654 
8655   Pos->second.first.setBits(Visitor.getInstanceBits());
8656   Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
8657   Pos->second.second.setBits(Visitor.getFactoryBits());
8658   Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
8659 
8660   // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
8661   // when building a module we keep every method individually and may need to
8662   // update hasMoreThanOneDecl as we add the methods.
8663   addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
8664   addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
8665 }
8666 
updateOutOfDateSelector(Selector Sel)8667 void ASTReader::updateOutOfDateSelector(Selector Sel) {
8668   if (SelectorOutOfDate[Sel])
8669     ReadMethodPool(Sel);
8670 }
8671 
ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl * > & Namespaces)8672 void ASTReader::ReadKnownNamespaces(
8673                           SmallVectorImpl<NamespaceDecl *> &Namespaces) {
8674   Namespaces.clear();
8675 
8676   for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
8677     if (NamespaceDecl *Namespace
8678                 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
8679       Namespaces.push_back(Namespace);
8680   }
8681 }
8682 
ReadUndefinedButUsed(llvm::MapVector<NamedDecl *,SourceLocation> & Undefined)8683 void ASTReader::ReadUndefinedButUsed(
8684     llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
8685   for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
8686     UndefinedButUsedDecl &U = UndefinedButUsed[Idx++];
8687     NamedDecl *D = cast<NamedDecl>(GetDecl(U.ID));
8688     SourceLocation Loc = SourceLocation::getFromRawEncoding(U.RawLoc);
8689     Undefined.insert(std::make_pair(D, Loc));
8690   }
8691   UndefinedButUsed.clear();
8692 }
8693 
ReadMismatchingDeleteExpressions(llvm::MapVector<FieldDecl *,llvm::SmallVector<std::pair<SourceLocation,bool>,4>> & Exprs)8694 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
8695     FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
8696                                                      Exprs) {
8697   for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
8698     FieldDecl *FD =
8699         cast<FieldDecl>(GetDecl(GlobalDeclID(DelayedDeleteExprs[Idx++])));
8700     uint64_t Count = DelayedDeleteExprs[Idx++];
8701     for (uint64_t C = 0; C < Count; ++C) {
8702       SourceLocation DeleteLoc =
8703           SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
8704       const bool IsArrayForm = DelayedDeleteExprs[Idx++];
8705       Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
8706     }
8707   }
8708 }
8709 
ReadTentativeDefinitions(SmallVectorImpl<VarDecl * > & TentativeDefs)8710 void ASTReader::ReadTentativeDefinitions(
8711                   SmallVectorImpl<VarDecl *> &TentativeDefs) {
8712   for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
8713     VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
8714     if (Var)
8715       TentativeDefs.push_back(Var);
8716   }
8717   TentativeDefinitions.clear();
8718 }
8719 
ReadUnusedFileScopedDecls(SmallVectorImpl<const DeclaratorDecl * > & Decls)8720 void ASTReader::ReadUnusedFileScopedDecls(
8721                                SmallVectorImpl<const DeclaratorDecl *> &Decls) {
8722   for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
8723     DeclaratorDecl *D
8724       = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
8725     if (D)
8726       Decls.push_back(D);
8727   }
8728   UnusedFileScopedDecls.clear();
8729 }
8730 
ReadDelegatingConstructors(SmallVectorImpl<CXXConstructorDecl * > & Decls)8731 void ASTReader::ReadDelegatingConstructors(
8732                                  SmallVectorImpl<CXXConstructorDecl *> &Decls) {
8733   for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
8734     CXXConstructorDecl *D
8735       = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
8736     if (D)
8737       Decls.push_back(D);
8738   }
8739   DelegatingCtorDecls.clear();
8740 }
8741 
ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl * > & Decls)8742 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
8743   for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
8744     TypedefNameDecl *D
8745       = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
8746     if (D)
8747       Decls.push_back(D);
8748   }
8749   ExtVectorDecls.clear();
8750 }
8751 
ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector<const TypedefNameDecl *,4> & Decls)8752 void ASTReader::ReadUnusedLocalTypedefNameCandidates(
8753     llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
8754   for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
8755        ++I) {
8756     TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
8757         GetDecl(UnusedLocalTypedefNameCandidates[I]));
8758     if (D)
8759       Decls.insert(D);
8760   }
8761   UnusedLocalTypedefNameCandidates.clear();
8762 }
8763 
ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector<Decl *,4> & Decls)8764 void ASTReader::ReadDeclsToCheckForDeferredDiags(
8765     llvm::SmallSetVector<Decl *, 4> &Decls) {
8766   for (auto I : DeclsToCheckForDeferredDiags) {
8767     auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
8768     if (D)
8769       Decls.insert(D);
8770   }
8771   DeclsToCheckForDeferredDiags.clear();
8772 }
8773 
ReadReferencedSelectors(SmallVectorImpl<std::pair<Selector,SourceLocation>> & Sels)8774 void ASTReader::ReadReferencedSelectors(
8775        SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
8776   if (ReferencedSelectorsData.empty())
8777     return;
8778 
8779   // If there are @selector references added them to its pool. This is for
8780   // implementation of -Wselector.
8781   unsigned int DataSize = ReferencedSelectorsData.size()-1;
8782   unsigned I = 0;
8783   while (I < DataSize) {
8784     Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
8785     SourceLocation SelLoc
8786       = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
8787     Sels.push_back(std::make_pair(Sel, SelLoc));
8788   }
8789   ReferencedSelectorsData.clear();
8790 }
8791 
ReadWeakUndeclaredIdentifiers(SmallVectorImpl<std::pair<IdentifierInfo *,WeakInfo>> & WeakIDs)8792 void ASTReader::ReadWeakUndeclaredIdentifiers(
8793        SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
8794   if (WeakUndeclaredIdentifiers.empty())
8795     return;
8796 
8797   for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
8798     IdentifierInfo *WeakId
8799       = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8800     IdentifierInfo *AliasId
8801       = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
8802     SourceLocation Loc =
8803         SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
8804     WeakInfo WI(AliasId, Loc);
8805     WeakIDs.push_back(std::make_pair(WeakId, WI));
8806   }
8807   WeakUndeclaredIdentifiers.clear();
8808 }
8809 
ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> & VTables)8810 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
8811   for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
8812     ExternalVTableUse VT;
8813     VTableUse &TableInfo = VTableUses[Idx++];
8814     VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(TableInfo.ID));
8815     VT.Location = SourceLocation::getFromRawEncoding(TableInfo.RawLoc);
8816     VT.DefinitionRequired = TableInfo.Used;
8817     VTables.push_back(VT);
8818   }
8819 
8820   VTableUses.clear();
8821 }
8822 
ReadPendingInstantiations(SmallVectorImpl<std::pair<ValueDecl *,SourceLocation>> & Pending)8823 void ASTReader::ReadPendingInstantiations(
8824        SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
8825   for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
8826     PendingInstantiation &Inst = PendingInstantiations[Idx++];
8827     ValueDecl *D = cast<ValueDecl>(GetDecl(Inst.ID));
8828     SourceLocation Loc = SourceLocation::getFromRawEncoding(Inst.RawLoc);
8829 
8830     Pending.push_back(std::make_pair(D, Loc));
8831   }
8832   PendingInstantiations.clear();
8833 }
8834 
ReadLateParsedTemplates(llvm::MapVector<const FunctionDecl *,std::unique_ptr<LateParsedTemplate>> & LPTMap)8835 void ASTReader::ReadLateParsedTemplates(
8836     llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
8837         &LPTMap) {
8838   for (auto &LPT : LateParsedTemplates) {
8839     ModuleFile *FMod = LPT.first;
8840     RecordDataImpl &LateParsed = LPT.second;
8841     for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
8842          /* In loop */) {
8843       FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
8844 
8845       auto LT = std::make_unique<LateParsedTemplate>();
8846       LT->D = ReadDecl(*FMod, LateParsed, Idx);
8847       LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
8848 
8849       ModuleFile *F = getOwningModuleFile(LT->D);
8850       assert(F && "No module");
8851 
8852       unsigned TokN = LateParsed[Idx++];
8853       LT->Toks.reserve(TokN);
8854       for (unsigned T = 0; T < TokN; ++T)
8855         LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
8856 
8857       LPTMap.insert(std::make_pair(FD, std::move(LT)));
8858     }
8859   }
8860 
8861   LateParsedTemplates.clear();
8862 }
8863 
AssignedLambdaNumbering(const CXXRecordDecl * Lambda)8864 void ASTReader::AssignedLambdaNumbering(const CXXRecordDecl *Lambda) {
8865   if (Lambda->getLambdaContextDecl()) {
8866     // Keep track of this lambda so it can be merged with another lambda that
8867     // is loaded later.
8868     LambdaDeclarationsForMerging.insert(
8869         {{Lambda->getLambdaContextDecl()->getCanonicalDecl(),
8870           Lambda->getLambdaIndexInContext()},
8871          const_cast<CXXRecordDecl *>(Lambda)});
8872   }
8873 }
8874 
LoadSelector(Selector Sel)8875 void ASTReader::LoadSelector(Selector Sel) {
8876   // It would be complicated to avoid reading the methods anyway. So don't.
8877   ReadMethodPool(Sel);
8878 }
8879 
SetIdentifierInfo(IdentifierID ID,IdentifierInfo * II)8880 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
8881   assert(ID && "Non-zero identifier ID required");
8882   unsigned Index = translateIdentifierIDToIndex(ID).second;
8883   assert(Index < IdentifiersLoaded.size() && "identifier ID out of range");
8884   IdentifiersLoaded[Index] = II;
8885   if (DeserializationListener)
8886     DeserializationListener->IdentifierRead(ID, II);
8887 }
8888 
8889 /// Set the globally-visible declarations associated with the given
8890 /// identifier.
8891 ///
8892 /// If the AST reader is currently in a state where the given declaration IDs
8893 /// cannot safely be resolved, they are queued until it is safe to resolve
8894 /// them.
8895 ///
8896 /// \param II an IdentifierInfo that refers to one or more globally-visible
8897 /// declarations.
8898 ///
8899 /// \param DeclIDs the set of declaration IDs with the name @p II that are
8900 /// visible at global scope.
8901 ///
8902 /// \param Decls if non-null, this vector will be populated with the set of
8903 /// deserialized declarations. These declarations will not be pushed into
8904 /// scope.
SetGloballyVisibleDecls(IdentifierInfo * II,const SmallVectorImpl<GlobalDeclID> & DeclIDs,SmallVectorImpl<Decl * > * Decls)8905 void ASTReader::SetGloballyVisibleDecls(
8906     IdentifierInfo *II, const SmallVectorImpl<GlobalDeclID> &DeclIDs,
8907     SmallVectorImpl<Decl *> *Decls) {
8908   if (NumCurrentElementsDeserializing && !Decls) {
8909     PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
8910     return;
8911   }
8912 
8913   for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
8914     if (!SemaObj) {
8915       // Queue this declaration so that it will be added to the
8916       // translation unit scope and identifier's declaration chain
8917       // once a Sema object is known.
8918       PreloadedDeclIDs.push_back(DeclIDs[I]);
8919       continue;
8920     }
8921 
8922     NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
8923 
8924     // If we're simply supposed to record the declarations, do so now.
8925     if (Decls) {
8926       Decls->push_back(D);
8927       continue;
8928     }
8929 
8930     // Introduce this declaration into the translation-unit scope
8931     // and add it to the declaration chain for this identifier, so
8932     // that (unqualified) name lookup will find it.
8933     pushExternalDeclIntoScope(D, II);
8934   }
8935 }
8936 
8937 std::pair<ModuleFile *, unsigned>
translateIdentifierIDToIndex(IdentifierID ID) const8938 ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const {
8939   if (ID == 0)
8940     return {nullptr, 0};
8941 
8942   unsigned ModuleFileIndex = ID >> 32;
8943   unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
8944 
8945   assert(ModuleFileIndex && "not translating loaded IdentifierID?");
8946   assert(getModuleManager().size() > ModuleFileIndex - 1);
8947 
8948   ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
8949   assert(LocalID < MF.LocalNumIdentifiers);
8950   return {&MF, MF.BaseIdentifierID + LocalID};
8951 }
8952 
DecodeIdentifierInfo(IdentifierID ID)8953 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
8954   if (ID == 0)
8955     return nullptr;
8956 
8957   if (IdentifiersLoaded.empty()) {
8958     Error("no identifier table in AST file");
8959     return nullptr;
8960   }
8961 
8962   auto [M, Index] = translateIdentifierIDToIndex(ID);
8963   if (!IdentifiersLoaded[Index]) {
8964     assert(M != nullptr && "Untranslated Identifier ID?");
8965     assert(Index >= M->BaseIdentifierID);
8966     unsigned LocalIndex = Index - M->BaseIdentifierID;
8967     const unsigned char *Data =
8968         M->IdentifierTableData + M->IdentifierOffsets[LocalIndex];
8969 
8970     ASTIdentifierLookupTrait Trait(*this, *M);
8971     auto KeyDataLen = Trait.ReadKeyDataLength(Data);
8972     auto Key = Trait.ReadKey(Data, KeyDataLen.first);
8973     auto &II = PP.getIdentifierTable().get(Key);
8974     IdentifiersLoaded[Index] = &II;
8975     markIdentifierFromAST(*this,  II);
8976     if (DeserializationListener)
8977       DeserializationListener->IdentifierRead(ID, &II);
8978   }
8979 
8980   return IdentifiersLoaded[Index];
8981 }
8982 
getLocalIdentifier(ModuleFile & M,uint64_t LocalID)8983 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, uint64_t LocalID) {
8984   return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
8985 }
8986 
getGlobalIdentifierID(ModuleFile & M,uint64_t LocalID)8987 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID) {
8988   if (LocalID < NUM_PREDEF_IDENT_IDS)
8989     return LocalID;
8990 
8991   if (!M.ModuleOffsetMap.empty())
8992     ReadModuleOffsetMap(M);
8993 
8994   unsigned ModuleFileIndex = LocalID >> 32;
8995   LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
8996   ModuleFile *MF =
8997       ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
8998   assert(MF && "malformed identifier ID encoding?");
8999 
9000   if (!ModuleFileIndex)
9001     LocalID -= NUM_PREDEF_IDENT_IDS;
9002 
9003   return ((IdentifierID)(MF->Index + 1) << 32) | LocalID;
9004 }
9005 
getMacro(MacroID ID)9006 MacroInfo *ASTReader::getMacro(MacroID ID) {
9007   if (ID == 0)
9008     return nullptr;
9009 
9010   if (MacrosLoaded.empty()) {
9011     Error("no macro table in AST file");
9012     return nullptr;
9013   }
9014 
9015   ID -= NUM_PREDEF_MACRO_IDS;
9016   if (!MacrosLoaded[ID]) {
9017     GlobalMacroMapType::iterator I
9018       = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
9019     assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
9020     ModuleFile *M = I->second;
9021     unsigned Index = ID - M->BaseMacroID;
9022     MacrosLoaded[ID] =
9023         ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]);
9024 
9025     if (DeserializationListener)
9026       DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
9027                                          MacrosLoaded[ID]);
9028   }
9029 
9030   return MacrosLoaded[ID];
9031 }
9032 
getGlobalMacroID(ModuleFile & M,unsigned LocalID)9033 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
9034   if (LocalID < NUM_PREDEF_MACRO_IDS)
9035     return LocalID;
9036 
9037   if (!M.ModuleOffsetMap.empty())
9038     ReadModuleOffsetMap(M);
9039 
9040   ContinuousRangeMap<uint32_t, int, 2>::iterator I
9041     = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
9042   assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
9043 
9044   return LocalID + I->second;
9045 }
9046 
9047 serialization::SubmoduleID
getGlobalSubmoduleID(ModuleFile & M,unsigned LocalID) const9048 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const {
9049   if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
9050     return LocalID;
9051 
9052   if (!M.ModuleOffsetMap.empty())
9053     ReadModuleOffsetMap(M);
9054 
9055   ContinuousRangeMap<uint32_t, int, 2>::iterator I
9056     = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
9057   assert(I != M.SubmoduleRemap.end()
9058          && "Invalid index into submodule index remap");
9059 
9060   return LocalID + I->second;
9061 }
9062 
getSubmodule(SubmoduleID GlobalID)9063 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
9064   if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
9065     assert(GlobalID == 0 && "Unhandled global submodule ID");
9066     return nullptr;
9067   }
9068 
9069   if (GlobalID > SubmodulesLoaded.size()) {
9070     Error("submodule ID out of range in AST file");
9071     return nullptr;
9072   }
9073 
9074   return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
9075 }
9076 
getModule(unsigned ID)9077 Module *ASTReader::getModule(unsigned ID) {
9078   return getSubmodule(ID);
9079 }
9080 
getLocalModuleFile(ModuleFile & M,unsigned ID) const9081 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &M, unsigned ID) const {
9082   if (ID & 1) {
9083     // It's a module, look it up by submodule ID.
9084     auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(M, ID >> 1));
9085     return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
9086   } else {
9087     // It's a prefix (preamble, PCH, ...). Look it up by index.
9088     unsigned IndexFromEnd = ID >> 1;
9089     assert(IndexFromEnd && "got reference to unknown module file");
9090     return getModuleManager().pch_modules().end()[-IndexFromEnd];
9091   }
9092 }
9093 
getModuleFileID(ModuleFile * M)9094 unsigned ASTReader::getModuleFileID(ModuleFile *M) {
9095   if (!M)
9096     return 1;
9097 
9098   // For a file representing a module, use the submodule ID of the top-level
9099   // module as the file ID. For any other kind of file, the number of such
9100   // files loaded beforehand will be the same on reload.
9101   // FIXME: Is this true even if we have an explicit module file and a PCH?
9102   if (M->isModule())
9103     return ((M->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
9104 
9105   auto PCHModules = getModuleManager().pch_modules();
9106   auto I = llvm::find(PCHModules, M);
9107   assert(I != PCHModules.end() && "emitting reference to unknown file");
9108   return (I - PCHModules.end()) << 1;
9109 }
9110 
getSourceDescriptor(unsigned ID)9111 std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
9112   if (Module *M = getSubmodule(ID))
9113     return ASTSourceDescriptor(*M);
9114 
9115   // If there is only a single PCH, return it instead.
9116   // Chained PCH are not supported.
9117   const auto &PCHChain = ModuleMgr.pch_modules();
9118   if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
9119     ModuleFile &MF = ModuleMgr.getPrimaryModule();
9120     StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
9121     StringRef FileName = llvm::sys::path::filename(MF.FileName);
9122     return ASTSourceDescriptor(ModuleName,
9123                                llvm::sys::path::parent_path(MF.FileName),
9124                                FileName, MF.Signature);
9125   }
9126   return std::nullopt;
9127 }
9128 
hasExternalDefinitions(const Decl * FD)9129 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
9130   auto I = DefinitionSource.find(FD);
9131   if (I == DefinitionSource.end())
9132     return EK_ReplyHazy;
9133   return I->second ? EK_Never : EK_Always;
9134 }
9135 
getLocalSelector(ModuleFile & M,unsigned LocalID)9136 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
9137   return DecodeSelector(getGlobalSelectorID(M, LocalID));
9138 }
9139 
DecodeSelector(serialization::SelectorID ID)9140 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
9141   if (ID == 0)
9142     return Selector();
9143 
9144   if (ID > SelectorsLoaded.size()) {
9145     Error("selector ID out of range in AST file");
9146     return Selector();
9147   }
9148 
9149   if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
9150     // Load this selector from the selector table.
9151     GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
9152     assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
9153     ModuleFile &M = *I->second;
9154     ASTSelectorLookupTrait Trait(*this, M);
9155     unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
9156     SelectorsLoaded[ID - 1] =
9157       Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
9158     if (DeserializationListener)
9159       DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
9160   }
9161 
9162   return SelectorsLoaded[ID - 1];
9163 }
9164 
GetExternalSelector(serialization::SelectorID ID)9165 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
9166   return DecodeSelector(ID);
9167 }
9168 
GetNumExternalSelectors()9169 uint32_t ASTReader::GetNumExternalSelectors() {
9170   // ID 0 (the null selector) is considered an external selector.
9171   return getTotalNumSelectors() + 1;
9172 }
9173 
9174 serialization::SelectorID
getGlobalSelectorID(ModuleFile & M,unsigned LocalID) const9175 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
9176   if (LocalID < NUM_PREDEF_SELECTOR_IDS)
9177     return LocalID;
9178 
9179   if (!M.ModuleOffsetMap.empty())
9180     ReadModuleOffsetMap(M);
9181 
9182   ContinuousRangeMap<uint32_t, int, 2>::iterator I
9183     = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
9184   assert(I != M.SelectorRemap.end()
9185          && "Invalid index into selector index remap");
9186 
9187   return LocalID + I->second;
9188 }
9189 
9190 DeclarationNameLoc
readDeclarationNameLoc(DeclarationName Name)9191 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) {
9192   switch (Name.getNameKind()) {
9193   case DeclarationName::CXXConstructorName:
9194   case DeclarationName::CXXDestructorName:
9195   case DeclarationName::CXXConversionFunctionName:
9196     return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo());
9197 
9198   case DeclarationName::CXXOperatorName:
9199     return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange());
9200 
9201   case DeclarationName::CXXLiteralOperatorName:
9202     return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc(
9203         readSourceLocation());
9204 
9205   case DeclarationName::Identifier:
9206   case DeclarationName::ObjCZeroArgSelector:
9207   case DeclarationName::ObjCOneArgSelector:
9208   case DeclarationName::ObjCMultiArgSelector:
9209   case DeclarationName::CXXUsingDirective:
9210   case DeclarationName::CXXDeductionGuideName:
9211     break;
9212   }
9213   return DeclarationNameLoc();
9214 }
9215 
readDeclarationNameInfo()9216 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() {
9217   DeclarationNameInfo NameInfo;
9218   NameInfo.setName(readDeclarationName());
9219   NameInfo.setLoc(readSourceLocation());
9220   NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
9221   return NameInfo;
9222 }
9223 
readTypeCoupledDeclRefInfo()9224 TypeCoupledDeclRefInfo ASTRecordReader::readTypeCoupledDeclRefInfo() {
9225   return TypeCoupledDeclRefInfo(readDeclAs<ValueDecl>(), readBool());
9226 }
9227 
readQualifierInfo(QualifierInfo & Info)9228 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) {
9229   Info.QualifierLoc = readNestedNameSpecifierLoc();
9230   unsigned NumTPLists = readInt();
9231   Info.NumTemplParamLists = NumTPLists;
9232   if (NumTPLists) {
9233     Info.TemplParamLists =
9234         new (getContext()) TemplateParameterList *[NumTPLists];
9235     for (unsigned i = 0; i != NumTPLists; ++i)
9236       Info.TemplParamLists[i] = readTemplateParameterList();
9237   }
9238 }
9239 
9240 TemplateParameterList *
readTemplateParameterList()9241 ASTRecordReader::readTemplateParameterList() {
9242   SourceLocation TemplateLoc = readSourceLocation();
9243   SourceLocation LAngleLoc = readSourceLocation();
9244   SourceLocation RAngleLoc = readSourceLocation();
9245 
9246   unsigned NumParams = readInt();
9247   SmallVector<NamedDecl *, 16> Params;
9248   Params.reserve(NumParams);
9249   while (NumParams--)
9250     Params.push_back(readDeclAs<NamedDecl>());
9251 
9252   bool HasRequiresClause = readBool();
9253   Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
9254 
9255   TemplateParameterList *TemplateParams = TemplateParameterList::Create(
9256       getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
9257   return TemplateParams;
9258 }
9259 
readTemplateArgumentList(SmallVectorImpl<TemplateArgument> & TemplArgs,bool Canonicalize)9260 void ASTRecordReader::readTemplateArgumentList(
9261                         SmallVectorImpl<TemplateArgument> &TemplArgs,
9262                         bool Canonicalize) {
9263   unsigned NumTemplateArgs = readInt();
9264   TemplArgs.reserve(NumTemplateArgs);
9265   while (NumTemplateArgs--)
9266     TemplArgs.push_back(readTemplateArgument(Canonicalize));
9267 }
9268 
9269 /// Read a UnresolvedSet structure.
readUnresolvedSet(LazyASTUnresolvedSet & Set)9270 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) {
9271   unsigned NumDecls = readInt();
9272   Set.reserve(getContext(), NumDecls);
9273   while (NumDecls--) {
9274     GlobalDeclID ID = readDeclID();
9275     AccessSpecifier AS = (AccessSpecifier) readInt();
9276     Set.addLazyDecl(getContext(), ID, AS);
9277   }
9278 }
9279 
9280 CXXBaseSpecifier
readCXXBaseSpecifier()9281 ASTRecordReader::readCXXBaseSpecifier() {
9282   bool isVirtual = readBool();
9283   bool isBaseOfClass = readBool();
9284   AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
9285   bool inheritConstructors = readBool();
9286   TypeSourceInfo *TInfo = readTypeSourceInfo();
9287   SourceRange Range = readSourceRange();
9288   SourceLocation EllipsisLoc = readSourceLocation();
9289   CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
9290                           EllipsisLoc);
9291   Result.setInheritConstructors(inheritConstructors);
9292   return Result;
9293 }
9294 
9295 CXXCtorInitializer **
readCXXCtorInitializers()9296 ASTRecordReader::readCXXCtorInitializers() {
9297   ASTContext &Context = getContext();
9298   unsigned NumInitializers = readInt();
9299   assert(NumInitializers && "wrote ctor initializers but have no inits");
9300   auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
9301   for (unsigned i = 0; i != NumInitializers; ++i) {
9302     TypeSourceInfo *TInfo = nullptr;
9303     bool IsBaseVirtual = false;
9304     FieldDecl *Member = nullptr;
9305     IndirectFieldDecl *IndirectMember = nullptr;
9306 
9307     CtorInitializerType Type = (CtorInitializerType) readInt();
9308     switch (Type) {
9309     case CTOR_INITIALIZER_BASE:
9310       TInfo = readTypeSourceInfo();
9311       IsBaseVirtual = readBool();
9312       break;
9313 
9314     case CTOR_INITIALIZER_DELEGATING:
9315       TInfo = readTypeSourceInfo();
9316       break;
9317 
9318      case CTOR_INITIALIZER_MEMBER:
9319       Member = readDeclAs<FieldDecl>();
9320       break;
9321 
9322      case CTOR_INITIALIZER_INDIRECT_MEMBER:
9323       IndirectMember = readDeclAs<IndirectFieldDecl>();
9324       break;
9325     }
9326 
9327     SourceLocation MemberOrEllipsisLoc = readSourceLocation();
9328     Expr *Init = readExpr();
9329     SourceLocation LParenLoc = readSourceLocation();
9330     SourceLocation RParenLoc = readSourceLocation();
9331 
9332     CXXCtorInitializer *BOMInit;
9333     if (Type == CTOR_INITIALIZER_BASE)
9334       BOMInit = new (Context)
9335           CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
9336                              RParenLoc, MemberOrEllipsisLoc);
9337     else if (Type == CTOR_INITIALIZER_DELEGATING)
9338       BOMInit = new (Context)
9339           CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
9340     else if (Member)
9341       BOMInit = new (Context)
9342           CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
9343                              Init, RParenLoc);
9344     else
9345       BOMInit = new (Context)
9346           CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
9347                              LParenLoc, Init, RParenLoc);
9348 
9349     if (/*IsWritten*/readBool()) {
9350       unsigned SourceOrder = readInt();
9351       BOMInit->setSourceOrder(SourceOrder);
9352     }
9353 
9354     CtorInitializers[i] = BOMInit;
9355   }
9356 
9357   return CtorInitializers;
9358 }
9359 
9360 NestedNameSpecifierLoc
readNestedNameSpecifierLoc()9361 ASTRecordReader::readNestedNameSpecifierLoc() {
9362   ASTContext &Context = getContext();
9363   unsigned N = readInt();
9364   NestedNameSpecifierLocBuilder Builder;
9365   for (unsigned I = 0; I != N; ++I) {
9366     auto Kind = readNestedNameSpecifierKind();
9367     switch (Kind) {
9368     case NestedNameSpecifier::Identifier: {
9369       IdentifierInfo *II = readIdentifier();
9370       SourceRange Range = readSourceRange();
9371       Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
9372       break;
9373     }
9374 
9375     case NestedNameSpecifier::Namespace: {
9376       NamespaceDecl *NS = readDeclAs<NamespaceDecl>();
9377       SourceRange Range = readSourceRange();
9378       Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
9379       break;
9380     }
9381 
9382     case NestedNameSpecifier::NamespaceAlias: {
9383       NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>();
9384       SourceRange Range = readSourceRange();
9385       Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
9386       break;
9387     }
9388 
9389     case NestedNameSpecifier::TypeSpec:
9390     case NestedNameSpecifier::TypeSpecWithTemplate: {
9391       bool Template = readBool();
9392       TypeSourceInfo *T = readTypeSourceInfo();
9393       if (!T)
9394         return NestedNameSpecifierLoc();
9395       SourceLocation ColonColonLoc = readSourceLocation();
9396 
9397       // FIXME: 'template' keyword location not saved anywhere, so we fake it.
9398       Builder.Extend(Context,
9399                      Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
9400                      T->getTypeLoc(), ColonColonLoc);
9401       break;
9402     }
9403 
9404     case NestedNameSpecifier::Global: {
9405       SourceLocation ColonColonLoc = readSourceLocation();
9406       Builder.MakeGlobal(Context, ColonColonLoc);
9407       break;
9408     }
9409 
9410     case NestedNameSpecifier::Super: {
9411       CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>();
9412       SourceRange Range = readSourceRange();
9413       Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
9414       break;
9415     }
9416     }
9417   }
9418 
9419   return Builder.getWithLocInContext(Context);
9420 }
9421 
ReadSourceRange(ModuleFile & F,const RecordData & Record,unsigned & Idx,LocSeq * Seq)9422 SourceRange ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
9423                                        unsigned &Idx, LocSeq *Seq) {
9424   SourceLocation beg = ReadSourceLocation(F, Record, Idx, Seq);
9425   SourceLocation end = ReadSourceLocation(F, Record, Idx, Seq);
9426   return SourceRange(beg, end);
9427 }
9428 
ReadBitVector(const RecordData & Record,const StringRef Blob)9429 llvm::BitVector ASTReader::ReadBitVector(const RecordData &Record,
9430                                          const StringRef Blob) {
9431   unsigned Count = Record[0];
9432   const char *Byte = Blob.data();
9433   llvm::BitVector Ret = llvm::BitVector(Count, false);
9434   for (unsigned I = 0; I < Count; ++Byte)
9435     for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
9436       if (*Byte & (1 << Bit))
9437         Ret[I] = true;
9438   return Ret;
9439 }
9440 
9441 /// Read a floating-point value
readAPFloat(const llvm::fltSemantics & Sem)9442 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
9443   return llvm::APFloat(Sem, readAPInt());
9444 }
9445 
9446 // Read a string
ReadString(const RecordDataImpl & Record,unsigned & Idx)9447 std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
9448   unsigned Len = Record[Idx++];
9449   std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
9450   Idx += Len;
9451   return Result;
9452 }
9453 
ReadPath(ModuleFile & F,const RecordData & Record,unsigned & Idx)9454 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
9455                                 unsigned &Idx) {
9456   std::string Filename = ReadString(Record, Idx);
9457   ResolveImportedPath(F, Filename);
9458   return Filename;
9459 }
9460 
ReadPath(StringRef BaseDirectory,const RecordData & Record,unsigned & Idx)9461 std::string ASTReader::ReadPath(StringRef BaseDirectory,
9462                                 const RecordData &Record, unsigned &Idx) {
9463   std::string Filename = ReadString(Record, Idx);
9464   if (!BaseDirectory.empty())
9465     ResolveImportedPath(Filename, BaseDirectory);
9466   return Filename;
9467 }
9468 
ReadVersionTuple(const RecordData & Record,unsigned & Idx)9469 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
9470                                          unsigned &Idx) {
9471   unsigned Major = Record[Idx++];
9472   unsigned Minor = Record[Idx++];
9473   unsigned Subminor = Record[Idx++];
9474   if (Minor == 0)
9475     return VersionTuple(Major);
9476   if (Subminor == 0)
9477     return VersionTuple(Major, Minor - 1);
9478   return VersionTuple(Major, Minor - 1, Subminor - 1);
9479 }
9480 
ReadCXXTemporary(ModuleFile & F,const RecordData & Record,unsigned & Idx)9481 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
9482                                           const RecordData &Record,
9483                                           unsigned &Idx) {
9484   CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
9485   return CXXTemporary::Create(getContext(), Decl);
9486 }
9487 
Diag(unsigned DiagID) const9488 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
9489   return Diag(CurrentImportLoc, DiagID);
9490 }
9491 
Diag(SourceLocation Loc,unsigned DiagID) const9492 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
9493   return Diags.Report(Loc, DiagID);
9494 }
9495 
warnStackExhausted(SourceLocation Loc)9496 void ASTReader::warnStackExhausted(SourceLocation Loc) {
9497   // When Sema is available, avoid duplicate errors.
9498   if (SemaObj) {
9499     SemaObj->warnStackExhausted(Loc);
9500     return;
9501   }
9502 
9503   if (WarnedStackExhausted)
9504     return;
9505   WarnedStackExhausted = true;
9506 
9507   Diag(Loc, diag::warn_stack_exhausted);
9508 }
9509 
9510 /// Retrieve the identifier table associated with the
9511 /// preprocessor.
getIdentifierTable()9512 IdentifierTable &ASTReader::getIdentifierTable() {
9513   return PP.getIdentifierTable();
9514 }
9515 
9516 /// Record that the given ID maps to the given switch-case
9517 /// statement.
RecordSwitchCaseID(SwitchCase * SC,unsigned ID)9518 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
9519   assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
9520          "Already have a SwitchCase with this ID");
9521   (*CurrSwitchCaseStmts)[ID] = SC;
9522 }
9523 
9524 /// Retrieve the switch-case statement with the given ID.
getSwitchCaseWithID(unsigned ID)9525 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
9526   assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
9527   return (*CurrSwitchCaseStmts)[ID];
9528 }
9529 
ClearSwitchCaseIDs()9530 void ASTReader::ClearSwitchCaseIDs() {
9531   CurrSwitchCaseStmts->clear();
9532 }
9533 
ReadComments()9534 void ASTReader::ReadComments() {
9535   ASTContext &Context = getContext();
9536   std::vector<RawComment *> Comments;
9537   for (SmallVectorImpl<std::pair<BitstreamCursor,
9538                                  serialization::ModuleFile *>>::iterator
9539        I = CommentsCursors.begin(),
9540        E = CommentsCursors.end();
9541        I != E; ++I) {
9542     Comments.clear();
9543     BitstreamCursor &Cursor = I->first;
9544     serialization::ModuleFile &F = *I->second;
9545     SavedStreamPosition SavedPosition(Cursor);
9546 
9547     RecordData Record;
9548     while (true) {
9549       Expected<llvm::BitstreamEntry> MaybeEntry =
9550           Cursor.advanceSkippingSubblocks(
9551               BitstreamCursor::AF_DontPopBlockAtEnd);
9552       if (!MaybeEntry) {
9553         Error(MaybeEntry.takeError());
9554         return;
9555       }
9556       llvm::BitstreamEntry Entry = MaybeEntry.get();
9557 
9558       switch (Entry.Kind) {
9559       case llvm::BitstreamEntry::SubBlock: // Handled for us already.
9560       case llvm::BitstreamEntry::Error:
9561         Error("malformed block record in AST file");
9562         return;
9563       case llvm::BitstreamEntry::EndBlock:
9564         goto NextCursor;
9565       case llvm::BitstreamEntry::Record:
9566         // The interesting case.
9567         break;
9568       }
9569 
9570       // Read a record.
9571       Record.clear();
9572       Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
9573       if (!MaybeComment) {
9574         Error(MaybeComment.takeError());
9575         return;
9576       }
9577       switch ((CommentRecordTypes)MaybeComment.get()) {
9578       case COMMENTS_RAW_COMMENT: {
9579         unsigned Idx = 0;
9580         SourceRange SR = ReadSourceRange(F, Record, Idx);
9581         RawComment::CommentKind Kind =
9582             (RawComment::CommentKind) Record[Idx++];
9583         bool IsTrailingComment = Record[Idx++];
9584         bool IsAlmostTrailingComment = Record[Idx++];
9585         Comments.push_back(new (Context) RawComment(
9586             SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
9587         break;
9588       }
9589       }
9590     }
9591   NextCursor:
9592     llvm::DenseMap<FileID, std::map<unsigned, RawComment *>>
9593         FileToOffsetToComment;
9594     for (RawComment *C : Comments) {
9595       SourceLocation CommentLoc = C->getBeginLoc();
9596       if (CommentLoc.isValid()) {
9597         std::pair<FileID, unsigned> Loc =
9598             SourceMgr.getDecomposedLoc(CommentLoc);
9599         if (Loc.first.isValid())
9600           Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
9601       }
9602     }
9603   }
9604 }
9605 
visitInputFileInfos(serialization::ModuleFile & MF,bool IncludeSystem,llvm::function_ref<void (const serialization::InputFileInfo & IFI,bool IsSystem)> Visitor)9606 void ASTReader::visitInputFileInfos(
9607     serialization::ModuleFile &MF, bool IncludeSystem,
9608     llvm::function_ref<void(const serialization::InputFileInfo &IFI,
9609                             bool IsSystem)>
9610         Visitor) {
9611   unsigned NumUserInputs = MF.NumUserInputFiles;
9612   unsigned NumInputs = MF.InputFilesLoaded.size();
9613   assert(NumUserInputs <= NumInputs);
9614   unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9615   for (unsigned I = 0; I < N; ++I) {
9616     bool IsSystem = I >= NumUserInputs;
9617     InputFileInfo IFI = getInputFileInfo(MF, I+1);
9618     Visitor(IFI, IsSystem);
9619   }
9620 }
9621 
visitInputFiles(serialization::ModuleFile & MF,bool IncludeSystem,bool Complain,llvm::function_ref<void (const serialization::InputFile & IF,bool isSystem)> Visitor)9622 void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
9623                                 bool IncludeSystem, bool Complain,
9624                     llvm::function_ref<void(const serialization::InputFile &IF,
9625                                             bool isSystem)> Visitor) {
9626   unsigned NumUserInputs = MF.NumUserInputFiles;
9627   unsigned NumInputs = MF.InputFilesLoaded.size();
9628   assert(NumUserInputs <= NumInputs);
9629   unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
9630   for (unsigned I = 0; I < N; ++I) {
9631     bool IsSystem = I >= NumUserInputs;
9632     InputFile IF = getInputFile(MF, I+1, Complain);
9633     Visitor(IF, IsSystem);
9634   }
9635 }
9636 
visitTopLevelModuleMaps(serialization::ModuleFile & MF,llvm::function_ref<void (FileEntryRef FE)> Visitor)9637 void ASTReader::visitTopLevelModuleMaps(
9638     serialization::ModuleFile &MF,
9639     llvm::function_ref<void(FileEntryRef FE)> Visitor) {
9640   unsigned NumInputs = MF.InputFilesLoaded.size();
9641   for (unsigned I = 0; I < NumInputs; ++I) {
9642     InputFileInfo IFI = getInputFileInfo(MF, I + 1);
9643     if (IFI.TopLevel && IFI.ModuleMap)
9644       if (auto FE = getInputFile(MF, I + 1).getFile())
9645         Visitor(*FE);
9646   }
9647 }
9648 
finishPendingActions()9649 void ASTReader::finishPendingActions() {
9650   while (
9651       !PendingIdentifierInfos.empty() || !PendingDeducedFunctionTypes.empty() ||
9652       !PendingDeducedVarTypes.empty() || !PendingIncompleteDeclChains.empty() ||
9653       !PendingDeclChains.empty() || !PendingMacroIDs.empty() ||
9654       !PendingDeclContextInfos.empty() || !PendingUpdateRecords.empty() ||
9655       !PendingObjCExtensionIvarRedeclarations.empty()) {
9656     // If any identifiers with corresponding top-level declarations have
9657     // been loaded, load those declarations now.
9658     using TopLevelDeclsMap =
9659         llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
9660     TopLevelDeclsMap TopLevelDecls;
9661 
9662     while (!PendingIdentifierInfos.empty()) {
9663       IdentifierInfo *II = PendingIdentifierInfos.back().first;
9664       SmallVector<GlobalDeclID, 4> DeclIDs =
9665           std::move(PendingIdentifierInfos.back().second);
9666       PendingIdentifierInfos.pop_back();
9667 
9668       SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
9669     }
9670 
9671     // Load each function type that we deferred loading because it was a
9672     // deduced type that might refer to a local type declared within itself.
9673     for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
9674       auto *FD = PendingDeducedFunctionTypes[I].first;
9675       FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
9676 
9677       if (auto *DT = FD->getReturnType()->getContainedDeducedType()) {
9678         // If we gave a function a deduced return type, remember that we need to
9679         // propagate that along the redeclaration chain.
9680         if (DT->isDeduced()) {
9681           PendingDeducedTypeUpdates.insert(
9682               {FD->getCanonicalDecl(), FD->getReturnType()});
9683           continue;
9684         }
9685 
9686         // The function has undeduced DeduceType return type. We hope we can
9687         // find the deduced type by iterating the redecls in other modules
9688         // later.
9689         PendingUndeducedFunctionDecls.push_back(FD);
9690         continue;
9691       }
9692     }
9693     PendingDeducedFunctionTypes.clear();
9694 
9695     // Load each variable type that we deferred loading because it was a
9696     // deduced type that might refer to a local type declared within itself.
9697     for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
9698       auto *VD = PendingDeducedVarTypes[I].first;
9699       VD->setType(GetType(PendingDeducedVarTypes[I].second));
9700     }
9701     PendingDeducedVarTypes.clear();
9702 
9703     // For each decl chain that we wanted to complete while deserializing, mark
9704     // it as "still needs to be completed".
9705     for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
9706       markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
9707     }
9708     PendingIncompleteDeclChains.clear();
9709 
9710     // Load pending declaration chains.
9711     for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
9712       loadPendingDeclChain(PendingDeclChains[I].first,
9713                            PendingDeclChains[I].second);
9714     PendingDeclChains.clear();
9715 
9716     // Make the most recent of the top-level declarations visible.
9717     for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
9718            TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
9719       IdentifierInfo *II = TLD->first;
9720       for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
9721         pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
9722       }
9723     }
9724 
9725     // Load any pending macro definitions.
9726     for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
9727       IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
9728       SmallVector<PendingMacroInfo, 2> GlobalIDs;
9729       GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
9730       // Initialize the macro history from chained-PCHs ahead of module imports.
9731       for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9732            ++IDIdx) {
9733         const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9734         if (!Info.M->isModule())
9735           resolvePendingMacro(II, Info);
9736       }
9737       // Handle module imports.
9738       for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
9739            ++IDIdx) {
9740         const PendingMacroInfo &Info = GlobalIDs[IDIdx];
9741         if (Info.M->isModule())
9742           resolvePendingMacro(II, Info);
9743       }
9744     }
9745     PendingMacroIDs.clear();
9746 
9747     // Wire up the DeclContexts for Decls that we delayed setting until
9748     // recursive loading is completed.
9749     while (!PendingDeclContextInfos.empty()) {
9750       PendingDeclContextInfo Info = PendingDeclContextInfos.front();
9751       PendingDeclContextInfos.pop_front();
9752       DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
9753       DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
9754       Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
9755     }
9756 
9757     // Perform any pending declaration updates.
9758     while (!PendingUpdateRecords.empty()) {
9759       auto Update = PendingUpdateRecords.pop_back_val();
9760       ReadingKindTracker ReadingKind(Read_Decl, *this);
9761       loadDeclUpdateRecords(Update);
9762     }
9763 
9764     while (!PendingObjCExtensionIvarRedeclarations.empty()) {
9765       auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
9766       auto DuplicateIvars =
9767           PendingObjCExtensionIvarRedeclarations.back().second;
9768       llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls;
9769       StructuralEquivalenceContext Ctx(
9770           ExtensionsPair.first->getASTContext(),
9771           ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
9772           StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
9773           /*Complain =*/false,
9774           /*ErrorOnTagTypeMismatch =*/true);
9775       if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
9776         // Merge redeclared ivars with their predecessors.
9777         for (auto IvarPair : DuplicateIvars) {
9778           ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
9779           // Change semantic DeclContext but keep the lexical one.
9780           Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
9781                                     Ivar->getLexicalDeclContext(),
9782                                     getContext());
9783           getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
9784         }
9785         // Invalidate duplicate extension and the cached ivar list.
9786         ExtensionsPair.first->setInvalidDecl();
9787         ExtensionsPair.second->getClassInterface()
9788             ->getDefinition()
9789             ->setIvarList(nullptr);
9790       } else {
9791         for (auto IvarPair : DuplicateIvars) {
9792           Diag(IvarPair.first->getLocation(),
9793                diag::err_duplicate_ivar_declaration)
9794               << IvarPair.first->getIdentifier();
9795           Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
9796         }
9797       }
9798       PendingObjCExtensionIvarRedeclarations.pop_back();
9799     }
9800   }
9801 
9802   // At this point, all update records for loaded decls are in place, so any
9803   // fake class definitions should have become real.
9804   assert(PendingFakeDefinitionData.empty() &&
9805          "faked up a class definition but never saw the real one");
9806 
9807   // If we deserialized any C++ or Objective-C class definitions, any
9808   // Objective-C protocol definitions, or any redeclarable templates, make sure
9809   // that all redeclarations point to the definitions. Note that this can only
9810   // happen now, after the redeclaration chains have been fully wired.
9811   for (Decl *D : PendingDefinitions) {
9812     if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
9813       if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
9814         // Make sure that the TagType points at the definition.
9815         const_cast<TagType*>(TagT)->decl = TD;
9816       }
9817 
9818       if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
9819         for (auto *R = getMostRecentExistingDecl(RD); R;
9820              R = R->getPreviousDecl()) {
9821           assert((R == D) ==
9822                      cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
9823                  "declaration thinks it's the definition but it isn't");
9824           cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
9825         }
9826       }
9827 
9828       continue;
9829     }
9830 
9831     if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
9832       // Make sure that the ObjCInterfaceType points at the definition.
9833       const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
9834         ->Decl = ID;
9835 
9836       for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
9837         cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
9838 
9839       continue;
9840     }
9841 
9842     if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
9843       for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
9844         cast<ObjCProtocolDecl>(R)->Data = PD->Data;
9845 
9846       continue;
9847     }
9848 
9849     auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
9850     for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
9851       cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
9852   }
9853   PendingDefinitions.clear();
9854 
9855   // Load the bodies of any functions or methods we've encountered. We do
9856   // this now (delayed) so that we can be sure that the declaration chains
9857   // have been fully wired up (hasBody relies on this).
9858   // FIXME: We shouldn't require complete redeclaration chains here.
9859   for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
9860                                PBEnd = PendingBodies.end();
9861        PB != PBEnd; ++PB) {
9862     if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
9863       // For a function defined inline within a class template, force the
9864       // canonical definition to be the one inside the canonical definition of
9865       // the template. This ensures that we instantiate from a correct view
9866       // of the template.
9867       //
9868       // Sadly we can't do this more generally: we can't be sure that all
9869       // copies of an arbitrary class definition will have the same members
9870       // defined (eg, some member functions may not be instantiated, and some
9871       // special members may or may not have been implicitly defined).
9872       if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent()))
9873         if (RD->isDependentContext() && !RD->isThisDeclarationADefinition())
9874           continue;
9875 
9876       // FIXME: Check for =delete/=default?
9877       const FunctionDecl *Defn = nullptr;
9878       if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
9879         FD->setLazyBody(PB->second);
9880       } else {
9881         auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
9882         mergeDefinitionVisibility(NonConstDefn, FD);
9883 
9884         if (!FD->isLateTemplateParsed() &&
9885             !NonConstDefn->isLateTemplateParsed() &&
9886             // We only perform ODR checks for decls not in the explicit
9887             // global module fragment.
9888             !shouldSkipCheckingODR(FD) &&
9889             !shouldSkipCheckingODR(NonConstDefn) &&
9890             FD->getODRHash() != NonConstDefn->getODRHash()) {
9891           if (!isa<CXXMethodDecl>(FD)) {
9892             PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9893           } else if (FD->getLexicalParent()->isFileContext() &&
9894                      NonConstDefn->getLexicalParent()->isFileContext()) {
9895             // Only diagnose out-of-line method definitions.  If they are
9896             // in class definitions, then an error will be generated when
9897             // processing the class bodies.
9898             PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
9899           }
9900         }
9901       }
9902       continue;
9903     }
9904 
9905     ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
9906     if (!getContext().getLangOpts().Modules || !MD->hasBody())
9907       MD->setLazyBody(PB->second);
9908   }
9909   PendingBodies.clear();
9910 
9911   // Inform any classes that had members added that they now have more members.
9912   for (auto [RD, MD] : PendingAddedClassMembers) {
9913     RD->addedMember(MD);
9914   }
9915   PendingAddedClassMembers.clear();
9916 
9917   // Do some cleanup.
9918   for (auto *ND : PendingMergedDefinitionsToDeduplicate)
9919     getContext().deduplicateMergedDefinitonsFor(ND);
9920   PendingMergedDefinitionsToDeduplicate.clear();
9921 }
9922 
diagnoseOdrViolations()9923 void ASTReader::diagnoseOdrViolations() {
9924   if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
9925       PendingRecordOdrMergeFailures.empty() &&
9926       PendingFunctionOdrMergeFailures.empty() &&
9927       PendingEnumOdrMergeFailures.empty() &&
9928       PendingObjCInterfaceOdrMergeFailures.empty() &&
9929       PendingObjCProtocolOdrMergeFailures.empty())
9930     return;
9931 
9932   // Trigger the import of the full definition of each class that had any
9933   // odr-merging problems, so we can produce better diagnostics for them.
9934   // These updates may in turn find and diagnose some ODR failures, so take
9935   // ownership of the set first.
9936   auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
9937   PendingOdrMergeFailures.clear();
9938   for (auto &Merge : OdrMergeFailures) {
9939     Merge.first->buildLookup();
9940     Merge.first->decls_begin();
9941     Merge.first->bases_begin();
9942     Merge.first->vbases_begin();
9943     for (auto &RecordPair : Merge.second) {
9944       auto *RD = RecordPair.first;
9945       RD->decls_begin();
9946       RD->bases_begin();
9947       RD->vbases_begin();
9948     }
9949   }
9950 
9951   // Trigger the import of the full definition of each record in C/ObjC.
9952   auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
9953   PendingRecordOdrMergeFailures.clear();
9954   for (auto &Merge : RecordOdrMergeFailures) {
9955     Merge.first->decls_begin();
9956     for (auto &D : Merge.second)
9957       D->decls_begin();
9958   }
9959 
9960   // Trigger the import of the full interface definition.
9961   auto ObjCInterfaceOdrMergeFailures =
9962       std::move(PendingObjCInterfaceOdrMergeFailures);
9963   PendingObjCInterfaceOdrMergeFailures.clear();
9964   for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
9965     Merge.first->decls_begin();
9966     for (auto &InterfacePair : Merge.second)
9967       InterfacePair.first->decls_begin();
9968   }
9969 
9970   // Trigger the import of functions.
9971   auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
9972   PendingFunctionOdrMergeFailures.clear();
9973   for (auto &Merge : FunctionOdrMergeFailures) {
9974     Merge.first->buildLookup();
9975     Merge.first->decls_begin();
9976     Merge.first->getBody();
9977     for (auto &FD : Merge.second) {
9978       FD->buildLookup();
9979       FD->decls_begin();
9980       FD->getBody();
9981     }
9982   }
9983 
9984   // Trigger the import of enums.
9985   auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
9986   PendingEnumOdrMergeFailures.clear();
9987   for (auto &Merge : EnumOdrMergeFailures) {
9988     Merge.first->decls_begin();
9989     for (auto &Enum : Merge.second) {
9990       Enum->decls_begin();
9991     }
9992   }
9993 
9994   // Trigger the import of the full protocol definition.
9995   auto ObjCProtocolOdrMergeFailures =
9996       std::move(PendingObjCProtocolOdrMergeFailures);
9997   PendingObjCProtocolOdrMergeFailures.clear();
9998   for (auto &Merge : ObjCProtocolOdrMergeFailures) {
9999     Merge.first->decls_begin();
10000     for (auto &ProtocolPair : Merge.second)
10001       ProtocolPair.first->decls_begin();
10002   }
10003 
10004   // For each declaration from a merged context, check that the canonical
10005   // definition of that context also contains a declaration of the same
10006   // entity.
10007   //
10008   // Caution: this loop does things that might invalidate iterators into
10009   // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
10010   while (!PendingOdrMergeChecks.empty()) {
10011     NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10012 
10013     // FIXME: Skip over implicit declarations for now. This matters for things
10014     // like implicitly-declared special member functions. This isn't entirely
10015     // correct; we can end up with multiple unmerged declarations of the same
10016     // implicit entity.
10017     if (D->isImplicit())
10018       continue;
10019 
10020     DeclContext *CanonDef = D->getDeclContext();
10021 
10022     bool Found = false;
10023     const Decl *DCanon = D->getCanonicalDecl();
10024 
10025     for (auto *RI : D->redecls()) {
10026       if (RI->getLexicalDeclContext() == CanonDef) {
10027         Found = true;
10028         break;
10029       }
10030     }
10031     if (Found)
10032       continue;
10033 
10034     // Quick check failed, time to do the slow thing. Note, we can't just
10035     // look up the name of D in CanonDef here, because the member that is
10036     // in CanonDef might not be found by name lookup (it might have been
10037     // replaced by a more recent declaration in the lookup table), and we
10038     // can't necessarily find it in the redeclaration chain because it might
10039     // be merely mergeable, not redeclarable.
10040     llvm::SmallVector<const NamedDecl*, 4> Candidates;
10041     for (auto *CanonMember : CanonDef->decls()) {
10042       if (CanonMember->getCanonicalDecl() == DCanon) {
10043         // This can happen if the declaration is merely mergeable and not
10044         // actually redeclarable (we looked for redeclarations earlier).
10045         //
10046         // FIXME: We should be able to detect this more efficiently, without
10047         // pulling in all of the members of CanonDef.
10048         Found = true;
10049         break;
10050       }
10051       if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
10052         if (ND->getDeclName() == D->getDeclName())
10053           Candidates.push_back(ND);
10054     }
10055 
10056     if (!Found) {
10057       // The AST doesn't like TagDecls becoming invalid after they've been
10058       // completed. We only really need to mark FieldDecls as invalid here.
10059       if (!isa<TagDecl>(D))
10060         D->setInvalidDecl();
10061 
10062       // Ensure we don't accidentally recursively enter deserialization while
10063       // we're producing our diagnostic.
10064       Deserializing RecursionGuard(this);
10065 
10066       std::string CanonDefModule =
10067           ODRDiagsEmitter::getOwningModuleNameForDiagnostic(
10068               cast<Decl>(CanonDef));
10069       Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
10070         << D << ODRDiagsEmitter::getOwningModuleNameForDiagnostic(D)
10071         << CanonDef << CanonDefModule.empty() << CanonDefModule;
10072 
10073       if (Candidates.empty())
10074         Diag(cast<Decl>(CanonDef)->getLocation(),
10075              diag::note_module_odr_violation_no_possible_decls) << D;
10076       else {
10077         for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
10078           Diag(Candidates[I]->getLocation(),
10079                diag::note_module_odr_violation_possible_decl)
10080             << Candidates[I];
10081       }
10082 
10083       DiagnosedOdrMergeFailures.insert(CanonDef);
10084     }
10085   }
10086 
10087   if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
10088       FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
10089       ObjCInterfaceOdrMergeFailures.empty() &&
10090       ObjCProtocolOdrMergeFailures.empty())
10091     return;
10092 
10093   ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
10094                                getPreprocessor().getLangOpts());
10095 
10096   // Issue any pending ODR-failure diagnostics.
10097   for (auto &Merge : OdrMergeFailures) {
10098     // If we've already pointed out a specific problem with this class, don't
10099     // bother issuing a general "something's different" diagnostic.
10100     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10101       continue;
10102 
10103     bool Diagnosed = false;
10104     CXXRecordDecl *FirstRecord = Merge.first;
10105     for (auto &RecordPair : Merge.second) {
10106       if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
10107                                         RecordPair.second)) {
10108         Diagnosed = true;
10109         break;
10110       }
10111     }
10112 
10113     if (!Diagnosed) {
10114       // All definitions are updates to the same declaration. This happens if a
10115       // module instantiates the declaration of a class template specialization
10116       // and two or more other modules instantiate its definition.
10117       //
10118       // FIXME: Indicate which modules had instantiations of this definition.
10119       // FIXME: How can this even happen?
10120       Diag(Merge.first->getLocation(),
10121            diag::err_module_odr_violation_different_instantiations)
10122           << Merge.first;
10123     }
10124   }
10125 
10126   // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
10127   // that in C++ this is done as a part of CXXRecordDecl ODR checking.
10128   for (auto &Merge : RecordOdrMergeFailures) {
10129     // If we've already pointed out a specific problem with this class, don't
10130     // bother issuing a general "something's different" diagnostic.
10131     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10132       continue;
10133 
10134     RecordDecl *FirstRecord = Merge.first;
10135     bool Diagnosed = false;
10136     for (auto *SecondRecord : Merge.second) {
10137       if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
10138         Diagnosed = true;
10139         break;
10140       }
10141     }
10142     (void)Diagnosed;
10143     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10144   }
10145 
10146   // Issue ODR failures diagnostics for functions.
10147   for (auto &Merge : FunctionOdrMergeFailures) {
10148     FunctionDecl *FirstFunction = Merge.first;
10149     bool Diagnosed = false;
10150     for (auto &SecondFunction : Merge.second) {
10151       if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
10152         Diagnosed = true;
10153         break;
10154       }
10155     }
10156     (void)Diagnosed;
10157     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10158   }
10159 
10160   // Issue ODR failures diagnostics for enums.
10161   for (auto &Merge : EnumOdrMergeFailures) {
10162     // If we've already pointed out a specific problem with this enum, don't
10163     // bother issuing a general "something's different" diagnostic.
10164     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10165       continue;
10166 
10167     EnumDecl *FirstEnum = Merge.first;
10168     bool Diagnosed = false;
10169     for (auto &SecondEnum : Merge.second) {
10170       if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
10171         Diagnosed = true;
10172         break;
10173       }
10174     }
10175     (void)Diagnosed;
10176     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10177   }
10178 
10179   for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
10180     // If we've already pointed out a specific problem with this interface,
10181     // don't bother issuing a general "something's different" diagnostic.
10182     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10183       continue;
10184 
10185     bool Diagnosed = false;
10186     ObjCInterfaceDecl *FirstID = Merge.first;
10187     for (auto &InterfacePair : Merge.second) {
10188       if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
10189                                         InterfacePair.second)) {
10190         Diagnosed = true;
10191         break;
10192       }
10193     }
10194     (void)Diagnosed;
10195     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10196   }
10197 
10198   for (auto &Merge : ObjCProtocolOdrMergeFailures) {
10199     // If we've already pointed out a specific problem with this protocol,
10200     // don't bother issuing a general "something's different" diagnostic.
10201     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10202       continue;
10203 
10204     ObjCProtocolDecl *FirstProtocol = Merge.first;
10205     bool Diagnosed = false;
10206     for (auto &ProtocolPair : Merge.second) {
10207       if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
10208                                         ProtocolPair.second)) {
10209         Diagnosed = true;
10210         break;
10211       }
10212     }
10213     (void)Diagnosed;
10214     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10215   }
10216 }
10217 
StartedDeserializing()10218 void ASTReader::StartedDeserializing() {
10219   if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
10220     ReadTimer->startTimer();
10221 }
10222 
FinishedDeserializing()10223 void ASTReader::FinishedDeserializing() {
10224   assert(NumCurrentElementsDeserializing &&
10225          "FinishedDeserializing not paired with StartedDeserializing");
10226   if (NumCurrentElementsDeserializing == 1) {
10227     // We decrease NumCurrentElementsDeserializing only after pending actions
10228     // are finished, to avoid recursively re-calling finishPendingActions().
10229     finishPendingActions();
10230   }
10231   --NumCurrentElementsDeserializing;
10232 
10233   if (NumCurrentElementsDeserializing == 0) {
10234     // Propagate exception specification and deduced type updates along
10235     // redeclaration chains.
10236     //
10237     // We do this now rather than in finishPendingActions because we want to
10238     // be able to walk the complete redeclaration chains of the updated decls.
10239     while (!PendingExceptionSpecUpdates.empty() ||
10240            !PendingDeducedTypeUpdates.empty()) {
10241       auto ESUpdates = std::move(PendingExceptionSpecUpdates);
10242       PendingExceptionSpecUpdates.clear();
10243       for (auto Update : ESUpdates) {
10244         ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
10245         auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
10246         auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
10247         if (auto *Listener = getContext().getASTMutationListener())
10248           Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
10249         for (auto *Redecl : Update.second->redecls())
10250           getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
10251       }
10252 
10253       auto DTUpdates = std::move(PendingDeducedTypeUpdates);
10254       PendingDeducedTypeUpdates.clear();
10255       for (auto Update : DTUpdates) {
10256         ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
10257         // FIXME: If the return type is already deduced, check that it matches.
10258         getContext().adjustDeducedFunctionResultType(Update.first,
10259                                                      Update.second);
10260       }
10261 
10262       auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
10263       PendingUndeducedFunctionDecls.clear();
10264       // We hope we can find the deduced type for the functions by iterating
10265       // redeclarations in other modules.
10266       for (FunctionDecl *UndeducedFD : UDTUpdates)
10267         (void)UndeducedFD->getMostRecentDecl();
10268     }
10269 
10270     if (ReadTimer)
10271       ReadTimer->stopTimer();
10272 
10273     diagnoseOdrViolations();
10274 
10275     // We are not in recursive loading, so it's safe to pass the "interesting"
10276     // decls to the consumer.
10277     if (Consumer)
10278       PassInterestingDeclsToConsumer();
10279   }
10280 }
10281 
pushExternalDeclIntoScope(NamedDecl * D,DeclarationName Name)10282 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
10283   if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
10284     // Remove any fake results before adding any real ones.
10285     auto It = PendingFakeLookupResults.find(II);
10286     if (It != PendingFakeLookupResults.end()) {
10287       for (auto *ND : It->second)
10288         SemaObj->IdResolver.RemoveDecl(ND);
10289       // FIXME: this works around module+PCH performance issue.
10290       // Rather than erase the result from the map, which is O(n), just clear
10291       // the vector of NamedDecls.
10292       It->second.clear();
10293     }
10294   }
10295 
10296   if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
10297     SemaObj->TUScope->AddDecl(D);
10298   } else if (SemaObj->TUScope) {
10299     // Adding the decl to IdResolver may have failed because it was already in
10300     // (even though it was not added in scope). If it is already in, make sure
10301     // it gets in the scope as well.
10302     if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
10303       SemaObj->TUScope->AddDecl(D);
10304   }
10305 }
10306 
ASTReader(Preprocessor & PP,InMemoryModuleCache & ModuleCache,ASTContext * Context,const PCHContainerReader & PCHContainerRdr,ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,StringRef isysroot,DisableValidationForModuleKind DisableValidationKind,bool AllowASTWithCompilerErrors,bool AllowConfigurationMismatch,bool ValidateSystemInputs,bool ValidateASTInputFilesContent,bool UseGlobalIndex,std::unique_ptr<llvm::Timer> ReadTimer)10307 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
10308                      ASTContext *Context,
10309                      const PCHContainerReader &PCHContainerRdr,
10310                      ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
10311                      StringRef isysroot,
10312                      DisableValidationForModuleKind DisableValidationKind,
10313                      bool AllowASTWithCompilerErrors,
10314                      bool AllowConfigurationMismatch, bool ValidateSystemInputs,
10315                      bool ValidateASTInputFilesContent, bool UseGlobalIndex,
10316                      std::unique_ptr<llvm::Timer> ReadTimer)
10317     : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH)
10318                    ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
10319                    : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
10320       SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
10321       PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
10322       ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache,
10323                                      PCHContainerRdr, PP.getHeaderSearchInfo()),
10324       DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
10325       DisableValidationKind(DisableValidationKind),
10326       AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
10327       AllowConfigurationMismatch(AllowConfigurationMismatch),
10328       ValidateSystemInputs(ValidateSystemInputs),
10329       ValidateASTInputFilesContent(ValidateASTInputFilesContent),
10330       UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
10331   SourceMgr.setExternalSLocEntrySource(this);
10332 
10333   for (const auto &Ext : Extensions) {
10334     auto BlockName = Ext->getExtensionMetadata().BlockName;
10335     auto Known = ModuleFileExtensions.find(BlockName);
10336     if (Known != ModuleFileExtensions.end()) {
10337       Diags.Report(diag::warn_duplicate_module_file_extension)
10338         << BlockName;
10339       continue;
10340     }
10341 
10342     ModuleFileExtensions.insert({BlockName, Ext});
10343   }
10344 }
10345 
~ASTReader()10346 ASTReader::~ASTReader() {
10347   if (OwnsDeserializationListener)
10348     delete DeserializationListener;
10349 }
10350 
getIdResolver()10351 IdentifierResolver &ASTReader::getIdResolver() {
10352   return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
10353 }
10354 
readRecord(llvm::BitstreamCursor & Cursor,unsigned AbbrevID)10355 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
10356                                                unsigned AbbrevID) {
10357   Idx = 0;
10358   Record.clear();
10359   return Cursor.readRecord(AbbrevID, Record);
10360 }
10361 //===----------------------------------------------------------------------===//
10362 //// OMPClauseReader implementation
10363 ////===----------------------------------------------------------------------===//
10364 
10365 // This has to be in namespace clang because it's friended by all
10366 // of the OMP clauses.
10367 namespace clang {
10368 
10369 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
10370   ASTRecordReader &Record;
10371   ASTContext &Context;
10372 
10373 public:
OMPClauseReader(ASTRecordReader & Record)10374   OMPClauseReader(ASTRecordReader &Record)
10375       : Record(Record), Context(Record.getContext()) {}
10376 #define GEN_CLANG_CLAUSE_CLASS
10377 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
10378 #include "llvm/Frontend/OpenMP/OMP.inc"
10379   OMPClause *readClause();
10380   void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
10381   void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
10382 };
10383 
10384 } // end namespace clang
10385 
readOMPClause()10386 OMPClause *ASTRecordReader::readOMPClause() {
10387   return OMPClauseReader(*this).readClause();
10388 }
10389 
readClause()10390 OMPClause *OMPClauseReader::readClause() {
10391   OMPClause *C = nullptr;
10392   switch (llvm::omp::Clause(Record.readInt())) {
10393   case llvm::omp::OMPC_if:
10394     C = new (Context) OMPIfClause();
10395     break;
10396   case llvm::omp::OMPC_final:
10397     C = new (Context) OMPFinalClause();
10398     break;
10399   case llvm::omp::OMPC_num_threads:
10400     C = new (Context) OMPNumThreadsClause();
10401     break;
10402   case llvm::omp::OMPC_safelen:
10403     C = new (Context) OMPSafelenClause();
10404     break;
10405   case llvm::omp::OMPC_simdlen:
10406     C = new (Context) OMPSimdlenClause();
10407     break;
10408   case llvm::omp::OMPC_sizes: {
10409     unsigned NumSizes = Record.readInt();
10410     C = OMPSizesClause::CreateEmpty(Context, NumSizes);
10411     break;
10412   }
10413   case llvm::omp::OMPC_full:
10414     C = OMPFullClause::CreateEmpty(Context);
10415     break;
10416   case llvm::omp::OMPC_partial:
10417     C = OMPPartialClause::CreateEmpty(Context);
10418     break;
10419   case llvm::omp::OMPC_allocator:
10420     C = new (Context) OMPAllocatorClause();
10421     break;
10422   case llvm::omp::OMPC_collapse:
10423     C = new (Context) OMPCollapseClause();
10424     break;
10425   case llvm::omp::OMPC_default:
10426     C = new (Context) OMPDefaultClause();
10427     break;
10428   case llvm::omp::OMPC_proc_bind:
10429     C = new (Context) OMPProcBindClause();
10430     break;
10431   case llvm::omp::OMPC_schedule:
10432     C = new (Context) OMPScheduleClause();
10433     break;
10434   case llvm::omp::OMPC_ordered:
10435     C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
10436     break;
10437   case llvm::omp::OMPC_nowait:
10438     C = new (Context) OMPNowaitClause();
10439     break;
10440   case llvm::omp::OMPC_untied:
10441     C = new (Context) OMPUntiedClause();
10442     break;
10443   case llvm::omp::OMPC_mergeable:
10444     C = new (Context) OMPMergeableClause();
10445     break;
10446   case llvm::omp::OMPC_read:
10447     C = new (Context) OMPReadClause();
10448     break;
10449   case llvm::omp::OMPC_write:
10450     C = new (Context) OMPWriteClause();
10451     break;
10452   case llvm::omp::OMPC_update:
10453     C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
10454     break;
10455   case llvm::omp::OMPC_capture:
10456     C = new (Context) OMPCaptureClause();
10457     break;
10458   case llvm::omp::OMPC_compare:
10459     C = new (Context) OMPCompareClause();
10460     break;
10461   case llvm::omp::OMPC_fail:
10462     C = new (Context) OMPFailClause();
10463     break;
10464   case llvm::omp::OMPC_seq_cst:
10465     C = new (Context) OMPSeqCstClause();
10466     break;
10467   case llvm::omp::OMPC_acq_rel:
10468     C = new (Context) OMPAcqRelClause();
10469     break;
10470   case llvm::omp::OMPC_acquire:
10471     C = new (Context) OMPAcquireClause();
10472     break;
10473   case llvm::omp::OMPC_release:
10474     C = new (Context) OMPReleaseClause();
10475     break;
10476   case llvm::omp::OMPC_relaxed:
10477     C = new (Context) OMPRelaxedClause();
10478     break;
10479   case llvm::omp::OMPC_weak:
10480     C = new (Context) OMPWeakClause();
10481     break;
10482   case llvm::omp::OMPC_threads:
10483     C = new (Context) OMPThreadsClause();
10484     break;
10485   case llvm::omp::OMPC_simd:
10486     C = new (Context) OMPSIMDClause();
10487     break;
10488   case llvm::omp::OMPC_nogroup:
10489     C = new (Context) OMPNogroupClause();
10490     break;
10491   case llvm::omp::OMPC_unified_address:
10492     C = new (Context) OMPUnifiedAddressClause();
10493     break;
10494   case llvm::omp::OMPC_unified_shared_memory:
10495     C = new (Context) OMPUnifiedSharedMemoryClause();
10496     break;
10497   case llvm::omp::OMPC_reverse_offload:
10498     C = new (Context) OMPReverseOffloadClause();
10499     break;
10500   case llvm::omp::OMPC_dynamic_allocators:
10501     C = new (Context) OMPDynamicAllocatorsClause();
10502     break;
10503   case llvm::omp::OMPC_atomic_default_mem_order:
10504     C = new (Context) OMPAtomicDefaultMemOrderClause();
10505     break;
10506   case llvm::omp::OMPC_at:
10507     C = new (Context) OMPAtClause();
10508     break;
10509   case llvm::omp::OMPC_severity:
10510     C = new (Context) OMPSeverityClause();
10511     break;
10512   case llvm::omp::OMPC_message:
10513     C = new (Context) OMPMessageClause();
10514     break;
10515   case llvm::omp::OMPC_private:
10516     C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
10517     break;
10518   case llvm::omp::OMPC_firstprivate:
10519     C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
10520     break;
10521   case llvm::omp::OMPC_lastprivate:
10522     C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
10523     break;
10524   case llvm::omp::OMPC_shared:
10525     C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
10526     break;
10527   case llvm::omp::OMPC_reduction: {
10528     unsigned N = Record.readInt();
10529     auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
10530     C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
10531     break;
10532   }
10533   case llvm::omp::OMPC_task_reduction:
10534     C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
10535     break;
10536   case llvm::omp::OMPC_in_reduction:
10537     C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
10538     break;
10539   case llvm::omp::OMPC_linear:
10540     C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
10541     break;
10542   case llvm::omp::OMPC_aligned:
10543     C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
10544     break;
10545   case llvm::omp::OMPC_copyin:
10546     C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
10547     break;
10548   case llvm::omp::OMPC_copyprivate:
10549     C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
10550     break;
10551   case llvm::omp::OMPC_flush:
10552     C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
10553     break;
10554   case llvm::omp::OMPC_depobj:
10555     C = OMPDepobjClause::CreateEmpty(Context);
10556     break;
10557   case llvm::omp::OMPC_depend: {
10558     unsigned NumVars = Record.readInt();
10559     unsigned NumLoops = Record.readInt();
10560     C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
10561     break;
10562   }
10563   case llvm::omp::OMPC_device:
10564     C = new (Context) OMPDeviceClause();
10565     break;
10566   case llvm::omp::OMPC_map: {
10567     OMPMappableExprListSizeTy Sizes;
10568     Sizes.NumVars = Record.readInt();
10569     Sizes.NumUniqueDeclarations = Record.readInt();
10570     Sizes.NumComponentLists = Record.readInt();
10571     Sizes.NumComponents = Record.readInt();
10572     C = OMPMapClause::CreateEmpty(Context, Sizes);
10573     break;
10574   }
10575   case llvm::omp::OMPC_num_teams:
10576     C = new (Context) OMPNumTeamsClause();
10577     break;
10578   case llvm::omp::OMPC_thread_limit:
10579     C = new (Context) OMPThreadLimitClause();
10580     break;
10581   case llvm::omp::OMPC_priority:
10582     C = new (Context) OMPPriorityClause();
10583     break;
10584   case llvm::omp::OMPC_grainsize:
10585     C = new (Context) OMPGrainsizeClause();
10586     break;
10587   case llvm::omp::OMPC_num_tasks:
10588     C = new (Context) OMPNumTasksClause();
10589     break;
10590   case llvm::omp::OMPC_hint:
10591     C = new (Context) OMPHintClause();
10592     break;
10593   case llvm::omp::OMPC_dist_schedule:
10594     C = new (Context) OMPDistScheduleClause();
10595     break;
10596   case llvm::omp::OMPC_defaultmap:
10597     C = new (Context) OMPDefaultmapClause();
10598     break;
10599   case llvm::omp::OMPC_to: {
10600     OMPMappableExprListSizeTy Sizes;
10601     Sizes.NumVars = Record.readInt();
10602     Sizes.NumUniqueDeclarations = Record.readInt();
10603     Sizes.NumComponentLists = Record.readInt();
10604     Sizes.NumComponents = Record.readInt();
10605     C = OMPToClause::CreateEmpty(Context, Sizes);
10606     break;
10607   }
10608   case llvm::omp::OMPC_from: {
10609     OMPMappableExprListSizeTy Sizes;
10610     Sizes.NumVars = Record.readInt();
10611     Sizes.NumUniqueDeclarations = Record.readInt();
10612     Sizes.NumComponentLists = Record.readInt();
10613     Sizes.NumComponents = Record.readInt();
10614     C = OMPFromClause::CreateEmpty(Context, Sizes);
10615     break;
10616   }
10617   case llvm::omp::OMPC_use_device_ptr: {
10618     OMPMappableExprListSizeTy Sizes;
10619     Sizes.NumVars = Record.readInt();
10620     Sizes.NumUniqueDeclarations = Record.readInt();
10621     Sizes.NumComponentLists = Record.readInt();
10622     Sizes.NumComponents = Record.readInt();
10623     C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
10624     break;
10625   }
10626   case llvm::omp::OMPC_use_device_addr: {
10627     OMPMappableExprListSizeTy Sizes;
10628     Sizes.NumVars = Record.readInt();
10629     Sizes.NumUniqueDeclarations = Record.readInt();
10630     Sizes.NumComponentLists = Record.readInt();
10631     Sizes.NumComponents = Record.readInt();
10632     C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
10633     break;
10634   }
10635   case llvm::omp::OMPC_is_device_ptr: {
10636     OMPMappableExprListSizeTy Sizes;
10637     Sizes.NumVars = Record.readInt();
10638     Sizes.NumUniqueDeclarations = Record.readInt();
10639     Sizes.NumComponentLists = Record.readInt();
10640     Sizes.NumComponents = Record.readInt();
10641     C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
10642     break;
10643   }
10644   case llvm::omp::OMPC_has_device_addr: {
10645     OMPMappableExprListSizeTy Sizes;
10646     Sizes.NumVars = Record.readInt();
10647     Sizes.NumUniqueDeclarations = Record.readInt();
10648     Sizes.NumComponentLists = Record.readInt();
10649     Sizes.NumComponents = Record.readInt();
10650     C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
10651     break;
10652   }
10653   case llvm::omp::OMPC_allocate:
10654     C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
10655     break;
10656   case llvm::omp::OMPC_nontemporal:
10657     C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
10658     break;
10659   case llvm::omp::OMPC_inclusive:
10660     C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
10661     break;
10662   case llvm::omp::OMPC_exclusive:
10663     C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
10664     break;
10665   case llvm::omp::OMPC_order:
10666     C = new (Context) OMPOrderClause();
10667     break;
10668   case llvm::omp::OMPC_init:
10669     C = OMPInitClause::CreateEmpty(Context, Record.readInt());
10670     break;
10671   case llvm::omp::OMPC_use:
10672     C = new (Context) OMPUseClause();
10673     break;
10674   case llvm::omp::OMPC_destroy:
10675     C = new (Context) OMPDestroyClause();
10676     break;
10677   case llvm::omp::OMPC_novariants:
10678     C = new (Context) OMPNovariantsClause();
10679     break;
10680   case llvm::omp::OMPC_nocontext:
10681     C = new (Context) OMPNocontextClause();
10682     break;
10683   case llvm::omp::OMPC_detach:
10684     C = new (Context) OMPDetachClause();
10685     break;
10686   case llvm::omp::OMPC_uses_allocators:
10687     C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
10688     break;
10689   case llvm::omp::OMPC_affinity:
10690     C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
10691     break;
10692   case llvm::omp::OMPC_filter:
10693     C = new (Context) OMPFilterClause();
10694     break;
10695   case llvm::omp::OMPC_bind:
10696     C = OMPBindClause::CreateEmpty(Context);
10697     break;
10698   case llvm::omp::OMPC_align:
10699     C = new (Context) OMPAlignClause();
10700     break;
10701   case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
10702     C = new (Context) OMPXDynCGroupMemClause();
10703     break;
10704   case llvm::omp::OMPC_doacross: {
10705     unsigned NumVars = Record.readInt();
10706     unsigned NumLoops = Record.readInt();
10707     C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
10708     break;
10709   }
10710   case llvm::omp::OMPC_ompx_attribute:
10711     C = new (Context) OMPXAttributeClause();
10712     break;
10713   case llvm::omp::OMPC_ompx_bare:
10714     C = new (Context) OMPXBareClause();
10715     break;
10716 #define OMP_CLAUSE_NO_CLASS(Enum, Str)                                         \
10717   case llvm::omp::Enum:                                                        \
10718     break;
10719 #include "llvm/Frontend/OpenMP/OMPKinds.def"
10720   default:
10721     break;
10722   }
10723   assert(C && "Unknown OMPClause type");
10724 
10725   Visit(C);
10726   C->setLocStart(Record.readSourceLocation());
10727   C->setLocEnd(Record.readSourceLocation());
10728 
10729   return C;
10730 }
10731 
VisitOMPClauseWithPreInit(OMPClauseWithPreInit * C)10732 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
10733   C->setPreInitStmt(Record.readSubStmt(),
10734                     static_cast<OpenMPDirectiveKind>(Record.readInt()));
10735 }
10736 
VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate * C)10737 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
10738   VisitOMPClauseWithPreInit(C);
10739   C->setPostUpdateExpr(Record.readSubExpr());
10740 }
10741 
VisitOMPIfClause(OMPIfClause * C)10742 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
10743   VisitOMPClauseWithPreInit(C);
10744   C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
10745   C->setNameModifierLoc(Record.readSourceLocation());
10746   C->setColonLoc(Record.readSourceLocation());
10747   C->setCondition(Record.readSubExpr());
10748   C->setLParenLoc(Record.readSourceLocation());
10749 }
10750 
VisitOMPFinalClause(OMPFinalClause * C)10751 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
10752   VisitOMPClauseWithPreInit(C);
10753   C->setCondition(Record.readSubExpr());
10754   C->setLParenLoc(Record.readSourceLocation());
10755 }
10756 
VisitOMPNumThreadsClause(OMPNumThreadsClause * C)10757 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
10758   VisitOMPClauseWithPreInit(C);
10759   C->setNumThreads(Record.readSubExpr());
10760   C->setLParenLoc(Record.readSourceLocation());
10761 }
10762 
VisitOMPSafelenClause(OMPSafelenClause * C)10763 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
10764   C->setSafelen(Record.readSubExpr());
10765   C->setLParenLoc(Record.readSourceLocation());
10766 }
10767 
VisitOMPSimdlenClause(OMPSimdlenClause * C)10768 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
10769   C->setSimdlen(Record.readSubExpr());
10770   C->setLParenLoc(Record.readSourceLocation());
10771 }
10772 
VisitOMPSizesClause(OMPSizesClause * C)10773 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
10774   for (Expr *&E : C->getSizesRefs())
10775     E = Record.readSubExpr();
10776   C->setLParenLoc(Record.readSourceLocation());
10777 }
10778 
VisitOMPFullClause(OMPFullClause * C)10779 void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
10780 
VisitOMPPartialClause(OMPPartialClause * C)10781 void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
10782   C->setFactor(Record.readSubExpr());
10783   C->setLParenLoc(Record.readSourceLocation());
10784 }
10785 
VisitOMPAllocatorClause(OMPAllocatorClause * C)10786 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
10787   C->setAllocator(Record.readExpr());
10788   C->setLParenLoc(Record.readSourceLocation());
10789 }
10790 
VisitOMPCollapseClause(OMPCollapseClause * C)10791 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
10792   C->setNumForLoops(Record.readSubExpr());
10793   C->setLParenLoc(Record.readSourceLocation());
10794 }
10795 
VisitOMPDefaultClause(OMPDefaultClause * C)10796 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
10797   C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
10798   C->setLParenLoc(Record.readSourceLocation());
10799   C->setDefaultKindKwLoc(Record.readSourceLocation());
10800 }
10801 
VisitOMPProcBindClause(OMPProcBindClause * C)10802 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
10803   C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
10804   C->setLParenLoc(Record.readSourceLocation());
10805   C->setProcBindKindKwLoc(Record.readSourceLocation());
10806 }
10807 
VisitOMPScheduleClause(OMPScheduleClause * C)10808 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
10809   VisitOMPClauseWithPreInit(C);
10810   C->setScheduleKind(
10811        static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
10812   C->setFirstScheduleModifier(
10813       static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
10814   C->setSecondScheduleModifier(
10815       static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
10816   C->setChunkSize(Record.readSubExpr());
10817   C->setLParenLoc(Record.readSourceLocation());
10818   C->setFirstScheduleModifierLoc(Record.readSourceLocation());
10819   C->setSecondScheduleModifierLoc(Record.readSourceLocation());
10820   C->setScheduleKindLoc(Record.readSourceLocation());
10821   C->setCommaLoc(Record.readSourceLocation());
10822 }
10823 
VisitOMPOrderedClause(OMPOrderedClause * C)10824 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
10825   C->setNumForLoops(Record.readSubExpr());
10826   for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
10827     C->setLoopNumIterations(I, Record.readSubExpr());
10828   for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
10829     C->setLoopCounter(I, Record.readSubExpr());
10830   C->setLParenLoc(Record.readSourceLocation());
10831 }
10832 
VisitOMPDetachClause(OMPDetachClause * C)10833 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
10834   C->setEventHandler(Record.readSubExpr());
10835   C->setLParenLoc(Record.readSourceLocation());
10836 }
10837 
VisitOMPNowaitClause(OMPNowaitClause *)10838 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
10839 
VisitOMPUntiedClause(OMPUntiedClause *)10840 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
10841 
VisitOMPMergeableClause(OMPMergeableClause *)10842 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
10843 
VisitOMPReadClause(OMPReadClause *)10844 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
10845 
VisitOMPWriteClause(OMPWriteClause *)10846 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
10847 
VisitOMPUpdateClause(OMPUpdateClause * C)10848 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
10849   if (C->isExtended()) {
10850     C->setLParenLoc(Record.readSourceLocation());
10851     C->setArgumentLoc(Record.readSourceLocation());
10852     C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
10853   }
10854 }
10855 
VisitOMPCaptureClause(OMPCaptureClause *)10856 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
10857 
VisitOMPCompareClause(OMPCompareClause *)10858 void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
10859 
10860 // Read the parameter of fail clause. This will have been saved when
10861 // OMPClauseWriter is called.
VisitOMPFailClause(OMPFailClause * C)10862 void OMPClauseReader::VisitOMPFailClause(OMPFailClause *C) {
10863   C->setLParenLoc(Record.readSourceLocation());
10864   SourceLocation FailParameterLoc = Record.readSourceLocation();
10865   C->setFailParameterLoc(FailParameterLoc);
10866   OpenMPClauseKind CKind = Record.readEnum<OpenMPClauseKind>();
10867   C->setFailParameter(CKind);
10868 }
10869 
VisitOMPSeqCstClause(OMPSeqCstClause *)10870 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
10871 
VisitOMPAcqRelClause(OMPAcqRelClause *)10872 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
10873 
VisitOMPAcquireClause(OMPAcquireClause *)10874 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
10875 
VisitOMPReleaseClause(OMPReleaseClause *)10876 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
10877 
VisitOMPRelaxedClause(OMPRelaxedClause *)10878 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
10879 
VisitOMPWeakClause(OMPWeakClause *)10880 void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
10881 
VisitOMPThreadsClause(OMPThreadsClause *)10882 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
10883 
VisitOMPSIMDClause(OMPSIMDClause *)10884 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
10885 
VisitOMPNogroupClause(OMPNogroupClause *)10886 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
10887 
VisitOMPInitClause(OMPInitClause * C)10888 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
10889   unsigned NumVars = C->varlist_size();
10890   SmallVector<Expr *, 16> Vars;
10891   Vars.reserve(NumVars);
10892   for (unsigned I = 0; I != NumVars; ++I)
10893     Vars.push_back(Record.readSubExpr());
10894   C->setVarRefs(Vars);
10895   C->setIsTarget(Record.readBool());
10896   C->setIsTargetSync(Record.readBool());
10897   C->setLParenLoc(Record.readSourceLocation());
10898   C->setVarLoc(Record.readSourceLocation());
10899 }
10900 
VisitOMPUseClause(OMPUseClause * C)10901 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
10902   C->setInteropVar(Record.readSubExpr());
10903   C->setLParenLoc(Record.readSourceLocation());
10904   C->setVarLoc(Record.readSourceLocation());
10905 }
10906 
VisitOMPDestroyClause(OMPDestroyClause * C)10907 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
10908   C->setInteropVar(Record.readSubExpr());
10909   C->setLParenLoc(Record.readSourceLocation());
10910   C->setVarLoc(Record.readSourceLocation());
10911 }
10912 
VisitOMPNovariantsClause(OMPNovariantsClause * C)10913 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
10914   VisitOMPClauseWithPreInit(C);
10915   C->setCondition(Record.readSubExpr());
10916   C->setLParenLoc(Record.readSourceLocation());
10917 }
10918 
VisitOMPNocontextClause(OMPNocontextClause * C)10919 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
10920   VisitOMPClauseWithPreInit(C);
10921   C->setCondition(Record.readSubExpr());
10922   C->setLParenLoc(Record.readSourceLocation());
10923 }
10924 
VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *)10925 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
10926 
VisitOMPUnifiedSharedMemoryClause(OMPUnifiedSharedMemoryClause *)10927 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
10928     OMPUnifiedSharedMemoryClause *) {}
10929 
VisitOMPReverseOffloadClause(OMPReverseOffloadClause *)10930 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
10931 
10932 void
VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *)10933 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
10934 }
10935 
VisitOMPAtomicDefaultMemOrderClause(OMPAtomicDefaultMemOrderClause * C)10936 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
10937     OMPAtomicDefaultMemOrderClause *C) {
10938   C->setAtomicDefaultMemOrderKind(
10939       static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
10940   C->setLParenLoc(Record.readSourceLocation());
10941   C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
10942 }
10943 
VisitOMPAtClause(OMPAtClause * C)10944 void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
10945   C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
10946   C->setLParenLoc(Record.readSourceLocation());
10947   C->setAtKindKwLoc(Record.readSourceLocation());
10948 }
10949 
VisitOMPSeverityClause(OMPSeverityClause * C)10950 void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
10951   C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
10952   C->setLParenLoc(Record.readSourceLocation());
10953   C->setSeverityKindKwLoc(Record.readSourceLocation());
10954 }
10955 
VisitOMPMessageClause(OMPMessageClause * C)10956 void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
10957   C->setMessageString(Record.readSubExpr());
10958   C->setLParenLoc(Record.readSourceLocation());
10959 }
10960 
VisitOMPPrivateClause(OMPPrivateClause * C)10961 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
10962   C->setLParenLoc(Record.readSourceLocation());
10963   unsigned NumVars = C->varlist_size();
10964   SmallVector<Expr *, 16> Vars;
10965   Vars.reserve(NumVars);
10966   for (unsigned i = 0; i != NumVars; ++i)
10967     Vars.push_back(Record.readSubExpr());
10968   C->setVarRefs(Vars);
10969   Vars.clear();
10970   for (unsigned i = 0; i != NumVars; ++i)
10971     Vars.push_back(Record.readSubExpr());
10972   C->setPrivateCopies(Vars);
10973 }
10974 
VisitOMPFirstprivateClause(OMPFirstprivateClause * C)10975 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
10976   VisitOMPClauseWithPreInit(C);
10977   C->setLParenLoc(Record.readSourceLocation());
10978   unsigned NumVars = C->varlist_size();
10979   SmallVector<Expr *, 16> Vars;
10980   Vars.reserve(NumVars);
10981   for (unsigned i = 0; i != NumVars; ++i)
10982     Vars.push_back(Record.readSubExpr());
10983   C->setVarRefs(Vars);
10984   Vars.clear();
10985   for (unsigned i = 0; i != NumVars; ++i)
10986     Vars.push_back(Record.readSubExpr());
10987   C->setPrivateCopies(Vars);
10988   Vars.clear();
10989   for (unsigned i = 0; i != NumVars; ++i)
10990     Vars.push_back(Record.readSubExpr());
10991   C->setInits(Vars);
10992 }
10993 
VisitOMPLastprivateClause(OMPLastprivateClause * C)10994 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
10995   VisitOMPClauseWithPostUpdate(C);
10996   C->setLParenLoc(Record.readSourceLocation());
10997   C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
10998   C->setKindLoc(Record.readSourceLocation());
10999   C->setColonLoc(Record.readSourceLocation());
11000   unsigned NumVars = C->varlist_size();
11001   SmallVector<Expr *, 16> Vars;
11002   Vars.reserve(NumVars);
11003   for (unsigned i = 0; i != NumVars; ++i)
11004     Vars.push_back(Record.readSubExpr());
11005   C->setVarRefs(Vars);
11006   Vars.clear();
11007   for (unsigned i = 0; i != NumVars; ++i)
11008     Vars.push_back(Record.readSubExpr());
11009   C->setPrivateCopies(Vars);
11010   Vars.clear();
11011   for (unsigned i = 0; i != NumVars; ++i)
11012     Vars.push_back(Record.readSubExpr());
11013   C->setSourceExprs(Vars);
11014   Vars.clear();
11015   for (unsigned i = 0; i != NumVars; ++i)
11016     Vars.push_back(Record.readSubExpr());
11017   C->setDestinationExprs(Vars);
11018   Vars.clear();
11019   for (unsigned i = 0; i != NumVars; ++i)
11020     Vars.push_back(Record.readSubExpr());
11021   C->setAssignmentOps(Vars);
11022 }
11023 
VisitOMPSharedClause(OMPSharedClause * C)11024 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
11025   C->setLParenLoc(Record.readSourceLocation());
11026   unsigned NumVars = C->varlist_size();
11027   SmallVector<Expr *, 16> Vars;
11028   Vars.reserve(NumVars);
11029   for (unsigned i = 0; i != NumVars; ++i)
11030     Vars.push_back(Record.readSubExpr());
11031   C->setVarRefs(Vars);
11032 }
11033 
VisitOMPReductionClause(OMPReductionClause * C)11034 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
11035   VisitOMPClauseWithPostUpdate(C);
11036   C->setLParenLoc(Record.readSourceLocation());
11037   C->setModifierLoc(Record.readSourceLocation());
11038   C->setColonLoc(Record.readSourceLocation());
11039   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11040   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11041   C->setQualifierLoc(NNSL);
11042   C->setNameInfo(DNI);
11043 
11044   unsigned NumVars = C->varlist_size();
11045   SmallVector<Expr *, 16> Vars;
11046   Vars.reserve(NumVars);
11047   for (unsigned i = 0; i != NumVars; ++i)
11048     Vars.push_back(Record.readSubExpr());
11049   C->setVarRefs(Vars);
11050   Vars.clear();
11051   for (unsigned i = 0; i != NumVars; ++i)
11052     Vars.push_back(Record.readSubExpr());
11053   C->setPrivates(Vars);
11054   Vars.clear();
11055   for (unsigned i = 0; i != NumVars; ++i)
11056     Vars.push_back(Record.readSubExpr());
11057   C->setLHSExprs(Vars);
11058   Vars.clear();
11059   for (unsigned i = 0; i != NumVars; ++i)
11060     Vars.push_back(Record.readSubExpr());
11061   C->setRHSExprs(Vars);
11062   Vars.clear();
11063   for (unsigned i = 0; i != NumVars; ++i)
11064     Vars.push_back(Record.readSubExpr());
11065   C->setReductionOps(Vars);
11066   if (C->getModifier() == OMPC_REDUCTION_inscan) {
11067     Vars.clear();
11068     for (unsigned i = 0; i != NumVars; ++i)
11069       Vars.push_back(Record.readSubExpr());
11070     C->setInscanCopyOps(Vars);
11071     Vars.clear();
11072     for (unsigned i = 0; i != NumVars; ++i)
11073       Vars.push_back(Record.readSubExpr());
11074     C->setInscanCopyArrayTemps(Vars);
11075     Vars.clear();
11076     for (unsigned i = 0; i != NumVars; ++i)
11077       Vars.push_back(Record.readSubExpr());
11078     C->setInscanCopyArrayElems(Vars);
11079   }
11080 }
11081 
VisitOMPTaskReductionClause(OMPTaskReductionClause * C)11082 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
11083   VisitOMPClauseWithPostUpdate(C);
11084   C->setLParenLoc(Record.readSourceLocation());
11085   C->setColonLoc(Record.readSourceLocation());
11086   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11087   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11088   C->setQualifierLoc(NNSL);
11089   C->setNameInfo(DNI);
11090 
11091   unsigned NumVars = C->varlist_size();
11092   SmallVector<Expr *, 16> Vars;
11093   Vars.reserve(NumVars);
11094   for (unsigned I = 0; I != NumVars; ++I)
11095     Vars.push_back(Record.readSubExpr());
11096   C->setVarRefs(Vars);
11097   Vars.clear();
11098   for (unsigned I = 0; I != NumVars; ++I)
11099     Vars.push_back(Record.readSubExpr());
11100   C->setPrivates(Vars);
11101   Vars.clear();
11102   for (unsigned I = 0; I != NumVars; ++I)
11103     Vars.push_back(Record.readSubExpr());
11104   C->setLHSExprs(Vars);
11105   Vars.clear();
11106   for (unsigned I = 0; I != NumVars; ++I)
11107     Vars.push_back(Record.readSubExpr());
11108   C->setRHSExprs(Vars);
11109   Vars.clear();
11110   for (unsigned I = 0; I != NumVars; ++I)
11111     Vars.push_back(Record.readSubExpr());
11112   C->setReductionOps(Vars);
11113 }
11114 
VisitOMPInReductionClause(OMPInReductionClause * C)11115 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
11116   VisitOMPClauseWithPostUpdate(C);
11117   C->setLParenLoc(Record.readSourceLocation());
11118   C->setColonLoc(Record.readSourceLocation());
11119   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11120   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11121   C->setQualifierLoc(NNSL);
11122   C->setNameInfo(DNI);
11123 
11124   unsigned NumVars = C->varlist_size();
11125   SmallVector<Expr *, 16> Vars;
11126   Vars.reserve(NumVars);
11127   for (unsigned I = 0; I != NumVars; ++I)
11128     Vars.push_back(Record.readSubExpr());
11129   C->setVarRefs(Vars);
11130   Vars.clear();
11131   for (unsigned I = 0; I != NumVars; ++I)
11132     Vars.push_back(Record.readSubExpr());
11133   C->setPrivates(Vars);
11134   Vars.clear();
11135   for (unsigned I = 0; I != NumVars; ++I)
11136     Vars.push_back(Record.readSubExpr());
11137   C->setLHSExprs(Vars);
11138   Vars.clear();
11139   for (unsigned I = 0; I != NumVars; ++I)
11140     Vars.push_back(Record.readSubExpr());
11141   C->setRHSExprs(Vars);
11142   Vars.clear();
11143   for (unsigned I = 0; I != NumVars; ++I)
11144     Vars.push_back(Record.readSubExpr());
11145   C->setReductionOps(Vars);
11146   Vars.clear();
11147   for (unsigned I = 0; I != NumVars; ++I)
11148     Vars.push_back(Record.readSubExpr());
11149   C->setTaskgroupDescriptors(Vars);
11150 }
11151 
VisitOMPLinearClause(OMPLinearClause * C)11152 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
11153   VisitOMPClauseWithPostUpdate(C);
11154   C->setLParenLoc(Record.readSourceLocation());
11155   C->setColonLoc(Record.readSourceLocation());
11156   C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
11157   C->setModifierLoc(Record.readSourceLocation());
11158   unsigned NumVars = C->varlist_size();
11159   SmallVector<Expr *, 16> Vars;
11160   Vars.reserve(NumVars);
11161   for (unsigned i = 0; i != NumVars; ++i)
11162     Vars.push_back(Record.readSubExpr());
11163   C->setVarRefs(Vars);
11164   Vars.clear();
11165   for (unsigned i = 0; i != NumVars; ++i)
11166     Vars.push_back(Record.readSubExpr());
11167   C->setPrivates(Vars);
11168   Vars.clear();
11169   for (unsigned i = 0; i != NumVars; ++i)
11170     Vars.push_back(Record.readSubExpr());
11171   C->setInits(Vars);
11172   Vars.clear();
11173   for (unsigned i = 0; i != NumVars; ++i)
11174     Vars.push_back(Record.readSubExpr());
11175   C->setUpdates(Vars);
11176   Vars.clear();
11177   for (unsigned i = 0; i != NumVars; ++i)
11178     Vars.push_back(Record.readSubExpr());
11179   C->setFinals(Vars);
11180   C->setStep(Record.readSubExpr());
11181   C->setCalcStep(Record.readSubExpr());
11182   Vars.clear();
11183   for (unsigned I = 0; I != NumVars + 1; ++I)
11184     Vars.push_back(Record.readSubExpr());
11185   C->setUsedExprs(Vars);
11186 }
11187 
VisitOMPAlignedClause(OMPAlignedClause * C)11188 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
11189   C->setLParenLoc(Record.readSourceLocation());
11190   C->setColonLoc(Record.readSourceLocation());
11191   unsigned NumVars = C->varlist_size();
11192   SmallVector<Expr *, 16> Vars;
11193   Vars.reserve(NumVars);
11194   for (unsigned i = 0; i != NumVars; ++i)
11195     Vars.push_back(Record.readSubExpr());
11196   C->setVarRefs(Vars);
11197   C->setAlignment(Record.readSubExpr());
11198 }
11199 
VisitOMPCopyinClause(OMPCopyinClause * C)11200 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
11201   C->setLParenLoc(Record.readSourceLocation());
11202   unsigned NumVars = C->varlist_size();
11203   SmallVector<Expr *, 16> Exprs;
11204   Exprs.reserve(NumVars);
11205   for (unsigned i = 0; i != NumVars; ++i)
11206     Exprs.push_back(Record.readSubExpr());
11207   C->setVarRefs(Exprs);
11208   Exprs.clear();
11209   for (unsigned i = 0; i != NumVars; ++i)
11210     Exprs.push_back(Record.readSubExpr());
11211   C->setSourceExprs(Exprs);
11212   Exprs.clear();
11213   for (unsigned i = 0; i != NumVars; ++i)
11214     Exprs.push_back(Record.readSubExpr());
11215   C->setDestinationExprs(Exprs);
11216   Exprs.clear();
11217   for (unsigned i = 0; i != NumVars; ++i)
11218     Exprs.push_back(Record.readSubExpr());
11219   C->setAssignmentOps(Exprs);
11220 }
11221 
VisitOMPCopyprivateClause(OMPCopyprivateClause * C)11222 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
11223   C->setLParenLoc(Record.readSourceLocation());
11224   unsigned NumVars = C->varlist_size();
11225   SmallVector<Expr *, 16> Exprs;
11226   Exprs.reserve(NumVars);
11227   for (unsigned i = 0; i != NumVars; ++i)
11228     Exprs.push_back(Record.readSubExpr());
11229   C->setVarRefs(Exprs);
11230   Exprs.clear();
11231   for (unsigned i = 0; i != NumVars; ++i)
11232     Exprs.push_back(Record.readSubExpr());
11233   C->setSourceExprs(Exprs);
11234   Exprs.clear();
11235   for (unsigned i = 0; i != NumVars; ++i)
11236     Exprs.push_back(Record.readSubExpr());
11237   C->setDestinationExprs(Exprs);
11238   Exprs.clear();
11239   for (unsigned i = 0; i != NumVars; ++i)
11240     Exprs.push_back(Record.readSubExpr());
11241   C->setAssignmentOps(Exprs);
11242 }
11243 
VisitOMPFlushClause(OMPFlushClause * C)11244 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
11245   C->setLParenLoc(Record.readSourceLocation());
11246   unsigned NumVars = C->varlist_size();
11247   SmallVector<Expr *, 16> Vars;
11248   Vars.reserve(NumVars);
11249   for (unsigned i = 0; i != NumVars; ++i)
11250     Vars.push_back(Record.readSubExpr());
11251   C->setVarRefs(Vars);
11252 }
11253 
VisitOMPDepobjClause(OMPDepobjClause * C)11254 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
11255   C->setDepobj(Record.readSubExpr());
11256   C->setLParenLoc(Record.readSourceLocation());
11257 }
11258 
VisitOMPDependClause(OMPDependClause * C)11259 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
11260   C->setLParenLoc(Record.readSourceLocation());
11261   C->setModifier(Record.readSubExpr());
11262   C->setDependencyKind(
11263       static_cast<OpenMPDependClauseKind>(Record.readInt()));
11264   C->setDependencyLoc(Record.readSourceLocation());
11265   C->setColonLoc(Record.readSourceLocation());
11266   C->setOmpAllMemoryLoc(Record.readSourceLocation());
11267   unsigned NumVars = C->varlist_size();
11268   SmallVector<Expr *, 16> Vars;
11269   Vars.reserve(NumVars);
11270   for (unsigned I = 0; I != NumVars; ++I)
11271     Vars.push_back(Record.readSubExpr());
11272   C->setVarRefs(Vars);
11273   for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
11274     C->setLoopData(I, Record.readSubExpr());
11275 }
11276 
VisitOMPDeviceClause(OMPDeviceClause * C)11277 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
11278   VisitOMPClauseWithPreInit(C);
11279   C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
11280   C->setDevice(Record.readSubExpr());
11281   C->setModifierLoc(Record.readSourceLocation());
11282   C->setLParenLoc(Record.readSourceLocation());
11283 }
11284 
VisitOMPMapClause(OMPMapClause * C)11285 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
11286   C->setLParenLoc(Record.readSourceLocation());
11287   bool HasIteratorModifier = false;
11288   for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
11289     C->setMapTypeModifier(
11290         I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
11291     C->setMapTypeModifierLoc(I, Record.readSourceLocation());
11292     if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
11293       HasIteratorModifier = true;
11294   }
11295   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
11296   C->setMapperIdInfo(Record.readDeclarationNameInfo());
11297   C->setMapType(
11298      static_cast<OpenMPMapClauseKind>(Record.readInt()));
11299   C->setMapLoc(Record.readSourceLocation());
11300   C->setColonLoc(Record.readSourceLocation());
11301   auto NumVars = C->varlist_size();
11302   auto UniqueDecls = C->getUniqueDeclarationsNum();
11303   auto TotalLists = C->getTotalComponentListNum();
11304   auto TotalComponents = C->getTotalComponentsNum();
11305 
11306   SmallVector<Expr *, 16> Vars;
11307   Vars.reserve(NumVars);
11308   for (unsigned i = 0; i != NumVars; ++i)
11309     Vars.push_back(Record.readExpr());
11310   C->setVarRefs(Vars);
11311 
11312   SmallVector<Expr *, 16> UDMappers;
11313   UDMappers.reserve(NumVars);
11314   for (unsigned I = 0; I < NumVars; ++I)
11315     UDMappers.push_back(Record.readExpr());
11316   C->setUDMapperRefs(UDMappers);
11317 
11318   if (HasIteratorModifier)
11319     C->setIteratorModifier(Record.readExpr());
11320 
11321   SmallVector<ValueDecl *, 16> Decls;
11322   Decls.reserve(UniqueDecls);
11323   for (unsigned i = 0; i < UniqueDecls; ++i)
11324     Decls.push_back(Record.readDeclAs<ValueDecl>());
11325   C->setUniqueDecls(Decls);
11326 
11327   SmallVector<unsigned, 16> ListsPerDecl;
11328   ListsPerDecl.reserve(UniqueDecls);
11329   for (unsigned i = 0; i < UniqueDecls; ++i)
11330     ListsPerDecl.push_back(Record.readInt());
11331   C->setDeclNumLists(ListsPerDecl);
11332 
11333   SmallVector<unsigned, 32> ListSizes;
11334   ListSizes.reserve(TotalLists);
11335   for (unsigned i = 0; i < TotalLists; ++i)
11336     ListSizes.push_back(Record.readInt());
11337   C->setComponentListSizes(ListSizes);
11338 
11339   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
11340   Components.reserve(TotalComponents);
11341   for (unsigned i = 0; i < TotalComponents; ++i) {
11342     Expr *AssociatedExprPr = Record.readExpr();
11343     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11344     Components.emplace_back(AssociatedExprPr, AssociatedDecl,
11345                             /*IsNonContiguous=*/false);
11346   }
11347   C->setComponents(Components, ListSizes);
11348 }
11349 
VisitOMPAllocateClause(OMPAllocateClause * C)11350 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
11351   C->setLParenLoc(Record.readSourceLocation());
11352   C->setColonLoc(Record.readSourceLocation());
11353   C->setAllocator(Record.readSubExpr());
11354   unsigned NumVars = C->varlist_size();
11355   SmallVector<Expr *, 16> Vars;
11356   Vars.reserve(NumVars);
11357   for (unsigned i = 0; i != NumVars; ++i)
11358     Vars.push_back(Record.readSubExpr());
11359   C->setVarRefs(Vars);
11360 }
11361 
VisitOMPNumTeamsClause(OMPNumTeamsClause * C)11362 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
11363   VisitOMPClauseWithPreInit(C);
11364   C->setNumTeams(Record.readSubExpr());
11365   C->setLParenLoc(Record.readSourceLocation());
11366 }
11367 
VisitOMPThreadLimitClause(OMPThreadLimitClause * C)11368 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
11369   VisitOMPClauseWithPreInit(C);
11370   C->setThreadLimit(Record.readSubExpr());
11371   C->setLParenLoc(Record.readSourceLocation());
11372 }
11373 
VisitOMPPriorityClause(OMPPriorityClause * C)11374 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
11375   VisitOMPClauseWithPreInit(C);
11376   C->setPriority(Record.readSubExpr());
11377   C->setLParenLoc(Record.readSourceLocation());
11378 }
11379 
VisitOMPGrainsizeClause(OMPGrainsizeClause * C)11380 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
11381   VisitOMPClauseWithPreInit(C);
11382   C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
11383   C->setGrainsize(Record.readSubExpr());
11384   C->setModifierLoc(Record.readSourceLocation());
11385   C->setLParenLoc(Record.readSourceLocation());
11386 }
11387 
VisitOMPNumTasksClause(OMPNumTasksClause * C)11388 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
11389   VisitOMPClauseWithPreInit(C);
11390   C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
11391   C->setNumTasks(Record.readSubExpr());
11392   C->setModifierLoc(Record.readSourceLocation());
11393   C->setLParenLoc(Record.readSourceLocation());
11394 }
11395 
VisitOMPHintClause(OMPHintClause * C)11396 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
11397   C->setHint(Record.readSubExpr());
11398   C->setLParenLoc(Record.readSourceLocation());
11399 }
11400 
VisitOMPDistScheduleClause(OMPDistScheduleClause * C)11401 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
11402   VisitOMPClauseWithPreInit(C);
11403   C->setDistScheduleKind(
11404       static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
11405   C->setChunkSize(Record.readSubExpr());
11406   C->setLParenLoc(Record.readSourceLocation());
11407   C->setDistScheduleKindLoc(Record.readSourceLocation());
11408   C->setCommaLoc(Record.readSourceLocation());
11409 }
11410 
VisitOMPDefaultmapClause(OMPDefaultmapClause * C)11411 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
11412   C->setDefaultmapKind(
11413        static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
11414   C->setDefaultmapModifier(
11415       static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
11416   C->setLParenLoc(Record.readSourceLocation());
11417   C->setDefaultmapModifierLoc(Record.readSourceLocation());
11418   C->setDefaultmapKindLoc(Record.readSourceLocation());
11419 }
11420 
VisitOMPToClause(OMPToClause * C)11421 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
11422   C->setLParenLoc(Record.readSourceLocation());
11423   for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
11424     C->setMotionModifier(
11425         I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
11426     C->setMotionModifierLoc(I, Record.readSourceLocation());
11427   }
11428   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
11429   C->setMapperIdInfo(Record.readDeclarationNameInfo());
11430   C->setColonLoc(Record.readSourceLocation());
11431   auto NumVars = C->varlist_size();
11432   auto UniqueDecls = C->getUniqueDeclarationsNum();
11433   auto TotalLists = C->getTotalComponentListNum();
11434   auto TotalComponents = C->getTotalComponentsNum();
11435 
11436   SmallVector<Expr *, 16> Vars;
11437   Vars.reserve(NumVars);
11438   for (unsigned i = 0; i != NumVars; ++i)
11439     Vars.push_back(Record.readSubExpr());
11440   C->setVarRefs(Vars);
11441 
11442   SmallVector<Expr *, 16> UDMappers;
11443   UDMappers.reserve(NumVars);
11444   for (unsigned I = 0; I < NumVars; ++I)
11445     UDMappers.push_back(Record.readSubExpr());
11446   C->setUDMapperRefs(UDMappers);
11447 
11448   SmallVector<ValueDecl *, 16> Decls;
11449   Decls.reserve(UniqueDecls);
11450   for (unsigned i = 0; i < UniqueDecls; ++i)
11451     Decls.push_back(Record.readDeclAs<ValueDecl>());
11452   C->setUniqueDecls(Decls);
11453 
11454   SmallVector<unsigned, 16> ListsPerDecl;
11455   ListsPerDecl.reserve(UniqueDecls);
11456   for (unsigned i = 0; i < UniqueDecls; ++i)
11457     ListsPerDecl.push_back(Record.readInt());
11458   C->setDeclNumLists(ListsPerDecl);
11459 
11460   SmallVector<unsigned, 32> ListSizes;
11461   ListSizes.reserve(TotalLists);
11462   for (unsigned i = 0; i < TotalLists; ++i)
11463     ListSizes.push_back(Record.readInt());
11464   C->setComponentListSizes(ListSizes);
11465 
11466   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
11467   Components.reserve(TotalComponents);
11468   for (unsigned i = 0; i < TotalComponents; ++i) {
11469     Expr *AssociatedExprPr = Record.readSubExpr();
11470     bool IsNonContiguous = Record.readBool();
11471     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11472     Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
11473   }
11474   C->setComponents(Components, ListSizes);
11475 }
11476 
VisitOMPFromClause(OMPFromClause * C)11477 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
11478   C->setLParenLoc(Record.readSourceLocation());
11479   for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
11480     C->setMotionModifier(
11481         I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
11482     C->setMotionModifierLoc(I, Record.readSourceLocation());
11483   }
11484   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
11485   C->setMapperIdInfo(Record.readDeclarationNameInfo());
11486   C->setColonLoc(Record.readSourceLocation());
11487   auto NumVars = C->varlist_size();
11488   auto UniqueDecls = C->getUniqueDeclarationsNum();
11489   auto TotalLists = C->getTotalComponentListNum();
11490   auto TotalComponents = C->getTotalComponentsNum();
11491 
11492   SmallVector<Expr *, 16> Vars;
11493   Vars.reserve(NumVars);
11494   for (unsigned i = 0; i != NumVars; ++i)
11495     Vars.push_back(Record.readSubExpr());
11496   C->setVarRefs(Vars);
11497 
11498   SmallVector<Expr *, 16> UDMappers;
11499   UDMappers.reserve(NumVars);
11500   for (unsigned I = 0; I < NumVars; ++I)
11501     UDMappers.push_back(Record.readSubExpr());
11502   C->setUDMapperRefs(UDMappers);
11503 
11504   SmallVector<ValueDecl *, 16> Decls;
11505   Decls.reserve(UniqueDecls);
11506   for (unsigned i = 0; i < UniqueDecls; ++i)
11507     Decls.push_back(Record.readDeclAs<ValueDecl>());
11508   C->setUniqueDecls(Decls);
11509 
11510   SmallVector<unsigned, 16> ListsPerDecl;
11511   ListsPerDecl.reserve(UniqueDecls);
11512   for (unsigned i = 0; i < UniqueDecls; ++i)
11513     ListsPerDecl.push_back(Record.readInt());
11514   C->setDeclNumLists(ListsPerDecl);
11515 
11516   SmallVector<unsigned, 32> ListSizes;
11517   ListSizes.reserve(TotalLists);
11518   for (unsigned i = 0; i < TotalLists; ++i)
11519     ListSizes.push_back(Record.readInt());
11520   C->setComponentListSizes(ListSizes);
11521 
11522   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
11523   Components.reserve(TotalComponents);
11524   for (unsigned i = 0; i < TotalComponents; ++i) {
11525     Expr *AssociatedExprPr = Record.readSubExpr();
11526     bool IsNonContiguous = Record.readBool();
11527     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11528     Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
11529   }
11530   C->setComponents(Components, ListSizes);
11531 }
11532 
VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause * C)11533 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
11534   C->setLParenLoc(Record.readSourceLocation());
11535   auto NumVars = C->varlist_size();
11536   auto UniqueDecls = C->getUniqueDeclarationsNum();
11537   auto TotalLists = C->getTotalComponentListNum();
11538   auto TotalComponents = C->getTotalComponentsNum();
11539 
11540   SmallVector<Expr *, 16> Vars;
11541   Vars.reserve(NumVars);
11542   for (unsigned i = 0; i != NumVars; ++i)
11543     Vars.push_back(Record.readSubExpr());
11544   C->setVarRefs(Vars);
11545   Vars.clear();
11546   for (unsigned i = 0; i != NumVars; ++i)
11547     Vars.push_back(Record.readSubExpr());
11548   C->setPrivateCopies(Vars);
11549   Vars.clear();
11550   for (unsigned i = 0; i != NumVars; ++i)
11551     Vars.push_back(Record.readSubExpr());
11552   C->setInits(Vars);
11553 
11554   SmallVector<ValueDecl *, 16> Decls;
11555   Decls.reserve(UniqueDecls);
11556   for (unsigned i = 0; i < UniqueDecls; ++i)
11557     Decls.push_back(Record.readDeclAs<ValueDecl>());
11558   C->setUniqueDecls(Decls);
11559 
11560   SmallVector<unsigned, 16> ListsPerDecl;
11561   ListsPerDecl.reserve(UniqueDecls);
11562   for (unsigned i = 0; i < UniqueDecls; ++i)
11563     ListsPerDecl.push_back(Record.readInt());
11564   C->setDeclNumLists(ListsPerDecl);
11565 
11566   SmallVector<unsigned, 32> ListSizes;
11567   ListSizes.reserve(TotalLists);
11568   for (unsigned i = 0; i < TotalLists; ++i)
11569     ListSizes.push_back(Record.readInt());
11570   C->setComponentListSizes(ListSizes);
11571 
11572   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
11573   Components.reserve(TotalComponents);
11574   for (unsigned i = 0; i < TotalComponents; ++i) {
11575     auto *AssociatedExprPr = Record.readSubExpr();
11576     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11577     Components.emplace_back(AssociatedExprPr, AssociatedDecl,
11578                             /*IsNonContiguous=*/false);
11579   }
11580   C->setComponents(Components, ListSizes);
11581 }
11582 
VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause * C)11583 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
11584   C->setLParenLoc(Record.readSourceLocation());
11585   auto NumVars = C->varlist_size();
11586   auto UniqueDecls = C->getUniqueDeclarationsNum();
11587   auto TotalLists = C->getTotalComponentListNum();
11588   auto TotalComponents = C->getTotalComponentsNum();
11589 
11590   SmallVector<Expr *, 16> Vars;
11591   Vars.reserve(NumVars);
11592   for (unsigned i = 0; i != NumVars; ++i)
11593     Vars.push_back(Record.readSubExpr());
11594   C->setVarRefs(Vars);
11595 
11596   SmallVector<ValueDecl *, 16> Decls;
11597   Decls.reserve(UniqueDecls);
11598   for (unsigned i = 0; i < UniqueDecls; ++i)
11599     Decls.push_back(Record.readDeclAs<ValueDecl>());
11600   C->setUniqueDecls(Decls);
11601 
11602   SmallVector<unsigned, 16> ListsPerDecl;
11603   ListsPerDecl.reserve(UniqueDecls);
11604   for (unsigned i = 0; i < UniqueDecls; ++i)
11605     ListsPerDecl.push_back(Record.readInt());
11606   C->setDeclNumLists(ListsPerDecl);
11607 
11608   SmallVector<unsigned, 32> ListSizes;
11609   ListSizes.reserve(TotalLists);
11610   for (unsigned i = 0; i < TotalLists; ++i)
11611     ListSizes.push_back(Record.readInt());
11612   C->setComponentListSizes(ListSizes);
11613 
11614   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
11615   Components.reserve(TotalComponents);
11616   for (unsigned i = 0; i < TotalComponents; ++i) {
11617     Expr *AssociatedExpr = Record.readSubExpr();
11618     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11619     Components.emplace_back(AssociatedExpr, AssociatedDecl,
11620                             /*IsNonContiguous*/ false);
11621   }
11622   C->setComponents(Components, ListSizes);
11623 }
11624 
VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause * C)11625 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
11626   C->setLParenLoc(Record.readSourceLocation());
11627   auto NumVars = C->varlist_size();
11628   auto UniqueDecls = C->getUniqueDeclarationsNum();
11629   auto TotalLists = C->getTotalComponentListNum();
11630   auto TotalComponents = C->getTotalComponentsNum();
11631 
11632   SmallVector<Expr *, 16> Vars;
11633   Vars.reserve(NumVars);
11634   for (unsigned i = 0; i != NumVars; ++i)
11635     Vars.push_back(Record.readSubExpr());
11636   C->setVarRefs(Vars);
11637   Vars.clear();
11638 
11639   SmallVector<ValueDecl *, 16> Decls;
11640   Decls.reserve(UniqueDecls);
11641   for (unsigned i = 0; i < UniqueDecls; ++i)
11642     Decls.push_back(Record.readDeclAs<ValueDecl>());
11643   C->setUniqueDecls(Decls);
11644 
11645   SmallVector<unsigned, 16> ListsPerDecl;
11646   ListsPerDecl.reserve(UniqueDecls);
11647   for (unsigned i = 0; i < UniqueDecls; ++i)
11648     ListsPerDecl.push_back(Record.readInt());
11649   C->setDeclNumLists(ListsPerDecl);
11650 
11651   SmallVector<unsigned, 32> ListSizes;
11652   ListSizes.reserve(TotalLists);
11653   for (unsigned i = 0; i < TotalLists; ++i)
11654     ListSizes.push_back(Record.readInt());
11655   C->setComponentListSizes(ListSizes);
11656 
11657   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
11658   Components.reserve(TotalComponents);
11659   for (unsigned i = 0; i < TotalComponents; ++i) {
11660     Expr *AssociatedExpr = Record.readSubExpr();
11661     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11662     Components.emplace_back(AssociatedExpr, AssociatedDecl,
11663                             /*IsNonContiguous=*/false);
11664   }
11665   C->setComponents(Components, ListSizes);
11666 }
11667 
VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause * C)11668 void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
11669   C->setLParenLoc(Record.readSourceLocation());
11670   auto NumVars = C->varlist_size();
11671   auto UniqueDecls = C->getUniqueDeclarationsNum();
11672   auto TotalLists = C->getTotalComponentListNum();
11673   auto TotalComponents = C->getTotalComponentsNum();
11674 
11675   SmallVector<Expr *, 16> Vars;
11676   Vars.reserve(NumVars);
11677   for (unsigned I = 0; I != NumVars; ++I)
11678     Vars.push_back(Record.readSubExpr());
11679   C->setVarRefs(Vars);
11680   Vars.clear();
11681 
11682   SmallVector<ValueDecl *, 16> Decls;
11683   Decls.reserve(UniqueDecls);
11684   for (unsigned I = 0; I < UniqueDecls; ++I)
11685     Decls.push_back(Record.readDeclAs<ValueDecl>());
11686   C->setUniqueDecls(Decls);
11687 
11688   SmallVector<unsigned, 16> ListsPerDecl;
11689   ListsPerDecl.reserve(UniqueDecls);
11690   for (unsigned I = 0; I < UniqueDecls; ++I)
11691     ListsPerDecl.push_back(Record.readInt());
11692   C->setDeclNumLists(ListsPerDecl);
11693 
11694   SmallVector<unsigned, 32> ListSizes;
11695   ListSizes.reserve(TotalLists);
11696   for (unsigned i = 0; i < TotalLists; ++i)
11697     ListSizes.push_back(Record.readInt());
11698   C->setComponentListSizes(ListSizes);
11699 
11700   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
11701   Components.reserve(TotalComponents);
11702   for (unsigned I = 0; I < TotalComponents; ++I) {
11703     Expr *AssociatedExpr = Record.readSubExpr();
11704     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11705     Components.emplace_back(AssociatedExpr, AssociatedDecl,
11706                             /*IsNonContiguous=*/false);
11707   }
11708   C->setComponents(Components, ListSizes);
11709 }
11710 
VisitOMPNontemporalClause(OMPNontemporalClause * C)11711 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
11712   C->setLParenLoc(Record.readSourceLocation());
11713   unsigned NumVars = C->varlist_size();
11714   SmallVector<Expr *, 16> Vars;
11715   Vars.reserve(NumVars);
11716   for (unsigned i = 0; i != NumVars; ++i)
11717     Vars.push_back(Record.readSubExpr());
11718   C->setVarRefs(Vars);
11719   Vars.clear();
11720   Vars.reserve(NumVars);
11721   for (unsigned i = 0; i != NumVars; ++i)
11722     Vars.push_back(Record.readSubExpr());
11723   C->setPrivateRefs(Vars);
11724 }
11725 
VisitOMPInclusiveClause(OMPInclusiveClause * C)11726 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
11727   C->setLParenLoc(Record.readSourceLocation());
11728   unsigned NumVars = C->varlist_size();
11729   SmallVector<Expr *, 16> Vars;
11730   Vars.reserve(NumVars);
11731   for (unsigned i = 0; i != NumVars; ++i)
11732     Vars.push_back(Record.readSubExpr());
11733   C->setVarRefs(Vars);
11734 }
11735 
VisitOMPExclusiveClause(OMPExclusiveClause * C)11736 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
11737   C->setLParenLoc(Record.readSourceLocation());
11738   unsigned NumVars = C->varlist_size();
11739   SmallVector<Expr *, 16> Vars;
11740   Vars.reserve(NumVars);
11741   for (unsigned i = 0; i != NumVars; ++i)
11742     Vars.push_back(Record.readSubExpr());
11743   C->setVarRefs(Vars);
11744 }
11745 
VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause * C)11746 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
11747   C->setLParenLoc(Record.readSourceLocation());
11748   unsigned NumOfAllocators = C->getNumberOfAllocators();
11749   SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
11750   Data.reserve(NumOfAllocators);
11751   for (unsigned I = 0; I != NumOfAllocators; ++I) {
11752     OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
11753     D.Allocator = Record.readSubExpr();
11754     D.AllocatorTraits = Record.readSubExpr();
11755     D.LParenLoc = Record.readSourceLocation();
11756     D.RParenLoc = Record.readSourceLocation();
11757   }
11758   C->setAllocatorsData(Data);
11759 }
11760 
VisitOMPAffinityClause(OMPAffinityClause * C)11761 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
11762   C->setLParenLoc(Record.readSourceLocation());
11763   C->setModifier(Record.readSubExpr());
11764   C->setColonLoc(Record.readSourceLocation());
11765   unsigned NumOfLocators = C->varlist_size();
11766   SmallVector<Expr *, 4> Locators;
11767   Locators.reserve(NumOfLocators);
11768   for (unsigned I = 0; I != NumOfLocators; ++I)
11769     Locators.push_back(Record.readSubExpr());
11770   C->setVarRefs(Locators);
11771 }
11772 
VisitOMPOrderClause(OMPOrderClause * C)11773 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
11774   C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
11775   C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
11776   C->setLParenLoc(Record.readSourceLocation());
11777   C->setKindKwLoc(Record.readSourceLocation());
11778   C->setModifierKwLoc(Record.readSourceLocation());
11779 }
11780 
VisitOMPFilterClause(OMPFilterClause * C)11781 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
11782   VisitOMPClauseWithPreInit(C);
11783   C->setThreadID(Record.readSubExpr());
11784   C->setLParenLoc(Record.readSourceLocation());
11785 }
11786 
VisitOMPBindClause(OMPBindClause * C)11787 void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
11788   C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
11789   C->setLParenLoc(Record.readSourceLocation());
11790   C->setBindKindLoc(Record.readSourceLocation());
11791 }
11792 
VisitOMPAlignClause(OMPAlignClause * C)11793 void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
11794   C->setAlignment(Record.readExpr());
11795   C->setLParenLoc(Record.readSourceLocation());
11796 }
11797 
VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause * C)11798 void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
11799   VisitOMPClauseWithPreInit(C);
11800   C->setSize(Record.readSubExpr());
11801   C->setLParenLoc(Record.readSourceLocation());
11802 }
11803 
VisitOMPDoacrossClause(OMPDoacrossClause * C)11804 void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
11805   C->setLParenLoc(Record.readSourceLocation());
11806   C->setDependenceType(
11807       static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
11808   C->setDependenceLoc(Record.readSourceLocation());
11809   C->setColonLoc(Record.readSourceLocation());
11810   unsigned NumVars = C->varlist_size();
11811   SmallVector<Expr *, 16> Vars;
11812   Vars.reserve(NumVars);
11813   for (unsigned I = 0; I != NumVars; ++I)
11814     Vars.push_back(Record.readSubExpr());
11815   C->setVarRefs(Vars);
11816   for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
11817     C->setLoopData(I, Record.readSubExpr());
11818 }
11819 
VisitOMPXAttributeClause(OMPXAttributeClause * C)11820 void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *C) {
11821   AttrVec Attrs;
11822   Record.readAttributes(Attrs);
11823   C->setAttrs(Attrs);
11824   C->setLocStart(Record.readSourceLocation());
11825   C->setLParenLoc(Record.readSourceLocation());
11826   C->setLocEnd(Record.readSourceLocation());
11827 }
11828 
VisitOMPXBareClause(OMPXBareClause * C)11829 void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *C) {}
11830 
readOMPTraitInfo()11831 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() {
11832   OMPTraitInfo &TI = getContext().getNewOMPTraitInfo();
11833   TI.Sets.resize(readUInt32());
11834   for (auto &Set : TI.Sets) {
11835     Set.Kind = readEnum<llvm::omp::TraitSet>();
11836     Set.Selectors.resize(readUInt32());
11837     for (auto &Selector : Set.Selectors) {
11838       Selector.Kind = readEnum<llvm::omp::TraitSelector>();
11839       Selector.ScoreOrCondition = nullptr;
11840       if (readBool())
11841         Selector.ScoreOrCondition = readExprRef();
11842       Selector.Properties.resize(readUInt32());
11843       for (auto &Property : Selector.Properties)
11844         Property.Kind = readEnum<llvm::omp::TraitProperty>();
11845     }
11846   }
11847   return &TI;
11848 }
11849 
readOMPChildren(OMPChildren * Data)11850 void ASTRecordReader::readOMPChildren(OMPChildren *Data) {
11851   if (!Data)
11852     return;
11853   if (Reader->ReadingKind == ASTReader::Read_Stmt) {
11854     // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
11855     skipInts(3);
11856   }
11857   SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
11858   for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
11859     Clauses[I] = readOMPClause();
11860   Data->setClauses(Clauses);
11861   if (Data->hasAssociatedStmt())
11862     Data->setAssociatedStmt(readStmt());
11863   for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
11864     Data->getChildren()[I] = readStmt();
11865 }
11866 
readOpenACCVarList()11867 SmallVector<Expr *> ASTRecordReader::readOpenACCVarList() {
11868   unsigned NumVars = readInt();
11869   llvm::SmallVector<Expr *> VarList;
11870   for (unsigned I = 0; I < NumVars; ++I)
11871     VarList.push_back(readSubExpr());
11872   return VarList;
11873 }
11874 
readOpenACCIntExprList()11875 SmallVector<Expr *> ASTRecordReader::readOpenACCIntExprList() {
11876   unsigned NumExprs = readInt();
11877   llvm::SmallVector<Expr *> ExprList;
11878   for (unsigned I = 0; I < NumExprs; ++I)
11879     ExprList.push_back(readSubExpr());
11880   return ExprList;
11881 }
11882 
readOpenACCClause()11883 OpenACCClause *ASTRecordReader::readOpenACCClause() {
11884   OpenACCClauseKind ClauseKind = readEnum<OpenACCClauseKind>();
11885   SourceLocation BeginLoc = readSourceLocation();
11886   SourceLocation EndLoc = readSourceLocation();
11887 
11888   switch (ClauseKind) {
11889   case OpenACCClauseKind::Default: {
11890     SourceLocation LParenLoc = readSourceLocation();
11891     OpenACCDefaultClauseKind DCK = readEnum<OpenACCDefaultClauseKind>();
11892     return OpenACCDefaultClause::Create(getContext(), DCK, BeginLoc, LParenLoc,
11893                                         EndLoc);
11894   }
11895   case OpenACCClauseKind::If: {
11896     SourceLocation LParenLoc = readSourceLocation();
11897     Expr *CondExpr = readSubExpr();
11898     return OpenACCIfClause::Create(getContext(), BeginLoc, LParenLoc, CondExpr,
11899                                    EndLoc);
11900   }
11901   case OpenACCClauseKind::Self: {
11902     SourceLocation LParenLoc = readSourceLocation();
11903     Expr *CondExpr = readBool() ? readSubExpr() : nullptr;
11904     return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc,
11905                                      CondExpr, EndLoc);
11906   }
11907   case OpenACCClauseKind::NumGangs: {
11908     SourceLocation LParenLoc = readSourceLocation();
11909     unsigned NumClauses = readInt();
11910     llvm::SmallVector<Expr *> IntExprs;
11911     for (unsigned I = 0; I < NumClauses; ++I)
11912       IntExprs.push_back(readSubExpr());
11913     return OpenACCNumGangsClause::Create(getContext(), BeginLoc, LParenLoc,
11914                                          IntExprs, EndLoc);
11915   }
11916   case OpenACCClauseKind::NumWorkers: {
11917     SourceLocation LParenLoc = readSourceLocation();
11918     Expr *IntExpr = readSubExpr();
11919     return OpenACCNumWorkersClause::Create(getContext(), BeginLoc, LParenLoc,
11920                                            IntExpr, EndLoc);
11921   }
11922   case OpenACCClauseKind::VectorLength: {
11923     SourceLocation LParenLoc = readSourceLocation();
11924     Expr *IntExpr = readSubExpr();
11925     return OpenACCVectorLengthClause::Create(getContext(), BeginLoc, LParenLoc,
11926                                              IntExpr, EndLoc);
11927   }
11928   case OpenACCClauseKind::Private: {
11929     SourceLocation LParenLoc = readSourceLocation();
11930     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11931     return OpenACCPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
11932                                         VarList, EndLoc);
11933   }
11934   case OpenACCClauseKind::FirstPrivate: {
11935     SourceLocation LParenLoc = readSourceLocation();
11936     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11937     return OpenACCFirstPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
11938                                              VarList, EndLoc);
11939   }
11940   case OpenACCClauseKind::Attach: {
11941     SourceLocation LParenLoc = readSourceLocation();
11942     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11943     return OpenACCAttachClause::Create(getContext(), BeginLoc, LParenLoc,
11944                                        VarList, EndLoc);
11945   }
11946   case OpenACCClauseKind::DevicePtr: {
11947     SourceLocation LParenLoc = readSourceLocation();
11948     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11949     return OpenACCDevicePtrClause::Create(getContext(), BeginLoc, LParenLoc,
11950                                           VarList, EndLoc);
11951   }
11952   case OpenACCClauseKind::NoCreate: {
11953     SourceLocation LParenLoc = readSourceLocation();
11954     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11955     return OpenACCNoCreateClause::Create(getContext(), BeginLoc, LParenLoc,
11956                                          VarList, EndLoc);
11957   }
11958   case OpenACCClauseKind::Present: {
11959     SourceLocation LParenLoc = readSourceLocation();
11960     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11961     return OpenACCPresentClause::Create(getContext(), BeginLoc, LParenLoc,
11962                                         VarList, EndLoc);
11963   }
11964   case OpenACCClauseKind::PCopy:
11965   case OpenACCClauseKind::PresentOrCopy:
11966   case OpenACCClauseKind::Copy: {
11967     SourceLocation LParenLoc = readSourceLocation();
11968     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11969     return OpenACCCopyClause::Create(getContext(), ClauseKind, BeginLoc,
11970                                      LParenLoc, VarList, EndLoc);
11971   }
11972   case OpenACCClauseKind::CopyIn:
11973   case OpenACCClauseKind::PCopyIn:
11974   case OpenACCClauseKind::PresentOrCopyIn: {
11975     SourceLocation LParenLoc = readSourceLocation();
11976     bool IsReadOnly = readBool();
11977     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11978     return OpenACCCopyInClause::Create(getContext(), ClauseKind, BeginLoc,
11979                                        LParenLoc, IsReadOnly, VarList, EndLoc);
11980   }
11981   case OpenACCClauseKind::CopyOut:
11982   case OpenACCClauseKind::PCopyOut:
11983   case OpenACCClauseKind::PresentOrCopyOut: {
11984     SourceLocation LParenLoc = readSourceLocation();
11985     bool IsZero = readBool();
11986     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11987     return OpenACCCopyOutClause::Create(getContext(), ClauseKind, BeginLoc,
11988                                         LParenLoc, IsZero, VarList, EndLoc);
11989   }
11990   case OpenACCClauseKind::Create:
11991   case OpenACCClauseKind::PCreate:
11992   case OpenACCClauseKind::PresentOrCreate: {
11993     SourceLocation LParenLoc = readSourceLocation();
11994     bool IsZero = readBool();
11995     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
11996     return OpenACCCreateClause::Create(getContext(), ClauseKind, BeginLoc,
11997                                        LParenLoc, IsZero, VarList, EndLoc);
11998   }
11999   case OpenACCClauseKind::Async: {
12000     SourceLocation LParenLoc = readSourceLocation();
12001     Expr *AsyncExpr = readBool() ? readSubExpr() : nullptr;
12002     return OpenACCAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
12003                                       AsyncExpr, EndLoc);
12004   }
12005   case OpenACCClauseKind::Wait: {
12006     SourceLocation LParenLoc = readSourceLocation();
12007     Expr *DevNumExpr = readBool() ? readSubExpr() : nullptr;
12008     SourceLocation QueuesLoc = readSourceLocation();
12009     llvm::SmallVector<Expr *> QueueIdExprs = readOpenACCIntExprList();
12010     return OpenACCWaitClause::Create(getContext(), BeginLoc, LParenLoc,
12011                                      DevNumExpr, QueuesLoc, QueueIdExprs,
12012                                      EndLoc);
12013   }
12014   case OpenACCClauseKind::DeviceType:
12015   case OpenACCClauseKind::DType: {
12016     SourceLocation LParenLoc = readSourceLocation();
12017     llvm::SmallVector<DeviceTypeArgument> Archs;
12018     unsigned NumArchs = readInt();
12019 
12020     for (unsigned I = 0; I < NumArchs; ++I) {
12021       IdentifierInfo *Ident = readBool() ? readIdentifier() : nullptr;
12022       SourceLocation Loc = readSourceLocation();
12023       Archs.emplace_back(Ident, Loc);
12024     }
12025 
12026     return OpenACCDeviceTypeClause::Create(getContext(), ClauseKind, BeginLoc,
12027                                            LParenLoc, Archs, EndLoc);
12028   }
12029   case OpenACCClauseKind::Reduction: {
12030     SourceLocation LParenLoc = readSourceLocation();
12031     OpenACCReductionOperator Op = readEnum<OpenACCReductionOperator>();
12032     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12033     return OpenACCReductionClause::Create(getContext(), BeginLoc, LParenLoc, Op,
12034                                           VarList, EndLoc);
12035   }
12036   case OpenACCClauseKind::Seq:
12037     return OpenACCSeqClause::Create(getContext(), BeginLoc, EndLoc);
12038   case OpenACCClauseKind::Independent:
12039     return OpenACCIndependentClause::Create(getContext(), BeginLoc, EndLoc);
12040   case OpenACCClauseKind::Auto:
12041     return OpenACCAutoClause::Create(getContext(), BeginLoc, EndLoc);
12042 
12043   case OpenACCClauseKind::Finalize:
12044   case OpenACCClauseKind::IfPresent:
12045   case OpenACCClauseKind::Worker:
12046   case OpenACCClauseKind::Vector:
12047   case OpenACCClauseKind::NoHost:
12048   case OpenACCClauseKind::UseDevice:
12049   case OpenACCClauseKind::Delete:
12050   case OpenACCClauseKind::Detach:
12051   case OpenACCClauseKind::Device:
12052   case OpenACCClauseKind::DeviceResident:
12053   case OpenACCClauseKind::Host:
12054   case OpenACCClauseKind::Link:
12055   case OpenACCClauseKind::Collapse:
12056   case OpenACCClauseKind::Bind:
12057   case OpenACCClauseKind::DeviceNum:
12058   case OpenACCClauseKind::DefaultAsync:
12059   case OpenACCClauseKind::Tile:
12060   case OpenACCClauseKind::Gang:
12061   case OpenACCClauseKind::Invalid:
12062     llvm_unreachable("Clause serialization not yet implemented");
12063   }
12064   llvm_unreachable("Invalid Clause Kind");
12065 }
12066 
readOpenACCClauseList(MutableArrayRef<const OpenACCClause * > Clauses)12067 void ASTRecordReader::readOpenACCClauseList(
12068     MutableArrayRef<const OpenACCClause *> Clauses) {
12069   for (unsigned I = 0; I < Clauses.size(); ++I)
12070     Clauses[I] = readOpenACCClause();
12071 }
12072