xref: /freebsd/contrib/llvm-project/clang/lib/Serialization/ASTReader.cpp (revision e64bea71c21eb42e97aa615188ba91f6cce0d36d)
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 "TemplateArgumentHasher.h"
16 #include "clang/AST/ASTConsumer.h"
17 #include "clang/AST/ASTContext.h"
18 #include "clang/AST/ASTMutationListener.h"
19 #include "clang/AST/ASTStructuralEquivalence.h"
20 #include "clang/AST/ASTUnresolvedSet.h"
21 #include "clang/AST/AbstractTypeReader.h"
22 #include "clang/AST/Decl.h"
23 #include "clang/AST/DeclBase.h"
24 #include "clang/AST/DeclCXX.h"
25 #include "clang/AST/DeclFriend.h"
26 #include "clang/AST/DeclGroup.h"
27 #include "clang/AST/DeclObjC.h"
28 #include "clang/AST/DeclTemplate.h"
29 #include "clang/AST/DeclarationName.h"
30 #include "clang/AST/Expr.h"
31 #include "clang/AST/ExprCXX.h"
32 #include "clang/AST/ExternalASTSource.h"
33 #include "clang/AST/NestedNameSpecifier.h"
34 #include "clang/AST/ODRDiagsEmitter.h"
35 #include "clang/AST/OpenACCClause.h"
36 #include "clang/AST/OpenMPClause.h"
37 #include "clang/AST/RawCommentList.h"
38 #include "clang/AST/TemplateBase.h"
39 #include "clang/AST/TemplateName.h"
40 #include "clang/AST/Type.h"
41 #include "clang/AST/TypeLoc.h"
42 #include "clang/AST/TypeLocVisitor.h"
43 #include "clang/AST/UnresolvedSet.h"
44 #include "clang/Basic/ASTSourceDescriptor.h"
45 #include "clang/Basic/CommentOptions.h"
46 #include "clang/Basic/Diagnostic.h"
47 #include "clang/Basic/DiagnosticIDs.h"
48 #include "clang/Basic/DiagnosticOptions.h"
49 #include "clang/Basic/DiagnosticSema.h"
50 #include "clang/Basic/FileManager.h"
51 #include "clang/Basic/FileSystemOptions.h"
52 #include "clang/Basic/IdentifierTable.h"
53 #include "clang/Basic/LLVM.h"
54 #include "clang/Basic/LangOptions.h"
55 #include "clang/Basic/Module.h"
56 #include "clang/Basic/ObjCRuntime.h"
57 #include "clang/Basic/OpenACCKinds.h"
58 #include "clang/Basic/OpenMPKinds.h"
59 #include "clang/Basic/OperatorKinds.h"
60 #include "clang/Basic/PragmaKinds.h"
61 #include "clang/Basic/Sanitizers.h"
62 #include "clang/Basic/SourceLocation.h"
63 #include "clang/Basic/SourceManager.h"
64 #include "clang/Basic/SourceManagerInternals.h"
65 #include "clang/Basic/Specifiers.h"
66 #include "clang/Basic/TargetInfo.h"
67 #include "clang/Basic/TargetOptions.h"
68 #include "clang/Basic/TokenKinds.h"
69 #include "clang/Basic/Version.h"
70 #include "clang/Lex/HeaderSearch.h"
71 #include "clang/Lex/HeaderSearchOptions.h"
72 #include "clang/Lex/MacroInfo.h"
73 #include "clang/Lex/ModuleMap.h"
74 #include "clang/Lex/PreprocessingRecord.h"
75 #include "clang/Lex/Preprocessor.h"
76 #include "clang/Lex/PreprocessorOptions.h"
77 #include "clang/Lex/Token.h"
78 #include "clang/Sema/ObjCMethodList.h"
79 #include "clang/Sema/Scope.h"
80 #include "clang/Sema/Sema.h"
81 #include "clang/Sema/SemaCUDA.h"
82 #include "clang/Sema/SemaObjC.h"
83 #include "clang/Sema/Weak.h"
84 #include "clang/Serialization/ASTBitCodes.h"
85 #include "clang/Serialization/ASTDeserializationListener.h"
86 #include "clang/Serialization/ASTRecordReader.h"
87 #include "clang/Serialization/ContinuousRangeMap.h"
88 #include "clang/Serialization/GlobalModuleIndex.h"
89 #include "clang/Serialization/InMemoryModuleCache.h"
90 #include "clang/Serialization/ModuleCache.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/ArrayRef.h"
99 #include "llvm/ADT/DenseMap.h"
100 #include "llvm/ADT/FoldingSet.h"
101 #include "llvm/ADT/IntrusiveRefCntPtr.h"
102 #include "llvm/ADT/STLExtras.h"
103 #include "llvm/ADT/ScopeExit.h"
104 #include "llvm/ADT/Sequence.h"
105 #include "llvm/ADT/SmallPtrSet.h"
106 #include "llvm/ADT/SmallVector.h"
107 #include "llvm/ADT/StringExtras.h"
108 #include "llvm/ADT/StringMap.h"
109 #include "llvm/ADT/StringRef.h"
110 #include "llvm/ADT/iterator_range.h"
111 #include "llvm/Bitstream/BitstreamReader.h"
112 #include "llvm/Support/Compiler.h"
113 #include "llvm/Support/Compression.h"
114 #include "llvm/Support/DJB.h"
115 #include "llvm/Support/Endian.h"
116 #include "llvm/Support/Error.h"
117 #include "llvm/Support/ErrorHandling.h"
118 #include "llvm/Support/LEB128.h"
119 #include "llvm/Support/MemoryBuffer.h"
120 #include "llvm/Support/Path.h"
121 #include "llvm/Support/SaveAndRestore.h"
122 #include "llvm/Support/TimeProfiler.h"
123 #include "llvm/Support/Timer.h"
124 #include "llvm/Support/VersionTuple.h"
125 #include "llvm/Support/raw_ostream.h"
126 #include "llvm/TargetParser/Triple.h"
127 #include <algorithm>
128 #include <cassert>
129 #include <cstddef>
130 #include <cstdint>
131 #include <cstdio>
132 #include <ctime>
133 #include <iterator>
134 #include <limits>
135 #include <map>
136 #include <memory>
137 #include <optional>
138 #include <string>
139 #include <system_error>
140 #include <tuple>
141 #include <utility>
142 #include <vector>
143 
144 using namespace clang;
145 using namespace clang::serialization;
146 using namespace clang::serialization::reader;
147 using llvm::BitstreamCursor;
148 
149 //===----------------------------------------------------------------------===//
150 // ChainedASTReaderListener implementation
151 //===----------------------------------------------------------------------===//
152 
153 bool
ReadFullVersionInformation(StringRef FullVersion)154 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
155   return First->ReadFullVersionInformation(FullVersion) ||
156          Second->ReadFullVersionInformation(FullVersion);
157 }
158 
ReadModuleName(StringRef ModuleName)159 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
160   First->ReadModuleName(ModuleName);
161   Second->ReadModuleName(ModuleName);
162 }
163 
ReadModuleMapFile(StringRef ModuleMapPath)164 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
165   First->ReadModuleMapFile(ModuleMapPath);
166   Second->ReadModuleMapFile(ModuleMapPath);
167 }
168 
ReadLanguageOptions(const LangOptions & LangOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)169 bool ChainedASTReaderListener::ReadLanguageOptions(
170     const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain,
171     bool AllowCompatibleDifferences) {
172   return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
173                                     AllowCompatibleDifferences) ||
174          Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
175                                      AllowCompatibleDifferences);
176 }
177 
ReadTargetOptions(const TargetOptions & TargetOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)178 bool ChainedASTReaderListener::ReadTargetOptions(
179     const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain,
180     bool AllowCompatibleDifferences) {
181   return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
182                                   AllowCompatibleDifferences) ||
183          Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
184                                    AllowCompatibleDifferences);
185 }
186 
ReadDiagnosticOptions(DiagnosticOptions & DiagOpts,StringRef ModuleFilename,bool Complain)187 bool ChainedASTReaderListener::ReadDiagnosticOptions(
188     DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) {
189   return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
190          Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
191 }
192 
193 bool
ReadFileSystemOptions(const FileSystemOptions & FSOpts,bool Complain)194 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
195                                                 bool Complain) {
196   return First->ReadFileSystemOptions(FSOpts, Complain) ||
197          Second->ReadFileSystemOptions(FSOpts, Complain);
198 }
199 
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef ModuleFilename,StringRef SpecificModuleCachePath,bool Complain)200 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
201     const HeaderSearchOptions &HSOpts, StringRef ModuleFilename,
202     StringRef SpecificModuleCachePath, bool Complain) {
203   return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
204                                         SpecificModuleCachePath, Complain) ||
205          Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
206                                          SpecificModuleCachePath, Complain);
207 }
208 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,StringRef ModuleFilename,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)209 bool ChainedASTReaderListener::ReadPreprocessorOptions(
210     const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
211     bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
212   return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
213                                         Complain, SuggestedPredefines) ||
214          Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
215                                          Complain, SuggestedPredefines);
216 }
217 
ReadCounter(const serialization::ModuleFile & M,unsigned Value)218 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
219                                            unsigned Value) {
220   First->ReadCounter(M, Value);
221   Second->ReadCounter(M, Value);
222 }
223 
needsInputFileVisitation()224 bool ChainedASTReaderListener::needsInputFileVisitation() {
225   return First->needsInputFileVisitation() ||
226          Second->needsInputFileVisitation();
227 }
228 
needsSystemInputFileVisitation()229 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
230   return First->needsSystemInputFileVisitation() ||
231   Second->needsSystemInputFileVisitation();
232 }
233 
visitModuleFile(StringRef Filename,ModuleKind Kind)234 void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
235                                                ModuleKind Kind) {
236   First->visitModuleFile(Filename, Kind);
237   Second->visitModuleFile(Filename, Kind);
238 }
239 
visitInputFile(StringRef Filename,bool isSystem,bool isOverridden,bool isExplicitModule)240 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
241                                               bool isSystem,
242                                               bool isOverridden,
243                                               bool isExplicitModule) {
244   bool Continue = false;
245   if (First->needsInputFileVisitation() &&
246       (!isSystem || First->needsSystemInputFileVisitation()))
247     Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
248                                       isExplicitModule);
249   if (Second->needsInputFileVisitation() &&
250       (!isSystem || Second->needsSystemInputFileVisitation()))
251     Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
252                                        isExplicitModule);
253   return Continue;
254 }
255 
readModuleFileExtension(const ModuleFileExtensionMetadata & Metadata)256 void ChainedASTReaderListener::readModuleFileExtension(
257        const ModuleFileExtensionMetadata &Metadata) {
258   First->readModuleFileExtension(Metadata);
259   Second->readModuleFileExtension(Metadata);
260 }
261 
262 //===----------------------------------------------------------------------===//
263 // PCH validator implementation
264 //===----------------------------------------------------------------------===//
265 
266 ASTReaderListener::~ASTReaderListener() = default;
267 
268 /// Compare the given set of language options against an existing set of
269 /// language options.
270 ///
271 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
272 /// \param AllowCompatibleDifferences If true, differences between compatible
273 ///        language options will be permitted.
274 ///
275 /// \returns true if the languagae options mis-match, false otherwise.
checkLanguageOptions(const LangOptions & LangOpts,const LangOptions & ExistingLangOpts,StringRef ModuleFilename,DiagnosticsEngine * Diags,bool AllowCompatibleDifferences=true)276 static bool checkLanguageOptions(const LangOptions &LangOpts,
277                                  const LangOptions &ExistingLangOpts,
278                                  StringRef ModuleFilename,
279                                  DiagnosticsEngine *Diags,
280                                  bool AllowCompatibleDifferences = true) {
281   // FIXME: Replace with C++20 `using enum LangOptions::CompatibilityKind`.
282   using CK = LangOptions::CompatibilityKind;
283 
284 #define LANGOPT(Name, Bits, Default, Compatibility, Description)               \
285   if constexpr (CK::Compatibility != CK::Benign) {                             \
286     if ((CK::Compatibility == CK::NotCompatible) ||                            \
287         (CK::Compatibility == CK::Compatible &&                                \
288          !AllowCompatibleDifferences)) {                                       \
289       if (ExistingLangOpts.Name != LangOpts.Name) {                            \
290         if (Diags) {                                                           \
291           if (Bits == 1)                                                       \
292             Diags->Report(diag::err_ast_file_langopt_mismatch)                 \
293                 << Description << LangOpts.Name << ExistingLangOpts.Name       \
294                 << ModuleFilename;                                             \
295           else                                                                 \
296             Diags->Report(diag::err_ast_file_langopt_value_mismatch)           \
297                 << Description << ModuleFilename;                              \
298         }                                                                      \
299         return true;                                                           \
300       }                                                                        \
301     }                                                                          \
302   }
303 
304 #define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description)         \
305   if constexpr (CK::Compatibility != CK::Benign) {                             \
306     if ((CK::Compatibility == CK::NotCompatible) ||                            \
307         (CK::Compatibility == CK::Compatible &&                                \
308          !AllowCompatibleDifferences)) {                                       \
309       if (ExistingLangOpts.Name != LangOpts.Name) {                            \
310         if (Diags)                                                             \
311           Diags->Report(diag::err_ast_file_langopt_value_mismatch)             \
312               << Description << ModuleFilename;                                \
313         return true;                                                           \
314       }                                                                        \
315     }                                                                          \
316   }
317 
318 #define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description)    \
319   if constexpr (CK::Compatibility != CK::Benign) {                             \
320     if ((CK::Compatibility == CK::NotCompatible) ||                            \
321         (CK::Compatibility == CK::Compatible &&                                \
322          !AllowCompatibleDifferences)) {                                       \
323       if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) {              \
324         if (Diags)                                                             \
325           Diags->Report(diag::err_ast_file_langopt_value_mismatch)             \
326               << Description << ModuleFilename;                                \
327         return true;                                                           \
328       }                                                                        \
329     }                                                                          \
330   }
331 
332 #include "clang/Basic/LangOptions.def"
333 
334   if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
335     if (Diags)
336       Diags->Report(diag::err_ast_file_langopt_value_mismatch)
337           << "module features" << ModuleFilename;
338     return true;
339   }
340 
341   if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
342     if (Diags)
343       Diags->Report(diag::err_ast_file_langopt_value_mismatch)
344           << "target Objective-C runtime" << ModuleFilename;
345     return true;
346   }
347 
348   if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
349       LangOpts.CommentOpts.BlockCommandNames) {
350     if (Diags)
351       Diags->Report(diag::err_ast_file_langopt_value_mismatch)
352           << "block command names" << ModuleFilename;
353     return true;
354   }
355 
356   // Sanitizer feature mismatches are treated as compatible differences. If
357   // compatible differences aren't allowed, we still only want to check for
358   // mismatches of non-modular sanitizers (the only ones which can affect AST
359   // generation).
360   if (!AllowCompatibleDifferences) {
361     SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
362     SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
363     SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
364     ExistingSanitizers.clear(ModularSanitizers);
365     ImportedSanitizers.clear(ModularSanitizers);
366     if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
367       const std::string Flag = "-fsanitize=";
368       if (Diags) {
369 #define SANITIZER(NAME, ID)                                                    \
370   {                                                                            \
371     bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID);         \
372     bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID);         \
373     if (InExistingModule != InImportedModule)                                  \
374       Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)             \
375           << InExistingModule << ModuleFilename << (Flag + NAME);              \
376   }
377 #include "clang/Basic/Sanitizers.def"
378       }
379       return true;
380     }
381   }
382 
383   return false;
384 }
385 
386 /// Compare the given set of target options against an existing set of
387 /// target options.
388 ///
389 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
390 ///
391 /// \returns true if the target options mis-match, false otherwise.
checkTargetOptions(const TargetOptions & TargetOpts,const TargetOptions & ExistingTargetOpts,StringRef ModuleFilename,DiagnosticsEngine * Diags,bool AllowCompatibleDifferences=true)392 static bool checkTargetOptions(const TargetOptions &TargetOpts,
393                                const TargetOptions &ExistingTargetOpts,
394                                StringRef ModuleFilename,
395                                DiagnosticsEngine *Diags,
396                                bool AllowCompatibleDifferences = true) {
397 #define CHECK_TARGET_OPT(Field, Name)                                          \
398   if (TargetOpts.Field != ExistingTargetOpts.Field) {                          \
399     if (Diags)                                                                 \
400       Diags->Report(diag::err_ast_file_targetopt_mismatch)                     \
401           << ModuleFilename << Name << TargetOpts.Field                        \
402           << ExistingTargetOpts.Field;                                         \
403     return true;                                                               \
404   }
405 
406   // The triple and ABI must match exactly.
407   CHECK_TARGET_OPT(Triple, "target");
408   CHECK_TARGET_OPT(ABI, "target ABI");
409 
410   // We can tolerate different CPUs in many cases, notably when one CPU
411   // supports a strict superset of another. When allowing compatible
412   // differences skip this check.
413   if (!AllowCompatibleDifferences) {
414     CHECK_TARGET_OPT(CPU, "target CPU");
415     CHECK_TARGET_OPT(TuneCPU, "tune CPU");
416   }
417 
418 #undef CHECK_TARGET_OPT
419 
420   // Compare feature sets.
421   SmallVector<StringRef, 4> ExistingFeatures(
422                                              ExistingTargetOpts.FeaturesAsWritten.begin(),
423                                              ExistingTargetOpts.FeaturesAsWritten.end());
424   SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
425                                          TargetOpts.FeaturesAsWritten.end());
426   llvm::sort(ExistingFeatures);
427   llvm::sort(ReadFeatures);
428 
429   // We compute the set difference in both directions explicitly so that we can
430   // diagnose the differences differently.
431   SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
432   std::set_difference(
433       ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
434       ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
435   std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
436                       ExistingFeatures.begin(), ExistingFeatures.end(),
437                       std::back_inserter(UnmatchedReadFeatures));
438 
439   // If we are allowing compatible differences and the read feature set is
440   // a strict subset of the existing feature set, there is nothing to diagnose.
441   if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
442     return false;
443 
444   if (Diags) {
445     for (StringRef Feature : UnmatchedReadFeatures)
446       Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
447           << /* is-existing-feature */ false << ModuleFilename << Feature;
448     for (StringRef Feature : UnmatchedExistingFeatures)
449       Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)
450           << /* is-existing-feature */ true << ModuleFilename << Feature;
451   }
452 
453   return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
454 }
455 
ReadLanguageOptions(const LangOptions & LangOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)456 bool PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
457                                        StringRef ModuleFilename, bool Complain,
458                                        bool AllowCompatibleDifferences) {
459   const LangOptions &ExistingLangOpts = PP.getLangOpts();
460   return checkLanguageOptions(LangOpts, ExistingLangOpts, ModuleFilename,
461                               Complain ? &Reader.Diags : nullptr,
462                               AllowCompatibleDifferences);
463 }
464 
ReadTargetOptions(const TargetOptions & TargetOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)465 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
466                                      StringRef ModuleFilename, bool Complain,
467                                      bool AllowCompatibleDifferences) {
468   const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
469   return checkTargetOptions(TargetOpts, ExistingTargetOpts, ModuleFilename,
470                             Complain ? &Reader.Diags : nullptr,
471                             AllowCompatibleDifferences);
472 }
473 
474 namespace {
475 
476 using MacroDefinitionsMap =
477     llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
478 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
479 
480 } // namespace
481 
checkDiagnosticGroupMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,StringRef ModuleFilename,bool Complain)482 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
483                                          DiagnosticsEngine &Diags,
484                                          StringRef ModuleFilename,
485                                          bool Complain) {
486   using Level = DiagnosticsEngine::Level;
487 
488   // Check current mappings for new -Werror mappings, and the stored mappings
489   // for cases that were explicitly mapped to *not* be errors that are now
490   // errors because of options like -Werror.
491   DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
492 
493   for (DiagnosticsEngine *MappingSource : MappingSources) {
494     for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
495       diag::kind DiagID = DiagIDMappingPair.first;
496       Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
497       if (CurLevel < DiagnosticsEngine::Error)
498         continue; // not significant
499       Level StoredLevel =
500           StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
501       if (StoredLevel < DiagnosticsEngine::Error) {
502         if (Complain)
503           Diags.Report(diag::err_ast_file_diagopt_mismatch)
504               << "-Werror=" + Diags.getDiagnosticIDs()
505                                   ->getWarningOptionForDiag(DiagID)
506                                   .str()
507               << ModuleFilename;
508         return true;
509       }
510     }
511   }
512 
513   return false;
514 }
515 
isExtHandlingFromDiagsError(DiagnosticsEngine & Diags)516 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
517   diag::Severity Ext = Diags.getExtensionHandlingBehavior();
518   if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
519     return true;
520   return Ext >= diag::Severity::Error;
521 }
522 
checkDiagnosticMappings(DiagnosticsEngine & StoredDiags,DiagnosticsEngine & Diags,StringRef ModuleFilename,bool IsSystem,bool SystemHeaderWarningsInModule,bool Complain)523 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
524                                     DiagnosticsEngine &Diags,
525                                     StringRef ModuleFilename, bool IsSystem,
526                                     bool SystemHeaderWarningsInModule,
527                                     bool Complain) {
528   // Top-level options
529   if (IsSystem) {
530     if (Diags.getSuppressSystemWarnings())
531       return false;
532     // If -Wsystem-headers was not enabled before, and it was not explicit,
533     // be conservative
534     if (StoredDiags.getSuppressSystemWarnings() &&
535         !SystemHeaderWarningsInModule) {
536       if (Complain)
537         Diags.Report(diag::err_ast_file_diagopt_mismatch)
538             << "-Wsystem-headers" << ModuleFilename;
539       return true;
540     }
541   }
542 
543   if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
544     if (Complain)
545       Diags.Report(diag::err_ast_file_diagopt_mismatch)
546           << "-Werror" << ModuleFilename;
547     return true;
548   }
549 
550   if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
551       !StoredDiags.getEnableAllWarnings()) {
552     if (Complain)
553       Diags.Report(diag::err_ast_file_diagopt_mismatch)
554           << "-Weverything -Werror" << ModuleFilename;
555     return true;
556   }
557 
558   if (isExtHandlingFromDiagsError(Diags) &&
559       !isExtHandlingFromDiagsError(StoredDiags)) {
560     if (Complain)
561       Diags.Report(diag::err_ast_file_diagopt_mismatch)
562           << "-pedantic-errors" << ModuleFilename;
563     return true;
564   }
565 
566   return checkDiagnosticGroupMappings(StoredDiags, Diags, ModuleFilename,
567                                       Complain);
568 }
569 
570 /// Return the top import module if it is implicit, nullptr otherwise.
getTopImportImplicitModule(ModuleManager & ModuleMgr,Preprocessor & PP)571 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr,
572                                           Preprocessor &PP) {
573   // If the original import came from a file explicitly generated by the user,
574   // don't check the diagnostic mappings.
575   // FIXME: currently this is approximated by checking whether this is not a
576   // module import of an implicitly-loaded module file.
577   // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
578   // the transitive closure of its imports, since unrelated modules cannot be
579   // imported until after this module finishes validation.
580   ModuleFile *TopImport = &*ModuleMgr.rbegin();
581   while (!TopImport->ImportedBy.empty())
582     TopImport = TopImport->ImportedBy[0];
583   if (TopImport->Kind != MK_ImplicitModule)
584     return nullptr;
585 
586   StringRef ModuleName = TopImport->ModuleName;
587   assert(!ModuleName.empty() && "diagnostic options read before module name");
588 
589   Module *M =
590       PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc);
591   assert(M && "missing module");
592   return M;
593 }
594 
ReadDiagnosticOptions(DiagnosticOptions & DiagOpts,StringRef ModuleFilename,bool Complain)595 bool PCHValidator::ReadDiagnosticOptions(DiagnosticOptions &DiagOpts,
596                                          StringRef ModuleFilename,
597                                          bool Complain) {
598   DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
599   IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
600   IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
601       new DiagnosticsEngine(DiagIDs, DiagOpts));
602   // This should never fail, because we would have processed these options
603   // before writing them to an ASTFile.
604   ProcessWarningOptions(*Diags, DiagOpts,
605                         PP.getFileManager().getVirtualFileSystem(),
606                         /*Report*/ false);
607 
608   ModuleManager &ModuleMgr = Reader.getModuleManager();
609   assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
610 
611   Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
612   if (!TopM)
613     return false;
614 
615   Module *Importer = PP.getCurrentModule();
616 
617   DiagnosticOptions &ExistingOpts = ExistingDiags.getDiagnosticOptions();
618   bool SystemHeaderWarningsInModule =
619       Importer && llvm::is_contained(ExistingOpts.SystemHeaderWarningsModules,
620                                      Importer->Name);
621 
622   // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
623   // contains the union of their flags.
624   return checkDiagnosticMappings(*Diags, ExistingDiags, ModuleFilename,
625                                  TopM->IsSystem, SystemHeaderWarningsInModule,
626                                  Complain);
627 }
628 
629 /// Collect the macro definitions provided by the given preprocessor
630 /// options.
631 static void
collectMacroDefinitions(const PreprocessorOptions & PPOpts,MacroDefinitionsMap & Macros,SmallVectorImpl<StringRef> * MacroNames=nullptr)632 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
633                         MacroDefinitionsMap &Macros,
634                         SmallVectorImpl<StringRef> *MacroNames = nullptr) {
635   for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
636     StringRef Macro = PPOpts.Macros[I].first;
637     bool IsUndef = PPOpts.Macros[I].second;
638 
639     std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
640     StringRef MacroName = MacroPair.first;
641     StringRef MacroBody = MacroPair.second;
642 
643     // For an #undef'd macro, we only care about the name.
644     if (IsUndef) {
645       auto [It, Inserted] = Macros.try_emplace(MacroName);
646       if (MacroNames && Inserted)
647         MacroNames->push_back(MacroName);
648 
649       It->second = std::make_pair("", true);
650       continue;
651     }
652 
653     // For a #define'd macro, figure out the actual definition.
654     if (MacroName.size() == Macro.size())
655       MacroBody = "1";
656     else {
657       // Note: GCC drops anything following an end-of-line character.
658       StringRef::size_type End = MacroBody.find_first_of("\n\r");
659       MacroBody = MacroBody.substr(0, End);
660     }
661 
662     auto [It, Inserted] = Macros.try_emplace(MacroName);
663     if (MacroNames && Inserted)
664       MacroNames->push_back(MacroName);
665     It->second = std::make_pair(MacroBody, false);
666   }
667 }
668 
669 enum OptionValidation {
670   OptionValidateNone,
671   OptionValidateContradictions,
672   OptionValidateStrictMatches,
673 };
674 
675 /// Check the preprocessor options deserialized from the control block
676 /// against the preprocessor options in an existing preprocessor.
677 ///
678 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
679 /// \param Validation If set to OptionValidateNone, ignore differences in
680 ///        preprocessor options. If set to OptionValidateContradictions,
681 ///        require that options passed both in the AST file and on the command
682 ///        line (-D or -U) match, but tolerate options missing in one or the
683 ///        other. If set to OptionValidateContradictions, require that there
684 ///        are no differences in the options between the two.
checkPreprocessorOptions(const PreprocessorOptions & PPOpts,const PreprocessorOptions & ExistingPPOpts,StringRef ModuleFilename,bool ReadMacros,DiagnosticsEngine * Diags,FileManager & FileMgr,std::string & SuggestedPredefines,const LangOptions & LangOpts,OptionValidation Validation=OptionValidateContradictions)685 static bool checkPreprocessorOptions(
686     const PreprocessorOptions &PPOpts,
687     const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename,
688     bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr,
689     std::string &SuggestedPredefines, const LangOptions &LangOpts,
690     OptionValidation Validation = OptionValidateContradictions) {
691   if (ReadMacros) {
692     // Check macro definitions.
693     MacroDefinitionsMap ASTFileMacros;
694     collectMacroDefinitions(PPOpts, ASTFileMacros);
695     MacroDefinitionsMap ExistingMacros;
696     SmallVector<StringRef, 4> ExistingMacroNames;
697     collectMacroDefinitions(ExistingPPOpts, ExistingMacros,
698                             &ExistingMacroNames);
699 
700     // Use a line marker to enter the <command line> file, as the defines and
701     // undefines here will have come from the command line.
702     SuggestedPredefines += "# 1 \"<command line>\" 1\n";
703 
704     for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
705       // Dig out the macro definition in the existing preprocessor options.
706       StringRef MacroName = ExistingMacroNames[I];
707       std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
708 
709       // Check whether we know anything about this macro name or not.
710       llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
711           ASTFileMacros.find(MacroName);
712       if (Validation == OptionValidateNone || Known == ASTFileMacros.end()) {
713         if (Validation == OptionValidateStrictMatches) {
714           // If strict matches are requested, don't tolerate any extra defines
715           // on the command line that are missing in the AST file.
716           if (Diags) {
717             Diags->Report(diag::err_ast_file_macro_def_undef)
718                 << MacroName << true << ModuleFilename;
719           }
720           return true;
721         }
722         // FIXME: Check whether this identifier was referenced anywhere in the
723         // AST file. If so, we should reject the AST file. Unfortunately, this
724         // information isn't in the control block. What shall we do about it?
725 
726         if (Existing.second) {
727           SuggestedPredefines += "#undef ";
728           SuggestedPredefines += MacroName.str();
729           SuggestedPredefines += '\n';
730         } else {
731           SuggestedPredefines += "#define ";
732           SuggestedPredefines += MacroName.str();
733           SuggestedPredefines += ' ';
734           SuggestedPredefines += Existing.first.str();
735           SuggestedPredefines += '\n';
736         }
737         continue;
738       }
739 
740       // If the macro was defined in one but undef'd in the other, we have a
741       // conflict.
742       if (Existing.second != Known->second.second) {
743         if (Diags) {
744           Diags->Report(diag::err_ast_file_macro_def_undef)
745               << MacroName << Known->second.second << ModuleFilename;
746         }
747         return true;
748       }
749 
750       // If the macro was #undef'd in both, or if the macro bodies are
751       // identical, it's fine.
752       if (Existing.second || Existing.first == Known->second.first) {
753         ASTFileMacros.erase(Known);
754         continue;
755       }
756 
757       // The macro bodies differ; complain.
758       if (Diags) {
759         Diags->Report(diag::err_ast_file_macro_def_conflict)
760             << MacroName << Known->second.first << Existing.first
761             << ModuleFilename;
762       }
763       return true;
764     }
765 
766     // Leave the <command line> file and return to <built-in>.
767     SuggestedPredefines += "# 1 \"<built-in>\" 2\n";
768 
769     if (Validation == OptionValidateStrictMatches) {
770       // If strict matches are requested, don't tolerate any extra defines in
771       // the AST file that are missing on the command line.
772       for (const auto &MacroName : ASTFileMacros.keys()) {
773         if (Diags) {
774           Diags->Report(diag::err_ast_file_macro_def_undef)
775               << MacroName << false << ModuleFilename;
776         }
777         return true;
778       }
779     }
780   }
781 
782   // Check whether we're using predefines.
783   if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines &&
784       Validation != OptionValidateNone) {
785     if (Diags) {
786       Diags->Report(diag::err_ast_file_undef)
787           << ExistingPPOpts.UsePredefines << ModuleFilename;
788     }
789     return true;
790   }
791 
792   // Detailed record is important since it is used for the module cache hash.
793   if (LangOpts.Modules &&
794       PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord &&
795       Validation != OptionValidateNone) {
796     if (Diags) {
797       Diags->Report(diag::err_ast_file_pp_detailed_record)
798           << PPOpts.DetailedRecord << ModuleFilename;
799     }
800     return true;
801   }
802 
803   // Compute the #include and #include_macros lines we need.
804   for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
805     StringRef File = ExistingPPOpts.Includes[I];
806 
807     if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
808         !ExistingPPOpts.PCHThroughHeader.empty()) {
809       // In case the through header is an include, we must add all the includes
810       // to the predefines so the start point can be determined.
811       SuggestedPredefines += "#include \"";
812       SuggestedPredefines += File;
813       SuggestedPredefines += "\"\n";
814       continue;
815     }
816 
817     if (File == ExistingPPOpts.ImplicitPCHInclude)
818       continue;
819 
820     if (llvm::is_contained(PPOpts.Includes, File))
821       continue;
822 
823     SuggestedPredefines += "#include \"";
824     SuggestedPredefines += File;
825     SuggestedPredefines += "\"\n";
826   }
827 
828   for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
829     StringRef File = ExistingPPOpts.MacroIncludes[I];
830     if (llvm::is_contained(PPOpts.MacroIncludes, File))
831       continue;
832 
833     SuggestedPredefines += "#__include_macros \"";
834     SuggestedPredefines += File;
835     SuggestedPredefines += "\"\n##\n";
836   }
837 
838   return false;
839 }
840 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,StringRef ModuleFilename,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)841 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
842                                            StringRef ModuleFilename,
843                                            bool ReadMacros, bool Complain,
844                                            std::string &SuggestedPredefines) {
845   const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
846 
847   return checkPreprocessorOptions(
848       PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
849       Complain ? &Reader.Diags : nullptr, PP.getFileManager(),
850       SuggestedPredefines, PP.getLangOpts());
851 }
852 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,StringRef ModuleFilename,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)853 bool SimpleASTReaderListener::ReadPreprocessorOptions(
854     const PreprocessorOptions &PPOpts, StringRef ModuleFilename,
855     bool ReadMacros, bool Complain, std::string &SuggestedPredefines) {
856   return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(),
857                                   ModuleFilename, ReadMacros, nullptr,
858                                   PP.getFileManager(), SuggestedPredefines,
859                                   PP.getLangOpts(), OptionValidateNone);
860 }
861 
862 /// Check that the specified and the existing module cache paths are equivalent.
863 ///
864 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
865 /// \returns true when the module cache paths differ.
checkModuleCachePath(llvm::vfs::FileSystem & VFS,StringRef SpecificModuleCachePath,StringRef ExistingModuleCachePath,StringRef ModuleFilename,DiagnosticsEngine * Diags,const LangOptions & LangOpts,const PreprocessorOptions & PPOpts)866 static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS,
867                                  StringRef SpecificModuleCachePath,
868                                  StringRef ExistingModuleCachePath,
869                                  StringRef ModuleFilename,
870                                  DiagnosticsEngine *Diags,
871                                  const LangOptions &LangOpts,
872                                  const PreprocessorOptions &PPOpts) {
873   if (!LangOpts.Modules || PPOpts.AllowPCHWithDifferentModulesCachePath ||
874       SpecificModuleCachePath == ExistingModuleCachePath)
875     return false;
876   auto EqualOrErr =
877       VFS.equivalent(SpecificModuleCachePath, ExistingModuleCachePath);
878   if (EqualOrErr && *EqualOrErr)
879     return false;
880   if (Diags)
881     Diags->Report(diag::err_ast_file_modulecache_mismatch)
882         << SpecificModuleCachePath << ExistingModuleCachePath << ModuleFilename;
883   return true;
884 }
885 
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef ModuleFilename,StringRef SpecificModuleCachePath,bool Complain)886 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
887                                            StringRef ModuleFilename,
888                                            StringRef SpecificModuleCachePath,
889                                            bool Complain) {
890   return checkModuleCachePath(
891       Reader.getFileManager().getVirtualFileSystem(), SpecificModuleCachePath,
892       PP.getHeaderSearchInfo().getModuleCachePath(), ModuleFilename,
893       Complain ? &Reader.Diags : nullptr, PP.getLangOpts(),
894       PP.getPreprocessorOpts());
895 }
896 
ReadCounter(const ModuleFile & M,unsigned Value)897 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
898   PP.setCounterValue(Value);
899 }
900 
901 //===----------------------------------------------------------------------===//
902 // AST reader implementation
903 //===----------------------------------------------------------------------===//
904 
readULEB(const unsigned char * & P)905 static uint64_t readULEB(const unsigned char *&P) {
906   unsigned Length = 0;
907   const char *Error = nullptr;
908 
909   uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
910   if (Error)
911     llvm::report_fatal_error(Error);
912   P += Length;
913   return Val;
914 }
915 
916 /// Read ULEB-encoded key length and data length.
917 static std::pair<unsigned, unsigned>
readULEBKeyDataLength(const unsigned char * & P)918 readULEBKeyDataLength(const unsigned char *&P) {
919   unsigned KeyLen = readULEB(P);
920   if ((unsigned)KeyLen != KeyLen)
921     llvm::report_fatal_error("key too large");
922 
923   unsigned DataLen = readULEB(P);
924   if ((unsigned)DataLen != DataLen)
925     llvm::report_fatal_error("data too large");
926 
927   return std::make_pair(KeyLen, DataLen);
928 }
929 
setDeserializationListener(ASTDeserializationListener * Listener,bool TakeOwnership)930 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
931                                            bool TakeOwnership) {
932   DeserializationListener = Listener;
933   OwnsDeserializationListener = TakeOwnership;
934 }
935 
ComputeHash(Selector Sel)936 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
937   return serialization::ComputeHash(Sel);
938 }
939 
get(ASTReader & Reader,ModuleFile & MF,DeclID Value)940 LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF, DeclID Value) {
941   LocalDeclID ID(Value);
942 #ifndef NDEBUG
943   if (!MF.ModuleOffsetMap.empty())
944     Reader.ReadModuleOffsetMap(MF);
945 
946   unsigned ModuleFileIndex = ID.getModuleFileIndex();
947   unsigned LocalDeclID = ID.getLocalDeclIndex();
948 
949   assert(ModuleFileIndex <= MF.TransitiveImports.size());
950 
951   ModuleFile *OwningModuleFile =
952       ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
953   assert(OwningModuleFile);
954 
955   unsigned LocalNumDecls = OwningModuleFile->LocalNumDecls;
956 
957   if (!ModuleFileIndex)
958     LocalNumDecls += NUM_PREDEF_DECL_IDS;
959 
960   assert(LocalDeclID < LocalNumDecls);
961 #endif
962   (void)Reader;
963   (void)MF;
964   return ID;
965 }
966 
get(ASTReader & Reader,ModuleFile & MF,unsigned ModuleFileIndex,unsigned LocalDeclID)967 LocalDeclID LocalDeclID::get(ASTReader &Reader, ModuleFile &MF,
968                              unsigned ModuleFileIndex, unsigned LocalDeclID) {
969   DeclID Value = (DeclID)ModuleFileIndex << 32 | (DeclID)LocalDeclID;
970   return LocalDeclID::get(Reader, MF, Value);
971 }
972 
973 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)974 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
975   return readULEBKeyDataLength(d);
976 }
977 
978 ASTSelectorLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)979 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
980   using namespace llvm::support;
981 
982   SelectorTable &SelTable = Reader.getContext().Selectors;
983   unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
984   const IdentifierInfo *FirstII = Reader.getLocalIdentifier(
985       F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
986   if (N == 0)
987     return SelTable.getNullarySelector(FirstII);
988   else if (N == 1)
989     return SelTable.getUnarySelector(FirstII);
990 
991   SmallVector<const IdentifierInfo *, 16> Args;
992   Args.push_back(FirstII);
993   for (unsigned I = 1; I != N; ++I)
994     Args.push_back(Reader.getLocalIdentifier(
995         F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
996 
997   return SelTable.getSelector(N, Args.data());
998 }
999 
1000 ASTSelectorLookupTrait::data_type
ReadData(Selector,const unsigned char * d,unsigned DataLen)1001 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
1002                                  unsigned DataLen) {
1003   using namespace llvm::support;
1004 
1005   data_type Result;
1006 
1007   Result.ID = Reader.getGlobalSelectorID(
1008       F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1009   unsigned FullInstanceBits =
1010       endian::readNext<uint16_t, llvm::endianness::little>(d);
1011   unsigned FullFactoryBits =
1012       endian::readNext<uint16_t, llvm::endianness::little>(d);
1013   Result.InstanceBits = FullInstanceBits & 0x3;
1014   Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1015   Result.FactoryBits = FullFactoryBits & 0x3;
1016   Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1017   unsigned NumInstanceMethods = FullInstanceBits >> 3;
1018   unsigned NumFactoryMethods = FullFactoryBits >> 3;
1019 
1020   // Load instance methods
1021   for (unsigned I = 0; I != NumInstanceMethods; ++I) {
1022     if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1023             F, LocalDeclID::get(
1024                    Reader, F,
1025                    endian::readNext<DeclID, llvm::endianness::little>(d))))
1026       Result.Instance.push_back(Method);
1027   }
1028 
1029   // Load factory methods
1030   for (unsigned I = 0; I != NumFactoryMethods; ++I) {
1031     if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
1032             F, LocalDeclID::get(
1033                    Reader, F,
1034                    endian::readNext<DeclID, llvm::endianness::little>(d))))
1035       Result.Factory.push_back(Method);
1036   }
1037 
1038   return Result;
1039 }
1040 
ComputeHash(const internal_key_type & a)1041 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
1042   return llvm::djbHash(a);
1043 }
1044 
1045 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)1046 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
1047   return readULEBKeyDataLength(d);
1048 }
1049 
1050 ASTIdentifierLookupTraitBase::internal_key_type
ReadKey(const unsigned char * d,unsigned n)1051 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
1052   assert(n >= 2 && d[n-1] == '\0');
1053   return StringRef((const char*) d, n-1);
1054 }
1055 
1056 /// Whether the given identifier is "interesting".
isInterestingIdentifier(ASTReader & Reader,const IdentifierInfo & II,bool IsModule)1057 static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II,
1058                                     bool IsModule) {
1059   bool IsInteresting =
1060       II.getNotableIdentifierID() != tok::NotableIdentifierKind::not_notable ||
1061       II.getBuiltinID() != Builtin::ID::NotBuiltin ||
1062       II.getObjCKeywordID() != tok::ObjCKeywordKind::objc_not_keyword;
1063   return II.hadMacroDefinition() || II.isPoisoned() ||
1064          (!IsModule && IsInteresting) || II.hasRevertedTokenIDToIdentifier() ||
1065          (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
1066           II.getFETokenInfo());
1067 }
1068 
readBit(unsigned & Bits)1069 static bool readBit(unsigned &Bits) {
1070   bool Value = Bits & 0x1;
1071   Bits >>= 1;
1072   return Value;
1073 }
1074 
ReadIdentifierID(const unsigned char * d)1075 IdentifierID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
1076   using namespace llvm::support;
1077 
1078   IdentifierID RawID =
1079       endian::readNext<IdentifierID, llvm::endianness::little>(d);
1080   return Reader.getGlobalIdentifierID(F, RawID >> 1);
1081 }
1082 
markIdentifierFromAST(ASTReader & Reader,IdentifierInfo & II,bool IsModule)1083 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II,
1084                                   bool IsModule) {
1085   if (!II.isFromAST()) {
1086     II.setIsFromAST();
1087     if (isInterestingIdentifier(Reader, II, IsModule))
1088       II.setChangedSinceDeserialization();
1089   }
1090 }
1091 
ReadData(const internal_key_type & k,const unsigned char * d,unsigned DataLen)1092 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
1093                                                    const unsigned char* d,
1094                                                    unsigned DataLen) {
1095   using namespace llvm::support;
1096 
1097   IdentifierID RawID =
1098       endian::readNext<IdentifierID, llvm::endianness::little>(d);
1099   bool IsInteresting = RawID & 0x01;
1100 
1101   DataLen -= sizeof(IdentifierID);
1102 
1103   // Wipe out the "is interesting" bit.
1104   RawID = RawID >> 1;
1105 
1106   // Build the IdentifierInfo and link the identifier ID with it.
1107   IdentifierInfo *II = KnownII;
1108   if (!II) {
1109     II = &Reader.getIdentifierTable().getOwn(k);
1110     KnownII = II;
1111   }
1112   bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
1113   markIdentifierFromAST(Reader, *II, IsModule);
1114   Reader.markIdentifierUpToDate(II);
1115 
1116   IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1117   if (!IsInteresting) {
1118     // For uninteresting identifiers, there's nothing else to do. Just notify
1119     // the reader that we've finished loading this identifier.
1120     Reader.SetIdentifierInfo(ID, II);
1121     return II;
1122   }
1123 
1124   unsigned ObjCOrBuiltinID =
1125       endian::readNext<uint16_t, llvm::endianness::little>(d);
1126   unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1127   bool CPlusPlusOperatorKeyword = readBit(Bits);
1128   bool HasRevertedTokenIDToIdentifier = readBit(Bits);
1129   bool Poisoned = readBit(Bits);
1130   bool ExtensionToken = readBit(Bits);
1131   bool HasMacroDefinition = readBit(Bits);
1132 
1133   assert(Bits == 0 && "Extra bits in the identifier?");
1134   DataLen -= sizeof(uint16_t) * 2;
1135 
1136   // Set or check the various bits in the IdentifierInfo structure.
1137   // Token IDs are read-only.
1138   if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
1139     II->revertTokenIDToIdentifier();
1140   if (!F.isModule())
1141     II->setObjCOrBuiltinID(ObjCOrBuiltinID);
1142   assert(II->isExtensionToken() == ExtensionToken &&
1143          "Incorrect extension token flag");
1144   (void)ExtensionToken;
1145   if (Poisoned)
1146     II->setIsPoisoned(true);
1147   assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
1148          "Incorrect C++ operator keyword flag");
1149   (void)CPlusPlusOperatorKeyword;
1150 
1151   // If this identifier has a macro definition, deserialize it or notify the
1152   // visitor the actual definition is in a different module.
1153   if (HasMacroDefinition) {
1154     uint32_t MacroDirectivesOffset =
1155         endian::readNext<uint32_t, llvm::endianness::little>(d);
1156     DataLen -= 4;
1157 
1158     if (MacroDirectivesOffset)
1159       Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1160     else
1161       hasMacroDefinitionInDependencies = true;
1162   }
1163 
1164   Reader.SetIdentifierInfo(ID, II);
1165 
1166   // Read all of the declarations visible at global scope with this
1167   // name.
1168   if (DataLen > 0) {
1169     SmallVector<GlobalDeclID, 4> DeclIDs;
1170     for (; DataLen > 0; DataLen -= sizeof(DeclID))
1171       DeclIDs.push_back(Reader.getGlobalDeclID(
1172           F, LocalDeclID::get(
1173                  Reader, F,
1174                  endian::readNext<DeclID, llvm::endianness::little>(d))));
1175     Reader.SetGloballyVisibleDecls(II, DeclIDs);
1176   }
1177 
1178   return II;
1179 }
1180 
DeclarationNameKey(DeclarationName Name)1181 DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
1182     : Kind(Name.getNameKind()) {
1183   switch (Kind) {
1184   case DeclarationName::Identifier:
1185     Data = (uint64_t)Name.getAsIdentifierInfo();
1186     break;
1187   case DeclarationName::ObjCZeroArgSelector:
1188   case DeclarationName::ObjCOneArgSelector:
1189   case DeclarationName::ObjCMultiArgSelector:
1190     Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
1191     break;
1192   case DeclarationName::CXXOperatorName:
1193     Data = Name.getCXXOverloadedOperator();
1194     break;
1195   case DeclarationName::CXXLiteralOperatorName:
1196     Data = (uint64_t)Name.getCXXLiteralIdentifier();
1197     break;
1198   case DeclarationName::CXXDeductionGuideName:
1199     Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
1200                ->getDeclName().getAsIdentifierInfo();
1201     break;
1202   case DeclarationName::CXXConstructorName:
1203   case DeclarationName::CXXDestructorName:
1204   case DeclarationName::CXXConversionFunctionName:
1205   case DeclarationName::CXXUsingDirective:
1206     Data = 0;
1207     break;
1208   }
1209 }
1210 
getHash() const1211 unsigned DeclarationNameKey::getHash() const {
1212   llvm::FoldingSetNodeID ID;
1213   ID.AddInteger(Kind);
1214 
1215   switch (Kind) {
1216   case DeclarationName::Identifier:
1217   case DeclarationName::CXXLiteralOperatorName:
1218   case DeclarationName::CXXDeductionGuideName:
1219     ID.AddString(((IdentifierInfo*)Data)->getName());
1220     break;
1221   case DeclarationName::ObjCZeroArgSelector:
1222   case DeclarationName::ObjCOneArgSelector:
1223   case DeclarationName::ObjCMultiArgSelector:
1224     ID.AddInteger(serialization::ComputeHash(Selector(Data)));
1225     break;
1226   case DeclarationName::CXXOperatorName:
1227     ID.AddInteger((OverloadedOperatorKind)Data);
1228     break;
1229   case DeclarationName::CXXConstructorName:
1230   case DeclarationName::CXXDestructorName:
1231   case DeclarationName::CXXConversionFunctionName:
1232   case DeclarationName::CXXUsingDirective:
1233     break;
1234   }
1235 
1236   return ID.computeStableHash();
1237 }
1238 
1239 ModuleFile *
ReadFileRef(const unsigned char * & d)1240 ASTDeclContextNameLookupTraitBase::ReadFileRef(const unsigned char *&d) {
1241   using namespace llvm::support;
1242 
1243   uint32_t ModuleFileID =
1244       endian::readNext<uint32_t, llvm::endianness::little>(d);
1245   return Reader.getLocalModuleFile(F, ModuleFileID);
1246 }
1247 
1248 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)1249 ASTDeclContextNameLookupTraitBase::ReadKeyDataLength(const unsigned char *&d) {
1250   return readULEBKeyDataLength(d);
1251 }
1252 
1253 DeclarationNameKey
ReadKeyBase(const unsigned char * & d)1254 ASTDeclContextNameLookupTraitBase::ReadKeyBase(const unsigned char *&d) {
1255   using namespace llvm::support;
1256 
1257   auto Kind = (DeclarationName::NameKind)*d++;
1258   uint64_t Data;
1259   switch (Kind) {
1260   case DeclarationName::Identifier:
1261   case DeclarationName::CXXLiteralOperatorName:
1262   case DeclarationName::CXXDeductionGuideName:
1263     Data = (uint64_t)Reader.getLocalIdentifier(
1264         F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1265     break;
1266   case DeclarationName::ObjCZeroArgSelector:
1267   case DeclarationName::ObjCOneArgSelector:
1268   case DeclarationName::ObjCMultiArgSelector:
1269     Data = (uint64_t)Reader
1270                .getLocalSelector(
1271                    F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1272                .getAsOpaquePtr();
1273     break;
1274   case DeclarationName::CXXOperatorName:
1275     Data = *d++; // OverloadedOperatorKind
1276     break;
1277   case DeclarationName::CXXConstructorName:
1278   case DeclarationName::CXXDestructorName:
1279   case DeclarationName::CXXConversionFunctionName:
1280   case DeclarationName::CXXUsingDirective:
1281     Data = 0;
1282     break;
1283   }
1284 
1285   return DeclarationNameKey(Kind, Data);
1286 }
1287 
1288 ASTDeclContextNameLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)1289 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1290   return ReadKeyBase(d);
1291 }
1292 
ReadDataIntoImpl(const unsigned char * d,unsigned DataLen,data_type_builder & Val)1293 void ASTDeclContextNameLookupTraitBase::ReadDataIntoImpl(
1294     const unsigned char *d, unsigned DataLen, data_type_builder &Val) {
1295   using namespace llvm::support;
1296 
1297   for (unsigned NumDecls = DataLen / sizeof(DeclID); NumDecls; --NumDecls) {
1298     LocalDeclID ID = LocalDeclID::get(
1299         Reader, F, endian::readNext<DeclID, llvm::endianness::little>(d));
1300     Val.insert(Reader.getGlobalDeclID(F, ID));
1301   }
1302 }
1303 
ReadDataInto(internal_key_type,const unsigned char * d,unsigned DataLen,data_type_builder & Val)1304 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1305                                                  const unsigned char *d,
1306                                                  unsigned DataLen,
1307                                                  data_type_builder &Val) {
1308   ReadDataIntoImpl(d, DataLen, Val);
1309 }
1310 
1311 ModuleLocalNameLookupTrait::hash_value_type
ComputeHash(const internal_key_type & Key)1312 ModuleLocalNameLookupTrait::ComputeHash(const internal_key_type &Key) {
1313   llvm::FoldingSetNodeID ID;
1314   ID.AddInteger(Key.first.getHash());
1315   ID.AddInteger(Key.second);
1316   return ID.computeStableHash();
1317 }
1318 
1319 ModuleLocalNameLookupTrait::internal_key_type
GetInternalKey(const external_key_type & Key)1320 ModuleLocalNameLookupTrait::GetInternalKey(const external_key_type &Key) {
1321   DeclarationNameKey Name(Key.first);
1322 
1323   UnsignedOrNone ModuleHash = getPrimaryModuleHash(Key.second);
1324   if (!ModuleHash)
1325     return {Name, 0};
1326 
1327   return {Name, *ModuleHash};
1328 }
1329 
1330 ModuleLocalNameLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)1331 ModuleLocalNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1332   DeclarationNameKey Name = ReadKeyBase(d);
1333   unsigned PrimaryModuleHash =
1334       llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1335   return {Name, PrimaryModuleHash};
1336 }
1337 
ReadDataInto(internal_key_type,const unsigned char * d,unsigned DataLen,data_type_builder & Val)1338 void ModuleLocalNameLookupTrait::ReadDataInto(internal_key_type,
1339                                               const unsigned char *d,
1340                                               unsigned DataLen,
1341                                               data_type_builder &Val) {
1342   ReadDataIntoImpl(d, DataLen, Val);
1343 }
1344 
1345 ModuleFile *
ReadFileRef(const unsigned char * & d)1346 LazySpecializationInfoLookupTrait::ReadFileRef(const unsigned char *&d) {
1347   using namespace llvm::support;
1348 
1349   uint32_t ModuleFileID =
1350       endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1351   return Reader.getLocalModuleFile(F, ModuleFileID);
1352 }
1353 
1354 LazySpecializationInfoLookupTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)1355 LazySpecializationInfoLookupTrait::ReadKey(const unsigned char *d, unsigned) {
1356   using namespace llvm::support;
1357   return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1358 }
1359 
1360 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)1361 LazySpecializationInfoLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
1362   return readULEBKeyDataLength(d);
1363 }
1364 
ReadDataInto(internal_key_type,const unsigned char * d,unsigned DataLen,data_type_builder & Val)1365 void LazySpecializationInfoLookupTrait::ReadDataInto(internal_key_type,
1366                                                      const unsigned char *d,
1367                                                      unsigned DataLen,
1368                                                      data_type_builder &Val) {
1369   using namespace llvm::support;
1370 
1371   for (unsigned NumDecls =
1372            DataLen / sizeof(serialization::reader::LazySpecializationInfo);
1373        NumDecls; --NumDecls) {
1374     LocalDeclID LocalID = LocalDeclID::get(
1375         Reader, F,
1376         endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1377     Val.insert(Reader.getGlobalDeclID(F, LocalID));
1378   }
1379 }
1380 
ReadLexicalDeclContextStorage(ModuleFile & M,BitstreamCursor & Cursor,uint64_t Offset,DeclContext * DC)1381 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1382                                               BitstreamCursor &Cursor,
1383                                               uint64_t Offset,
1384                                               DeclContext *DC) {
1385   assert(Offset != 0);
1386 
1387   SavedStreamPosition SavedPosition(Cursor);
1388   if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1389     Error(std::move(Err));
1390     return true;
1391   }
1392 
1393   RecordData Record;
1394   StringRef Blob;
1395   Expected<unsigned> MaybeCode = Cursor.ReadCode();
1396   if (!MaybeCode) {
1397     Error(MaybeCode.takeError());
1398     return true;
1399   }
1400   unsigned Code = MaybeCode.get();
1401 
1402   Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1403   if (!MaybeRecCode) {
1404     Error(MaybeRecCode.takeError());
1405     return true;
1406   }
1407   unsigned RecCode = MaybeRecCode.get();
1408   if (RecCode != DECL_CONTEXT_LEXICAL) {
1409     Error("Expected lexical block");
1410     return true;
1411   }
1412 
1413   assert(!isa<TranslationUnitDecl>(DC) &&
1414          "expected a TU_UPDATE_LEXICAL record for TU");
1415   // If we are handling a C++ class template instantiation, we can see multiple
1416   // lexical updates for the same record. It's important that we select only one
1417   // of them, so that field numbering works properly. Just pick the first one we
1418   // see.
1419   auto &Lex = LexicalDecls[DC];
1420   if (!Lex.first) {
1421     Lex = std::make_pair(
1422         &M, llvm::ArrayRef(
1423                 reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
1424                 Blob.size() / sizeof(DeclID)));
1425   }
1426   DC->setHasExternalLexicalStorage(true);
1427   return false;
1428 }
1429 
ReadVisibleDeclContextStorage(ModuleFile & M,BitstreamCursor & Cursor,uint64_t Offset,GlobalDeclID ID,ASTReader::VisibleDeclContextStorageKind VisibleKind)1430 bool ASTReader::ReadVisibleDeclContextStorage(
1431     ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1432     ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1433   assert(Offset != 0);
1434 
1435   SavedStreamPosition SavedPosition(Cursor);
1436   if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1437     Error(std::move(Err));
1438     return true;
1439   }
1440 
1441   RecordData Record;
1442   StringRef Blob;
1443   Expected<unsigned> MaybeCode = Cursor.ReadCode();
1444   if (!MaybeCode) {
1445     Error(MaybeCode.takeError());
1446     return true;
1447   }
1448   unsigned Code = MaybeCode.get();
1449 
1450   Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1451   if (!MaybeRecCode) {
1452     Error(MaybeRecCode.takeError());
1453     return true;
1454   }
1455   unsigned RecCode = MaybeRecCode.get();
1456   switch (VisibleKind) {
1457   case VisibleDeclContextStorageKind::GenerallyVisible:
1458     if (RecCode != DECL_CONTEXT_VISIBLE) {
1459       Error("Expected visible lookup table block");
1460       return true;
1461     }
1462     break;
1463   case VisibleDeclContextStorageKind::ModuleLocalVisible:
1464     if (RecCode != DECL_CONTEXT_MODULE_LOCAL_VISIBLE) {
1465       Error("Expected module local visible lookup table block");
1466       return true;
1467     }
1468     break;
1469   case VisibleDeclContextStorageKind::TULocalVisible:
1470     if (RecCode != DECL_CONTEXT_TU_LOCAL_VISIBLE) {
1471       Error("Expected TU local lookup table block");
1472       return true;
1473     }
1474     break;
1475   }
1476 
1477   // We can't safely determine the primary context yet, so delay attaching the
1478   // lookup table until we're done with recursive deserialization.
1479   auto *Data = (const unsigned char*)Blob.data();
1480   switch (VisibleKind) {
1481   case VisibleDeclContextStorageKind::GenerallyVisible:
1482     PendingVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1483     break;
1484   case VisibleDeclContextStorageKind::ModuleLocalVisible:
1485     PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&M, Data});
1486     break;
1487   case VisibleDeclContextStorageKind::TULocalVisible:
1488     if (M.Kind == MK_MainFile)
1489       TULocalUpdates[ID].push_back(UpdateData{&M, Data});
1490     break;
1491   }
1492   return false;
1493 }
1494 
AddSpecializations(const Decl * D,const unsigned char * Data,ModuleFile & M,bool IsPartial)1495 void ASTReader::AddSpecializations(const Decl *D, const unsigned char *Data,
1496                                    ModuleFile &M, bool IsPartial) {
1497   D = D->getCanonicalDecl();
1498   auto &SpecLookups =
1499       IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1500   SpecLookups[D].Table.add(&M, Data,
1501                            reader::LazySpecializationInfoLookupTrait(*this, M));
1502 }
1503 
ReadSpecializations(ModuleFile & M,BitstreamCursor & Cursor,uint64_t Offset,Decl * D,bool IsPartial)1504 bool ASTReader::ReadSpecializations(ModuleFile &M, BitstreamCursor &Cursor,
1505                                     uint64_t Offset, Decl *D, bool IsPartial) {
1506   assert(Offset != 0);
1507 
1508   SavedStreamPosition SavedPosition(Cursor);
1509   if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1510     Error(std::move(Err));
1511     return true;
1512   }
1513 
1514   RecordData Record;
1515   StringRef Blob;
1516   Expected<unsigned> MaybeCode = Cursor.ReadCode();
1517   if (!MaybeCode) {
1518     Error(MaybeCode.takeError());
1519     return true;
1520   }
1521   unsigned Code = MaybeCode.get();
1522 
1523   Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
1524   if (!MaybeRecCode) {
1525     Error(MaybeRecCode.takeError());
1526     return true;
1527   }
1528   unsigned RecCode = MaybeRecCode.get();
1529   if (RecCode != DECL_SPECIALIZATIONS &&
1530       RecCode != DECL_PARTIAL_SPECIALIZATIONS) {
1531     Error("Expected decl specs block");
1532     return true;
1533   }
1534 
1535   auto *Data = (const unsigned char *)Blob.data();
1536   AddSpecializations(D, Data, M, IsPartial);
1537   return false;
1538 }
1539 
Error(StringRef Msg) const1540 void ASTReader::Error(StringRef Msg) const {
1541   Error(diag::err_fe_ast_file_malformed, Msg);
1542   if (PP.getLangOpts().Modules &&
1543       !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1544     Diag(diag::note_module_cache_path)
1545       << PP.getHeaderSearchInfo().getModuleCachePath();
1546   }
1547 }
1548 
Error(unsigned DiagID,StringRef Arg1,StringRef Arg2,StringRef Arg3) const1549 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1550                       StringRef Arg3) const {
1551   Diag(DiagID) << Arg1 << Arg2 << Arg3;
1552 }
1553 
1554 namespace {
1555 struct AlreadyReportedDiagnosticError
1556     : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1557   static char ID;
1558 
log__anon09454b220211::AlreadyReportedDiagnosticError1559   void log(raw_ostream &OS) const override {
1560     llvm_unreachable("reporting an already-reported diagnostic error");
1561   }
1562 
convertToErrorCode__anon09454b220211::AlreadyReportedDiagnosticError1563   std::error_code convertToErrorCode() const override {
1564     return llvm::inconvertibleErrorCode();
1565   }
1566 };
1567 
1568 char AlreadyReportedDiagnosticError::ID = 0;
1569 } // namespace
1570 
Error(llvm::Error && Err) const1571 void ASTReader::Error(llvm::Error &&Err) const {
1572   handleAllErrors(
1573       std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1574       [&](llvm::ErrorInfoBase &E) { return Error(E.message()); });
1575 }
1576 
1577 //===----------------------------------------------------------------------===//
1578 // Source Manager Deserialization
1579 //===----------------------------------------------------------------------===//
1580 
1581 /// Read the line table in the source manager block.
ParseLineTable(ModuleFile & F,const RecordData & Record)1582 void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
1583   unsigned Idx = 0;
1584   LineTableInfo &LineTable = SourceMgr.getLineTable();
1585 
1586   // Parse the file names
1587   std::map<int, int> FileIDs;
1588   FileIDs[-1] = -1; // For unspecified filenames.
1589   for (unsigned I = 0; Record[Idx]; ++I) {
1590     // Extract the file name
1591     auto Filename = ReadPath(F, Record, Idx);
1592     FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1593   }
1594   ++Idx;
1595 
1596   // Parse the line entries
1597   std::vector<LineEntry> Entries;
1598   while (Idx < Record.size()) {
1599     FileID FID = ReadFileID(F, Record, Idx);
1600 
1601     // Extract the line entries
1602     unsigned NumEntries = Record[Idx++];
1603     assert(NumEntries && "no line entries for file ID");
1604     Entries.clear();
1605     Entries.reserve(NumEntries);
1606     for (unsigned I = 0; I != NumEntries; ++I) {
1607       unsigned FileOffset = Record[Idx++];
1608       unsigned LineNo = Record[Idx++];
1609       int FilenameID = FileIDs[Record[Idx++]];
1610       SrcMgr::CharacteristicKind FileKind
1611         = (SrcMgr::CharacteristicKind)Record[Idx++];
1612       unsigned IncludeOffset = Record[Idx++];
1613       Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1614                                        FileKind, IncludeOffset));
1615     }
1616     LineTable.AddEntry(FID, Entries);
1617   }
1618 }
1619 
1620 /// Read a source manager block
ReadSourceManagerBlock(ModuleFile & F)1621 llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1622   using namespace SrcMgr;
1623 
1624   BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1625 
1626   // Set the source-location entry cursor to the current position in
1627   // the stream. This cursor will be used to read the contents of the
1628   // source manager block initially, and then lazily read
1629   // source-location entries as needed.
1630   SLocEntryCursor = F.Stream;
1631 
1632   // The stream itself is going to skip over the source manager block.
1633   if (llvm::Error Err = F.Stream.SkipBlock())
1634     return Err;
1635 
1636   // Enter the source manager block.
1637   if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1638     return Err;
1639   F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
1640 
1641   RecordData Record;
1642   while (true) {
1643     Expected<llvm::BitstreamEntry> MaybeE =
1644         SLocEntryCursor.advanceSkippingSubblocks();
1645     if (!MaybeE)
1646       return MaybeE.takeError();
1647     llvm::BitstreamEntry E = MaybeE.get();
1648 
1649     switch (E.Kind) {
1650     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1651     case llvm::BitstreamEntry::Error:
1652       return llvm::createStringError(std::errc::illegal_byte_sequence,
1653                                      "malformed block record in AST file");
1654     case llvm::BitstreamEntry::EndBlock:
1655       return llvm::Error::success();
1656     case llvm::BitstreamEntry::Record:
1657       // The interesting case.
1658       break;
1659     }
1660 
1661     // Read a record.
1662     Record.clear();
1663     StringRef Blob;
1664     Expected<unsigned> MaybeRecord =
1665         SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1666     if (!MaybeRecord)
1667       return MaybeRecord.takeError();
1668     switch (MaybeRecord.get()) {
1669     default:  // Default behavior: ignore.
1670       break;
1671 
1672     case SM_SLOC_FILE_ENTRY:
1673     case SM_SLOC_BUFFER_ENTRY:
1674     case SM_SLOC_EXPANSION_ENTRY:
1675       // Once we hit one of the source location entries, we're done.
1676       return llvm::Error::success();
1677     }
1678   }
1679 }
1680 
1681 llvm::Expected<SourceLocation::UIntTy>
readSLocOffset(ModuleFile * F,unsigned Index)1682 ASTReader::readSLocOffset(ModuleFile *F, unsigned Index) {
1683   BitstreamCursor &Cursor = F->SLocEntryCursor;
1684   SavedStreamPosition SavedPosition(Cursor);
1685   if (llvm::Error Err = Cursor.JumpToBit(F->SLocEntryOffsetsBase +
1686                                          F->SLocEntryOffsets[Index]))
1687     return std::move(Err);
1688 
1689   Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
1690   if (!MaybeEntry)
1691     return MaybeEntry.takeError();
1692 
1693   llvm::BitstreamEntry Entry = MaybeEntry.get();
1694   if (Entry.Kind != llvm::BitstreamEntry::Record)
1695     return llvm::createStringError(
1696         std::errc::illegal_byte_sequence,
1697         "incorrectly-formatted source location entry in AST file");
1698 
1699   RecordData Record;
1700   StringRef Blob;
1701   Expected<unsigned> MaybeSLOC = Cursor.readRecord(Entry.ID, Record, &Blob);
1702   if (!MaybeSLOC)
1703     return MaybeSLOC.takeError();
1704 
1705   switch (MaybeSLOC.get()) {
1706   default:
1707     return llvm::createStringError(
1708         std::errc::illegal_byte_sequence,
1709         "incorrectly-formatted source location entry in AST file");
1710   case SM_SLOC_FILE_ENTRY:
1711   case SM_SLOC_BUFFER_ENTRY:
1712   case SM_SLOC_EXPANSION_ENTRY:
1713     return F->SLocEntryBaseOffset + Record[0];
1714   }
1715 }
1716 
getSLocEntryID(SourceLocation::UIntTy SLocOffset)1717 int ASTReader::getSLocEntryID(SourceLocation::UIntTy SLocOffset) {
1718   auto SLocMapI =
1719       GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1720   assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1721          "Corrupted global sloc offset map");
1722   ModuleFile *F = SLocMapI->second;
1723 
1724   bool Invalid = false;
1725 
1726   auto It = llvm::upper_bound(
1727       llvm::index_range(0, F->LocalNumSLocEntries), SLocOffset,
1728       [&](SourceLocation::UIntTy Offset, std::size_t LocalIndex) {
1729         int ID = F->SLocEntryBaseID + LocalIndex;
1730         std::size_t Index = -ID - 2;
1731         if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1732           assert(!SourceMgr.SLocEntryLoaded[Index]);
1733           auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1734           if (!MaybeEntryOffset) {
1735             Error(MaybeEntryOffset.takeError());
1736             Invalid = true;
1737             return true;
1738           }
1739           SourceMgr.LoadedSLocEntryTable[Index] =
1740               SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1741           SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1742         }
1743         return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1744       });
1745 
1746   if (Invalid)
1747     return 0;
1748 
1749   // The iterator points to the first entry with start offset greater than the
1750   // offset of interest. The previous entry must contain the offset of interest.
1751   return F->SLocEntryBaseID + *std::prev(It);
1752 }
1753 
ReadSLocEntry(int ID)1754 bool ASTReader::ReadSLocEntry(int ID) {
1755   if (ID == 0)
1756     return false;
1757 
1758   if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1759     Error("source location entry ID out-of-range for AST file");
1760     return true;
1761   }
1762 
1763   // Local helper to read the (possibly-compressed) buffer data following the
1764   // entry record.
1765   auto ReadBuffer = [this](
1766       BitstreamCursor &SLocEntryCursor,
1767       StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1768     RecordData Record;
1769     StringRef Blob;
1770     Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
1771     if (!MaybeCode) {
1772       Error(MaybeCode.takeError());
1773       return nullptr;
1774     }
1775     unsigned Code = MaybeCode.get();
1776 
1777     Expected<unsigned> MaybeRecCode =
1778         SLocEntryCursor.readRecord(Code, Record, &Blob);
1779     if (!MaybeRecCode) {
1780       Error(MaybeRecCode.takeError());
1781       return nullptr;
1782     }
1783     unsigned RecCode = MaybeRecCode.get();
1784 
1785     if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1786       // Inspect the first byte to differentiate zlib (\x78) and zstd
1787       // (little-endian 0xFD2FB528).
1788       const llvm::compression::Format F =
1789           Blob.size() > 0 && Blob.data()[0] == 0x78
1790               ? llvm::compression::Format::Zlib
1791               : llvm::compression::Format::Zstd;
1792       if (const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1793         Error(Reason);
1794         return nullptr;
1795       }
1796       SmallVector<uint8_t, 0> Decompressed;
1797       if (llvm::Error E = llvm::compression::decompress(
1798               F, llvm::arrayRefFromStringRef(Blob), Decompressed, Record[0])) {
1799         Error("could not decompress embedded file contents: " +
1800               llvm::toString(std::move(E)));
1801         return nullptr;
1802       }
1803       return llvm::MemoryBuffer::getMemBufferCopy(
1804           llvm::toStringRef(Decompressed), Name);
1805     } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1806       return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1807     } else {
1808       Error("AST record has invalid code");
1809       return nullptr;
1810     }
1811   };
1812 
1813   ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1814   if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
1815           F->SLocEntryOffsetsBase +
1816           F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
1817     Error(std::move(Err));
1818     return true;
1819   }
1820 
1821   BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1822   SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset;
1823 
1824   ++NumSLocEntriesRead;
1825   Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
1826   if (!MaybeEntry) {
1827     Error(MaybeEntry.takeError());
1828     return true;
1829   }
1830   llvm::BitstreamEntry Entry = MaybeEntry.get();
1831 
1832   if (Entry.Kind != llvm::BitstreamEntry::Record) {
1833     Error("incorrectly-formatted source location entry in AST file");
1834     return true;
1835   }
1836 
1837   RecordData Record;
1838   StringRef Blob;
1839   Expected<unsigned> MaybeSLOC =
1840       SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
1841   if (!MaybeSLOC) {
1842     Error(MaybeSLOC.takeError());
1843     return true;
1844   }
1845   switch (MaybeSLOC.get()) {
1846   default:
1847     Error("incorrectly-formatted source location entry in AST file");
1848     return true;
1849 
1850   case SM_SLOC_FILE_ENTRY: {
1851     // We will detect whether a file changed and return 'Failure' for it, but
1852     // we will also try to fail gracefully by setting up the SLocEntry.
1853     unsigned InputID = Record[4];
1854     InputFile IF = getInputFile(*F, InputID);
1855     OptionalFileEntryRef File = IF.getFile();
1856     bool OverriddenBuffer = IF.isOverridden();
1857 
1858     // Note that we only check if a File was returned. If it was out-of-date
1859     // we have complained but we will continue creating a FileID to recover
1860     // gracefully.
1861     if (!File)
1862       return true;
1863 
1864     SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1865     if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1866       // This is the module's main file.
1867       IncludeLoc = getImportLocation(F);
1868     }
1869     SrcMgr::CharacteristicKind
1870       FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1871     FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
1872                                         BaseOffset + Record[0]);
1873     SrcMgr::FileInfo &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
1874     FileInfo.NumCreatedFIDs = Record[5];
1875     if (Record[3])
1876       FileInfo.setHasLineDirectives();
1877 
1878     unsigned NumFileDecls = Record[7];
1879     if (NumFileDecls && ContextObj) {
1880       const unaligned_decl_id_t *FirstDecl = F->FileSortedDecls + Record[6];
1881       assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1882       FileDeclIDs[FID] =
1883           FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
1884     }
1885 
1886     const SrcMgr::ContentCache &ContentCache =
1887         SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
1888     if (OverriddenBuffer && !ContentCache.BufferOverridden &&
1889         ContentCache.ContentsEntry == ContentCache.OrigEntry &&
1890         !ContentCache.getBufferIfLoaded()) {
1891       auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1892       if (!Buffer)
1893         return true;
1894       SourceMgr.overrideFileContents(*File, std::move(Buffer));
1895     }
1896 
1897     break;
1898   }
1899 
1900   case SM_SLOC_BUFFER_ENTRY: {
1901     const char *Name = Blob.data();
1902     unsigned Offset = Record[0];
1903     SrcMgr::CharacteristicKind
1904       FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1905     SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1906     if (IncludeLoc.isInvalid() && F->isModule()) {
1907       IncludeLoc = getImportLocation(F);
1908     }
1909 
1910     auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1911     if (!Buffer)
1912       return true;
1913     FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1914                                         BaseOffset + Offset, IncludeLoc);
1915     if (Record[3]) {
1916       auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
1917       FileInfo.setHasLineDirectives();
1918     }
1919     break;
1920   }
1921 
1922   case SM_SLOC_EXPANSION_ENTRY: {
1923     SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1924     SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2]);
1925     SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3]);
1926     SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
1927                                  Record[5], Record[4], ID,
1928                                  BaseOffset + Record[0]);
1929     break;
1930   }
1931   }
1932 
1933   return false;
1934 }
1935 
getModuleImportLoc(int ID)1936 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1937   if (ID == 0)
1938     return std::make_pair(SourceLocation(), "");
1939 
1940   if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1941     Error("source location entry ID out-of-range for AST file");
1942     return std::make_pair(SourceLocation(), "");
1943   }
1944 
1945   // Find which module file this entry lands in.
1946   ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1947   if (!M->isModule())
1948     return std::make_pair(SourceLocation(), "");
1949 
1950   // FIXME: Can we map this down to a particular submodule? That would be
1951   // ideal.
1952   return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1953 }
1954 
1955 /// Find the location where the module F is imported.
getImportLocation(ModuleFile * F)1956 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1957   if (F->ImportLoc.isValid())
1958     return F->ImportLoc;
1959 
1960   // Otherwise we have a PCH. It's considered to be "imported" at the first
1961   // location of its includer.
1962   if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1963     // Main file is the importer.
1964     assert(SourceMgr.getMainFileID().isValid() && "missing main file");
1965     return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1966   }
1967   return F->ImportedBy[0]->FirstLoc;
1968 }
1969 
1970 /// Enter a subblock of the specified BlockID with the specified cursor. Read
1971 /// the abbreviations that are at the top of the block and then leave the cursor
1972 /// pointing into the block.
ReadBlockAbbrevs(BitstreamCursor & Cursor,unsigned BlockID,uint64_t * StartOfBlockOffset)1973 llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
1974                                         unsigned BlockID,
1975                                         uint64_t *StartOfBlockOffset) {
1976   if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
1977     return Err;
1978 
1979   if (StartOfBlockOffset)
1980     *StartOfBlockOffset = Cursor.GetCurrentBitNo();
1981 
1982   while (true) {
1983     uint64_t Offset = Cursor.GetCurrentBitNo();
1984     Expected<unsigned> MaybeCode = Cursor.ReadCode();
1985     if (!MaybeCode)
1986       return MaybeCode.takeError();
1987     unsigned Code = MaybeCode.get();
1988 
1989     // We expect all abbrevs to be at the start of the block.
1990     if (Code != llvm::bitc::DEFINE_ABBREV) {
1991       if (llvm::Error Err = Cursor.JumpToBit(Offset))
1992         return Err;
1993       return llvm::Error::success();
1994     }
1995     if (llvm::Error Err = Cursor.ReadAbbrevRecord())
1996       return Err;
1997   }
1998 }
1999 
ReadToken(ModuleFile & M,const RecordDataImpl & Record,unsigned & Idx)2000 Token ASTReader::ReadToken(ModuleFile &M, const RecordDataImpl &Record,
2001                            unsigned &Idx) {
2002   Token Tok;
2003   Tok.startToken();
2004   Tok.setLocation(ReadSourceLocation(M, Record, Idx));
2005   Tok.setKind((tok::TokenKind)Record[Idx++]);
2006   Tok.setFlag((Token::TokenFlags)Record[Idx++]);
2007 
2008   if (Tok.isAnnotation()) {
2009     Tok.setAnnotationEndLoc(ReadSourceLocation(M, Record, Idx));
2010     switch (Tok.getKind()) {
2011     case tok::annot_pragma_loop_hint: {
2012       auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo;
2013       Info->PragmaName = ReadToken(M, Record, Idx);
2014       Info->Option = ReadToken(M, Record, Idx);
2015       unsigned NumTokens = Record[Idx++];
2016       SmallVector<Token, 4> Toks;
2017       Toks.reserve(NumTokens);
2018       for (unsigned I = 0; I < NumTokens; ++I)
2019         Toks.push_back(ReadToken(M, Record, Idx));
2020       Info->Toks = llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2021       Tok.setAnnotationValue(static_cast<void *>(Info));
2022       break;
2023     }
2024     case tok::annot_pragma_pack: {
2025       auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo;
2026       Info->Action = static_cast<Sema::PragmaMsStackAction>(Record[Idx++]);
2027       auto SlotLabel = ReadString(Record, Idx);
2028       Info->SlotLabel =
2029           llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2030       Info->Alignment = ReadToken(M, Record, Idx);
2031       Tok.setAnnotationValue(static_cast<void *>(Info));
2032       break;
2033     }
2034     // Some annotation tokens do not use the PtrData field.
2035     case tok::annot_pragma_openmp:
2036     case tok::annot_pragma_openmp_end:
2037     case tok::annot_pragma_unused:
2038     case tok::annot_pragma_openacc:
2039     case tok::annot_pragma_openacc_end:
2040     case tok::annot_repl_input_end:
2041       break;
2042     default:
2043       llvm_unreachable("missing deserialization code for annotation token");
2044     }
2045   } else {
2046     Tok.setLength(Record[Idx++]);
2047     if (IdentifierInfo *II = getLocalIdentifier(M, Record[Idx++]))
2048       Tok.setIdentifierInfo(II);
2049   }
2050   return Tok;
2051 }
2052 
ReadMacroRecord(ModuleFile & F,uint64_t Offset)2053 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
2054   BitstreamCursor &Stream = F.MacroCursor;
2055 
2056   // Keep track of where we are in the stream, then jump back there
2057   // after reading this macro.
2058   SavedStreamPosition SavedPosition(Stream);
2059 
2060   if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2061     // FIXME this drops errors on the floor.
2062     consumeError(std::move(Err));
2063     return nullptr;
2064   }
2065   RecordData Record;
2066   SmallVector<IdentifierInfo*, 16> MacroParams;
2067   MacroInfo *Macro = nullptr;
2068   llvm::MutableArrayRef<Token> MacroTokens;
2069 
2070   while (true) {
2071     // Advance to the next record, but if we get to the end of the block, don't
2072     // pop it (removing all the abbreviations from the cursor) since we want to
2073     // be able to reseek within the block and read entries.
2074     unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2075     Expected<llvm::BitstreamEntry> MaybeEntry =
2076         Stream.advanceSkippingSubblocks(Flags);
2077     if (!MaybeEntry) {
2078       Error(MaybeEntry.takeError());
2079       return Macro;
2080     }
2081     llvm::BitstreamEntry Entry = MaybeEntry.get();
2082 
2083     switch (Entry.Kind) {
2084     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2085     case llvm::BitstreamEntry::Error:
2086       Error("malformed block record in AST file");
2087       return Macro;
2088     case llvm::BitstreamEntry::EndBlock:
2089       return Macro;
2090     case llvm::BitstreamEntry::Record:
2091       // The interesting case.
2092       break;
2093     }
2094 
2095     // Read a record.
2096     Record.clear();
2097     PreprocessorRecordTypes RecType;
2098     if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
2099       RecType = (PreprocessorRecordTypes)MaybeRecType.get();
2100     else {
2101       Error(MaybeRecType.takeError());
2102       return Macro;
2103     }
2104     switch (RecType) {
2105     case PP_MODULE_MACRO:
2106     case PP_MACRO_DIRECTIVE_HISTORY:
2107       return Macro;
2108 
2109     case PP_MACRO_OBJECT_LIKE:
2110     case PP_MACRO_FUNCTION_LIKE: {
2111       // If we already have a macro, that means that we've hit the end
2112       // of the definition of the macro we were looking for. We're
2113       // done.
2114       if (Macro)
2115         return Macro;
2116 
2117       unsigned NextIndex = 1; // Skip identifier ID.
2118       SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
2119       MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2120       MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
2121       MI->setIsUsed(Record[NextIndex++]);
2122       MI->setUsedForHeaderGuard(Record[NextIndex++]);
2123       MacroTokens = MI->allocateTokens(Record[NextIndex++],
2124                                        PP.getPreprocessorAllocator());
2125       if (RecType == PP_MACRO_FUNCTION_LIKE) {
2126         // Decode function-like macro info.
2127         bool isC99VarArgs = Record[NextIndex++];
2128         bool isGNUVarArgs = Record[NextIndex++];
2129         bool hasCommaPasting = Record[NextIndex++];
2130         MacroParams.clear();
2131         unsigned NumArgs = Record[NextIndex++];
2132         for (unsigned i = 0; i != NumArgs; ++i)
2133           MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
2134 
2135         // Install function-like macro info.
2136         MI->setIsFunctionLike();
2137         if (isC99VarArgs) MI->setIsC99Varargs();
2138         if (isGNUVarArgs) MI->setIsGNUVarargs();
2139         if (hasCommaPasting) MI->setHasCommaPasting();
2140         MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
2141       }
2142 
2143       // Remember that we saw this macro last so that we add the tokens that
2144       // form its body to it.
2145       Macro = MI;
2146 
2147       if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
2148           Record[NextIndex]) {
2149         // We have a macro definition. Register the association
2150         PreprocessedEntityID
2151             GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
2152         PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
2153         PreprocessingRecord::PPEntityID PPID =
2154             PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
2155         MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
2156             PPRec.getPreprocessedEntity(PPID));
2157         if (PPDef)
2158           PPRec.RegisterMacroDefinition(Macro, PPDef);
2159       }
2160 
2161       ++NumMacrosRead;
2162       break;
2163     }
2164 
2165     case PP_TOKEN: {
2166       // If we see a TOKEN before a PP_MACRO_*, then the file is
2167       // erroneous, just pretend we didn't see this.
2168       if (!Macro) break;
2169       if (MacroTokens.empty()) {
2170         Error("unexpected number of macro tokens for a macro in AST file");
2171         return Macro;
2172       }
2173 
2174       unsigned Idx = 0;
2175       MacroTokens[0] = ReadToken(F, Record, Idx);
2176       MacroTokens = MacroTokens.drop_front();
2177       break;
2178     }
2179     }
2180   }
2181 }
2182 
2183 PreprocessedEntityID
getGlobalPreprocessedEntityID(ModuleFile & M,unsigned LocalID) const2184 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
2185                                          unsigned LocalID) const {
2186   if (!M.ModuleOffsetMap.empty())
2187     ReadModuleOffsetMap(M);
2188 
2189   ContinuousRangeMap<uint32_t, int, 2>::const_iterator
2190     I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
2191   assert(I != M.PreprocessedEntityRemap.end()
2192          && "Invalid index into preprocessed entity index remap");
2193 
2194   return LocalID + I->second;
2195 }
2196 
2197 OptionalFileEntryRef
getFile(const internal_key_type & Key)2198 HeaderFileInfoTrait::getFile(const internal_key_type &Key) {
2199   FileManager &FileMgr = Reader.getFileManager();
2200   if (!Key.Imported)
2201     return FileMgr.getOptionalFileRef(Key.Filename);
2202 
2203   auto Resolved =
2204       ASTReader::ResolveImportedPath(Reader.getPathBuf(), Key.Filename, M);
2205   return FileMgr.getOptionalFileRef(*Resolved);
2206 }
2207 
ComputeHash(internal_key_ref ikey)2208 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
2209   uint8_t buf[sizeof(ikey.Size) + sizeof(ikey.ModTime)];
2210   memcpy(buf, &ikey.Size, sizeof(ikey.Size));
2211   memcpy(buf + sizeof(ikey.Size), &ikey.ModTime, sizeof(ikey.ModTime));
2212   return llvm::xxh3_64bits(buf);
2213 }
2214 
2215 HeaderFileInfoTrait::internal_key_type
GetInternalKey(external_key_type ekey)2216 HeaderFileInfoTrait::GetInternalKey(external_key_type ekey) {
2217   internal_key_type ikey = {ekey.getSize(),
2218                             M.HasTimestamps ? ekey.getModificationTime() : 0,
2219                             ekey.getName(), /*Imported*/ false};
2220   return ikey;
2221 }
2222 
EqualKey(internal_key_ref a,internal_key_ref b)2223 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
2224   if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
2225     return false;
2226 
2227   if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
2228     return true;
2229 
2230   // Determine whether the actual files are equivalent.
2231   OptionalFileEntryRef FEA = getFile(a);
2232   OptionalFileEntryRef FEB = getFile(b);
2233   return FEA && FEA == FEB;
2234 }
2235 
2236 std::pair<unsigned, unsigned>
ReadKeyDataLength(const unsigned char * & d)2237 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
2238   return readULEBKeyDataLength(d);
2239 }
2240 
2241 HeaderFileInfoTrait::internal_key_type
ReadKey(const unsigned char * d,unsigned)2242 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
2243   using namespace llvm::support;
2244 
2245   internal_key_type ikey;
2246   ikey.Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2247   ikey.ModTime =
2248       time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2249   ikey.Filename = (const char *)d;
2250   ikey.Imported = true;
2251   return ikey;
2252 }
2253 
2254 HeaderFileInfoTrait::data_type
ReadData(internal_key_ref key,const unsigned char * d,unsigned DataLen)2255 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
2256                               unsigned DataLen) {
2257   using namespace llvm::support;
2258 
2259   const unsigned char *End = d + DataLen;
2260   HeaderFileInfo HFI;
2261   unsigned Flags = *d++;
2262 
2263   OptionalFileEntryRef FE;
2264   bool Included = (Flags >> 6) & 0x01;
2265   if (Included)
2266     if ((FE = getFile(key)))
2267       // Not using \c Preprocessor::markIncluded(), since that would attempt to
2268       // deserialize this header file info again.
2269       Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2270 
2271   // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
2272   HFI.isImport |= (Flags >> 5) & 0x01;
2273   HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
2274   HFI.DirInfo = (Flags >> 1) & 0x07;
2275   HFI.LazyControllingMacro = Reader.getGlobalIdentifierID(
2276       M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2277 
2278   assert((End - d) % 4 == 0 &&
2279          "Wrong data length in HeaderFileInfo deserialization");
2280   while (d != End) {
2281     uint32_t LocalSMID =
2282         endian::readNext<uint32_t, llvm::endianness::little>(d);
2283     auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 7);
2284     LocalSMID >>= 3;
2285 
2286     // This header is part of a module. Associate it with the module to enable
2287     // implicit module import.
2288     SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2289     Module *Mod = Reader.getSubmodule(GlobalSMID);
2290     ModuleMap &ModMap =
2291         Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2292 
2293     if (FE || (FE = getFile(key))) {
2294       // FIXME: NameAsWritten
2295       Module::Header H = {std::string(key.Filename), "", *FE};
2296       ModMap.addHeader(Mod, H, HeaderRole, /*Imported=*/true);
2297     }
2298     HFI.mergeModuleMembership(HeaderRole);
2299   }
2300 
2301   // This HeaderFileInfo was externally loaded.
2302   HFI.External = true;
2303   HFI.IsValid = true;
2304   return HFI;
2305 }
2306 
addPendingMacro(IdentifierInfo * II,ModuleFile * M,uint32_t MacroDirectivesOffset)2307 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M,
2308                                 uint32_t MacroDirectivesOffset) {
2309   assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
2310   PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2311 }
2312 
ReadDefinedMacros()2313 void ASTReader::ReadDefinedMacros() {
2314   // Note that we are loading defined macros.
2315   Deserializing Macros(this);
2316 
2317   for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
2318     BitstreamCursor &MacroCursor = I.MacroCursor;
2319 
2320     // If there was no preprocessor block, skip this file.
2321     if (MacroCursor.getBitcodeBytes().empty())
2322       continue;
2323 
2324     BitstreamCursor Cursor = MacroCursor;
2325     if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2326       Error(std::move(Err));
2327       return;
2328     }
2329 
2330     RecordData Record;
2331     while (true) {
2332       Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
2333       if (!MaybeE) {
2334         Error(MaybeE.takeError());
2335         return;
2336       }
2337       llvm::BitstreamEntry E = MaybeE.get();
2338 
2339       switch (E.Kind) {
2340       case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2341       case llvm::BitstreamEntry::Error:
2342         Error("malformed block record in AST file");
2343         return;
2344       case llvm::BitstreamEntry::EndBlock:
2345         goto NextCursor;
2346 
2347       case llvm::BitstreamEntry::Record: {
2348         Record.clear();
2349         Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
2350         if (!MaybeRecord) {
2351           Error(MaybeRecord.takeError());
2352           return;
2353         }
2354         switch (MaybeRecord.get()) {
2355         default:  // Default behavior: ignore.
2356           break;
2357 
2358         case PP_MACRO_OBJECT_LIKE:
2359         case PP_MACRO_FUNCTION_LIKE: {
2360           IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
2361           if (II->isOutOfDate())
2362             updateOutOfDateIdentifier(*II);
2363           break;
2364         }
2365 
2366         case PP_TOKEN:
2367           // Ignore tokens.
2368           break;
2369         }
2370         break;
2371       }
2372       }
2373     }
2374     NextCursor:  ;
2375   }
2376 }
2377 
2378 namespace {
2379 
2380   /// Visitor class used to look up identifirs in an AST file.
2381   class IdentifierLookupVisitor {
2382     StringRef Name;
2383     unsigned NameHash;
2384     unsigned PriorGeneration;
2385     unsigned &NumIdentifierLookups;
2386     unsigned &NumIdentifierLookupHits;
2387     IdentifierInfo *Found = nullptr;
2388 
2389   public:
IdentifierLookupVisitor(StringRef Name,unsigned PriorGeneration,unsigned & NumIdentifierLookups,unsigned & NumIdentifierLookupHits)2390     IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
2391                             unsigned &NumIdentifierLookups,
2392                             unsigned &NumIdentifierLookupHits)
2393       : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
2394         PriorGeneration(PriorGeneration),
2395         NumIdentifierLookups(NumIdentifierLookups),
2396         NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2397 
operator ()(ModuleFile & M)2398     bool operator()(ModuleFile &M) {
2399       // If we've already searched this module file, skip it now.
2400       if (M.Generation <= PriorGeneration)
2401         return true;
2402 
2403       ASTIdentifierLookupTable *IdTable
2404         = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
2405       if (!IdTable)
2406         return false;
2407 
2408       ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
2409                                      Found);
2410       ++NumIdentifierLookups;
2411       ASTIdentifierLookupTable::iterator Pos =
2412           IdTable->find_hashed(Name, NameHash, &Trait);
2413       if (Pos == IdTable->end())
2414         return false;
2415 
2416       // Dereferencing the iterator has the effect of building the
2417       // IdentifierInfo node and populating it with the various
2418       // declarations it needs.
2419       ++NumIdentifierLookupHits;
2420       Found = *Pos;
2421       if (Trait.hasMoreInformationInDependencies()) {
2422         // Look for the identifier in extra modules as they contain more info.
2423         return false;
2424       }
2425       return true;
2426     }
2427 
2428     // Retrieve the identifier info found within the module
2429     // files.
getIdentifierInfo() const2430     IdentifierInfo *getIdentifierInfo() const { return Found; }
2431   };
2432 
2433 } // namespace
2434 
updateOutOfDateIdentifier(const IdentifierInfo & II)2435 void ASTReader::updateOutOfDateIdentifier(const IdentifierInfo &II) {
2436   // Note that we are loading an identifier.
2437   Deserializing AnIdentifier(this);
2438 
2439   unsigned PriorGeneration = 0;
2440   if (getContext().getLangOpts().Modules)
2441     PriorGeneration = IdentifierGeneration[&II];
2442 
2443   // If there is a global index, look there first to determine which modules
2444   // provably do not have any results for this identifier.
2445   GlobalModuleIndex::HitSet Hits;
2446   GlobalModuleIndex::HitSet *HitsPtr = nullptr;
2447   if (!loadGlobalIndex()) {
2448     if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
2449       HitsPtr = &Hits;
2450     }
2451   }
2452 
2453   IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
2454                                   NumIdentifierLookups,
2455                                   NumIdentifierLookupHits);
2456   ModuleMgr.visit(Visitor, HitsPtr);
2457   markIdentifierUpToDate(&II);
2458 }
2459 
markIdentifierUpToDate(const IdentifierInfo * II)2460 void ASTReader::markIdentifierUpToDate(const IdentifierInfo *II) {
2461   if (!II)
2462     return;
2463 
2464   const_cast<IdentifierInfo *>(II)->setOutOfDate(false);
2465 
2466   // Update the generation for this identifier.
2467   if (getContext().getLangOpts().Modules)
2468     IdentifierGeneration[II] = getGeneration();
2469 }
2470 
resolvePendingMacro(IdentifierInfo * II,const PendingMacroInfo & PMInfo)2471 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
2472                                     const PendingMacroInfo &PMInfo) {
2473   ModuleFile &M = *PMInfo.M;
2474 
2475   BitstreamCursor &Cursor = M.MacroCursor;
2476   SavedStreamPosition SavedPosition(Cursor);
2477   if (llvm::Error Err =
2478           Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
2479     Error(std::move(Err));
2480     return;
2481   }
2482 
2483   struct ModuleMacroRecord {
2484     SubmoduleID SubModID;
2485     MacroInfo *MI;
2486     SmallVector<SubmoduleID, 8> Overrides;
2487   };
2488   llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
2489 
2490   // We expect to see a sequence of PP_MODULE_MACRO records listing exported
2491   // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
2492   // macro histroy.
2493   RecordData Record;
2494   while (true) {
2495     Expected<llvm::BitstreamEntry> MaybeEntry =
2496         Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2497     if (!MaybeEntry) {
2498       Error(MaybeEntry.takeError());
2499       return;
2500     }
2501     llvm::BitstreamEntry Entry = MaybeEntry.get();
2502 
2503     if (Entry.Kind != llvm::BitstreamEntry::Record) {
2504       Error("malformed block record in AST file");
2505       return;
2506     }
2507 
2508     Record.clear();
2509     Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
2510     if (!MaybePP) {
2511       Error(MaybePP.takeError());
2512       return;
2513     }
2514     switch ((PreprocessorRecordTypes)MaybePP.get()) {
2515     case PP_MACRO_DIRECTIVE_HISTORY:
2516       break;
2517 
2518     case PP_MODULE_MACRO: {
2519       ModuleMacros.push_back(ModuleMacroRecord());
2520       auto &Info = ModuleMacros.back();
2521       Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
2522       Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
2523       for (int I = 2, N = Record.size(); I != N; ++I)
2524         Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
2525       continue;
2526     }
2527 
2528     default:
2529       Error("malformed block record in AST file");
2530       return;
2531     }
2532 
2533     // We found the macro directive history; that's the last record
2534     // for this macro.
2535     break;
2536   }
2537 
2538   // Module macros are listed in reverse dependency order.
2539   {
2540     std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2541     llvm::SmallVector<ModuleMacro*, 8> Overrides;
2542     for (auto &MMR : ModuleMacros) {
2543       Overrides.clear();
2544       for (unsigned ModID : MMR.Overrides) {
2545         Module *Mod = getSubmodule(ModID);
2546         auto *Macro = PP.getModuleMacro(Mod, II);
2547         assert(Macro && "missing definition for overridden macro");
2548         Overrides.push_back(Macro);
2549       }
2550 
2551       bool Inserted = false;
2552       Module *Owner = getSubmodule(MMR.SubModID);
2553       PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2554     }
2555   }
2556 
2557   // Don't read the directive history for a module; we don't have anywhere
2558   // to put it.
2559   if (M.isModule())
2560     return;
2561 
2562   // Deserialize the macro directives history in reverse source-order.
2563   MacroDirective *Latest = nullptr, *Earliest = nullptr;
2564   unsigned Idx = 0, N = Record.size();
2565   while (Idx < N) {
2566     MacroDirective *MD = nullptr;
2567     SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
2568     MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
2569     switch (K) {
2570     case MacroDirective::MD_Define: {
2571       MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
2572       MD = PP.AllocateDefMacroDirective(MI, Loc);
2573       break;
2574     }
2575     case MacroDirective::MD_Undefine:
2576       MD = PP.AllocateUndefMacroDirective(Loc);
2577       break;
2578     case MacroDirective::MD_Visibility:
2579       bool isPublic = Record[Idx++];
2580       MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2581       break;
2582     }
2583 
2584     if (!Latest)
2585       Latest = MD;
2586     if (Earliest)
2587       Earliest->setPrevious(MD);
2588     Earliest = MD;
2589   }
2590 
2591   if (Latest)
2592     PP.setLoadedMacroDirective(II, Earliest, Latest);
2593 }
2594 
shouldDisableValidationForFile(const serialization::ModuleFile & M) const2595 bool ASTReader::shouldDisableValidationForFile(
2596     const serialization::ModuleFile &M) const {
2597   if (DisableValidationKind == DisableValidationForModuleKind::None)
2598     return false;
2599 
2600   // If a PCH is loaded and validation is disabled for PCH then disable
2601   // validation for the PCH and the modules it loads.
2602   ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);
2603 
2604   switch (K) {
2605   case MK_MainFile:
2606   case MK_Preamble:
2607   case MK_PCH:
2608     return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2609   case MK_ImplicitModule:
2610   case MK_ExplicitModule:
2611   case MK_PrebuiltModule:
2612     return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2613   }
2614 
2615   return false;
2616 }
2617 
2618 static std::pair<StringRef, StringRef>
getUnresolvedInputFilenames(const ASTReader::RecordData & Record,const StringRef InputBlob)2619 getUnresolvedInputFilenames(const ASTReader::RecordData &Record,
2620                             const StringRef InputBlob) {
2621   uint16_t AsRequestedLength = Record[7];
2622   return {InputBlob.substr(0, AsRequestedLength),
2623           InputBlob.substr(AsRequestedLength)};
2624 }
2625 
getInputFileInfo(ModuleFile & F,unsigned ID)2626 InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
2627   // If this ID is bogus, just return an empty input file.
2628   if (ID == 0 || ID > F.InputFileInfosLoaded.size())
2629     return InputFileInfo();
2630 
2631   // If we've already loaded this input file, return it.
2632   if (F.InputFileInfosLoaded[ID - 1].isValid())
2633     return F.InputFileInfosLoaded[ID - 1];
2634 
2635   // Go find this input file.
2636   BitstreamCursor &Cursor = F.InputFilesCursor;
2637   SavedStreamPosition SavedPosition(Cursor);
2638   if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2639                                          F.InputFileOffsets[ID - 1])) {
2640     // FIXME this drops errors on the floor.
2641     consumeError(std::move(Err));
2642   }
2643 
2644   Expected<unsigned> MaybeCode = Cursor.ReadCode();
2645   if (!MaybeCode) {
2646     // FIXME this drops errors on the floor.
2647     consumeError(MaybeCode.takeError());
2648   }
2649   unsigned Code = MaybeCode.get();
2650   RecordData Record;
2651   StringRef Blob;
2652 
2653   if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
2654     assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
2655            "invalid record type for input file");
2656   else {
2657     // FIXME this drops errors on the floor.
2658     consumeError(Maybe.takeError());
2659   }
2660 
2661   assert(Record[0] == ID && "Bogus stored ID or offset");
2662   InputFileInfo R;
2663   R.StoredSize = static_cast<off_t>(Record[1]);
2664   R.StoredTime = static_cast<time_t>(Record[2]);
2665   R.Overridden = static_cast<bool>(Record[3]);
2666   R.Transient = static_cast<bool>(Record[4]);
2667   R.TopLevel = static_cast<bool>(Record[5]);
2668   R.ModuleMap = static_cast<bool>(Record[6]);
2669   auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2670       getUnresolvedInputFilenames(Record, Blob);
2671   R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2672   R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2673                                      ? UnresolvedFilenameAsRequested
2674                                      : UnresolvedFilename;
2675 
2676   Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2677   if (!MaybeEntry) // FIXME this drops errors on the floor.
2678     consumeError(MaybeEntry.takeError());
2679   llvm::BitstreamEntry Entry = MaybeEntry.get();
2680   assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2681          "expected record type for input file hash");
2682 
2683   Record.clear();
2684   if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2685     assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2686            "invalid record type for input file hash");
2687   else {
2688     // FIXME this drops errors on the floor.
2689     consumeError(Maybe.takeError());
2690   }
2691   R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2692                   static_cast<uint64_t>(Record[0]);
2693 
2694   // Note that we've loaded this input file info.
2695   F.InputFileInfosLoaded[ID - 1] = R;
2696   return R;
2697 }
2698 
2699 static unsigned moduleKindForDiagnostic(ModuleKind Kind);
getInputFile(ModuleFile & F,unsigned ID,bool Complain)2700 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2701   // If this ID is bogus, just return an empty input file.
2702   if (ID == 0 || ID > F.InputFilesLoaded.size())
2703     return InputFile();
2704 
2705   // If we've already loaded this input file, return it.
2706   if (F.InputFilesLoaded[ID-1].getFile())
2707     return F.InputFilesLoaded[ID-1];
2708 
2709   if (F.InputFilesLoaded[ID-1].isNotFound())
2710     return InputFile();
2711 
2712   // Go find this input file.
2713   BitstreamCursor &Cursor = F.InputFilesCursor;
2714   SavedStreamPosition SavedPosition(Cursor);
2715   if (llvm::Error Err = Cursor.JumpToBit(F.InputFilesOffsetBase +
2716                                          F.InputFileOffsets[ID - 1])) {
2717     // FIXME this drops errors on the floor.
2718     consumeError(std::move(Err));
2719   }
2720 
2721   InputFileInfo FI = getInputFileInfo(F, ID);
2722   off_t StoredSize = FI.StoredSize;
2723   time_t StoredTime = FI.StoredTime;
2724   bool Overridden = FI.Overridden;
2725   bool Transient = FI.Transient;
2726   auto Filename =
2727       ResolveImportedPath(PathBuf, FI.UnresolvedImportedFilenameAsRequested, F);
2728   uint64_t StoredContentHash = FI.ContentHash;
2729 
2730   // For standard C++ modules, we don't need to check the inputs.
2731   bool SkipChecks = F.StandardCXXModule;
2732 
2733   const HeaderSearchOptions &HSOpts =
2734       PP.getHeaderSearchInfo().getHeaderSearchOpts();
2735 
2736   // The option ForceCheckCXX20ModulesInputFiles is only meaningful for C++20
2737   // modules.
2738   if (F.StandardCXXModule && HSOpts.ForceCheckCXX20ModulesInputFiles) {
2739     SkipChecks = false;
2740     Overridden = false;
2741   }
2742 
2743   auto File = FileMgr.getOptionalFileRef(*Filename, /*OpenFile=*/false);
2744 
2745   // For an overridden file, create a virtual file with the stored
2746   // size/timestamp.
2747   if ((Overridden || Transient || SkipChecks) && !File)
2748     File = FileMgr.getVirtualFileRef(*Filename, StoredSize, StoredTime);
2749 
2750   if (!File) {
2751     if (Complain) {
2752       std::string ErrorStr = "could not find file '";
2753       ErrorStr += *Filename;
2754       ErrorStr += "' referenced by AST file '";
2755       ErrorStr += F.FileName;
2756       ErrorStr += "'";
2757       Error(ErrorStr);
2758     }
2759     // Record that we didn't find the file.
2760     F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2761     return InputFile();
2762   }
2763 
2764   // Check if there was a request to override the contents of the file
2765   // that was part of the precompiled header. Overriding such a file
2766   // can lead to problems when lexing using the source locations from the
2767   // PCH.
2768   SourceManager &SM = getSourceManager();
2769   // FIXME: Reject if the overrides are different.
2770   if ((!Overridden && !Transient) && !SkipChecks &&
2771       SM.isFileOverridden(*File)) {
2772     if (Complain)
2773       Error(diag::err_fe_pch_file_overridden, *Filename);
2774 
2775     // After emitting the diagnostic, bypass the overriding file to recover
2776     // (this creates a separate FileEntry).
2777     File = SM.bypassFileContentsOverride(*File);
2778     if (!File) {
2779       F.InputFilesLoaded[ID - 1] = InputFile::getNotFound();
2780       return InputFile();
2781     }
2782   }
2783 
2784   struct Change {
2785     enum ModificationKind {
2786       Size,
2787       ModTime,
2788       Content,
2789       None,
2790     } Kind;
2791     std::optional<int64_t> Old = std::nullopt;
2792     std::optional<int64_t> New = std::nullopt;
2793   };
2794   auto HasInputContentChanged = [&](Change OriginalChange) {
2795     assert(ValidateASTInputFilesContent &&
2796            "We should only check the content of the inputs with "
2797            "ValidateASTInputFilesContent enabled.");
2798 
2799     if (StoredContentHash == 0)
2800       return OriginalChange;
2801 
2802     auto MemBuffOrError = FileMgr.getBufferForFile(*File);
2803     if (!MemBuffOrError) {
2804       if (!Complain)
2805         return OriginalChange;
2806       std::string ErrorStr = "could not get buffer for file '";
2807       ErrorStr += File->getName();
2808       ErrorStr += "'";
2809       Error(ErrorStr);
2810       return OriginalChange;
2811     }
2812 
2813     auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2814     if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2815       return Change{Change::None};
2816 
2817     return Change{Change::Content};
2818   };
2819   auto HasInputFileChanged = [&]() {
2820     if (StoredSize != File->getSize())
2821       return Change{Change::Size, StoredSize, File->getSize()};
2822     if (!shouldDisableValidationForFile(F) && StoredTime &&
2823         StoredTime != File->getModificationTime()) {
2824       Change MTimeChange = {Change::ModTime, StoredTime,
2825                             File->getModificationTime()};
2826 
2827       // In case the modification time changes but not the content,
2828       // accept the cached file as legit.
2829       if (ValidateASTInputFilesContent)
2830         return HasInputContentChanged(MTimeChange);
2831 
2832       return MTimeChange;
2833     }
2834     return Change{Change::None};
2835   };
2836 
2837   bool IsOutOfDate = false;
2838   auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2839   // When ForceCheckCXX20ModulesInputFiles and ValidateASTInputFilesContent
2840   // enabled, it is better to check the contents of the inputs. Since we can't
2841   // get correct modified time information for inputs from overriden inputs.
2842   if (HSOpts.ForceCheckCXX20ModulesInputFiles && ValidateASTInputFilesContent &&
2843       F.StandardCXXModule && FileChange.Kind == Change::None)
2844     FileChange = HasInputContentChanged(FileChange);
2845 
2846   // When we have StoredTime equal to zero and ValidateASTInputFilesContent,
2847   // it is better to check the content of the input files because we cannot rely
2848   // on the file modification time, which will be the same (zero) for these
2849   // files.
2850   if (!StoredTime && ValidateASTInputFilesContent &&
2851       FileChange.Kind == Change::None)
2852     FileChange = HasInputContentChanged(FileChange);
2853 
2854   // For an overridden file, there is nothing to validate.
2855   if (!Overridden && FileChange.Kind != Change::None) {
2856     if (Complain) {
2857       // Build a list of the PCH imports that got us here (in reverse).
2858       SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2859       while (!ImportStack.back()->ImportedBy.empty())
2860         ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2861 
2862       // The top-level AST file is stale.
2863       StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2864       Diag(diag::err_fe_ast_file_modified)
2865           << *Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
2866           << TopLevelASTFileName << FileChange.Kind
2867           << (FileChange.Old && FileChange.New)
2868           << llvm::itostr(FileChange.Old.value_or(0))
2869           << llvm::itostr(FileChange.New.value_or(0));
2870 
2871       // Print the import stack.
2872       if (ImportStack.size() > 1) {
2873         Diag(diag::note_ast_file_required_by)
2874             << *Filename << ImportStack[0]->FileName;
2875         for (unsigned I = 1; I < ImportStack.size(); ++I)
2876           Diag(diag::note_ast_file_required_by)
2877               << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
2878       }
2879 
2880       Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
2881     }
2882 
2883     IsOutOfDate = true;
2884   }
2885   // FIXME: If the file is overridden and we've already opened it,
2886   // issue an error (or split it into a separate FileEntry).
2887 
2888   InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
2889 
2890   // Note that we've loaded this input file.
2891   F.InputFilesLoaded[ID-1] = IF;
2892   return IF;
2893 }
2894 
2895 ASTReader::TemporarilyOwnedStringRef
ResolveImportedPath(SmallString<0> & Buf,StringRef Path,ModuleFile & ModF)2896 ASTReader::ResolveImportedPath(SmallString<0> &Buf, StringRef Path,
2897                                ModuleFile &ModF) {
2898   return ResolveImportedPath(Buf, Path, ModF.BaseDirectory);
2899 }
2900 
2901 ASTReader::TemporarilyOwnedStringRef
ResolveImportedPath(SmallString<0> & Buf,StringRef Path,StringRef Prefix)2902 ASTReader::ResolveImportedPath(SmallString<0> &Buf, StringRef Path,
2903                                StringRef Prefix) {
2904   assert(Buf.capacity() != 0 && "Overlapping ResolveImportedPath calls");
2905 
2906   if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
2907       Path == "<built-in>" || Path == "<command line>")
2908     return {Path, Buf};
2909 
2910   Buf.clear();
2911   llvm::sys::path::append(Buf, Prefix, Path);
2912   StringRef ResolvedPath{Buf.data(), Buf.size()};
2913   return {ResolvedPath, Buf};
2914 }
2915 
ResolveImportedPathAndAllocate(SmallString<0> & Buf,StringRef P,ModuleFile & ModF)2916 std::string ASTReader::ResolveImportedPathAndAllocate(SmallString<0> &Buf,
2917                                                       StringRef P,
2918                                                       ModuleFile &ModF) {
2919   return ResolveImportedPathAndAllocate(Buf, P, ModF.BaseDirectory);
2920 }
2921 
ResolveImportedPathAndAllocate(SmallString<0> & Buf,StringRef P,StringRef Prefix)2922 std::string ASTReader::ResolveImportedPathAndAllocate(SmallString<0> &Buf,
2923                                                       StringRef P,
2924                                                       StringRef Prefix) {
2925   auto ResolvedPath = ResolveImportedPath(Buf, P, Prefix);
2926   return ResolvedPath->str();
2927 }
2928 
isDiagnosedResult(ASTReader::ASTReadResult ARR,unsigned Caps)2929 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2930   switch (ARR) {
2931   case ASTReader::Failure: return true;
2932   case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2933   case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2934   case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2935   case ASTReader::ConfigurationMismatch:
2936     return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2937   case ASTReader::HadErrors: return true;
2938   case ASTReader::Success: return false;
2939   }
2940 
2941   llvm_unreachable("unknown ASTReadResult");
2942 }
2943 
ReadOptionsBlock(BitstreamCursor & Stream,StringRef Filename,unsigned ClientLoadCapabilities,bool AllowCompatibleConfigurationMismatch,ASTReaderListener & Listener,std::string & SuggestedPredefines)2944 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2945     BitstreamCursor &Stream, StringRef Filename,
2946     unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
2947     ASTReaderListener &Listener, std::string &SuggestedPredefines) {
2948   if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
2949     // FIXME this drops errors on the floor.
2950     consumeError(std::move(Err));
2951     return Failure;
2952   }
2953 
2954   // Read all of the records in the options block.
2955   RecordData Record;
2956   ASTReadResult Result = Success;
2957   while (true) {
2958     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
2959     if (!MaybeEntry) {
2960       // FIXME this drops errors on the floor.
2961       consumeError(MaybeEntry.takeError());
2962       return Failure;
2963     }
2964     llvm::BitstreamEntry Entry = MaybeEntry.get();
2965 
2966     switch (Entry.Kind) {
2967     case llvm::BitstreamEntry::Error:
2968     case llvm::BitstreamEntry::SubBlock:
2969       return Failure;
2970 
2971     case llvm::BitstreamEntry::EndBlock:
2972       return Result;
2973 
2974     case llvm::BitstreamEntry::Record:
2975       // The interesting case.
2976       break;
2977     }
2978 
2979     // Read and process a record.
2980     Record.clear();
2981     Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
2982     if (!MaybeRecordType) {
2983       // FIXME this drops errors on the floor.
2984       consumeError(MaybeRecordType.takeError());
2985       return Failure;
2986     }
2987     switch ((OptionsRecordTypes)MaybeRecordType.get()) {
2988     case LANGUAGE_OPTIONS: {
2989       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2990       if (ParseLanguageOptions(Record, Filename, Complain, Listener,
2991                                AllowCompatibleConfigurationMismatch))
2992         Result = ConfigurationMismatch;
2993       break;
2994     }
2995 
2996     case TARGET_OPTIONS: {
2997       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2998       if (ParseTargetOptions(Record, Filename, Complain, Listener,
2999                              AllowCompatibleConfigurationMismatch))
3000         Result = ConfigurationMismatch;
3001       break;
3002     }
3003 
3004     case FILE_SYSTEM_OPTIONS: {
3005       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3006       if (!AllowCompatibleConfigurationMismatch &&
3007           ParseFileSystemOptions(Record, Complain, Listener))
3008         Result = ConfigurationMismatch;
3009       break;
3010     }
3011 
3012     case HEADER_SEARCH_OPTIONS: {
3013       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3014       if (!AllowCompatibleConfigurationMismatch &&
3015           ParseHeaderSearchOptions(Record, Filename, Complain, Listener))
3016         Result = ConfigurationMismatch;
3017       break;
3018     }
3019 
3020     case PREPROCESSOR_OPTIONS:
3021       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3022       if (!AllowCompatibleConfigurationMismatch &&
3023           ParsePreprocessorOptions(Record, Filename, Complain, Listener,
3024                                    SuggestedPredefines))
3025         Result = ConfigurationMismatch;
3026       break;
3027     }
3028   }
3029 }
3030 
3031 ASTReader::ASTReadResult
ReadControlBlock(ModuleFile & F,SmallVectorImpl<ImportedModule> & Loaded,const ModuleFile * ImportedBy,unsigned ClientLoadCapabilities)3032 ASTReader::ReadControlBlock(ModuleFile &F,
3033                             SmallVectorImpl<ImportedModule> &Loaded,
3034                             const ModuleFile *ImportedBy,
3035                             unsigned ClientLoadCapabilities) {
3036   BitstreamCursor &Stream = F.Stream;
3037 
3038   if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
3039     Error(std::move(Err));
3040     return Failure;
3041   }
3042 
3043   // Lambda to read the unhashed control block the first time it's called.
3044   //
3045   // For PCM files, the unhashed control block cannot be read until after the
3046   // MODULE_NAME record.  However, PCH files have no MODULE_NAME, and yet still
3047   // need to look ahead before reading the IMPORTS record.  For consistency,
3048   // this block is always read somehow (see BitstreamEntry::EndBlock).
3049   bool HasReadUnhashedControlBlock = false;
3050   auto readUnhashedControlBlockOnce = [&]() {
3051     if (!HasReadUnhashedControlBlock) {
3052       HasReadUnhashedControlBlock = true;
3053       if (ASTReadResult Result =
3054               readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3055         return Result;
3056     }
3057     return Success;
3058   };
3059 
3060   bool DisableValidation = shouldDisableValidationForFile(F);
3061 
3062   // Read all of the records and blocks in the control block.
3063   RecordData Record;
3064   unsigned NumInputs = 0;
3065   unsigned NumUserInputs = 0;
3066   StringRef BaseDirectoryAsWritten;
3067   while (true) {
3068     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3069     if (!MaybeEntry) {
3070       Error(MaybeEntry.takeError());
3071       return Failure;
3072     }
3073     llvm::BitstreamEntry Entry = MaybeEntry.get();
3074 
3075     switch (Entry.Kind) {
3076     case llvm::BitstreamEntry::Error:
3077       Error("malformed block record in AST file");
3078       return Failure;
3079     case llvm::BitstreamEntry::EndBlock: {
3080       // Validate the module before returning.  This call catches an AST with
3081       // no module name and no imports.
3082       if (ASTReadResult Result = readUnhashedControlBlockOnce())
3083         return Result;
3084 
3085       // Validate input files.
3086       const HeaderSearchOptions &HSOpts =
3087           PP.getHeaderSearchInfo().getHeaderSearchOpts();
3088 
3089       // All user input files reside at the index range [0, NumUserInputs), and
3090       // system input files reside at [NumUserInputs, NumInputs). For explicitly
3091       // loaded module files, ignore missing inputs.
3092       if (!DisableValidation && F.Kind != MK_ExplicitModule &&
3093           F.Kind != MK_PrebuiltModule) {
3094         bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3095 
3096         // If we are reading a module, we will create a verification timestamp,
3097         // so we verify all input files.  Otherwise, verify only user input
3098         // files.
3099 
3100         unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3101         if (HSOpts.ModulesValidateOncePerBuildSession &&
3102             F.InputFilesValidationTimestamp > HSOpts.BuildSessionTimestamp &&
3103             F.Kind == MK_ImplicitModule)
3104           N = ForceValidateUserInputs ? NumUserInputs : 0;
3105 
3106         if (N != 0)
3107           Diag(diag::remark_module_validation)
3108               << N << F.ModuleName << F.FileName;
3109 
3110         for (unsigned I = 0; I < N; ++I) {
3111           InputFile IF = getInputFile(F, I+1, Complain);
3112           if (!IF.getFile() || IF.isOutOfDate())
3113             return OutOfDate;
3114         }
3115       }
3116 
3117       if (Listener)
3118         Listener->visitModuleFile(F.FileName, F.Kind);
3119 
3120       if (Listener && Listener->needsInputFileVisitation()) {
3121         unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
3122                                                                 : NumUserInputs;
3123         for (unsigned I = 0; I < N; ++I) {
3124           bool IsSystem = I >= NumUserInputs;
3125           InputFileInfo FI = getInputFileInfo(F, I + 1);
3126           auto FilenameAsRequested = ResolveImportedPath(
3127               PathBuf, FI.UnresolvedImportedFilenameAsRequested, F);
3128           Listener->visitInputFile(
3129               *FilenameAsRequested, IsSystem, FI.Overridden,
3130               F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule);
3131         }
3132       }
3133 
3134       return Success;
3135     }
3136 
3137     case llvm::BitstreamEntry::SubBlock:
3138       switch (Entry.ID) {
3139       case INPUT_FILES_BLOCK_ID:
3140         F.InputFilesCursor = Stream;
3141         if (llvm::Error Err = Stream.SkipBlock()) {
3142           Error(std::move(Err));
3143           return Failure;
3144         }
3145         if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
3146           Error("malformed block record in AST file");
3147           return Failure;
3148         }
3149         F.InputFilesOffsetBase = F.InputFilesCursor.GetCurrentBitNo();
3150         continue;
3151 
3152       case OPTIONS_BLOCK_ID:
3153         // If we're reading the first module for this group, check its options
3154         // are compatible with ours. For modules it imports, no further checking
3155         // is required, because we checked them when we built it.
3156         if (Listener && !ImportedBy) {
3157           // Should we allow the configuration of the module file to differ from
3158           // the configuration of the current translation unit in a compatible
3159           // way?
3160           //
3161           // FIXME: Allow this for files explicitly specified with -include-pch.
3162           bool AllowCompatibleConfigurationMismatch =
3163               F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
3164 
3165           ASTReadResult Result =
3166               ReadOptionsBlock(Stream, F.FileName, ClientLoadCapabilities,
3167                                AllowCompatibleConfigurationMismatch, *Listener,
3168                                SuggestedPredefines);
3169           if (Result == Failure) {
3170             Error("malformed block record in AST file");
3171             return Result;
3172           }
3173 
3174           if (DisableValidation ||
3175               (AllowConfigurationMismatch && Result == ConfigurationMismatch))
3176             Result = Success;
3177 
3178           // If we can't load the module, exit early since we likely
3179           // will rebuild the module anyway. The stream may be in the
3180           // middle of a block.
3181           if (Result != Success)
3182             return Result;
3183         } else if (llvm::Error Err = Stream.SkipBlock()) {
3184           Error(std::move(Err));
3185           return Failure;
3186         }
3187         continue;
3188 
3189       default:
3190         if (llvm::Error Err = Stream.SkipBlock()) {
3191           Error(std::move(Err));
3192           return Failure;
3193         }
3194         continue;
3195       }
3196 
3197     case llvm::BitstreamEntry::Record:
3198       // The interesting case.
3199       break;
3200     }
3201 
3202     // Read and process a record.
3203     Record.clear();
3204     StringRef Blob;
3205     Expected<unsigned> MaybeRecordType =
3206         Stream.readRecord(Entry.ID, Record, &Blob);
3207     if (!MaybeRecordType) {
3208       Error(MaybeRecordType.takeError());
3209       return Failure;
3210     }
3211     switch ((ControlRecordTypes)MaybeRecordType.get()) {
3212     case METADATA: {
3213       if (Record[0] != VERSION_MAJOR && !DisableValidation) {
3214         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3215           Diag(Record[0] < VERSION_MAJOR ? diag::err_ast_file_version_too_old
3216                                          : diag::err_ast_file_version_too_new)
3217               << moduleKindForDiagnostic(F.Kind) << F.FileName;
3218         return VersionMismatch;
3219       }
3220 
3221       bool hasErrors = Record[7];
3222       if (hasErrors && !DisableValidation) {
3223         // If requested by the caller and the module hasn't already been read
3224         // or compiled, mark modules on error as out-of-date.
3225         if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3226             canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3227           return OutOfDate;
3228 
3229         if (!AllowASTWithCompilerErrors) {
3230           Diag(diag::err_ast_file_with_compiler_errors)
3231               << moduleKindForDiagnostic(F.Kind) << F.FileName;
3232           return HadErrors;
3233         }
3234       }
3235       if (hasErrors) {
3236         Diags.ErrorOccurred = true;
3237         Diags.UncompilableErrorOccurred = true;
3238         Diags.UnrecoverableErrorOccurred = true;
3239       }
3240 
3241       F.RelocatablePCH = Record[4];
3242       // Relative paths in a relocatable PCH are relative to our sysroot.
3243       if (F.RelocatablePCH)
3244         F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
3245 
3246       F.StandardCXXModule = Record[5];
3247 
3248       F.HasTimestamps = Record[6];
3249 
3250       const std::string &CurBranch = getClangFullRepositoryVersion();
3251       StringRef ASTBranch = Blob;
3252       if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3253         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3254           Diag(diag::err_ast_file_different_branch)
3255               << moduleKindForDiagnostic(F.Kind) << F.FileName << ASTBranch
3256               << CurBranch;
3257         return VersionMismatch;
3258       }
3259       break;
3260     }
3261 
3262     case IMPORT: {
3263       // Validate the AST before processing any imports (otherwise, untangling
3264       // them can be error-prone and expensive).  A module will have a name and
3265       // will already have been validated, but this catches the PCH case.
3266       if (ASTReadResult Result = readUnhashedControlBlockOnce())
3267         return Result;
3268 
3269       unsigned Idx = 0;
3270       // Read information about the AST file.
3271       ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
3272 
3273       // The import location will be the local one for now; we will adjust
3274       // all import locations of module imports after the global source
3275       // location info are setup, in ReadAST.
3276       auto [ImportLoc, ImportModuleFileIndex] =
3277           ReadUntranslatedSourceLocation(Record[Idx++]);
3278       // The import location must belong to the current module file itself.
3279       assert(ImportModuleFileIndex == 0);
3280 
3281       StringRef ImportedName = ReadStringBlob(Record, Idx, Blob);
3282 
3283       bool IsImportingStdCXXModule = Record[Idx++];
3284 
3285       off_t StoredSize = 0;
3286       time_t StoredModTime = 0;
3287       ASTFileSignature StoredSignature;
3288       std::string ImportedFile;
3289       std::string StoredFile;
3290       bool IgnoreImportedByNote = false;
3291 
3292       // For prebuilt and explicit modules first consult the file map for
3293       // an override. Note that here we don't search prebuilt module
3294       // directories if we're not importing standard c++ module, only the
3295       // explicit name to file mappings. Also, we will still verify the
3296       // size/signature making sure it is essentially the same file but
3297       // perhaps in a different location.
3298       if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
3299         ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3300             ImportedName, /*FileMapOnly*/ !IsImportingStdCXXModule);
3301 
3302       if (IsImportingStdCXXModule && ImportedFile.empty()) {
3303         Diag(diag::err_failed_to_find_module_file) << ImportedName;
3304         return Missing;
3305       }
3306 
3307       if (!IsImportingStdCXXModule) {
3308         StoredSize = (off_t)Record[Idx++];
3309         StoredModTime = (time_t)Record[Idx++];
3310 
3311         StringRef SignatureBytes = Blob.substr(0, ASTFileSignature::size);
3312         StoredSignature = ASTFileSignature::create(SignatureBytes.begin(),
3313                                                    SignatureBytes.end());
3314         Blob = Blob.substr(ASTFileSignature::size);
3315 
3316         // Use BaseDirectoryAsWritten to ensure we use the same path in the
3317         // ModuleCache as when writing.
3318         StoredFile = ReadPathBlob(BaseDirectoryAsWritten, Record, Idx, Blob);
3319         if (ImportedFile.empty()) {
3320           ImportedFile = StoredFile;
3321         } else if (!getDiags().isIgnored(
3322                        diag::warn_module_file_mapping_mismatch,
3323                        CurrentImportLoc)) {
3324           auto ImportedFileRef =
3325               PP.getFileManager().getOptionalFileRef(ImportedFile);
3326           auto StoredFileRef =
3327               PP.getFileManager().getOptionalFileRef(StoredFile);
3328           if ((ImportedFileRef && StoredFileRef) &&
3329               (*ImportedFileRef != *StoredFileRef)) {
3330             Diag(diag::warn_module_file_mapping_mismatch)
3331                 << ImportedFile << StoredFile;
3332             Diag(diag::note_module_file_imported_by)
3333                 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3334             IgnoreImportedByNote = true;
3335           }
3336         }
3337       }
3338 
3339       // If our client can't cope with us being out of date, we can't cope with
3340       // our dependency being missing.
3341       unsigned Capabilities = ClientLoadCapabilities;
3342       if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3343         Capabilities &= ~ARR_Missing;
3344 
3345       // Load the AST file.
3346       auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3347                                 Loaded, StoredSize, StoredModTime,
3348                                 StoredSignature, Capabilities);
3349 
3350       // Check the AST we just read from ImportedFile contains a different
3351       // module than we expected (ImportedName). This can occur for C++20
3352       // Modules when given a mismatch via -fmodule-file=<name>=<file>
3353       if (IsImportingStdCXXModule) {
3354         if (const auto *Imported =
3355                 getModuleManager().lookupByFileName(ImportedFile);
3356             Imported != nullptr && Imported->ModuleName != ImportedName) {
3357           Diag(diag::err_failed_to_find_module_file) << ImportedName;
3358           Result = Missing;
3359         }
3360       }
3361 
3362       // If we diagnosed a problem, produce a backtrace.
3363       bool recompilingFinalized = Result == OutOfDate &&
3364                                   (Capabilities & ARR_OutOfDate) &&
3365                                   getModuleManager()
3366                                       .getModuleCache()
3367                                       .getInMemoryModuleCache()
3368                                       .isPCMFinal(F.FileName);
3369       if (!IgnoreImportedByNote &&
3370           (isDiagnosedResult(Result, Capabilities) || recompilingFinalized))
3371         Diag(diag::note_module_file_imported_by)
3372             << F.FileName << !F.ModuleName.empty() << F.ModuleName;
3373 
3374       switch (Result) {
3375       case Failure: return Failure;
3376         // If we have to ignore the dependency, we'll have to ignore this too.
3377       case Missing:
3378       case OutOfDate: return OutOfDate;
3379       case VersionMismatch: return VersionMismatch;
3380       case ConfigurationMismatch: return ConfigurationMismatch;
3381       case HadErrors: return HadErrors;
3382       case Success: break;
3383       }
3384       break;
3385     }
3386 
3387     case ORIGINAL_FILE:
3388       F.OriginalSourceFileID = FileID::get(Record[0]);
3389       F.ActualOriginalSourceFileName = std::string(Blob);
3390       F.OriginalSourceFileName = ResolveImportedPathAndAllocate(
3391           PathBuf, F.ActualOriginalSourceFileName, F);
3392       break;
3393 
3394     case ORIGINAL_FILE_ID:
3395       F.OriginalSourceFileID = FileID::get(Record[0]);
3396       break;
3397 
3398     case MODULE_NAME:
3399       F.ModuleName = std::string(Blob);
3400       Diag(diag::remark_module_import)
3401           << F.ModuleName << F.FileName << (ImportedBy ? true : false)
3402           << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
3403       if (Listener)
3404         Listener->ReadModuleName(F.ModuleName);
3405 
3406       // Validate the AST as soon as we have a name so we can exit early on
3407       // failure.
3408       if (ASTReadResult Result = readUnhashedControlBlockOnce())
3409         return Result;
3410 
3411       break;
3412 
3413     case MODULE_DIRECTORY: {
3414       // Save the BaseDirectory as written in the PCM for computing the module
3415       // filename for the ModuleCache.
3416       BaseDirectoryAsWritten = Blob;
3417       assert(!F.ModuleName.empty() &&
3418              "MODULE_DIRECTORY found before MODULE_NAME");
3419       F.BaseDirectory = std::string(Blob);
3420       if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3421         break;
3422       // If we've already loaded a module map file covering this module, we may
3423       // have a better path for it (relative to the current build).
3424       Module *M = PP.getHeaderSearchInfo().lookupModule(
3425           F.ModuleName, SourceLocation(), /*AllowSearch*/ true,
3426           /*AllowExtraModuleMapSearch*/ true);
3427       if (M && M->Directory) {
3428         // If we're implicitly loading a module, the base directory can't
3429         // change between the build and use.
3430         // Don't emit module relocation error if we have -fno-validate-pch
3431         if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3432                   DisableValidationForModuleKind::Module) &&
3433             F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
3434           auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3435           if (!BuildDir || *BuildDir != M->Directory) {
3436             if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
3437               Diag(diag::err_imported_module_relocated)
3438                   << F.ModuleName << Blob << M->Directory->getName();
3439             return OutOfDate;
3440           }
3441         }
3442         F.BaseDirectory = std::string(M->Directory->getName());
3443       }
3444       break;
3445     }
3446 
3447     case MODULE_MAP_FILE:
3448       if (ASTReadResult Result =
3449               ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
3450         return Result;
3451       break;
3452 
3453     case INPUT_FILE_OFFSETS:
3454       NumInputs = Record[0];
3455       NumUserInputs = Record[1];
3456       F.InputFileOffsets =
3457           (const llvm::support::unaligned_uint64_t *)Blob.data();
3458       F.InputFilesLoaded.resize(NumInputs);
3459       F.InputFileInfosLoaded.resize(NumInputs);
3460       F.NumUserInputFiles = NumUserInputs;
3461       break;
3462     }
3463   }
3464 }
3465 
ReadASTBlock(ModuleFile & F,unsigned ClientLoadCapabilities)3466 llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3467                                     unsigned ClientLoadCapabilities) {
3468   BitstreamCursor &Stream = F.Stream;
3469 
3470   if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
3471     return Err;
3472   F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
3473 
3474   // Read all of the records and blocks for the AST file.
3475   RecordData Record;
3476   while (true) {
3477     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3478     if (!MaybeEntry)
3479       return MaybeEntry.takeError();
3480     llvm::BitstreamEntry Entry = MaybeEntry.get();
3481 
3482     switch (Entry.Kind) {
3483     case llvm::BitstreamEntry::Error:
3484       return llvm::createStringError(
3485           std::errc::illegal_byte_sequence,
3486           "error at end of module block in AST file");
3487     case llvm::BitstreamEntry::EndBlock:
3488       // Outside of C++, we do not store a lookup map for the translation unit.
3489       // Instead, mark it as needing a lookup map to be built if this module
3490       // contains any declarations lexically within it (which it always does!).
3491       // This usually has no cost, since we very rarely need the lookup map for
3492       // the translation unit outside C++.
3493       if (ASTContext *Ctx = ContextObj) {
3494         DeclContext *DC = Ctx->getTranslationUnitDecl();
3495         if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
3496           DC->setMustBuildLookupTable();
3497       }
3498 
3499       return llvm::Error::success();
3500     case llvm::BitstreamEntry::SubBlock:
3501       switch (Entry.ID) {
3502       case DECLTYPES_BLOCK_ID:
3503         // We lazily load the decls block, but we want to set up the
3504         // DeclsCursor cursor to point into it.  Clone our current bitcode
3505         // cursor to it, enter the block and read the abbrevs in that block.
3506         // With the main cursor, we just skip over it.
3507         F.DeclsCursor = Stream;
3508         if (llvm::Error Err = Stream.SkipBlock())
3509           return Err;
3510         if (llvm::Error Err = ReadBlockAbbrevs(
3511                 F.DeclsCursor, DECLTYPES_BLOCK_ID, &F.DeclsBlockStartOffset))
3512           return Err;
3513         break;
3514 
3515       case PREPROCESSOR_BLOCK_ID:
3516         F.MacroCursor = Stream;
3517         if (!PP.getExternalSource())
3518           PP.setExternalSource(this);
3519 
3520         if (llvm::Error Err = Stream.SkipBlock())
3521           return Err;
3522         if (llvm::Error Err =
3523                 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3524           return Err;
3525         F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
3526         break;
3527 
3528       case PREPROCESSOR_DETAIL_BLOCK_ID:
3529         F.PreprocessorDetailCursor = Stream;
3530 
3531         if (llvm::Error Err = Stream.SkipBlock()) {
3532           return Err;
3533         }
3534         if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3535                                                PREPROCESSOR_DETAIL_BLOCK_ID))
3536           return Err;
3537         F.PreprocessorDetailStartOffset
3538         = F.PreprocessorDetailCursor.GetCurrentBitNo();
3539 
3540         if (!PP.getPreprocessingRecord())
3541           PP.createPreprocessingRecord();
3542         if (!PP.getPreprocessingRecord()->getExternalSource())
3543           PP.getPreprocessingRecord()->SetExternalSource(*this);
3544         break;
3545 
3546       case SOURCE_MANAGER_BLOCK_ID:
3547         if (llvm::Error Err = ReadSourceManagerBlock(F))
3548           return Err;
3549         break;
3550 
3551       case SUBMODULE_BLOCK_ID:
3552         if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3553           return Err;
3554         break;
3555 
3556       case COMMENTS_BLOCK_ID: {
3557         BitstreamCursor C = Stream;
3558 
3559         if (llvm::Error Err = Stream.SkipBlock())
3560           return Err;
3561         if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3562           return Err;
3563         CommentsCursors.push_back(std::make_pair(C, &F));
3564         break;
3565       }
3566 
3567       default:
3568         if (llvm::Error Err = Stream.SkipBlock())
3569           return Err;
3570         break;
3571       }
3572       continue;
3573 
3574     case llvm::BitstreamEntry::Record:
3575       // The interesting case.
3576       break;
3577     }
3578 
3579     // Read and process a record.
3580     Record.clear();
3581     StringRef Blob;
3582     Expected<unsigned> MaybeRecordType =
3583         Stream.readRecord(Entry.ID, Record, &Blob);
3584     if (!MaybeRecordType)
3585       return MaybeRecordType.takeError();
3586     ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
3587 
3588     // If we're not loading an AST context, we don't care about most records.
3589     if (!ContextObj) {
3590       switch (RecordType) {
3591       case IDENTIFIER_TABLE:
3592       case IDENTIFIER_OFFSET:
3593       case INTERESTING_IDENTIFIERS:
3594       case STATISTICS:
3595       case PP_ASSUME_NONNULL_LOC:
3596       case PP_CONDITIONAL_STACK:
3597       case PP_COUNTER_VALUE:
3598       case SOURCE_LOCATION_OFFSETS:
3599       case MODULE_OFFSET_MAP:
3600       case SOURCE_MANAGER_LINE_TABLE:
3601       case PPD_ENTITIES_OFFSETS:
3602       case HEADER_SEARCH_TABLE:
3603       case IMPORTED_MODULES:
3604       case MACRO_OFFSET:
3605         break;
3606       default:
3607         continue;
3608       }
3609     }
3610 
3611     switch (RecordType) {
3612     default:  // Default behavior: ignore.
3613       break;
3614 
3615     case TYPE_OFFSET: {
3616       if (F.LocalNumTypes != 0)
3617         return llvm::createStringError(
3618             std::errc::illegal_byte_sequence,
3619             "duplicate TYPE_OFFSET record in AST file");
3620       F.TypeOffsets = reinterpret_cast<const UnalignedUInt64 *>(Blob.data());
3621       F.LocalNumTypes = Record[0];
3622       F.BaseTypeIndex = getTotalNumTypes();
3623 
3624       if (F.LocalNumTypes > 0)
3625         TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
3626 
3627       break;
3628     }
3629 
3630     case DECL_OFFSET: {
3631       if (F.LocalNumDecls != 0)
3632         return llvm::createStringError(
3633             std::errc::illegal_byte_sequence,
3634             "duplicate DECL_OFFSET record in AST file");
3635       F.DeclOffsets = (const DeclOffset *)Blob.data();
3636       F.LocalNumDecls = Record[0];
3637       F.BaseDeclIndex = getTotalNumDecls();
3638 
3639       if (F.LocalNumDecls > 0)
3640         DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
3641 
3642       break;
3643     }
3644 
3645     case TU_UPDATE_LEXICAL: {
3646       DeclContext *TU = ContextObj->getTranslationUnitDecl();
3647       LexicalContents Contents(
3648           reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()),
3649           static_cast<unsigned int>(Blob.size() / sizeof(DeclID)));
3650       TULexicalDecls.push_back(std::make_pair(&F, Contents));
3651       TU->setHasExternalLexicalStorage(true);
3652       break;
3653     }
3654 
3655     case UPDATE_VISIBLE: {
3656       unsigned Idx = 0;
3657       GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3658       auto *Data = (const unsigned char*)Blob.data();
3659       PendingVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3660       // If we've already loaded the decl, perform the updates when we finish
3661       // loading this block.
3662       if (Decl *D = GetExistingDecl(ID))
3663         PendingUpdateRecords.push_back(
3664             PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3665       break;
3666     }
3667 
3668     case UPDATE_MODULE_LOCAL_VISIBLE: {
3669       unsigned Idx = 0;
3670       GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3671       auto *Data = (const unsigned char *)Blob.data();
3672       PendingModuleLocalVisibleUpdates[ID].push_back(UpdateData{&F, Data});
3673       // If we've already loaded the decl, perform the updates when we finish
3674       // loading this block.
3675       if (Decl *D = GetExistingDecl(ID))
3676         PendingUpdateRecords.push_back(
3677             PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3678       break;
3679     }
3680 
3681     case UPDATE_TU_LOCAL_VISIBLE: {
3682       if (F.Kind != MK_MainFile)
3683         break;
3684       unsigned Idx = 0;
3685       GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3686       auto *Data = (const unsigned char *)Blob.data();
3687       TULocalUpdates[ID].push_back(UpdateData{&F, Data});
3688       // If we've already loaded the decl, perform the updates when we finish
3689       // loading this block.
3690       if (Decl *D = GetExistingDecl(ID))
3691         PendingUpdateRecords.push_back(
3692             PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3693       break;
3694     }
3695 
3696     case CXX_ADDED_TEMPLATE_SPECIALIZATION: {
3697       unsigned Idx = 0;
3698       GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3699       auto *Data = (const unsigned char *)Blob.data();
3700       PendingSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
3701       // If we've already loaded the decl, perform the updates when we finish
3702       // loading this block.
3703       if (Decl *D = GetExistingDecl(ID))
3704         PendingUpdateRecords.push_back(
3705             PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3706       break;
3707     }
3708 
3709     case CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION: {
3710       unsigned Idx = 0;
3711       GlobalDeclID ID = ReadDeclID(F, Record, Idx);
3712       auto *Data = (const unsigned char *)Blob.data();
3713       PendingPartialSpecializationsUpdates[ID].push_back(UpdateData{&F, Data});
3714       // If we've already loaded the decl, perform the updates when we finish
3715       // loading this block.
3716       if (Decl *D = GetExistingDecl(ID))
3717         PendingUpdateRecords.push_back(
3718             PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
3719       break;
3720     }
3721 
3722     case IDENTIFIER_TABLE:
3723       F.IdentifierTableData =
3724           reinterpret_cast<const unsigned char *>(Blob.data());
3725       if (Record[0]) {
3726         F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3727             F.IdentifierTableData + Record[0],
3728             F.IdentifierTableData + sizeof(uint32_t),
3729             F.IdentifierTableData,
3730             ASTIdentifierLookupTrait(*this, F));
3731 
3732         PP.getIdentifierTable().setExternalIdentifierLookup(this);
3733       }
3734       break;
3735 
3736     case IDENTIFIER_OFFSET: {
3737       if (F.LocalNumIdentifiers != 0)
3738         return llvm::createStringError(
3739             std::errc::illegal_byte_sequence,
3740             "duplicate IDENTIFIER_OFFSET record in AST file");
3741       F.IdentifierOffsets = (const uint32_t *)Blob.data();
3742       F.LocalNumIdentifiers = Record[0];
3743       F.BaseIdentifierID = getTotalNumIdentifiers();
3744 
3745       if (F.LocalNumIdentifiers > 0)
3746         IdentifiersLoaded.resize(IdentifiersLoaded.size()
3747                                  + F.LocalNumIdentifiers);
3748       break;
3749     }
3750 
3751     case INTERESTING_IDENTIFIERS:
3752       F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
3753       break;
3754 
3755     case EAGERLY_DESERIALIZED_DECLS:
3756       // FIXME: Skip reading this record if our ASTConsumer doesn't care
3757       // about "interesting" decls (for instance, if we're building a module).
3758       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3759         EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
3760       break;
3761 
3762     case MODULAR_CODEGEN_DECLS:
3763       // FIXME: Skip reading this record if our ASTConsumer doesn't care about
3764       // them (ie: if we're not codegenerating this module).
3765       if (F.Kind == MK_MainFile ||
3766           getContext().getLangOpts().BuildingPCHWithObjectFile)
3767         for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3768           EagerlyDeserializedDecls.push_back(ReadDeclID(F, Record, I));
3769       break;
3770 
3771     case SPECIAL_TYPES:
3772       if (SpecialTypes.empty()) {
3773         for (unsigned I = 0, N = Record.size(); I != N; ++I)
3774           SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
3775         break;
3776       }
3777 
3778       if (Record.empty())
3779         break;
3780 
3781       if (SpecialTypes.size() != Record.size())
3782         return llvm::createStringError(std::errc::illegal_byte_sequence,
3783                                        "invalid special-types record");
3784 
3785       for (unsigned I = 0, N = Record.size(); I != N; ++I) {
3786         serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
3787         if (!SpecialTypes[I])
3788           SpecialTypes[I] = ID;
3789         // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
3790         // merge step?
3791       }
3792       break;
3793 
3794     case STATISTICS:
3795       TotalNumStatements += Record[0];
3796       TotalNumMacros += Record[1];
3797       TotalLexicalDeclContexts += Record[2];
3798       TotalVisibleDeclContexts += Record[3];
3799       TotalModuleLocalVisibleDeclContexts += Record[4];
3800       TotalTULocalVisibleDeclContexts += Record[5];
3801       break;
3802 
3803     case UNUSED_FILESCOPED_DECLS:
3804       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3805         UnusedFileScopedDecls.push_back(ReadDeclID(F, Record, I));
3806       break;
3807 
3808     case DELEGATING_CTORS:
3809       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3810         DelegatingCtorDecls.push_back(ReadDeclID(F, Record, I));
3811       break;
3812 
3813     case WEAK_UNDECLARED_IDENTIFIERS:
3814       if (Record.size() % 3 != 0)
3815         return llvm::createStringError(std::errc::illegal_byte_sequence,
3816                                        "invalid weak identifiers record");
3817 
3818       // FIXME: Ignore weak undeclared identifiers from non-original PCH
3819       // files. This isn't the way to do it :)
3820       WeakUndeclaredIdentifiers.clear();
3821 
3822       // Translate the weak, undeclared identifiers into global IDs.
3823       for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
3824         WeakUndeclaredIdentifiers.push_back(
3825           getGlobalIdentifierID(F, Record[I++]));
3826         WeakUndeclaredIdentifiers.push_back(
3827           getGlobalIdentifierID(F, Record[I++]));
3828         WeakUndeclaredIdentifiers.push_back(
3829             ReadSourceLocation(F, Record, I).getRawEncoding());
3830       }
3831       break;
3832 
3833     case SELECTOR_OFFSETS: {
3834       F.SelectorOffsets = (const uint32_t *)Blob.data();
3835       F.LocalNumSelectors = Record[0];
3836       unsigned LocalBaseSelectorID = Record[1];
3837       F.BaseSelectorID = getTotalNumSelectors();
3838 
3839       if (F.LocalNumSelectors > 0) {
3840         // Introduce the global -> local mapping for selectors within this
3841         // module.
3842         GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3843 
3844         // Introduce the local -> global mapping for selectors within this
3845         // module.
3846         F.SelectorRemap.insertOrReplace(
3847           std::make_pair(LocalBaseSelectorID,
3848                          F.BaseSelectorID - LocalBaseSelectorID));
3849 
3850         SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
3851       }
3852       break;
3853     }
3854 
3855     case METHOD_POOL:
3856       F.SelectorLookupTableData = (const unsigned char *)Blob.data();
3857       if (Record[0])
3858         F.SelectorLookupTable
3859           = ASTSelectorLookupTable::Create(
3860                         F.SelectorLookupTableData + Record[0],
3861                         F.SelectorLookupTableData,
3862                         ASTSelectorLookupTrait(*this, F));
3863       TotalNumMethodPoolEntries += Record[1];
3864       break;
3865 
3866     case REFERENCED_SELECTOR_POOL:
3867       if (!Record.empty()) {
3868         for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
3869           ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3870                                                                 Record[Idx++]));
3871           ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
3872                                               getRawEncoding());
3873         }
3874       }
3875       break;
3876 
3877     case PP_ASSUME_NONNULL_LOC: {
3878       unsigned Idx = 0;
3879       if (!Record.empty())
3880         PP.setPreambleRecordedPragmaAssumeNonNullLoc(
3881             ReadSourceLocation(F, Record, Idx));
3882       break;
3883     }
3884 
3885     case PP_UNSAFE_BUFFER_USAGE: {
3886       if (!Record.empty()) {
3887         SmallVector<SourceLocation, 64> SrcLocs;
3888         unsigned Idx = 0;
3889         while (Idx < Record.size())
3890           SrcLocs.push_back(ReadSourceLocation(F, Record, Idx));
3891         PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
3892       }
3893       break;
3894     }
3895 
3896     case PP_CONDITIONAL_STACK:
3897       if (!Record.empty()) {
3898         unsigned Idx = 0, End = Record.size() - 1;
3899         bool ReachedEOFWhileSkipping = Record[Idx++];
3900         std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3901         if (ReachedEOFWhileSkipping) {
3902           SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
3903           SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
3904           bool FoundNonSkipPortion = Record[Idx++];
3905           bool FoundElse = Record[Idx++];
3906           SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
3907           SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3908                            FoundElse, ElseLoc);
3909         }
3910         SmallVector<PPConditionalInfo, 4> ConditionalStack;
3911         while (Idx < End) {
3912           auto Loc = ReadSourceLocation(F, Record, Idx);
3913           bool WasSkipping = Record[Idx++];
3914           bool FoundNonSkip = Record[Idx++];
3915           bool FoundElse = Record[Idx++];
3916           ConditionalStack.push_back(
3917               {Loc, WasSkipping, FoundNonSkip, FoundElse});
3918         }
3919         PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
3920       }
3921       break;
3922 
3923     case PP_COUNTER_VALUE:
3924       if (!Record.empty() && Listener)
3925         Listener->ReadCounter(F, Record[0]);
3926       break;
3927 
3928     case FILE_SORTED_DECLS:
3929       F.FileSortedDecls = (const unaligned_decl_id_t *)Blob.data();
3930       F.NumFileSortedDecls = Record[0];
3931       break;
3932 
3933     case SOURCE_LOCATION_OFFSETS: {
3934       F.SLocEntryOffsets = (const uint32_t *)Blob.data();
3935       F.LocalNumSLocEntries = Record[0];
3936       SourceLocation::UIntTy SLocSpaceSize = Record[1];
3937       F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset;
3938       std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
3939           SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
3940                                               SLocSpaceSize);
3941       if (!F.SLocEntryBaseID) {
3942         Diags.Report(SourceLocation(), diag::remark_sloc_usage);
3943         SourceMgr.noteSLocAddressSpaceUsage(Diags);
3944         return llvm::createStringError(std::errc::invalid_argument,
3945                                        "ran out of source locations");
3946       }
3947       // Make our entry in the range map. BaseID is negative and growing, so
3948       // we invert it. Because we invert it, though, we need the other end of
3949       // the range.
3950       unsigned RangeStart =
3951           unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
3952       GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
3953       F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
3954 
3955       // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3956       assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0);
3957       GlobalSLocOffsetMap.insert(
3958           std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
3959                            - SLocSpaceSize,&F));
3960 
3961       TotalNumSLocEntries += F.LocalNumSLocEntries;
3962       break;
3963     }
3964 
3965     case MODULE_OFFSET_MAP:
3966       F.ModuleOffsetMap = Blob;
3967       break;
3968 
3969     case SOURCE_MANAGER_LINE_TABLE:
3970       ParseLineTable(F, Record);
3971       break;
3972 
3973     case EXT_VECTOR_DECLS:
3974       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
3975         ExtVectorDecls.push_back(ReadDeclID(F, Record, I));
3976       break;
3977 
3978     case VTABLE_USES:
3979       if (Record.size() % 3 != 0)
3980         return llvm::createStringError(std::errc::illegal_byte_sequence,
3981                                        "Invalid VTABLE_USES record");
3982 
3983       // Later tables overwrite earlier ones.
3984       // FIXME: Modules will have some trouble with this. This is clearly not
3985       // the right way to do this.
3986       VTableUses.clear();
3987 
3988       for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3989         VTableUses.push_back(
3990             {ReadDeclID(F, Record, Idx),
3991              ReadSourceLocation(F, Record, Idx).getRawEncoding(),
3992              (bool)Record[Idx++]});
3993       }
3994       break;
3995 
3996     case PENDING_IMPLICIT_INSTANTIATIONS:
3997 
3998       if (Record.size() % 2 != 0)
3999         return llvm::createStringError(
4000             std::errc::illegal_byte_sequence,
4001             "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4002 
4003       for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4004         PendingInstantiations.push_back(
4005             {ReadDeclID(F, Record, I),
4006              ReadSourceLocation(F, Record, I).getRawEncoding()});
4007       }
4008       break;
4009 
4010     case SEMA_DECL_REFS:
4011       if (Record.size() != 3)
4012         return llvm::createStringError(std::errc::illegal_byte_sequence,
4013                                        "Invalid SEMA_DECL_REFS block");
4014       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4015         SemaDeclRefs.push_back(ReadDeclID(F, Record, I));
4016       break;
4017 
4018     case PPD_ENTITIES_OFFSETS: {
4019       F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
4020       assert(Blob.size() % sizeof(PPEntityOffset) == 0);
4021       F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
4022 
4023       unsigned LocalBasePreprocessedEntityID = Record[0];
4024 
4025       unsigned StartingID;
4026       if (!PP.getPreprocessingRecord())
4027         PP.createPreprocessingRecord();
4028       if (!PP.getPreprocessingRecord()->getExternalSource())
4029         PP.getPreprocessingRecord()->SetExternalSource(*this);
4030       StartingID
4031         = PP.getPreprocessingRecord()
4032             ->allocateLoadedEntities(F.NumPreprocessedEntities);
4033       F.BasePreprocessedEntityID = StartingID;
4034 
4035       if (F.NumPreprocessedEntities > 0) {
4036         // Introduce the global -> local mapping for preprocessed entities in
4037         // this module.
4038         GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4039 
4040         // Introduce the local -> global mapping for preprocessed entities in
4041         // this module.
4042         F.PreprocessedEntityRemap.insertOrReplace(
4043           std::make_pair(LocalBasePreprocessedEntityID,
4044             F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
4045       }
4046 
4047       break;
4048     }
4049 
4050     case PPD_SKIPPED_RANGES: {
4051       F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
4052       assert(Blob.size() % sizeof(PPSkippedRange) == 0);
4053       F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
4054 
4055       if (!PP.getPreprocessingRecord())
4056         PP.createPreprocessingRecord();
4057       if (!PP.getPreprocessingRecord()->getExternalSource())
4058         PP.getPreprocessingRecord()->SetExternalSource(*this);
4059       F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
4060           ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
4061 
4062       if (F.NumPreprocessedSkippedRanges > 0)
4063         GlobalSkippedRangeMap.insert(
4064             std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
4065       break;
4066     }
4067 
4068     case DECL_UPDATE_OFFSETS:
4069       if (Record.size() % 2 != 0)
4070         return llvm::createStringError(
4071             std::errc::illegal_byte_sequence,
4072             "invalid DECL_UPDATE_OFFSETS block in AST file");
4073       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4074         GlobalDeclID ID = ReadDeclID(F, Record, I);
4075         DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I++]));
4076 
4077         // If we've already loaded the decl, perform the updates when we finish
4078         // loading this block.
4079         if (Decl *D = GetExistingDecl(ID))
4080           PendingUpdateRecords.push_back(
4081               PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
4082       }
4083       break;
4084 
4085     case DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD: {
4086       if (Record.size() % 5 != 0)
4087         return llvm::createStringError(
4088             std::errc::illegal_byte_sequence,
4089             "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4090             "file");
4091       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4092         GlobalDeclID ID = ReadDeclID(F, Record, I);
4093 
4094         uint64_t BaseOffset = F.DeclsBlockStartOffset;
4095         assert(BaseOffset && "Invalid DeclsBlockStartOffset for module file!");
4096         uint64_t LocalLexicalOffset = Record[I++];
4097         uint64_t LexicalOffset =
4098             LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4099         uint64_t LocalVisibleOffset = Record[I++];
4100         uint64_t VisibleOffset =
4101             LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4102         uint64_t LocalModuleLocalOffset = Record[I++];
4103         uint64_t ModuleLocalOffset =
4104             LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4105         uint64_t TULocalLocalOffset = Record[I++];
4106         uint64_t TULocalOffset =
4107             TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4108 
4109         DelayedNamespaceOffsetMap[ID] = {
4110             {VisibleOffset, TULocalOffset, ModuleLocalOffset}, LexicalOffset};
4111 
4112         assert(!GetExistingDecl(ID) &&
4113                "We shouldn't load the namespace in the front of delayed "
4114                "namespace lexical and visible block");
4115       }
4116       break;
4117     }
4118 
4119     case RELATED_DECLS_MAP:
4120       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) {
4121         GlobalDeclID ID = ReadDeclID(F, Record, I);
4122         auto &RelatedDecls = RelatedDeclsMap[ID];
4123         unsigned NN = Record[I++];
4124         RelatedDecls.reserve(NN);
4125         for (unsigned II = 0; II < NN; II++)
4126           RelatedDecls.push_back(ReadDeclID(F, Record, I));
4127       }
4128       break;
4129 
4130     case OBJC_CATEGORIES_MAP:
4131       if (F.LocalNumObjCCategoriesInMap != 0)
4132         return llvm::createStringError(
4133             std::errc::illegal_byte_sequence,
4134             "duplicate OBJC_CATEGORIES_MAP record in AST file");
4135 
4136       F.LocalNumObjCCategoriesInMap = Record[0];
4137       F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
4138       break;
4139 
4140     case OBJC_CATEGORIES:
4141       F.ObjCCategories.swap(Record);
4142       break;
4143 
4144     case CUDA_SPECIAL_DECL_REFS:
4145       // Later tables overwrite earlier ones.
4146       // FIXME: Modules will have trouble with this.
4147       CUDASpecialDeclRefs.clear();
4148       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4149         CUDASpecialDeclRefs.push_back(ReadDeclID(F, Record, I));
4150       break;
4151 
4152     case HEADER_SEARCH_TABLE:
4153       F.HeaderFileInfoTableData = Blob.data();
4154       F.LocalNumHeaderFileInfos = Record[1];
4155       if (Record[0]) {
4156         F.HeaderFileInfoTable = HeaderFileInfoLookupTable::Create(
4157             (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
4158             (const unsigned char *)F.HeaderFileInfoTableData,
4159             HeaderFileInfoTrait(*this, F));
4160 
4161         PP.getHeaderSearchInfo().SetExternalSource(this);
4162         if (!PP.getHeaderSearchInfo().getExternalLookup())
4163           PP.getHeaderSearchInfo().SetExternalLookup(this);
4164       }
4165       break;
4166 
4167     case FP_PRAGMA_OPTIONS:
4168       // Later tables overwrite earlier ones.
4169       FPPragmaOptions.swap(Record);
4170       break;
4171 
4172     case DECLS_WITH_EFFECTS_TO_VERIFY:
4173       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4174         DeclsWithEffectsToVerify.push_back(ReadDeclID(F, Record, I));
4175       break;
4176 
4177     case OPENCL_EXTENSIONS:
4178       for (unsigned I = 0, E = Record.size(); I != E; ) {
4179         auto Name = ReadString(Record, I);
4180         auto &OptInfo = OpenCLExtensions.OptMap[Name];
4181         OptInfo.Supported = Record[I++] != 0;
4182         OptInfo.Enabled = Record[I++] != 0;
4183         OptInfo.WithPragma = Record[I++] != 0;
4184         OptInfo.Avail = Record[I++];
4185         OptInfo.Core = Record[I++];
4186         OptInfo.Opt = Record[I++];
4187       }
4188       break;
4189 
4190     case TENTATIVE_DEFINITIONS:
4191       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4192         TentativeDefinitions.push_back(ReadDeclID(F, Record, I));
4193       break;
4194 
4195     case KNOWN_NAMESPACES:
4196       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4197         KnownNamespaces.push_back(ReadDeclID(F, Record, I));
4198       break;
4199 
4200     case UNDEFINED_BUT_USED:
4201       if (Record.size() % 2 != 0)
4202         return llvm::createStringError(std::errc::illegal_byte_sequence,
4203                                        "invalid undefined-but-used record");
4204       for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
4205         UndefinedButUsed.push_back(
4206             {ReadDeclID(F, Record, I),
4207              ReadSourceLocation(F, Record, I).getRawEncoding()});
4208       }
4209       break;
4210 
4211     case DELETE_EXPRS_TO_ANALYZE:
4212       for (unsigned I = 0, N = Record.size(); I != N;) {
4213         DelayedDeleteExprs.push_back(ReadDeclID(F, Record, I).getRawValue());
4214         const uint64_t Count = Record[I++];
4215         DelayedDeleteExprs.push_back(Count);
4216         for (uint64_t C = 0; C < Count; ++C) {
4217           DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
4218           bool IsArrayForm = Record[I++] == 1;
4219           DelayedDeleteExprs.push_back(IsArrayForm);
4220         }
4221       }
4222       break;
4223 
4224     case VTABLES_TO_EMIT:
4225       if (F.Kind == MK_MainFile ||
4226           getContext().getLangOpts().BuildingPCHWithObjectFile)
4227         for (unsigned I = 0, N = Record.size(); I != N;)
4228           VTablesToEmit.push_back(ReadDeclID(F, Record, I));
4229       break;
4230 
4231     case IMPORTED_MODULES:
4232       if (!F.isModule()) {
4233         // If we aren't loading a module (which has its own exports), make
4234         // all of the imported modules visible.
4235         // FIXME: Deal with macros-only imports.
4236         for (unsigned I = 0, N = Record.size(); I != N; /**/) {
4237           unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
4238           SourceLocation Loc = ReadSourceLocation(F, Record, I);
4239           if (GlobalID) {
4240             PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4241             if (DeserializationListener)
4242               DeserializationListener->ModuleImportRead(GlobalID, Loc);
4243           }
4244         }
4245       }
4246       break;
4247 
4248     case MACRO_OFFSET: {
4249       if (F.LocalNumMacros != 0)
4250         return llvm::createStringError(
4251             std::errc::illegal_byte_sequence,
4252             "duplicate MACRO_OFFSET record in AST file");
4253       F.MacroOffsets = (const uint32_t *)Blob.data();
4254       F.LocalNumMacros = Record[0];
4255       unsigned LocalBaseMacroID = Record[1];
4256       F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset;
4257       F.BaseMacroID = getTotalNumMacros();
4258 
4259       if (F.LocalNumMacros > 0) {
4260         // Introduce the global -> local mapping for macros within this module.
4261         GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
4262 
4263         // Introduce the local -> global mapping for macros within this module.
4264         F.MacroRemap.insertOrReplace(
4265           std::make_pair(LocalBaseMacroID,
4266                          F.BaseMacroID - LocalBaseMacroID));
4267 
4268         MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
4269       }
4270       break;
4271     }
4272 
4273     case LATE_PARSED_TEMPLATE:
4274       LateParsedTemplates.emplace_back(
4275           std::piecewise_construct, std::forward_as_tuple(&F),
4276           std::forward_as_tuple(Record.begin(), Record.end()));
4277       break;
4278 
4279     case OPTIMIZE_PRAGMA_OPTIONS:
4280       if (Record.size() != 1)
4281         return llvm::createStringError(std::errc::illegal_byte_sequence,
4282                                        "invalid pragma optimize record");
4283       OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
4284       break;
4285 
4286     case MSSTRUCT_PRAGMA_OPTIONS:
4287       if (Record.size() != 1)
4288         return llvm::createStringError(std::errc::illegal_byte_sequence,
4289                                        "invalid pragma ms_struct record");
4290       PragmaMSStructState = Record[0];
4291       break;
4292 
4293     case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
4294       if (Record.size() != 2)
4295         return llvm::createStringError(
4296             std::errc::illegal_byte_sequence,
4297             "invalid pragma pointers to members record");
4298       PragmaMSPointersToMembersState = Record[0];
4299       PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
4300       break;
4301 
4302     case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
4303       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4304         UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, Record, I));
4305       break;
4306 
4307     case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
4308       if (Record.size() != 1)
4309         return llvm::createStringError(std::errc::illegal_byte_sequence,
4310                                        "invalid cuda pragma options record");
4311       ForceHostDeviceDepth = Record[0];
4312       break;
4313 
4314     case ALIGN_PACK_PRAGMA_OPTIONS: {
4315       if (Record.size() < 3)
4316         return llvm::createStringError(std::errc::illegal_byte_sequence,
4317                                        "invalid pragma pack record");
4318       PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
4319       PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
4320       unsigned NumStackEntries = Record[2];
4321       unsigned Idx = 3;
4322       // Reset the stack when importing a new module.
4323       PragmaAlignPackStack.clear();
4324       for (unsigned I = 0; I < NumStackEntries; ++I) {
4325         PragmaAlignPackStackEntry Entry;
4326         Entry.Value = ReadAlignPackInfo(Record[Idx++]);
4327         Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4328         Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4329         PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
4330         Entry.SlotLabel = PragmaAlignPackStrings.back();
4331         PragmaAlignPackStack.push_back(Entry);
4332       }
4333       break;
4334     }
4335 
4336     case FLOAT_CONTROL_PRAGMA_OPTIONS: {
4337       if (Record.size() < 3)
4338         return llvm::createStringError(std::errc::illegal_byte_sequence,
4339                                        "invalid pragma float control record");
4340       FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
4341       FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
4342       unsigned NumStackEntries = Record[2];
4343       unsigned Idx = 3;
4344       // Reset the stack when importing a new module.
4345       FpPragmaStack.clear();
4346       for (unsigned I = 0; I < NumStackEntries; ++I) {
4347         FpPragmaStackEntry Entry;
4348         Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
4349         Entry.Location = ReadSourceLocation(F, Record[Idx++]);
4350         Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
4351         FpPragmaStrings.push_back(ReadString(Record, Idx));
4352         Entry.SlotLabel = FpPragmaStrings.back();
4353         FpPragmaStack.push_back(Entry);
4354       }
4355       break;
4356     }
4357 
4358     case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
4359       for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/)
4360         DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, Record, I));
4361       break;
4362     }
4363   }
4364 }
4365 
ReadModuleOffsetMap(ModuleFile & F) const4366 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
4367   assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
4368 
4369   // Additional remapping information.
4370   const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
4371   const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
4372   F.ModuleOffsetMap = StringRef();
4373 
4374   using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
4375   RemapBuilder MacroRemap(F.MacroRemap);
4376   RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
4377   RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
4378   RemapBuilder SelectorRemap(F.SelectorRemap);
4379 
4380   auto &ImportedModuleVector = F.TransitiveImports;
4381   assert(ImportedModuleVector.empty());
4382 
4383   while (Data < DataEnd) {
4384     // FIXME: Looking up dependency modules by filename is horrible. Let's
4385     // start fixing this with prebuilt, explicit and implicit modules and see
4386     // how it goes...
4387     using namespace llvm::support;
4388     ModuleKind Kind = static_cast<ModuleKind>(
4389         endian::readNext<uint8_t, llvm::endianness::little>(Data));
4390     uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(Data);
4391     StringRef Name = StringRef((const char*)Data, Len);
4392     Data += Len;
4393     ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule ||
4394                               Kind == MK_ImplicitModule
4395                           ? ModuleMgr.lookupByModuleName(Name)
4396                           : ModuleMgr.lookupByFileName(Name));
4397     if (!OM) {
4398       std::string Msg = "refers to unknown module, cannot find ";
4399       Msg.append(std::string(Name));
4400       Error(Msg);
4401       return;
4402     }
4403 
4404     ImportedModuleVector.push_back(OM);
4405 
4406     uint32_t MacroIDOffset =
4407         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4408     uint32_t PreprocessedEntityIDOffset =
4409         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4410     uint32_t SubmoduleIDOffset =
4411         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4412     uint32_t SelectorIDOffset =
4413         endian::readNext<uint32_t, llvm::endianness::little>(Data);
4414 
4415     auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
4416                          RemapBuilder &Remap) {
4417       constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4418       if (Offset != None)
4419         Remap.insert(std::make_pair(Offset,
4420                                     static_cast<int>(BaseOffset - Offset)));
4421     };
4422 
4423     mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
4424     mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
4425               PreprocessedEntityRemap);
4426     mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
4427     mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
4428   }
4429 }
4430 
4431 ASTReader::ASTReadResult
ReadModuleMapFileBlock(RecordData & Record,ModuleFile & F,const ModuleFile * ImportedBy,unsigned ClientLoadCapabilities)4432 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
4433                                   const ModuleFile *ImportedBy,
4434                                   unsigned ClientLoadCapabilities) {
4435   unsigned Idx = 0;
4436   F.ModuleMapPath = ReadPath(F, Record, Idx);
4437 
4438   // Try to resolve ModuleName in the current header search context and
4439   // verify that it is found in the same module map file as we saved. If the
4440   // top-level AST file is a main file, skip this check because there is no
4441   // usable header search context.
4442   assert(!F.ModuleName.empty() &&
4443          "MODULE_NAME should come before MODULE_MAP_FILE");
4444   if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
4445       F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
4446     // An implicitly-loaded module file should have its module listed in some
4447     // module map file that we've already loaded.
4448     Module *M =
4449         PP.getHeaderSearchInfo().lookupModule(F.ModuleName, F.ImportLoc);
4450     auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4451     OptionalFileEntryRef ModMap =
4452         M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4453     // Don't emit module relocation error if we have -fno-validate-pch
4454     if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4455               DisableValidationForModuleKind::Module) &&
4456         !ModMap) {
4457       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
4458         if (auto ASTFE = M ? M->getASTFile() : std::nullopt) {
4459           // This module was defined by an imported (explicit) module.
4460           Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
4461                                                << ASTFE->getName();
4462           // TODO: Add a note with the module map paths if they differ.
4463         } else {
4464           // This module was built with a different module map.
4465           Diag(diag::err_imported_module_not_found)
4466               << F.ModuleName << F.FileName
4467               << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath
4468               << !ImportedBy;
4469           // In case it was imported by a PCH, there's a chance the user is
4470           // just missing to include the search path to the directory containing
4471           // the modulemap.
4472           if (ImportedBy && ImportedBy->Kind == MK_PCH)
4473             Diag(diag::note_imported_by_pch_module_not_found)
4474                 << llvm::sys::path::parent_path(F.ModuleMapPath);
4475         }
4476       }
4477       return OutOfDate;
4478     }
4479 
4480     assert(M && M->Name == F.ModuleName && "found module with different name");
4481 
4482     // Check the primary module map file.
4483     auto StoredModMap = FileMgr.getOptionalFileRef(F.ModuleMapPath);
4484     if (!StoredModMap || *StoredModMap != ModMap) {
4485       assert(ModMap && "found module is missing module map file");
4486       assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
4487              "top-level import should be verified");
4488       bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
4489       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4490         Diag(diag::err_imported_module_modmap_changed)
4491             << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
4492             << ModMap->getName() << F.ModuleMapPath << NotImported;
4493       return OutOfDate;
4494     }
4495 
4496     ModuleMap::AdditionalModMapsSet AdditionalStoredMaps;
4497     for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
4498       // FIXME: we should use input files rather than storing names.
4499       std::string Filename = ReadPath(F, Record, Idx);
4500       auto SF = FileMgr.getOptionalFileRef(Filename, false, false);
4501       if (!SF) {
4502         if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4503           Error("could not find file '" + Filename +"' referenced by AST file");
4504         return OutOfDate;
4505       }
4506       AdditionalStoredMaps.insert(*SF);
4507     }
4508 
4509     // Check any additional module map files (e.g. module.private.modulemap)
4510     // that are not in the pcm.
4511     if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4512       for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4513         // Remove files that match
4514         // Note: SmallPtrSet::erase is really remove
4515         if (!AdditionalStoredMaps.erase(ModMap)) {
4516           if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4517             Diag(diag::err_module_different_modmap)
4518               << F.ModuleName << /*new*/0 << ModMap.getName();
4519           return OutOfDate;
4520         }
4521       }
4522     }
4523 
4524     // Check any additional module map files that are in the pcm, but not
4525     // found in header search. Cases that match are already removed.
4526     for (FileEntryRef ModMap : AdditionalStoredMaps) {
4527       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
4528         Diag(diag::err_module_different_modmap)
4529           << F.ModuleName << /*not new*/1 << ModMap.getName();
4530       return OutOfDate;
4531     }
4532   }
4533 
4534   if (Listener)
4535     Listener->ReadModuleMapFile(F.ModuleMapPath);
4536   return Success;
4537 }
4538 
4539 /// Move the given method to the back of the global list of methods.
moveMethodToBackOfGlobalList(Sema & S,ObjCMethodDecl * Method)4540 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
4541   // Find the entry for this selector in the method pool.
4542   SemaObjC::GlobalMethodPool::iterator Known =
4543       S.ObjC().MethodPool.find(Method->getSelector());
4544   if (Known == S.ObjC().MethodPool.end())
4545     return;
4546 
4547   // Retrieve the appropriate method list.
4548   ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4549                                                     : Known->second.second;
4550   bool Found = false;
4551   for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
4552     if (!Found) {
4553       if (List->getMethod() == Method) {
4554         Found = true;
4555       } else {
4556         // Keep searching.
4557         continue;
4558       }
4559     }
4560 
4561     if (List->getNext())
4562       List->setMethod(List->getNext()->getMethod());
4563     else
4564       List->setMethod(Method);
4565   }
4566 }
4567 
makeNamesVisible(const HiddenNames & Names,Module * Owner)4568 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
4569   assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
4570   for (Decl *D : Names) {
4571     bool wasHidden = !D->isUnconditionallyVisible();
4572     D->setVisibleDespiteOwningModule();
4573 
4574     if (wasHidden && SemaObj) {
4575       if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
4576         moveMethodToBackOfGlobalList(*SemaObj, Method);
4577       }
4578     }
4579   }
4580 }
4581 
makeModuleVisible(Module * Mod,Module::NameVisibilityKind NameVisibility,SourceLocation ImportLoc)4582 void ASTReader::makeModuleVisible(Module *Mod,
4583                                   Module::NameVisibilityKind NameVisibility,
4584                                   SourceLocation ImportLoc) {
4585   llvm::SmallPtrSet<Module *, 4> Visited;
4586   SmallVector<Module *, 4> Stack;
4587   Stack.push_back(Mod);
4588   while (!Stack.empty()) {
4589     Mod = Stack.pop_back_val();
4590 
4591     if (NameVisibility <= Mod->NameVisibility) {
4592       // This module already has this level of visibility (or greater), so
4593       // there is nothing more to do.
4594       continue;
4595     }
4596 
4597     if (Mod->isUnimportable()) {
4598       // Modules that aren't importable cannot be made visible.
4599       continue;
4600     }
4601 
4602     // Update the module's name visibility.
4603     Mod->NameVisibility = NameVisibility;
4604 
4605     // If we've already deserialized any names from this module,
4606     // mark them as visible.
4607     HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4608     if (Hidden != HiddenNamesMap.end()) {
4609       auto HiddenNames = std::move(*Hidden);
4610       HiddenNamesMap.erase(Hidden);
4611       makeNamesVisible(HiddenNames.second, HiddenNames.first);
4612       assert(!HiddenNamesMap.contains(Mod) &&
4613              "making names visible added hidden names");
4614     }
4615 
4616     // Push any exported modules onto the stack to be marked as visible.
4617     SmallVector<Module *, 16> Exports;
4618     Mod->getExportedModules(Exports);
4619     for (SmallVectorImpl<Module *>::iterator
4620            I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4621       Module *Exported = *I;
4622       if (Visited.insert(Exported).second)
4623         Stack.push_back(Exported);
4624     }
4625   }
4626 }
4627 
4628 /// We've merged the definition \p MergedDef into the existing definition
4629 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
4630 /// visible.
mergeDefinitionVisibility(NamedDecl * Def,NamedDecl * MergedDef)4631 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
4632                                           NamedDecl *MergedDef) {
4633   if (!Def->isUnconditionallyVisible()) {
4634     // If MergedDef is visible or becomes visible, make the definition visible.
4635     if (MergedDef->isUnconditionallyVisible())
4636       Def->setVisibleDespiteOwningModule();
4637     else {
4638       getContext().mergeDefinitionIntoModule(
4639           Def, MergedDef->getImportedOwningModule(),
4640           /*NotifyListeners*/ false);
4641       PendingMergedDefinitionsToDeduplicate.insert(Def);
4642     }
4643   }
4644 }
4645 
loadGlobalIndex()4646 bool ASTReader::loadGlobalIndex() {
4647   if (GlobalIndex)
4648     return false;
4649 
4650   if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4651       !PP.getLangOpts().Modules)
4652     return true;
4653 
4654   // Try to load the global index.
4655   TriedLoadingGlobalIndex = true;
4656   StringRef ModuleCachePath
4657     = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
4658   std::pair<GlobalModuleIndex *, llvm::Error> Result =
4659       GlobalModuleIndex::readIndex(ModuleCachePath);
4660   if (llvm::Error Err = std::move(Result.second)) {
4661     assert(!Result.first);
4662     consumeError(std::move(Err)); // FIXME this drops errors on the floor.
4663     return true;
4664   }
4665 
4666   GlobalIndex.reset(Result.first);
4667   ModuleMgr.setGlobalIndex(GlobalIndex.get());
4668   return false;
4669 }
4670 
isGlobalIndexUnavailable() const4671 bool ASTReader::isGlobalIndexUnavailable() const {
4672   return PP.getLangOpts().Modules && UseGlobalIndex &&
4673          !hasGlobalIndex() && TriedLoadingGlobalIndex;
4674 }
4675 
4676 /// Given a cursor at the start of an AST file, scan ahead and drop the
4677 /// cursor into the start of the given block ID, returning false on success and
4678 /// true on failure.
SkipCursorToBlock(BitstreamCursor & Cursor,unsigned BlockID)4679 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4680   while (true) {
4681     Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
4682     if (!MaybeEntry) {
4683       // FIXME this drops errors on the floor.
4684       consumeError(MaybeEntry.takeError());
4685       return true;
4686     }
4687     llvm::BitstreamEntry Entry = MaybeEntry.get();
4688 
4689     switch (Entry.Kind) {
4690     case llvm::BitstreamEntry::Error:
4691     case llvm::BitstreamEntry::EndBlock:
4692       return true;
4693 
4694     case llvm::BitstreamEntry::Record:
4695       // Ignore top-level records.
4696       if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
4697         break;
4698       else {
4699         // FIXME this drops errors on the floor.
4700         consumeError(Skipped.takeError());
4701         return true;
4702       }
4703 
4704     case llvm::BitstreamEntry::SubBlock:
4705       if (Entry.ID == BlockID) {
4706         if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4707           // FIXME this drops the error on the floor.
4708           consumeError(std::move(Err));
4709           return true;
4710         }
4711         // Found it!
4712         return false;
4713       }
4714 
4715       if (llvm::Error Err = Cursor.SkipBlock()) {
4716         // FIXME this drops the error on the floor.
4717         consumeError(std::move(Err));
4718         return true;
4719       }
4720     }
4721   }
4722 }
4723 
ReadAST(StringRef FileName,ModuleKind Type,SourceLocation ImportLoc,unsigned ClientLoadCapabilities,ModuleFile ** NewLoadedModuleFile)4724 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, ModuleKind Type,
4725                                             SourceLocation ImportLoc,
4726                                             unsigned ClientLoadCapabilities,
4727                                             ModuleFile **NewLoadedModuleFile) {
4728   llvm::TimeTraceScope scope("ReadAST", FileName);
4729 
4730   llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4731   llvm::SaveAndRestore<std::optional<ModuleKind>> SetCurModuleKindRAII(
4732       CurrentDeserializingModuleKind, Type);
4733 
4734   // Defer any pending actions until we get to the end of reading the AST file.
4735   Deserializing AnASTFile(this);
4736 
4737   // Bump the generation number.
4738   unsigned PreviousGeneration = 0;
4739   if (ContextObj)
4740     PreviousGeneration = incrementGeneration(*ContextObj);
4741 
4742   unsigned NumModules = ModuleMgr.size();
4743   SmallVector<ImportedModule, 4> Loaded;
4744   if (ASTReadResult ReadResult =
4745           ReadASTCore(FileName, Type, ImportLoc,
4746                       /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
4747                       ClientLoadCapabilities)) {
4748     ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4749 
4750     // If we find that any modules are unusable, the global index is going
4751     // to be out-of-date. Just remove it.
4752     GlobalIndex.reset();
4753     ModuleMgr.setGlobalIndex(nullptr);
4754     return ReadResult;
4755   }
4756 
4757   if (NewLoadedModuleFile && !Loaded.empty())
4758     *NewLoadedModuleFile = Loaded.back().Mod;
4759 
4760   // Here comes stuff that we only do once the entire chain is loaded. Do *not*
4761   // remove modules from this point. Various fields are updated during reading
4762   // the AST block and removing the modules would result in dangling pointers.
4763   // They are generally only incidentally dereferenced, ie. a binary search
4764   // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
4765   // be dereferenced but it wouldn't actually be used.
4766 
4767   // Load the AST blocks of all of the modules that we loaded. We can still
4768   // hit errors parsing the ASTs at this point.
4769   for (ImportedModule &M : Loaded) {
4770     ModuleFile &F = *M.Mod;
4771     llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
4772 
4773     // Read the AST block.
4774     if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4775       Error(std::move(Err));
4776       return Failure;
4777     }
4778 
4779     // The AST block should always have a definition for the main module.
4780     if (F.isModule() && !F.DidReadTopLevelSubmodule) {
4781       Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
4782       return Failure;
4783     }
4784 
4785     // Read the extension blocks.
4786     while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
4787       if (llvm::Error Err = ReadExtensionBlock(F)) {
4788         Error(std::move(Err));
4789         return Failure;
4790       }
4791     }
4792 
4793     // Once read, set the ModuleFile bit base offset and update the size in
4794     // bits of all files we've seen.
4795     F.GlobalBitOffset = TotalModulesSizeInBits;
4796     TotalModulesSizeInBits += F.SizeInBits;
4797     GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
4798   }
4799 
4800   // Preload source locations and interesting indentifiers.
4801   for (ImportedModule &M : Loaded) {
4802     ModuleFile &F = *M.Mod;
4803 
4804     // Map the original source file ID into the ID space of the current
4805     // compilation.
4806     if (F.OriginalSourceFileID.isValid())
4807       F.OriginalSourceFileID = TranslateFileID(F, F.OriginalSourceFileID);
4808 
4809     for (auto Offset : F.PreloadIdentifierOffsets) {
4810       const unsigned char *Data = F.IdentifierTableData + Offset;
4811 
4812       ASTIdentifierLookupTrait Trait(*this, F);
4813       auto KeyDataLen = Trait.ReadKeyDataLength(Data);
4814       auto Key = Trait.ReadKey(Data, KeyDataLen.first);
4815 
4816       IdentifierInfo *II;
4817       if (!PP.getLangOpts().CPlusPlus) {
4818         // Identifiers present in both the module file and the importing
4819         // instance are marked out-of-date so that they can be deserialized
4820         // on next use via ASTReader::updateOutOfDateIdentifier().
4821         // Identifiers present in the module file but not in the importing
4822         // instance are ignored for now, preventing growth of the identifier
4823         // table. They will be deserialized on first use via ASTReader::get().
4824         auto It = PP.getIdentifierTable().find(Key);
4825         if (It == PP.getIdentifierTable().end())
4826           continue;
4827         II = It->second;
4828       } else {
4829         // With C++ modules, not many identifiers are considered interesting.
4830         // All identifiers in the module file can be placed into the identifier
4831         // table of the importing instance and marked as out-of-date. This makes
4832         // ASTReader::get() a no-op, and deserialization will take place on
4833         // first/next use via ASTReader::updateOutOfDateIdentifier().
4834         II = &PP.getIdentifierTable().getOwn(Key);
4835       }
4836 
4837       II->setOutOfDate(true);
4838 
4839       // Mark this identifier as being from an AST file so that we can track
4840       // whether we need to serialize it.
4841       markIdentifierFromAST(*this, *II, /*IsModule=*/true);
4842 
4843       // Associate the ID with the identifier so that the writer can reuse it.
4844       auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
4845       SetIdentifierInfo(ID, II);
4846     }
4847   }
4848 
4849   // Builtins and library builtins have already been initialized. Mark all
4850   // identifiers as out-of-date, so that they are deserialized on first use.
4851   if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
4852     for (auto &Id : PP.getIdentifierTable())
4853       Id.second->setOutOfDate(true);
4854 
4855   // Mark selectors as out of date.
4856   for (const auto &Sel : SelectorGeneration)
4857     SelectorOutOfDate[Sel.first] = true;
4858 
4859   // Setup the import locations and notify the module manager that we've
4860   // committed to these module files.
4861   for (ImportedModule &M : Loaded) {
4862     ModuleFile &F = *M.Mod;
4863 
4864     ModuleMgr.moduleFileAccepted(&F);
4865 
4866     // Set the import location.
4867     F.DirectImportLoc = ImportLoc;
4868     // FIXME: We assume that locations from PCH / preamble do not need
4869     // any translation.
4870     if (!M.ImportedBy)
4871       F.ImportLoc = M.ImportLoc;
4872     else
4873       F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
4874   }
4875 
4876   // Resolve any unresolved module exports.
4877   for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4878     UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
4879     SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
4880     Module *ResolvedMod = getSubmodule(GlobalID);
4881 
4882     switch (Unresolved.Kind) {
4883     case UnresolvedModuleRef::Conflict:
4884       if (ResolvedMod) {
4885         Module::Conflict Conflict;
4886         Conflict.Other = ResolvedMod;
4887         Conflict.Message = Unresolved.String.str();
4888         Unresolved.Mod->Conflicts.push_back(Conflict);
4889       }
4890       continue;
4891 
4892     case UnresolvedModuleRef::Import:
4893       if (ResolvedMod)
4894         Unresolved.Mod->Imports.insert(ResolvedMod);
4895       continue;
4896 
4897     case UnresolvedModuleRef::Affecting:
4898       if (ResolvedMod)
4899         Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
4900       continue;
4901 
4902     case UnresolvedModuleRef::Export:
4903       if (ResolvedMod || Unresolved.IsWildcard)
4904         Unresolved.Mod->Exports.push_back(
4905           Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
4906       continue;
4907     }
4908   }
4909   UnresolvedModuleRefs.clear();
4910 
4911   // FIXME: How do we load the 'use'd modules? They may not be submodules.
4912   // Might be unnecessary as use declarations are only used to build the
4913   // module itself.
4914 
4915   if (ContextObj)
4916     InitializeContext();
4917 
4918   if (SemaObj)
4919     UpdateSema();
4920 
4921   if (DeserializationListener)
4922     DeserializationListener->ReaderInitialized(this);
4923 
4924   ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
4925   if (PrimaryModule.OriginalSourceFileID.isValid()) {
4926     // If this AST file is a precompiled preamble, then set the
4927     // preamble file ID of the source manager to the file source file
4928     // from which the preamble was built.
4929     if (Type == MK_Preamble) {
4930       SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
4931     } else if (Type == MK_MainFile) {
4932       SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
4933     }
4934   }
4935 
4936   // For any Objective-C class definitions we have already loaded, make sure
4937   // that we load any additional categories.
4938   if (ContextObj) {
4939     for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
4940       loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
4941                          ObjCClassesLoaded[I], PreviousGeneration);
4942     }
4943   }
4944 
4945   const HeaderSearchOptions &HSOpts =
4946       PP.getHeaderSearchInfo().getHeaderSearchOpts();
4947   if (HSOpts.ModulesValidateOncePerBuildSession) {
4948     // Now we are certain that the module and all modules it depends on are
4949     // up-to-date. For implicitly-built module files, ensure the corresponding
4950     // timestamp files are up-to-date in this build session.
4951     for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
4952       ImportedModule &M = Loaded[I];
4953       if (M.Mod->Kind == MK_ImplicitModule &&
4954           M.Mod->InputFilesValidationTimestamp < HSOpts.BuildSessionTimestamp)
4955         getModuleManager().getModuleCache().updateModuleTimestamp(
4956             M.Mod->FileName);
4957     }
4958   }
4959 
4960   return Success;
4961 }
4962 
4963 static ASTFileSignature readASTFileSignature(StringRef PCH);
4964 
4965 /// Whether \p Stream doesn't start with the AST file magic number 'CPCH'.
doesntStartWithASTFileMagic(BitstreamCursor & Stream)4966 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
4967   // FIXME checking magic headers is done in other places such as
4968   // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
4969   // always done the same. Unify it all with a helper.
4970   if (!Stream.canSkipToPos(4))
4971     return llvm::createStringError(
4972         std::errc::illegal_byte_sequence,
4973         "file too small to contain precompiled file magic");
4974   for (unsigned C : {'C', 'P', 'C', 'H'})
4975     if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
4976       if (Res.get() != C)
4977         return llvm::createStringError(
4978             std::errc::illegal_byte_sequence,
4979             "file doesn't start with precompiled file magic");
4980     } else
4981       return Res.takeError();
4982   return llvm::Error::success();
4983 }
4984 
moduleKindForDiagnostic(ModuleKind Kind)4985 static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
4986   switch (Kind) {
4987   case MK_PCH:
4988     return 0; // PCH
4989   case MK_ImplicitModule:
4990   case MK_ExplicitModule:
4991   case MK_PrebuiltModule:
4992     return 1; // module
4993   case MK_MainFile:
4994   case MK_Preamble:
4995     return 2; // main source file
4996   }
4997   llvm_unreachable("unknown module kind");
4998 }
4999 
5000 ASTReader::ASTReadResult
ReadASTCore(StringRef FileName,ModuleKind Type,SourceLocation ImportLoc,ModuleFile * ImportedBy,SmallVectorImpl<ImportedModule> & Loaded,off_t ExpectedSize,time_t ExpectedModTime,ASTFileSignature ExpectedSignature,unsigned ClientLoadCapabilities)5001 ASTReader::ReadASTCore(StringRef FileName,
5002                        ModuleKind Type,
5003                        SourceLocation ImportLoc,
5004                        ModuleFile *ImportedBy,
5005                        SmallVectorImpl<ImportedModule> &Loaded,
5006                        off_t ExpectedSize, time_t ExpectedModTime,
5007                        ASTFileSignature ExpectedSignature,
5008                        unsigned ClientLoadCapabilities) {
5009   ModuleFile *M;
5010   std::string ErrorStr;
5011   ModuleManager::AddModuleResult AddResult
5012     = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
5013                           getGeneration(), ExpectedSize, ExpectedModTime,
5014                           ExpectedSignature, readASTFileSignature,
5015                           M, ErrorStr);
5016 
5017   switch (AddResult) {
5018   case ModuleManager::AlreadyLoaded:
5019     Diag(diag::remark_module_import)
5020         << M->ModuleName << M->FileName << (ImportedBy ? true : false)
5021         << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
5022     return Success;
5023 
5024   case ModuleManager::NewlyLoaded:
5025     // Load module file below.
5026     break;
5027 
5028   case ModuleManager::Missing:
5029     // The module file was missing; if the client can handle that, return
5030     // it.
5031     if (ClientLoadCapabilities & ARR_Missing)
5032       return Missing;
5033 
5034     // Otherwise, return an error.
5035     Diag(diag::err_ast_file_not_found)
5036         << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
5037         << ErrorStr;
5038     return Failure;
5039 
5040   case ModuleManager::OutOfDate:
5041     // We couldn't load the module file because it is out-of-date. If the
5042     // client can handle out-of-date, return it.
5043     if (ClientLoadCapabilities & ARR_OutOfDate)
5044       return OutOfDate;
5045 
5046     // Otherwise, return an error.
5047     Diag(diag::err_ast_file_out_of_date)
5048         << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
5049         << ErrorStr;
5050     return Failure;
5051   }
5052 
5053   assert(M && "Missing module file");
5054 
5055   bool ShouldFinalizePCM = false;
5056   auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
5057     auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5058     if (ShouldFinalizePCM)
5059       MC.finalizePCM(FileName);
5060     else
5061       MC.tryToDropPCM(FileName);
5062   });
5063   ModuleFile &F = *M;
5064   BitstreamCursor &Stream = F.Stream;
5065   Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5066   F.SizeInBits = F.Buffer->getBufferSize() * 8;
5067 
5068   // Sniff for the signature.
5069   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5070     Diag(diag::err_ast_file_invalid)
5071         << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
5072     return Failure;
5073   }
5074 
5075   // This is used for compatibility with older PCH formats.
5076   bool HaveReadControlBlock = false;
5077   while (true) {
5078     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5079     if (!MaybeEntry) {
5080       Error(MaybeEntry.takeError());
5081       return Failure;
5082     }
5083     llvm::BitstreamEntry Entry = MaybeEntry.get();
5084 
5085     switch (Entry.Kind) {
5086     case llvm::BitstreamEntry::Error:
5087     case llvm::BitstreamEntry::Record:
5088     case llvm::BitstreamEntry::EndBlock:
5089       Error("invalid record at top-level of AST file");
5090       return Failure;
5091 
5092     case llvm::BitstreamEntry::SubBlock:
5093       break;
5094     }
5095 
5096     switch (Entry.ID) {
5097     case CONTROL_BLOCK_ID:
5098       HaveReadControlBlock = true;
5099       switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5100       case Success:
5101         // Check that we didn't try to load a non-module AST file as a module.
5102         //
5103         // FIXME: Should we also perform the converse check? Loading a module as
5104         // a PCH file sort of works, but it's a bit wonky.
5105         if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
5106              Type == MK_PrebuiltModule) &&
5107             F.ModuleName.empty()) {
5108           auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
5109           if (Result != OutOfDate ||
5110               (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5111             Diag(diag::err_module_file_not_module) << FileName;
5112           return Result;
5113         }
5114         break;
5115 
5116       case Failure: return Failure;
5117       case Missing: return Missing;
5118       case OutOfDate: return OutOfDate;
5119       case VersionMismatch: return VersionMismatch;
5120       case ConfigurationMismatch: return ConfigurationMismatch;
5121       case HadErrors: return HadErrors;
5122       }
5123       break;
5124 
5125     case AST_BLOCK_ID:
5126       if (!HaveReadControlBlock) {
5127         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5128           Diag(diag::err_ast_file_version_too_old)
5129               << moduleKindForDiagnostic(Type) << FileName;
5130         return VersionMismatch;
5131       }
5132 
5133       // Record that we've loaded this module.
5134       Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5135       ShouldFinalizePCM = true;
5136       return Success;
5137 
5138     default:
5139       if (llvm::Error Err = Stream.SkipBlock()) {
5140         Error(std::move(Err));
5141         return Failure;
5142       }
5143       break;
5144     }
5145   }
5146 
5147   llvm_unreachable("unexpected break; expected return");
5148 }
5149 
5150 ASTReader::ASTReadResult
readUnhashedControlBlock(ModuleFile & F,bool WasImportedBy,unsigned ClientLoadCapabilities)5151 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
5152                                     unsigned ClientLoadCapabilities) {
5153   const HeaderSearchOptions &HSOpts =
5154       PP.getHeaderSearchInfo().getHeaderSearchOpts();
5155   bool AllowCompatibleConfigurationMismatch =
5156       F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
5157   bool DisableValidation = shouldDisableValidationForFile(F);
5158 
5159   ASTReadResult Result = readUnhashedControlBlockImpl(
5160       &F, F.Data, F.FileName, ClientLoadCapabilities,
5161       AllowCompatibleConfigurationMismatch, Listener.get(),
5162       WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
5163 
5164   // If F was directly imported by another module, it's implicitly validated by
5165   // the importing module.
5166   if (DisableValidation || WasImportedBy ||
5167       (AllowConfigurationMismatch && Result == ConfigurationMismatch))
5168     return Success;
5169 
5170   if (Result == Failure) {
5171     Error("malformed block record in AST file");
5172     return Failure;
5173   }
5174 
5175   if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
5176     // If this module has already been finalized in the ModuleCache, we're stuck
5177     // with it; we can only load a single version of each module.
5178     //
5179     // This can happen when a module is imported in two contexts: in one, as a
5180     // user module; in another, as a system module (due to an import from
5181     // another module marked with the [system] flag).  It usually indicates a
5182     // bug in the module map: this module should also be marked with [system].
5183     //
5184     // If -Wno-system-headers (the default), and the first import is as a
5185     // system module, then validation will fail during the as-user import,
5186     // since -Werror flags won't have been validated.  However, it's reasonable
5187     // to treat this consistently as a system module.
5188     //
5189     // If -Wsystem-headers, the PCM on disk was built with
5190     // -Wno-system-headers, and the first import is as a user module, then
5191     // validation will fail during the as-system import since the PCM on disk
5192     // doesn't guarantee that -Werror was respected.  However, the -Werror
5193     // flags were checked during the initial as-user import.
5194     if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5195             F.FileName)) {
5196       Diag(diag::warn_module_system_bit_conflict) << F.FileName;
5197       return Success;
5198     }
5199   }
5200 
5201   return Result;
5202 }
5203 
readUnhashedControlBlockImpl(ModuleFile * F,llvm::StringRef StreamData,StringRef Filename,unsigned ClientLoadCapabilities,bool AllowCompatibleConfigurationMismatch,ASTReaderListener * Listener,bool ValidateDiagnosticOptions)5204 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
5205     ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5206     unsigned ClientLoadCapabilities, bool AllowCompatibleConfigurationMismatch,
5207     ASTReaderListener *Listener, bool ValidateDiagnosticOptions) {
5208   // Initialize a stream.
5209   BitstreamCursor Stream(StreamData);
5210 
5211   // Sniff for the signature.
5212   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5213     // FIXME this drops the error on the floor.
5214     consumeError(std::move(Err));
5215     return Failure;
5216   }
5217 
5218   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5219   if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
5220     return Failure;
5221 
5222   // Read all of the records in the options block.
5223   RecordData Record;
5224   ASTReadResult Result = Success;
5225   while (true) {
5226     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5227     if (!MaybeEntry) {
5228       // FIXME this drops the error on the floor.
5229       consumeError(MaybeEntry.takeError());
5230       return Failure;
5231     }
5232     llvm::BitstreamEntry Entry = MaybeEntry.get();
5233 
5234     switch (Entry.Kind) {
5235     case llvm::BitstreamEntry::Error:
5236     case llvm::BitstreamEntry::SubBlock:
5237       return Failure;
5238 
5239     case llvm::BitstreamEntry::EndBlock:
5240       return Result;
5241 
5242     case llvm::BitstreamEntry::Record:
5243       // The interesting case.
5244       break;
5245     }
5246 
5247     // Read and process a record.
5248     Record.clear();
5249     StringRef Blob;
5250     Expected<unsigned> MaybeRecordType =
5251         Stream.readRecord(Entry.ID, Record, &Blob);
5252     if (!MaybeRecordType) {
5253       // FIXME this drops the error.
5254       return Failure;
5255     }
5256     switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
5257     case SIGNATURE:
5258       if (F) {
5259         F->Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5260         assert(F->Signature != ASTFileSignature::createDummy() &&
5261                "Dummy AST file signature not backpatched in ASTWriter.");
5262       }
5263       break;
5264     case AST_BLOCK_HASH:
5265       if (F) {
5266         F->ASTBlockHash = ASTFileSignature::create(Blob.begin(), Blob.end());
5267         assert(F->ASTBlockHash != ASTFileSignature::createDummy() &&
5268                "Dummy AST block hash not backpatched in ASTWriter.");
5269       }
5270       break;
5271     case DIAGNOSTIC_OPTIONS: {
5272       bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5273       if (Listener && ValidateDiagnosticOptions &&
5274           !AllowCompatibleConfigurationMismatch &&
5275           ParseDiagnosticOptions(Record, Filename, Complain, *Listener))
5276         Result = OutOfDate; // Don't return early.  Read the signature.
5277       break;
5278     }
5279     case HEADER_SEARCH_PATHS: {
5280       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5281       if (Listener && !AllowCompatibleConfigurationMismatch &&
5282           ParseHeaderSearchPaths(Record, Complain, *Listener))
5283         Result = ConfigurationMismatch;
5284       break;
5285     }
5286     case DIAG_PRAGMA_MAPPINGS:
5287       if (!F)
5288         break;
5289       if (F->PragmaDiagMappings.empty())
5290         F->PragmaDiagMappings.swap(Record);
5291       else
5292         F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
5293                                      Record.begin(), Record.end());
5294       break;
5295     case HEADER_SEARCH_ENTRY_USAGE:
5296       if (F)
5297         F->SearchPathUsage = ReadBitVector(Record, Blob);
5298       break;
5299     case VFS_USAGE:
5300       if (F)
5301         F->VFSUsage = ReadBitVector(Record, Blob);
5302       break;
5303     }
5304   }
5305 }
5306 
5307 /// Parse a record and blob containing module file extension metadata.
parseModuleFileExtensionMetadata(const SmallVectorImpl<uint64_t> & Record,StringRef Blob,ModuleFileExtensionMetadata & Metadata)5308 static bool parseModuleFileExtensionMetadata(
5309               const SmallVectorImpl<uint64_t> &Record,
5310               StringRef Blob,
5311               ModuleFileExtensionMetadata &Metadata) {
5312   if (Record.size() < 4) return true;
5313 
5314   Metadata.MajorVersion = Record[0];
5315   Metadata.MinorVersion = Record[1];
5316 
5317   unsigned BlockNameLen = Record[2];
5318   unsigned UserInfoLen = Record[3];
5319 
5320   if (BlockNameLen + UserInfoLen > Blob.size()) return true;
5321 
5322   Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5323   Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
5324                                   Blob.data() + BlockNameLen + UserInfoLen);
5325   return false;
5326 }
5327 
ReadExtensionBlock(ModuleFile & F)5328 llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
5329   BitstreamCursor &Stream = F.Stream;
5330 
5331   RecordData Record;
5332   while (true) {
5333     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5334     if (!MaybeEntry)
5335       return MaybeEntry.takeError();
5336     llvm::BitstreamEntry Entry = MaybeEntry.get();
5337 
5338     switch (Entry.Kind) {
5339     case llvm::BitstreamEntry::SubBlock:
5340       if (llvm::Error Err = Stream.SkipBlock())
5341         return Err;
5342       continue;
5343     case llvm::BitstreamEntry::EndBlock:
5344       return llvm::Error::success();
5345     case llvm::BitstreamEntry::Error:
5346       return llvm::createStringError(std::errc::illegal_byte_sequence,
5347                                      "malformed block record in AST file");
5348     case llvm::BitstreamEntry::Record:
5349       break;
5350     }
5351 
5352     Record.clear();
5353     StringRef Blob;
5354     Expected<unsigned> MaybeRecCode =
5355         Stream.readRecord(Entry.ID, Record, &Blob);
5356     if (!MaybeRecCode)
5357       return MaybeRecCode.takeError();
5358     switch (MaybeRecCode.get()) {
5359     case EXTENSION_METADATA: {
5360       ModuleFileExtensionMetadata Metadata;
5361       if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5362         return llvm::createStringError(
5363             std::errc::illegal_byte_sequence,
5364             "malformed EXTENSION_METADATA in AST file");
5365 
5366       // Find a module file extension with this block name.
5367       auto Known = ModuleFileExtensions.find(Metadata.BlockName);
5368       if (Known == ModuleFileExtensions.end()) break;
5369 
5370       // Form a reader.
5371       if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
5372                                                              F, Stream)) {
5373         F.ExtensionReaders.push_back(std::move(Reader));
5374       }
5375 
5376       break;
5377     }
5378     }
5379   }
5380 
5381   llvm_unreachable("ReadExtensionBlock should return from while loop");
5382 }
5383 
InitializeContext()5384 void ASTReader::InitializeContext() {
5385   assert(ContextObj && "no context to initialize");
5386   ASTContext &Context = *ContextObj;
5387 
5388   // If there's a listener, notify them that we "read" the translation unit.
5389   if (DeserializationListener)
5390     DeserializationListener->DeclRead(
5391         GlobalDeclID(PREDEF_DECL_TRANSLATION_UNIT_ID),
5392         Context.getTranslationUnitDecl());
5393 
5394   // FIXME: Find a better way to deal with collisions between these
5395   // built-in types. Right now, we just ignore the problem.
5396 
5397   // Load the special types.
5398   if (SpecialTypes.size() >= NumSpecialTypeIDs) {
5399     if (TypeID String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
5400       if (!Context.CFConstantStringTypeDecl)
5401         Context.setCFConstantStringType(GetType(String));
5402     }
5403 
5404     if (TypeID File = SpecialTypes[SPECIAL_TYPE_FILE]) {
5405       QualType FileType = GetType(File);
5406       if (FileType.isNull()) {
5407         Error("FILE type is NULL");
5408         return;
5409       }
5410 
5411       if (!Context.FILEDecl) {
5412         if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
5413           Context.setFILEDecl(Typedef->getDecl());
5414         else {
5415           const TagType *Tag = FileType->getAs<TagType>();
5416           if (!Tag) {
5417             Error("Invalid FILE type in AST file");
5418             return;
5419           }
5420           Context.setFILEDecl(Tag->getDecl());
5421         }
5422       }
5423     }
5424 
5425     if (TypeID Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
5426       QualType Jmp_bufType = GetType(Jmp_buf);
5427       if (Jmp_bufType.isNull()) {
5428         Error("jmp_buf type is NULL");
5429         return;
5430       }
5431 
5432       if (!Context.jmp_bufDecl) {
5433         if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
5434           Context.setjmp_bufDecl(Typedef->getDecl());
5435         else {
5436           const TagType *Tag = Jmp_bufType->getAs<TagType>();
5437           if (!Tag) {
5438             Error("Invalid jmp_buf type in AST file");
5439             return;
5440           }
5441           Context.setjmp_bufDecl(Tag->getDecl());
5442         }
5443       }
5444     }
5445 
5446     if (TypeID Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
5447       QualType Sigjmp_bufType = GetType(Sigjmp_buf);
5448       if (Sigjmp_bufType.isNull()) {
5449         Error("sigjmp_buf type is NULL");
5450         return;
5451       }
5452 
5453       if (!Context.sigjmp_bufDecl) {
5454         if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
5455           Context.setsigjmp_bufDecl(Typedef->getDecl());
5456         else {
5457           const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
5458           assert(Tag && "Invalid sigjmp_buf type in AST file");
5459           Context.setsigjmp_bufDecl(Tag->getDecl());
5460         }
5461       }
5462     }
5463 
5464     if (TypeID ObjCIdRedef = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
5465       if (Context.ObjCIdRedefinitionType.isNull())
5466         Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
5467     }
5468 
5469     if (TypeID ObjCClassRedef =
5470             SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
5471       if (Context.ObjCClassRedefinitionType.isNull())
5472         Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
5473     }
5474 
5475     if (TypeID ObjCSelRedef =
5476             SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
5477       if (Context.ObjCSelRedefinitionType.isNull())
5478         Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
5479     }
5480 
5481     if (TypeID Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
5482       QualType Ucontext_tType = GetType(Ucontext_t);
5483       if (Ucontext_tType.isNull()) {
5484         Error("ucontext_t type is NULL");
5485         return;
5486       }
5487 
5488       if (!Context.ucontext_tDecl) {
5489         if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
5490           Context.setucontext_tDecl(Typedef->getDecl());
5491         else {
5492           const TagType *Tag = Ucontext_tType->getAs<TagType>();
5493           assert(Tag && "Invalid ucontext_t type in AST file");
5494           Context.setucontext_tDecl(Tag->getDecl());
5495         }
5496       }
5497     }
5498   }
5499 
5500   ReadPragmaDiagnosticMappings(Context.getDiagnostics());
5501 
5502   // If there were any CUDA special declarations, deserialize them.
5503   if (!CUDASpecialDeclRefs.empty()) {
5504     assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
5505     Context.setcudaConfigureCallDecl(
5506                            cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
5507   }
5508 
5509   // Re-export any modules that were imported by a non-module AST file.
5510   // FIXME: This does not make macro-only imports visible again.
5511   for (auto &Import : PendingImportedModules) {
5512     if (Module *Imported = getSubmodule(Import.ID)) {
5513       makeModuleVisible(Imported, Module::AllVisible,
5514                         /*ImportLoc=*/Import.ImportLoc);
5515       if (Import.ImportLoc.isValid())
5516         PP.makeModuleVisible(Imported, Import.ImportLoc);
5517       // This updates visibility for Preprocessor only. For Sema, which can be
5518       // nullptr here, we do the same later, in UpdateSema().
5519     }
5520   }
5521 
5522   // Hand off these modules to Sema.
5523   PendingImportedModulesSema.append(PendingImportedModules);
5524   PendingImportedModules.clear();
5525 }
5526 
finalizeForWriting()5527 void ASTReader::finalizeForWriting() {
5528   // Nothing to do for now.
5529 }
5530 
5531 /// Reads and return the signature record from \p PCH's control block, or
5532 /// else returns 0.
readASTFileSignature(StringRef PCH)5533 static ASTFileSignature readASTFileSignature(StringRef PCH) {
5534   BitstreamCursor Stream(PCH);
5535   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5536     // FIXME this drops the error on the floor.
5537     consumeError(std::move(Err));
5538     return ASTFileSignature();
5539   }
5540 
5541   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
5542   if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
5543     return ASTFileSignature();
5544 
5545   // Scan for SIGNATURE inside the diagnostic options block.
5546   ASTReader::RecordData Record;
5547   while (true) {
5548     Expected<llvm::BitstreamEntry> MaybeEntry =
5549         Stream.advanceSkippingSubblocks();
5550     if (!MaybeEntry) {
5551       // FIXME this drops the error on the floor.
5552       consumeError(MaybeEntry.takeError());
5553       return ASTFileSignature();
5554     }
5555     llvm::BitstreamEntry Entry = MaybeEntry.get();
5556 
5557     if (Entry.Kind != llvm::BitstreamEntry::Record)
5558       return ASTFileSignature();
5559 
5560     Record.clear();
5561     StringRef Blob;
5562     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5563     if (!MaybeRecord) {
5564       // FIXME this drops the error on the floor.
5565       consumeError(MaybeRecord.takeError());
5566       return ASTFileSignature();
5567     }
5568     if (SIGNATURE == MaybeRecord.get()) {
5569       auto Signature = ASTFileSignature::create(Blob.begin(), Blob.end());
5570       assert(Signature != ASTFileSignature::createDummy() &&
5571              "Dummy AST file signature not backpatched in ASTWriter.");
5572       return Signature;
5573     }
5574   }
5575 }
5576 
5577 /// Retrieve the name of the original source file name
5578 /// directly from the AST file, without actually loading the AST
5579 /// file.
getOriginalSourceFile(const std::string & ASTFileName,FileManager & FileMgr,const PCHContainerReader & PCHContainerRdr,DiagnosticsEngine & Diags)5580 std::string ASTReader::getOriginalSourceFile(
5581     const std::string &ASTFileName, FileManager &FileMgr,
5582     const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
5583   // Open the AST file.
5584   auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
5585                                          /*RequiresNullTerminator=*/false,
5586                                          /*MaybeLimit=*/std::nullopt,
5587                                          /*IsText=*/false);
5588   if (!Buffer) {
5589     Diags.Report(diag::err_fe_unable_to_read_pch_file)
5590         << ASTFileName << Buffer.getError().message();
5591     return std::string();
5592   }
5593 
5594   // Initialize the stream
5595   BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5596 
5597   // Sniff for the signature.
5598   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5599     Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5600     return std::string();
5601   }
5602 
5603   // Scan for the CONTROL_BLOCK_ID block.
5604   if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
5605     Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5606     return std::string();
5607   }
5608 
5609   // Scan for ORIGINAL_FILE inside the control block.
5610   RecordData Record;
5611   while (true) {
5612     Expected<llvm::BitstreamEntry> MaybeEntry =
5613         Stream.advanceSkippingSubblocks();
5614     if (!MaybeEntry) {
5615       // FIXME this drops errors on the floor.
5616       consumeError(MaybeEntry.takeError());
5617       return std::string();
5618     }
5619     llvm::BitstreamEntry Entry = MaybeEntry.get();
5620 
5621     if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5622       return std::string();
5623 
5624     if (Entry.Kind != llvm::BitstreamEntry::Record) {
5625       Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5626       return std::string();
5627     }
5628 
5629     Record.clear();
5630     StringRef Blob;
5631     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
5632     if (!MaybeRecord) {
5633       // FIXME this drops the errors on the floor.
5634       consumeError(MaybeRecord.takeError());
5635       return std::string();
5636     }
5637     if (ORIGINAL_FILE == MaybeRecord.get())
5638       return Blob.str();
5639   }
5640 }
5641 
5642 namespace {
5643 
5644   class SimplePCHValidator : public ASTReaderListener {
5645     const LangOptions &ExistingLangOpts;
5646     const TargetOptions &ExistingTargetOpts;
5647     const PreprocessorOptions &ExistingPPOpts;
5648     std::string ExistingModuleCachePath;
5649     FileManager &FileMgr;
5650     bool StrictOptionMatches;
5651 
5652   public:
SimplePCHValidator(const LangOptions & ExistingLangOpts,const TargetOptions & ExistingTargetOpts,const PreprocessorOptions & ExistingPPOpts,StringRef ExistingModuleCachePath,FileManager & FileMgr,bool StrictOptionMatches)5653     SimplePCHValidator(const LangOptions &ExistingLangOpts,
5654                        const TargetOptions &ExistingTargetOpts,
5655                        const PreprocessorOptions &ExistingPPOpts,
5656                        StringRef ExistingModuleCachePath, FileManager &FileMgr,
5657                        bool StrictOptionMatches)
5658         : ExistingLangOpts(ExistingLangOpts),
5659           ExistingTargetOpts(ExistingTargetOpts),
5660           ExistingPPOpts(ExistingPPOpts),
5661           ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr),
5662           StrictOptionMatches(StrictOptionMatches) {}
5663 
ReadLanguageOptions(const LangOptions & LangOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)5664     bool ReadLanguageOptions(const LangOptions &LangOpts,
5665                              StringRef ModuleFilename, bool Complain,
5666                              bool AllowCompatibleDifferences) override {
5667       return checkLanguageOptions(ExistingLangOpts, LangOpts, ModuleFilename,
5668                                   nullptr, AllowCompatibleDifferences);
5669     }
5670 
ReadTargetOptions(const TargetOptions & TargetOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)5671     bool ReadTargetOptions(const TargetOptions &TargetOpts,
5672                            StringRef ModuleFilename, bool Complain,
5673                            bool AllowCompatibleDifferences) override {
5674       return checkTargetOptions(ExistingTargetOpts, TargetOpts, ModuleFilename,
5675                                 nullptr, AllowCompatibleDifferences);
5676     }
5677 
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef ModuleFilename,StringRef SpecificModuleCachePath,bool Complain)5678     bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
5679                                  StringRef ModuleFilename,
5680                                  StringRef SpecificModuleCachePath,
5681                                  bool Complain) override {
5682       return checkModuleCachePath(FileMgr.getVirtualFileSystem(),
5683                                   SpecificModuleCachePath,
5684                                   ExistingModuleCachePath, ModuleFilename,
5685                                   nullptr, ExistingLangOpts, ExistingPPOpts);
5686     }
5687 
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,StringRef ModuleFilename,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)5688     bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
5689                                  StringRef ModuleFilename, bool ReadMacros,
5690                                  bool Complain,
5691                                  std::string &SuggestedPredefines) override {
5692       return checkPreprocessorOptions(
5693           PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros, /*Diags=*/nullptr,
5694           FileMgr, SuggestedPredefines, ExistingLangOpts,
5695           StrictOptionMatches ? OptionValidateStrictMatches
5696                               : OptionValidateContradictions);
5697     }
5698   };
5699 
5700 } // namespace
5701 
readASTFileControlBlock(StringRef Filename,FileManager & FileMgr,const ModuleCache & ModCache,const PCHContainerReader & PCHContainerRdr,bool FindModuleFileExtensions,ASTReaderListener & Listener,bool ValidateDiagnosticOptions,unsigned ClientLoadCapabilities)5702 bool ASTReader::readASTFileControlBlock(
5703     StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
5704     const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
5705     ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
5706     unsigned ClientLoadCapabilities) {
5707   // Open the AST file.
5708   std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5709   llvm::MemoryBuffer *Buffer =
5710       ModCache.getInMemoryModuleCache().lookupPCM(Filename);
5711   if (!Buffer) {
5712     // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
5713     // read again later, but we do not have the context here to determine if it
5714     // is safe to change the result of InMemoryModuleCache::getPCMState().
5715 
5716     // FIXME: This allows use of the VFS; we do not allow use of the
5717     // VFS when actually loading a module.
5718     auto BufferOrErr = FileMgr.getBufferForFile(Filename);
5719     if (!BufferOrErr)
5720       return true;
5721     OwnedBuffer = std::move(*BufferOrErr);
5722     Buffer = OwnedBuffer.get();
5723   }
5724 
5725   // Initialize the stream
5726   StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5727   BitstreamCursor Stream(Bytes);
5728 
5729   // Sniff for the signature.
5730   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
5731     consumeError(std::move(Err)); // FIXME this drops errors on the floor.
5732     return true;
5733   }
5734 
5735   // Scan for the CONTROL_BLOCK_ID block.
5736   if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
5737     return true;
5738 
5739   bool NeedsInputFiles = Listener.needsInputFileVisitation();
5740   bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5741   bool NeedsImports = Listener.needsImportVisitation();
5742   BitstreamCursor InputFilesCursor;
5743   uint64_t InputFilesOffsetBase = 0;
5744 
5745   RecordData Record;
5746   std::string ModuleDir;
5747   bool DoneWithControlBlock = false;
5748   SmallString<0> PathBuf;
5749   PathBuf.reserve(256);
5750   // Additional path buffer to use when multiple paths need to be resolved.
5751   // For example, when deserializing input files that contains a path that was
5752   // resolved from a vfs overlay and an external location.
5753   SmallString<0> AdditionalPathBuf;
5754   AdditionalPathBuf.reserve(256);
5755   while (!DoneWithControlBlock) {
5756     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5757     if (!MaybeEntry) {
5758       // FIXME this drops the error on the floor.
5759       consumeError(MaybeEntry.takeError());
5760       return true;
5761     }
5762     llvm::BitstreamEntry Entry = MaybeEntry.get();
5763 
5764     switch (Entry.Kind) {
5765     case llvm::BitstreamEntry::SubBlock: {
5766       switch (Entry.ID) {
5767       case OPTIONS_BLOCK_ID: {
5768         std::string IgnoredSuggestedPredefines;
5769         if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5770                              /*AllowCompatibleConfigurationMismatch*/ false,
5771                              Listener, IgnoredSuggestedPredefines) != Success)
5772           return true;
5773         break;
5774       }
5775 
5776       case INPUT_FILES_BLOCK_ID:
5777         InputFilesCursor = Stream;
5778         if (llvm::Error Err = Stream.SkipBlock()) {
5779           // FIXME this drops the error on the floor.
5780           consumeError(std::move(Err));
5781           return true;
5782         }
5783         if (NeedsInputFiles &&
5784             ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
5785           return true;
5786         InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5787         break;
5788 
5789       default:
5790         if (llvm::Error Err = Stream.SkipBlock()) {
5791           // FIXME this drops the error on the floor.
5792           consumeError(std::move(Err));
5793           return true;
5794         }
5795         break;
5796       }
5797 
5798       continue;
5799     }
5800 
5801     case llvm::BitstreamEntry::EndBlock:
5802       DoneWithControlBlock = true;
5803       break;
5804 
5805     case llvm::BitstreamEntry::Error:
5806       return true;
5807 
5808     case llvm::BitstreamEntry::Record:
5809       break;
5810     }
5811 
5812     if (DoneWithControlBlock) break;
5813 
5814     Record.clear();
5815     StringRef Blob;
5816     Expected<unsigned> MaybeRecCode =
5817         Stream.readRecord(Entry.ID, Record, &Blob);
5818     if (!MaybeRecCode) {
5819       // FIXME this drops the error.
5820       return Failure;
5821     }
5822     switch ((ControlRecordTypes)MaybeRecCode.get()) {
5823     case METADATA:
5824       if (Record[0] != VERSION_MAJOR)
5825         return true;
5826       if (Listener.ReadFullVersionInformation(Blob))
5827         return true;
5828       break;
5829     case MODULE_NAME:
5830       Listener.ReadModuleName(Blob);
5831       break;
5832     case MODULE_DIRECTORY:
5833       ModuleDir = std::string(Blob);
5834       break;
5835     case MODULE_MAP_FILE: {
5836       unsigned Idx = 0;
5837       std::string PathStr = ReadString(Record, Idx);
5838       auto Path = ResolveImportedPath(PathBuf, PathStr, ModuleDir);
5839       Listener.ReadModuleMapFile(*Path);
5840       break;
5841     }
5842     case INPUT_FILE_OFFSETS: {
5843       if (!NeedsInputFiles)
5844         break;
5845 
5846       unsigned NumInputFiles = Record[0];
5847       unsigned NumUserFiles = Record[1];
5848       const llvm::support::unaligned_uint64_t *InputFileOffs =
5849           (const llvm::support::unaligned_uint64_t *)Blob.data();
5850       for (unsigned I = 0; I != NumInputFiles; ++I) {
5851         // Go find this input file.
5852         bool isSystemFile = I >= NumUserFiles;
5853 
5854         if (isSystemFile && !NeedsSystemInputFiles)
5855           break; // the rest are system input files
5856 
5857         BitstreamCursor &Cursor = InputFilesCursor;
5858         SavedStreamPosition SavedPosition(Cursor);
5859         if (llvm::Error Err =
5860                 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
5861           // FIXME this drops errors on the floor.
5862           consumeError(std::move(Err));
5863         }
5864 
5865         Expected<unsigned> MaybeCode = Cursor.ReadCode();
5866         if (!MaybeCode) {
5867           // FIXME this drops errors on the floor.
5868           consumeError(MaybeCode.takeError());
5869         }
5870         unsigned Code = MaybeCode.get();
5871 
5872         RecordData Record;
5873         StringRef Blob;
5874         bool shouldContinue = false;
5875         Expected<unsigned> MaybeRecordType =
5876             Cursor.readRecord(Code, Record, &Blob);
5877         if (!MaybeRecordType) {
5878           // FIXME this drops errors on the floor.
5879           consumeError(MaybeRecordType.takeError());
5880         }
5881         switch ((InputFileRecordTypes)MaybeRecordType.get()) {
5882         case INPUT_FILE_HASH:
5883           break;
5884         case INPUT_FILE:
5885           bool Overridden = static_cast<bool>(Record[3]);
5886           auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
5887               getUnresolvedInputFilenames(Record, Blob);
5888           auto FilenameAsRequestedBuf = ResolveImportedPath(
5889               PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
5890           StringRef Filename;
5891           if (UnresolvedFilename.empty())
5892             Filename = *FilenameAsRequestedBuf;
5893           else {
5894             auto FilenameBuf = ResolveImportedPath(
5895                 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
5896             Filename = *FilenameBuf;
5897           }
5898           shouldContinue = Listener.visitInputFile(
5899               *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
5900               /*IsExplicitModule=*/false);
5901           break;
5902         }
5903         if (!shouldContinue)
5904           break;
5905       }
5906       break;
5907     }
5908 
5909     case IMPORT: {
5910       if (!NeedsImports)
5911         break;
5912 
5913       unsigned Idx = 0;
5914       // Read information about the AST file.
5915 
5916       // Skip Kind
5917       Idx++;
5918 
5919       // Skip ImportLoc
5920       Idx++;
5921 
5922       StringRef ModuleName = ReadStringBlob(Record, Idx, Blob);
5923 
5924       bool IsStandardCXXModule = Record[Idx++];
5925 
5926       // In C++20 Modules, we don't record the path to imported
5927       // modules in the BMI files.
5928       if (IsStandardCXXModule) {
5929         Listener.visitImport(ModuleName, /*Filename=*/"");
5930         continue;
5931       }
5932 
5933       // Skip Size and ModTime.
5934       Idx += 1 + 1;
5935       // Skip signature.
5936       Blob = Blob.substr(ASTFileSignature::size);
5937 
5938       StringRef FilenameStr = ReadStringBlob(Record, Idx, Blob);
5939       auto Filename = ResolveImportedPath(PathBuf, FilenameStr, ModuleDir);
5940       Listener.visitImport(ModuleName, *Filename);
5941       break;
5942     }
5943 
5944     default:
5945       // No other validation to perform.
5946       break;
5947     }
5948   }
5949 
5950   // Look for module file extension blocks, if requested.
5951   if (FindModuleFileExtensions) {
5952     BitstreamCursor SavedStream = Stream;
5953     while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
5954       bool DoneWithExtensionBlock = false;
5955       while (!DoneWithExtensionBlock) {
5956         Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5957         if (!MaybeEntry) {
5958           // FIXME this drops the error.
5959           return true;
5960         }
5961         llvm::BitstreamEntry Entry = MaybeEntry.get();
5962 
5963         switch (Entry.Kind) {
5964         case llvm::BitstreamEntry::SubBlock:
5965           if (llvm::Error Err = Stream.SkipBlock()) {
5966             // FIXME this drops the error on the floor.
5967             consumeError(std::move(Err));
5968             return true;
5969           }
5970           continue;
5971 
5972         case llvm::BitstreamEntry::EndBlock:
5973           DoneWithExtensionBlock = true;
5974           continue;
5975 
5976         case llvm::BitstreamEntry::Error:
5977           return true;
5978 
5979         case llvm::BitstreamEntry::Record:
5980           break;
5981         }
5982 
5983        Record.clear();
5984        StringRef Blob;
5985        Expected<unsigned> MaybeRecCode =
5986            Stream.readRecord(Entry.ID, Record, &Blob);
5987        if (!MaybeRecCode) {
5988          // FIXME this drops the error.
5989          return true;
5990        }
5991        switch (MaybeRecCode.get()) {
5992        case EXTENSION_METADATA: {
5993          ModuleFileExtensionMetadata Metadata;
5994          if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
5995            return true;
5996 
5997          Listener.readModuleFileExtension(Metadata);
5998          break;
5999        }
6000        }
6001       }
6002     }
6003     Stream = std::move(SavedStream);
6004   }
6005 
6006   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
6007   if (readUnhashedControlBlockImpl(
6008           nullptr, Bytes, Filename, ClientLoadCapabilities,
6009           /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
6010           ValidateDiagnosticOptions) != Success)
6011     return true;
6012 
6013   return false;
6014 }
6015 
isAcceptableASTFile(StringRef Filename,FileManager & FileMgr,const ModuleCache & ModCache,const PCHContainerReader & PCHContainerRdr,const LangOptions & LangOpts,const TargetOptions & TargetOpts,const PreprocessorOptions & PPOpts,StringRef ExistingModuleCachePath,bool RequireStrictOptionMatches)6016 bool ASTReader::isAcceptableASTFile(
6017     StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
6018     const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
6019     const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts,
6020     StringRef ExistingModuleCachePath, bool RequireStrictOptionMatches) {
6021   SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
6022                                ExistingModuleCachePath, FileMgr,
6023                                RequireStrictOptionMatches);
6024   return !readASTFileControlBlock(Filename, FileMgr, ModCache, PCHContainerRdr,
6025                                   /*FindModuleFileExtensions=*/false, validator,
6026                                   /*ValidateDiagnosticOptions=*/true);
6027 }
6028 
ReadSubmoduleBlock(ModuleFile & F,unsigned ClientLoadCapabilities)6029 llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
6030                                           unsigned ClientLoadCapabilities) {
6031   // Enter the submodule block.
6032   if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID))
6033     return Err;
6034 
6035   ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6036   bool KnowsTopLevelModule = ModMap.findModule(F.ModuleName) != nullptr;
6037   // If we don't know the top-level module, there's no point in doing qualified
6038   // lookup of its submodules; it won't find anything anywhere within this tree.
6039   // Let's skip that and avoid some string lookups.
6040   auto CreateModule = !KnowsTopLevelModule
6041                           ? &ModuleMap::createModule
6042                           : &ModuleMap::findOrCreateModuleFirst;
6043 
6044   bool First = true;
6045   Module *CurrentModule = nullptr;
6046   RecordData Record;
6047   while (true) {
6048     Expected<llvm::BitstreamEntry> MaybeEntry =
6049         F.Stream.advanceSkippingSubblocks();
6050     if (!MaybeEntry)
6051       return MaybeEntry.takeError();
6052     llvm::BitstreamEntry Entry = MaybeEntry.get();
6053 
6054     switch (Entry.Kind) {
6055     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
6056     case llvm::BitstreamEntry::Error:
6057       return llvm::createStringError(std::errc::illegal_byte_sequence,
6058                                      "malformed block record in AST file");
6059     case llvm::BitstreamEntry::EndBlock:
6060       return llvm::Error::success();
6061     case llvm::BitstreamEntry::Record:
6062       // The interesting case.
6063       break;
6064     }
6065 
6066     // Read a record.
6067     StringRef Blob;
6068     Record.clear();
6069     Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob);
6070     if (!MaybeKind)
6071       return MaybeKind.takeError();
6072     unsigned Kind = MaybeKind.get();
6073 
6074     if ((Kind == SUBMODULE_METADATA) != First)
6075       return llvm::createStringError(
6076           std::errc::illegal_byte_sequence,
6077           "submodule metadata record should be at beginning of block");
6078     First = false;
6079 
6080     // Submodule information is only valid if we have a current module.
6081     // FIXME: Should we error on these cases?
6082     if (!CurrentModule && Kind != SUBMODULE_METADATA &&
6083         Kind != SUBMODULE_DEFINITION)
6084       continue;
6085 
6086     switch (Kind) {
6087     default:  // Default behavior: ignore.
6088       break;
6089 
6090     case SUBMODULE_DEFINITION: {
6091       if (Record.size() < 13)
6092         return llvm::createStringError(std::errc::illegal_byte_sequence,
6093                                        "malformed module definition");
6094 
6095       StringRef Name = Blob;
6096       unsigned Idx = 0;
6097       SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
6098       SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
6099       Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
6100       SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
6101       FileID InferredAllowedBy = ReadFileID(F, Record, Idx);
6102       bool IsFramework = Record[Idx++];
6103       bool IsExplicit = Record[Idx++];
6104       bool IsSystem = Record[Idx++];
6105       bool IsExternC = Record[Idx++];
6106       bool InferSubmodules = Record[Idx++];
6107       bool InferExplicitSubmodules = Record[Idx++];
6108       bool InferExportWildcard = Record[Idx++];
6109       bool ConfigMacrosExhaustive = Record[Idx++];
6110       bool ModuleMapIsPrivate = Record[Idx++];
6111       bool NamedModuleHasInit = Record[Idx++];
6112 
6113       Module *ParentModule = nullptr;
6114       if (Parent)
6115         ParentModule = getSubmodule(Parent);
6116 
6117       CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6118                                   IsFramework, IsExplicit);
6119 
6120       SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
6121       if (GlobalIndex >= SubmodulesLoaded.size() ||
6122           SubmodulesLoaded[GlobalIndex])
6123         return llvm::createStringError(std::errc::invalid_argument,
6124                                        "too many submodules");
6125 
6126       if (!ParentModule) {
6127         if (OptionalFileEntryRef CurFile = CurrentModule->getASTFile()) {
6128           // Don't emit module relocation error if we have -fno-validate-pch
6129           if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6130                     DisableValidationForModuleKind::Module)) {
6131             assert(CurFile != F.File && "ModuleManager did not de-duplicate");
6132 
6133             Diag(diag::err_module_file_conflict)
6134                 << CurrentModule->getTopLevelModuleName() << CurFile->getName()
6135                 << F.File.getName();
6136 
6137             auto CurModMapFile =
6138                 ModMap.getContainingModuleMapFile(CurrentModule);
6139             auto ModMapFile = FileMgr.getOptionalFileRef(F.ModuleMapPath);
6140             if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6141               Diag(diag::note_module_file_conflict)
6142                   << CurModMapFile->getName() << ModMapFile->getName();
6143 
6144             return llvm::make_error<AlreadyReportedDiagnosticError>();
6145           }
6146         }
6147 
6148         F.DidReadTopLevelSubmodule = true;
6149         CurrentModule->setASTFile(F.File);
6150         CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
6151       }
6152 
6153       CurrentModule->Kind = Kind;
6154       // Note that we may be rewriting an existing location and it is important
6155       // to keep doing that. In particular, we would like to prefer a
6156       // `DefinitionLoc` loaded from the module file instead of the location
6157       // created in the current source manager, because it allows the new
6158       // location to be marked as "unaffecting" when writing and avoid creating
6159       // duplicate locations for the same module map file.
6160       CurrentModule->DefinitionLoc = DefinitionLoc;
6161       CurrentModule->Signature = F.Signature;
6162       CurrentModule->IsFromModuleFile = true;
6163       if (InferredAllowedBy.isValid())
6164         ModMap.setInferredModuleAllowedBy(CurrentModule, InferredAllowedBy);
6165       CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
6166       CurrentModule->IsExternC = IsExternC;
6167       CurrentModule->InferSubmodules = InferSubmodules;
6168       CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
6169       CurrentModule->InferExportWildcard = InferExportWildcard;
6170       CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
6171       CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
6172       CurrentModule->NamedModuleHasInit = NamedModuleHasInit;
6173       if (DeserializationListener)
6174         DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6175 
6176       SubmodulesLoaded[GlobalIndex] = CurrentModule;
6177 
6178       // Clear out data that will be replaced by what is in the module file.
6179       CurrentModule->LinkLibraries.clear();
6180       CurrentModule->ConfigMacros.clear();
6181       CurrentModule->UnresolvedConflicts.clear();
6182       CurrentModule->Conflicts.clear();
6183 
6184       // The module is available unless it's missing a requirement; relevant
6185       // requirements will be (re-)added by SUBMODULE_REQUIRES records.
6186       // Missing headers that were present when the module was built do not
6187       // make it unavailable -- if we got this far, this must be an explicitly
6188       // imported module file.
6189       CurrentModule->Requirements.clear();
6190       CurrentModule->MissingHeaders.clear();
6191       CurrentModule->IsUnimportable =
6192           ParentModule && ParentModule->IsUnimportable;
6193       CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
6194       break;
6195     }
6196 
6197     case SUBMODULE_UMBRELLA_HEADER: {
6198       // FIXME: This doesn't work for framework modules as `Filename` is the
6199       //        name as written in the module file and does not include
6200       //        `Headers/`, so this path will never exist.
6201       auto Filename = ResolveImportedPath(PathBuf, Blob, F);
6202       if (auto Umbrella = PP.getFileManager().getOptionalFileRef(*Filename)) {
6203         if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
6204           // FIXME: NameAsWritten
6205           ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob, "");
6206         }
6207         // Note that it's too late at this point to return out of date if the
6208         // name from the PCM doesn't match up with the one in the module map,
6209         // but also quite unlikely since we will have already checked the
6210         // modification time and size of the module map file itself.
6211       }
6212       break;
6213     }
6214 
6215     case SUBMODULE_HEADER:
6216     case SUBMODULE_EXCLUDED_HEADER:
6217     case SUBMODULE_PRIVATE_HEADER:
6218       // We lazily associate headers with their modules via the HeaderInfo table.
6219       // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
6220       // of complete filenames or remove it entirely.
6221       break;
6222 
6223     case SUBMODULE_TEXTUAL_HEADER:
6224     case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
6225       // FIXME: Textual headers are not marked in the HeaderInfo table. Load
6226       // them here.
6227       break;
6228 
6229     case SUBMODULE_TOPHEADER: {
6230       auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6231       CurrentModule->addTopHeaderFilename(*HeaderName);
6232       break;
6233     }
6234 
6235     case SUBMODULE_UMBRELLA_DIR: {
6236       // See comments in SUBMODULE_UMBRELLA_HEADER
6237       auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6238       if (auto Umbrella =
6239               PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6240         if (!CurrentModule->getUmbrellaDirAsWritten()) {
6241           // FIXME: NameAsWritten
6242           ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
6243         }
6244       }
6245       break;
6246     }
6247 
6248     case SUBMODULE_METADATA: {
6249       F.BaseSubmoduleID = getTotalNumSubmodules();
6250       F.LocalNumSubmodules = Record[0];
6251       unsigned LocalBaseSubmoduleID = Record[1];
6252       if (F.LocalNumSubmodules > 0) {
6253         // Introduce the global -> local mapping for submodules within this
6254         // module.
6255         GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6256 
6257         // Introduce the local -> global mapping for submodules within this
6258         // module.
6259         F.SubmoduleRemap.insertOrReplace(
6260           std::make_pair(LocalBaseSubmoduleID,
6261                          F.BaseSubmoduleID - LocalBaseSubmoduleID));
6262 
6263         SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
6264       }
6265       break;
6266     }
6267 
6268     case SUBMODULE_IMPORTS:
6269       for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6270         UnresolvedModuleRef Unresolved;
6271         Unresolved.File = &F;
6272         Unresolved.Mod = CurrentModule;
6273         Unresolved.ID = Record[Idx];
6274         Unresolved.Kind = UnresolvedModuleRef::Import;
6275         Unresolved.IsWildcard = false;
6276         UnresolvedModuleRefs.push_back(Unresolved);
6277       }
6278       break;
6279 
6280     case SUBMODULE_AFFECTING_MODULES:
6281       for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
6282         UnresolvedModuleRef Unresolved;
6283         Unresolved.File = &F;
6284         Unresolved.Mod = CurrentModule;
6285         Unresolved.ID = Record[Idx];
6286         Unresolved.Kind = UnresolvedModuleRef::Affecting;
6287         Unresolved.IsWildcard = false;
6288         UnresolvedModuleRefs.push_back(Unresolved);
6289       }
6290       break;
6291 
6292     case SUBMODULE_EXPORTS:
6293       for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
6294         UnresolvedModuleRef Unresolved;
6295         Unresolved.File = &F;
6296         Unresolved.Mod = CurrentModule;
6297         Unresolved.ID = Record[Idx];
6298         Unresolved.Kind = UnresolvedModuleRef::Export;
6299         Unresolved.IsWildcard = Record[Idx + 1];
6300         UnresolvedModuleRefs.push_back(Unresolved);
6301       }
6302 
6303       // Once we've loaded the set of exports, there's no reason to keep
6304       // the parsed, unresolved exports around.
6305       CurrentModule->UnresolvedExports.clear();
6306       break;
6307 
6308     case SUBMODULE_REQUIRES:
6309       CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
6310                                     PP.getTargetInfo());
6311       break;
6312 
6313     case SUBMODULE_LINK_LIBRARY:
6314       ModMap.resolveLinkAsDependencies(CurrentModule);
6315       CurrentModule->LinkLibraries.push_back(
6316           Module::LinkLibrary(std::string(Blob), Record[0]));
6317       break;
6318 
6319     case SUBMODULE_CONFIG_MACRO:
6320       CurrentModule->ConfigMacros.push_back(Blob.str());
6321       break;
6322 
6323     case SUBMODULE_CONFLICT: {
6324       UnresolvedModuleRef Unresolved;
6325       Unresolved.File = &F;
6326       Unresolved.Mod = CurrentModule;
6327       Unresolved.ID = Record[0];
6328       Unresolved.Kind = UnresolvedModuleRef::Conflict;
6329       Unresolved.IsWildcard = false;
6330       Unresolved.String = Blob;
6331       UnresolvedModuleRefs.push_back(Unresolved);
6332       break;
6333     }
6334 
6335     case SUBMODULE_INITIALIZERS: {
6336       if (!ContextObj)
6337         break;
6338       SmallVector<GlobalDeclID, 16> Inits;
6339       for (unsigned I = 0; I < Record.size(); /*in loop*/)
6340         Inits.push_back(ReadDeclID(F, Record, I));
6341       ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6342       break;
6343     }
6344 
6345     case SUBMODULE_EXPORT_AS:
6346       CurrentModule->ExportAsModule = Blob.str();
6347       ModMap.addLinkAsDependency(CurrentModule);
6348       break;
6349     }
6350   }
6351 }
6352 
6353 /// Parse the record that corresponds to a LangOptions data
6354 /// structure.
6355 ///
6356 /// This routine parses the language options from the AST file and then gives
6357 /// them to the AST listener if one is set.
6358 ///
6359 /// \returns true if the listener deems the file unacceptable, false otherwise.
ParseLanguageOptions(const RecordData & Record,StringRef ModuleFilename,bool Complain,ASTReaderListener & Listener,bool AllowCompatibleDifferences)6360 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
6361                                      StringRef ModuleFilename, bool Complain,
6362                                      ASTReaderListener &Listener,
6363                                      bool AllowCompatibleDifferences) {
6364   LangOptions LangOpts;
6365   unsigned Idx = 0;
6366 #define LANGOPT(Name, Bits, Default, Compatibility, Description)               \
6367   LangOpts.Name = Record[Idx++];
6368 #define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description)    \
6369   LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6370 #include "clang/Basic/LangOptions.def"
6371 #define SANITIZER(NAME, ID)                                                    \
6372   LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6373 #include "clang/Basic/Sanitizers.def"
6374 
6375   for (unsigned N = Record[Idx++]; N; --N)
6376     LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
6377 
6378   ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
6379   VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
6380   LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6381 
6382   LangOpts.CurrentModule = ReadString(Record, Idx);
6383 
6384   // Comment options.
6385   for (unsigned N = Record[Idx++]; N; --N) {
6386     LangOpts.CommentOpts.BlockCommandNames.push_back(
6387       ReadString(Record, Idx));
6388   }
6389   LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
6390 
6391   // OpenMP offloading options.
6392   for (unsigned N = Record[Idx++]; N; --N) {
6393     LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
6394   }
6395 
6396   LangOpts.OMPHostIRFile = ReadString(Record, Idx);
6397 
6398   return Listener.ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
6399                                       AllowCompatibleDifferences);
6400 }
6401 
ParseTargetOptions(const RecordData & Record,StringRef ModuleFilename,bool Complain,ASTReaderListener & Listener,bool AllowCompatibleDifferences)6402 bool ASTReader::ParseTargetOptions(const RecordData &Record,
6403                                    StringRef ModuleFilename, bool Complain,
6404                                    ASTReaderListener &Listener,
6405                                    bool AllowCompatibleDifferences) {
6406   unsigned Idx = 0;
6407   TargetOptions TargetOpts;
6408   TargetOpts.Triple = ReadString(Record, Idx);
6409   TargetOpts.CPU = ReadString(Record, Idx);
6410   TargetOpts.TuneCPU = ReadString(Record, Idx);
6411   TargetOpts.ABI = ReadString(Record, Idx);
6412   for (unsigned N = Record[Idx++]; N; --N) {
6413     TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
6414   }
6415   for (unsigned N = Record[Idx++]; N; --N) {
6416     TargetOpts.Features.push_back(ReadString(Record, Idx));
6417   }
6418 
6419   return Listener.ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
6420                                     AllowCompatibleDifferences);
6421 }
6422 
ParseDiagnosticOptions(const RecordData & Record,StringRef ModuleFilename,bool Complain,ASTReaderListener & Listener)6423 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record,
6424                                        StringRef ModuleFilename, bool Complain,
6425                                        ASTReaderListener &Listener) {
6426   DiagnosticOptions DiagOpts;
6427   unsigned Idx = 0;
6428 #define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6429 #define ENUM_DIAGOPT(Name, Type, Bits, Default)                                \
6430   DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6431 #include "clang/Basic/DiagnosticOptions.def"
6432 
6433   for (unsigned N = Record[Idx++]; N; --N)
6434     DiagOpts.Warnings.push_back(ReadString(Record, Idx));
6435   for (unsigned N = Record[Idx++]; N; --N)
6436     DiagOpts.Remarks.push_back(ReadString(Record, Idx));
6437 
6438   return Listener.ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
6439 }
6440 
ParseFileSystemOptions(const RecordData & Record,bool Complain,ASTReaderListener & Listener)6441 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
6442                                        ASTReaderListener &Listener) {
6443   FileSystemOptions FSOpts;
6444   unsigned Idx = 0;
6445   FSOpts.WorkingDir = ReadString(Record, Idx);
6446   return Listener.ReadFileSystemOptions(FSOpts, Complain);
6447 }
6448 
ParseHeaderSearchOptions(const RecordData & Record,StringRef ModuleFilename,bool Complain,ASTReaderListener & Listener)6449 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
6450                                          StringRef ModuleFilename,
6451                                          bool Complain,
6452                                          ASTReaderListener &Listener) {
6453   HeaderSearchOptions HSOpts;
6454   unsigned Idx = 0;
6455   HSOpts.Sysroot = ReadString(Record, Idx);
6456 
6457   HSOpts.ResourceDir = ReadString(Record, Idx);
6458   HSOpts.ModuleCachePath = ReadString(Record, Idx);
6459   HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
6460   HSOpts.DisableModuleHash = Record[Idx++];
6461   HSOpts.ImplicitModuleMaps = Record[Idx++];
6462   HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
6463   HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
6464   HSOpts.UseBuiltinIncludes = Record[Idx++];
6465   HSOpts.UseStandardSystemIncludes = Record[Idx++];
6466   HSOpts.UseStandardCXXIncludes = Record[Idx++];
6467   HSOpts.UseLibcxx = Record[Idx++];
6468   std::string SpecificModuleCachePath = ReadString(Record, Idx);
6469 
6470   return Listener.ReadHeaderSearchOptions(HSOpts, ModuleFilename,
6471                                           SpecificModuleCachePath, Complain);
6472 }
6473 
ParseHeaderSearchPaths(const RecordData & Record,bool Complain,ASTReaderListener & Listener)6474 bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
6475                                        ASTReaderListener &Listener) {
6476   HeaderSearchOptions HSOpts;
6477   unsigned Idx = 0;
6478 
6479   // Include entries.
6480   for (unsigned N = Record[Idx++]; N; --N) {
6481     std::string Path = ReadString(Record, Idx);
6482     frontend::IncludeDirGroup Group
6483       = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
6484     bool IsFramework = Record[Idx++];
6485     bool IgnoreSysRoot = Record[Idx++];
6486     HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6487                                     IgnoreSysRoot);
6488   }
6489 
6490   // System header prefixes.
6491   for (unsigned N = Record[Idx++]; N; --N) {
6492     std::string Prefix = ReadString(Record, Idx);
6493     bool IsSystemHeader = Record[Idx++];
6494     HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
6495   }
6496 
6497   // VFS overlay files.
6498   for (unsigned N = Record[Idx++]; N; --N) {
6499     std::string VFSOverlayFile = ReadString(Record, Idx);
6500     HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6501   }
6502 
6503   return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
6504 }
6505 
ParsePreprocessorOptions(const RecordData & Record,StringRef ModuleFilename,bool Complain,ASTReaderListener & Listener,std::string & SuggestedPredefines)6506 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
6507                                          StringRef ModuleFilename,
6508                                          bool Complain,
6509                                          ASTReaderListener &Listener,
6510                                          std::string &SuggestedPredefines) {
6511   PreprocessorOptions PPOpts;
6512   unsigned Idx = 0;
6513 
6514   // Macro definitions/undefs
6515   bool ReadMacros = Record[Idx++];
6516   if (ReadMacros) {
6517     for (unsigned N = Record[Idx++]; N; --N) {
6518       std::string Macro = ReadString(Record, Idx);
6519       bool IsUndef = Record[Idx++];
6520       PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
6521     }
6522   }
6523 
6524   // Includes
6525   for (unsigned N = Record[Idx++]; N; --N) {
6526     PPOpts.Includes.push_back(ReadString(Record, Idx));
6527   }
6528 
6529   // Macro Includes
6530   for (unsigned N = Record[Idx++]; N; --N) {
6531     PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
6532   }
6533 
6534   PPOpts.UsePredefines = Record[Idx++];
6535   PPOpts.DetailedRecord = Record[Idx++];
6536   PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
6537   PPOpts.ObjCXXARCStandardLibrary =
6538     static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
6539   SuggestedPredefines.clear();
6540   return Listener.ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
6541                                           Complain, SuggestedPredefines);
6542 }
6543 
6544 std::pair<ModuleFile *, unsigned>
getModulePreprocessedEntity(unsigned GlobalIndex)6545 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
6546   GlobalPreprocessedEntityMapType::iterator
6547   I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6548   assert(I != GlobalPreprocessedEntityMap.end() &&
6549          "Corrupted global preprocessed entity map");
6550   ModuleFile *M = I->second;
6551   unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
6552   return std::make_pair(M, LocalIndex);
6553 }
6554 
6555 llvm::iterator_range<PreprocessingRecord::iterator>
getModulePreprocessedEntities(ModuleFile & Mod) const6556 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
6557   if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6558     return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
6559                                              Mod.NumPreprocessedEntities);
6560 
6561   return llvm::make_range(PreprocessingRecord::iterator(),
6562                           PreprocessingRecord::iterator());
6563 }
6564 
canRecoverFromOutOfDate(StringRef ModuleFileName,unsigned int ClientLoadCapabilities)6565 bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6566                                         unsigned int ClientLoadCapabilities) {
6567   return ClientLoadCapabilities & ARR_OutOfDate &&
6568          !getModuleManager()
6569               .getModuleCache()
6570               .getInMemoryModuleCache()
6571               .isPCMFinal(ModuleFileName);
6572 }
6573 
6574 llvm::iterator_range<ASTReader::ModuleDeclIterator>
getModuleFileLevelDecls(ModuleFile & Mod)6575 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
6576   return llvm::make_range(
6577       ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
6578       ModuleDeclIterator(this, &Mod,
6579                          Mod.FileSortedDecls + Mod.NumFileSortedDecls));
6580 }
6581 
ReadSkippedRange(unsigned GlobalIndex)6582 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
6583   auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6584   assert(I != GlobalSkippedRangeMap.end() &&
6585     "Corrupted global skipped range map");
6586   ModuleFile *M = I->second;
6587   unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
6588   assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6589   PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
6590   SourceRange Range(ReadSourceLocation(*M, RawRange.getBegin()),
6591                     ReadSourceLocation(*M, RawRange.getEnd()));
6592   assert(Range.isValid());
6593   return Range;
6594 }
6595 
ReadPreprocessedEntity(unsigned Index)6596 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
6597   PreprocessedEntityID PPID = Index+1;
6598   std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6599   ModuleFile &M = *PPInfo.first;
6600   unsigned LocalIndex = PPInfo.second;
6601   const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6602 
6603   if (!PP.getPreprocessingRecord()) {
6604     Error("no preprocessing record");
6605     return nullptr;
6606   }
6607 
6608   SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
6609   if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
6610           M.MacroOffsetsBase + PPOffs.getOffset())) {
6611     Error(std::move(Err));
6612     return nullptr;
6613   }
6614 
6615   Expected<llvm::BitstreamEntry> MaybeEntry =
6616       M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
6617   if (!MaybeEntry) {
6618     Error(MaybeEntry.takeError());
6619     return nullptr;
6620   }
6621   llvm::BitstreamEntry Entry = MaybeEntry.get();
6622 
6623   if (Entry.Kind != llvm::BitstreamEntry::Record)
6624     return nullptr;
6625 
6626   // Read the record.
6627   SourceRange Range(ReadSourceLocation(M, PPOffs.getBegin()),
6628                     ReadSourceLocation(M, PPOffs.getEnd()));
6629   PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
6630   StringRef Blob;
6631   RecordData Record;
6632   Expected<unsigned> MaybeRecType =
6633       M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
6634   if (!MaybeRecType) {
6635     Error(MaybeRecType.takeError());
6636     return nullptr;
6637   }
6638   switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
6639   case PPD_MACRO_EXPANSION: {
6640     bool isBuiltin = Record[0];
6641     IdentifierInfo *Name = nullptr;
6642     MacroDefinitionRecord *Def = nullptr;
6643     if (isBuiltin)
6644       Name = getLocalIdentifier(M, Record[1]);
6645     else {
6646       PreprocessedEntityID GlobalID =
6647           getGlobalPreprocessedEntityID(M, Record[1]);
6648       Def = cast<MacroDefinitionRecord>(
6649           PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
6650     }
6651 
6652     MacroExpansion *ME;
6653     if (isBuiltin)
6654       ME = new (PPRec) MacroExpansion(Name, Range);
6655     else
6656       ME = new (PPRec) MacroExpansion(Def, Range);
6657 
6658     return ME;
6659   }
6660 
6661   case PPD_MACRO_DEFINITION: {
6662     // Decode the identifier info and then check again; if the macro is
6663     // still defined and associated with the identifier,
6664     IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
6665     MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
6666 
6667     if (DeserializationListener)
6668       DeserializationListener->MacroDefinitionRead(PPID, MD);
6669 
6670     return MD;
6671   }
6672 
6673   case PPD_INCLUSION_DIRECTIVE: {
6674     const char *FullFileNameStart = Blob.data() + Record[0];
6675     StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
6676     OptionalFileEntryRef File;
6677     if (!FullFileName.empty())
6678       File = PP.getFileManager().getOptionalFileRef(FullFileName);
6679 
6680     // FIXME: Stable encoding
6681     InclusionDirective::InclusionKind Kind
6682       = static_cast<InclusionDirective::InclusionKind>(Record[2]);
6683     InclusionDirective *ID
6684       = new (PPRec) InclusionDirective(PPRec, Kind,
6685                                        StringRef(Blob.data(), Record[0]),
6686                                        Record[1], Record[3],
6687                                        File,
6688                                        Range);
6689     return ID;
6690   }
6691   }
6692 
6693   llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
6694 }
6695 
6696 /// Find the next module that contains entities and return the ID
6697 /// of the first entry.
6698 ///
6699 /// \param SLocMapI points at a chunk of a module that contains no
6700 /// preprocessed entities or the entities it contains are not the ones we are
6701 /// looking for.
findNextPreprocessedEntity(GlobalSLocOffsetMapType::const_iterator SLocMapI) const6702 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
6703                        GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
6704   ++SLocMapI;
6705   for (GlobalSLocOffsetMapType::const_iterator
6706          EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6707     ModuleFile &M = *SLocMapI->second;
6708     if (M.NumPreprocessedEntities)
6709       return M.BasePreprocessedEntityID;
6710   }
6711 
6712   return getTotalNumPreprocessedEntities();
6713 }
6714 
6715 namespace {
6716 
6717 struct PPEntityComp {
6718   const ASTReader &Reader;
6719   ModuleFile &M;
6720 
PPEntityComp__anon09454b220e11::PPEntityComp6721   PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6722 
operator ()__anon09454b220e11::PPEntityComp6723   bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
6724     SourceLocation LHS = getLoc(L);
6725     SourceLocation RHS = getLoc(R);
6726     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6727   }
6728 
operator ()__anon09454b220e11::PPEntityComp6729   bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
6730     SourceLocation LHS = getLoc(L);
6731     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6732   }
6733 
operator ()__anon09454b220e11::PPEntityComp6734   bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
6735     SourceLocation RHS = getLoc(R);
6736     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6737   }
6738 
getLoc__anon09454b220e11::PPEntityComp6739   SourceLocation getLoc(const PPEntityOffset &PPE) const {
6740     return Reader.ReadSourceLocation(M, PPE.getBegin());
6741   }
6742 };
6743 
6744 } // namespace
6745 
findPreprocessedEntity(SourceLocation Loc,bool EndsAfter) const6746 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
6747                                                        bool EndsAfter) const {
6748   if (SourceMgr.isLocalSourceLocation(Loc))
6749     return getTotalNumPreprocessedEntities();
6750 
6751   GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6752       SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6753   assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6754          "Corrupted global sloc offset map");
6755 
6756   if (SLocMapI->second->NumPreprocessedEntities == 0)
6757     return findNextPreprocessedEntity(SLocMapI);
6758 
6759   ModuleFile &M = *SLocMapI->second;
6760 
6761   using pp_iterator = const PPEntityOffset *;
6762 
6763   pp_iterator pp_begin = M.PreprocessedEntityOffsets;
6764   pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
6765 
6766   size_t Count = M.NumPreprocessedEntities;
6767   size_t Half;
6768   pp_iterator First = pp_begin;
6769   pp_iterator PPI;
6770 
6771   if (EndsAfter) {
6772     PPI = std::upper_bound(pp_begin, pp_end, Loc,
6773                            PPEntityComp(*this, M));
6774   } else {
6775     // Do a binary search manually instead of using std::lower_bound because
6776     // The end locations of entities may be unordered (when a macro expansion
6777     // is inside another macro argument), but for this case it is not important
6778     // whether we get the first macro expansion or its containing macro.
6779     while (Count > 0) {
6780       Half = Count / 2;
6781       PPI = First;
6782       std::advance(PPI, Half);
6783       if (SourceMgr.isBeforeInTranslationUnit(
6784               ReadSourceLocation(M, PPI->getEnd()), Loc)) {
6785         First = PPI;
6786         ++First;
6787         Count = Count - Half - 1;
6788       } else
6789         Count = Half;
6790     }
6791   }
6792 
6793   if (PPI == pp_end)
6794     return findNextPreprocessedEntity(SLocMapI);
6795 
6796   return M.BasePreprocessedEntityID + (PPI - pp_begin);
6797 }
6798 
6799 /// Returns a pair of [Begin, End) indices of preallocated
6800 /// preprocessed entities that \arg Range encompasses.
6801 std::pair<unsigned, unsigned>
findPreprocessedEntitiesInRange(SourceRange Range)6802     ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
6803   if (Range.isInvalid())
6804     return std::make_pair(0,0);
6805   assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6806 
6807   PreprocessedEntityID BeginID =
6808       findPreprocessedEntity(Range.getBegin(), false);
6809   PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
6810   return std::make_pair(BeginID, EndID);
6811 }
6812 
6813 /// Optionally returns true or false if the preallocated preprocessed
6814 /// entity with index \arg Index came from file \arg FID.
isPreprocessedEntityInFileID(unsigned Index,FileID FID)6815 std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
6816                                                             FileID FID) {
6817   if (FID.isInvalid())
6818     return false;
6819 
6820   std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6821   ModuleFile &M = *PPInfo.first;
6822   unsigned LocalIndex = PPInfo.second;
6823   const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
6824 
6825   SourceLocation Loc = ReadSourceLocation(M, PPOffs.getBegin());
6826   if (Loc.isInvalid())
6827     return false;
6828 
6829   if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6830     return true;
6831   else
6832     return false;
6833 }
6834 
6835 namespace {
6836 
6837   /// Visitor used to search for information about a header file.
6838   class HeaderFileInfoVisitor {
6839   FileEntryRef FE;
6840     std::optional<HeaderFileInfo> HFI;
6841 
6842   public:
HeaderFileInfoVisitor(FileEntryRef FE)6843     explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {}
6844 
operator ()(ModuleFile & M)6845     bool operator()(ModuleFile &M) {
6846       HeaderFileInfoLookupTable *Table
6847         = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
6848       if (!Table)
6849         return false;
6850 
6851       // Look in the on-disk hash table for an entry for this file name.
6852       HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
6853       if (Pos == Table->end())
6854         return false;
6855 
6856       HFI = *Pos;
6857       return true;
6858     }
6859 
getHeaderFileInfo() const6860     std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
6861   };
6862 
6863 } // namespace
6864 
GetHeaderFileInfo(FileEntryRef FE)6865 HeaderFileInfo ASTReader::GetHeaderFileInfo(FileEntryRef FE) {
6866   HeaderFileInfoVisitor Visitor(FE);
6867   ModuleMgr.visit(Visitor);
6868   if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
6869       return *HFI;
6870 
6871   return HeaderFileInfo();
6872 }
6873 
ReadPragmaDiagnosticMappings(DiagnosticsEngine & Diag)6874 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
6875   using DiagState = DiagnosticsEngine::DiagState;
6876   SmallVector<DiagState *, 32> DiagStates;
6877 
6878   for (ModuleFile &F : ModuleMgr) {
6879     unsigned Idx = 0;
6880     auto &Record = F.PragmaDiagMappings;
6881     if (Record.empty())
6882       continue;
6883 
6884     DiagStates.clear();
6885 
6886     auto ReadDiagState = [&](const DiagState &BasedOn,
6887                              bool IncludeNonPragmaStates) {
6888       unsigned BackrefID = Record[Idx++];
6889       if (BackrefID != 0)
6890         return DiagStates[BackrefID - 1];
6891 
6892       // A new DiagState was created here.
6893       Diag.DiagStates.push_back(BasedOn);
6894       DiagState *NewState = &Diag.DiagStates.back();
6895       DiagStates.push_back(NewState);
6896       unsigned Size = Record[Idx++];
6897       assert(Idx + Size * 2 <= Record.size() &&
6898              "Invalid data, not enough diag/map pairs");
6899       while (Size--) {
6900         unsigned DiagID = Record[Idx++];
6901         DiagnosticMapping NewMapping =
6902             DiagnosticMapping::deserialize(Record[Idx++]);
6903         if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
6904           continue;
6905 
6906         DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
6907 
6908         // If this mapping was specified as a warning but the severity was
6909         // upgraded due to diagnostic settings, simulate the current diagnostic
6910         // settings (and use a warning).
6911         if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
6912           NewMapping.setSeverity(diag::Severity::Warning);
6913           NewMapping.setUpgradedFromWarning(false);
6914         }
6915 
6916         Mapping = NewMapping;
6917       }
6918       return NewState;
6919     };
6920 
6921     // Read the first state.
6922     DiagState *FirstState;
6923     if (F.Kind == MK_ImplicitModule) {
6924       // Implicitly-built modules are reused with different diagnostic
6925       // settings.  Use the initial diagnostic state from Diag to simulate this
6926       // compilation's diagnostic settings.
6927       FirstState = Diag.DiagStatesByLoc.FirstDiagState;
6928       DiagStates.push_back(FirstState);
6929 
6930       // Skip the initial diagnostic state from the serialized module.
6931       assert(Record[1] == 0 &&
6932              "Invalid data, unexpected backref in initial state");
6933       Idx = 3 + Record[2] * 2;
6934       assert(Idx < Record.size() &&
6935              "Invalid data, not enough state change pairs in initial state");
6936     } else if (F.isModule()) {
6937       // For an explicit module, preserve the flags from the module build
6938       // command line (-w, -Weverything, -Werror, ...) along with any explicit
6939       // -Wblah flags.
6940       unsigned Flags = Record[Idx++];
6941       DiagState Initial(*Diag.getDiagnosticIDs());
6942       Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
6943       Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
6944       Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
6945       Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
6946       Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
6947       Initial.ExtBehavior = (diag::Severity)Flags;
6948       FirstState = ReadDiagState(Initial, true);
6949 
6950       assert(F.OriginalSourceFileID.isValid());
6951 
6952       // Set up the root buffer of the module to start with the initial
6953       // diagnostic state of the module itself, to cover files that contain no
6954       // explicit transitions (for which we did not serialize anything).
6955       Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
6956           .StateTransitions.push_back({FirstState, 0});
6957     } else {
6958       // For prefix ASTs, start with whatever the user configured on the
6959       // command line.
6960       Idx++; // Skip flags.
6961       FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
6962     }
6963 
6964     // Read the state transitions.
6965     unsigned NumLocations = Record[Idx++];
6966     while (NumLocations--) {
6967       assert(Idx < Record.size() &&
6968              "Invalid data, missing pragma diagnostic states");
6969       FileID FID = ReadFileID(F, Record, Idx);
6970       assert(FID.isValid() && "invalid FileID for transition");
6971       unsigned Transitions = Record[Idx++];
6972 
6973       // Note that we don't need to set up Parent/ParentOffset here, because
6974       // we won't be changing the diagnostic state within imported FileIDs
6975       // (other than perhaps appending to the main source file, which has no
6976       // parent).
6977       auto &F = Diag.DiagStatesByLoc.Files[FID];
6978       F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
6979       for (unsigned I = 0; I != Transitions; ++I) {
6980         unsigned Offset = Record[Idx++];
6981         auto *State = ReadDiagState(*FirstState, false);
6982         F.StateTransitions.push_back({State, Offset});
6983       }
6984     }
6985 
6986     // Read the final state.
6987     assert(Idx < Record.size() &&
6988            "Invalid data, missing final pragma diagnostic state");
6989     SourceLocation CurStateLoc = ReadSourceLocation(F, Record[Idx++]);
6990     auto *CurState = ReadDiagState(*FirstState, false);
6991 
6992     if (!F.isModule()) {
6993       Diag.DiagStatesByLoc.CurDiagState = CurState;
6994       Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
6995 
6996       // Preserve the property that the imaginary root file describes the
6997       // current state.
6998       FileID NullFile;
6999       auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7000       if (T.empty())
7001         T.push_back({CurState, 0});
7002       else
7003         T[0].State = CurState;
7004     }
7005 
7006     // Don't try to read these mappings again.
7007     Record.clear();
7008   }
7009 }
7010 
7011 /// Get the correct cursor and offset for loading a type.
TypeCursorForIndex(TypeID ID)7012 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(TypeID ID) {
7013   auto [M, Index] = translateTypeIDToIndex(ID);
7014   return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex].get() +
7015                                M->DeclsBlockStartOffset);
7016 }
7017 
getTypeClassForCode(TypeCode code)7018 static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
7019   switch (code) {
7020 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7021   case TYPE_##CODE_ID: return Type::CLASS_ID;
7022 #include "clang/Serialization/TypeBitCodes.def"
7023   default:
7024     return std::nullopt;
7025   }
7026 }
7027 
7028 /// Read and return the type with the given index..
7029 ///
7030 /// The index is the type ID, shifted and minus the number of predefs. This
7031 /// routine actually reads the record corresponding to the type at the given
7032 /// location. It is a helper routine for GetType, which deals with reading type
7033 /// IDs.
readTypeRecord(TypeID ID)7034 QualType ASTReader::readTypeRecord(TypeID ID) {
7035   assert(ContextObj && "reading type with no AST context");
7036   ASTContext &Context = *ContextObj;
7037   RecordLocation Loc = TypeCursorForIndex(ID);
7038   BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7039 
7040   // Keep track of where we are in the stream, then jump back there
7041   // after reading this type.
7042   SavedStreamPosition SavedPosition(DeclsCursor);
7043 
7044   ReadingKindTracker ReadingKind(Read_Type, *this);
7045 
7046   // Note that we are loading a type record.
7047   Deserializing AType(this);
7048 
7049   if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7050     Error(std::move(Err));
7051     return QualType();
7052   }
7053   Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7054   if (!RawCode) {
7055     Error(RawCode.takeError());
7056     return QualType();
7057   }
7058 
7059   ASTRecordReader Record(*this, *Loc.F);
7060   Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
7061   if (!Code) {
7062     Error(Code.takeError());
7063     return QualType();
7064   }
7065   if (Code.get() == TYPE_EXT_QUAL) {
7066     QualType baseType = Record.readQualType();
7067     Qualifiers quals = Record.readQualifiers();
7068     return Context.getQualifiedType(baseType, quals);
7069   }
7070 
7071   auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
7072   if (!maybeClass) {
7073     Error("Unexpected code for type");
7074     return QualType();
7075   }
7076 
7077   serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
7078   return TypeReader.read(*maybeClass);
7079 }
7080 
7081 namespace clang {
7082 
7083 class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
7084   ASTRecordReader &Reader;
7085 
readSourceLocation()7086   SourceLocation readSourceLocation() { return Reader.readSourceLocation(); }
readSourceRange()7087   SourceRange readSourceRange() { return Reader.readSourceRange(); }
7088 
GetTypeSourceInfo()7089   TypeSourceInfo *GetTypeSourceInfo() {
7090     return Reader.readTypeSourceInfo();
7091   }
7092 
ReadNestedNameSpecifierLoc()7093   NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
7094     return Reader.readNestedNameSpecifierLoc();
7095   }
7096 
ReadAttr()7097   Attr *ReadAttr() {
7098     return Reader.readAttr();
7099   }
7100 
7101 public:
TypeLocReader(ASTRecordReader & Reader)7102   TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {}
7103 
7104   // We want compile-time assurance that we've enumerated all of
7105   // these, so unfortunately we have to declare them first, then
7106   // define them out-of-line.
7107 #define ABSTRACT_TYPELOC(CLASS, PARENT)
7108 #define TYPELOC(CLASS, PARENT) \
7109   void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7110 #include "clang/AST/TypeLocNodes.def"
7111 
7112   void VisitFunctionTypeLoc(FunctionTypeLoc);
7113   void VisitArrayTypeLoc(ArrayTypeLoc);
7114 };
7115 
7116 } // namespace clang
7117 
VisitQualifiedTypeLoc(QualifiedTypeLoc TL)7118 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7119   // nothing to do
7120 }
7121 
VisitBuiltinTypeLoc(BuiltinTypeLoc TL)7122 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7123   TL.setBuiltinLoc(readSourceLocation());
7124   if (TL.needsExtraLocalData()) {
7125     TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
7126     TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
7127     TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
7128     TL.setModeAttr(Reader.readInt());
7129   }
7130 }
7131 
VisitComplexTypeLoc(ComplexTypeLoc TL)7132 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7133   TL.setNameLoc(readSourceLocation());
7134 }
7135 
VisitPointerTypeLoc(PointerTypeLoc TL)7136 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7137   TL.setStarLoc(readSourceLocation());
7138 }
7139 
VisitDecayedTypeLoc(DecayedTypeLoc TL)7140 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7141   // nothing to do
7142 }
7143 
VisitAdjustedTypeLoc(AdjustedTypeLoc TL)7144 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7145   // nothing to do
7146 }
7147 
VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL)7148 void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7149   // nothing to do
7150 }
7151 
VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL)7152 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7153   TL.setExpansionLoc(readSourceLocation());
7154 }
7155 
VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL)7156 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7157   TL.setCaretLoc(readSourceLocation());
7158 }
7159 
VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL)7160 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7161   TL.setAmpLoc(readSourceLocation());
7162 }
7163 
VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL)7164 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7165   TL.setAmpAmpLoc(readSourceLocation());
7166 }
7167 
VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL)7168 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7169   TL.setStarLoc(readSourceLocation());
7170   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7171 }
7172 
VisitArrayTypeLoc(ArrayTypeLoc TL)7173 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
7174   TL.setLBracketLoc(readSourceLocation());
7175   TL.setRBracketLoc(readSourceLocation());
7176   if (Reader.readBool())
7177     TL.setSizeExpr(Reader.readExpr());
7178   else
7179     TL.setSizeExpr(nullptr);
7180 }
7181 
VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL)7182 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
7183   VisitArrayTypeLoc(TL);
7184 }
7185 
VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL)7186 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
7187   VisitArrayTypeLoc(TL);
7188 }
7189 
VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL)7190 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7191   VisitArrayTypeLoc(TL);
7192 }
7193 
VisitDependentSizedArrayTypeLoc(DependentSizedArrayTypeLoc TL)7194 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7195                                             DependentSizedArrayTypeLoc TL) {
7196   VisitArrayTypeLoc(TL);
7197 }
7198 
VisitDependentAddressSpaceTypeLoc(DependentAddressSpaceTypeLoc TL)7199 void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7200     DependentAddressSpaceTypeLoc TL) {
7201 
7202     TL.setAttrNameLoc(readSourceLocation());
7203     TL.setAttrOperandParensRange(readSourceRange());
7204     TL.setAttrExprOperand(Reader.readExpr());
7205 }
7206 
VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL)7207 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7208                                         DependentSizedExtVectorTypeLoc TL) {
7209   TL.setNameLoc(readSourceLocation());
7210 }
7211 
VisitVectorTypeLoc(VectorTypeLoc TL)7212 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7213   TL.setNameLoc(readSourceLocation());
7214 }
7215 
VisitDependentVectorTypeLoc(DependentVectorTypeLoc TL)7216 void TypeLocReader::VisitDependentVectorTypeLoc(
7217     DependentVectorTypeLoc TL) {
7218   TL.setNameLoc(readSourceLocation());
7219 }
7220 
VisitExtVectorTypeLoc(ExtVectorTypeLoc TL)7221 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7222   TL.setNameLoc(readSourceLocation());
7223 }
7224 
VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL)7225 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7226   TL.setAttrNameLoc(readSourceLocation());
7227   TL.setAttrOperandParensRange(readSourceRange());
7228   TL.setAttrRowOperand(Reader.readExpr());
7229   TL.setAttrColumnOperand(Reader.readExpr());
7230 }
7231 
VisitDependentSizedMatrixTypeLoc(DependentSizedMatrixTypeLoc TL)7232 void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7233     DependentSizedMatrixTypeLoc TL) {
7234   TL.setAttrNameLoc(readSourceLocation());
7235   TL.setAttrOperandParensRange(readSourceRange());
7236   TL.setAttrRowOperand(Reader.readExpr());
7237   TL.setAttrColumnOperand(Reader.readExpr());
7238 }
7239 
VisitFunctionTypeLoc(FunctionTypeLoc TL)7240 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
7241   TL.setLocalRangeBegin(readSourceLocation());
7242   TL.setLParenLoc(readSourceLocation());
7243   TL.setRParenLoc(readSourceLocation());
7244   TL.setExceptionSpecRange(readSourceRange());
7245   TL.setLocalRangeEnd(readSourceLocation());
7246   for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
7247     TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
7248   }
7249 }
7250 
VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL)7251 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
7252   VisitFunctionTypeLoc(TL);
7253 }
7254 
VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL)7255 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
7256   VisitFunctionTypeLoc(TL);
7257 }
7258 
VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL)7259 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7260   TL.setNameLoc(readSourceLocation());
7261 }
7262 
VisitUsingTypeLoc(UsingTypeLoc TL)7263 void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7264   TL.setNameLoc(readSourceLocation());
7265 }
7266 
VisitTypedefTypeLoc(TypedefTypeLoc TL)7267 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7268   TL.setNameLoc(readSourceLocation());
7269 }
7270 
VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL)7271 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7272   TL.setTypeofLoc(readSourceLocation());
7273   TL.setLParenLoc(readSourceLocation());
7274   TL.setRParenLoc(readSourceLocation());
7275 }
7276 
VisitTypeOfTypeLoc(TypeOfTypeLoc TL)7277 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7278   TL.setTypeofLoc(readSourceLocation());
7279   TL.setLParenLoc(readSourceLocation());
7280   TL.setRParenLoc(readSourceLocation());
7281   TL.setUnmodifiedTInfo(GetTypeSourceInfo());
7282 }
7283 
VisitDecltypeTypeLoc(DecltypeTypeLoc TL)7284 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7285   TL.setDecltypeLoc(readSourceLocation());
7286   TL.setRParenLoc(readSourceLocation());
7287 }
7288 
VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL)7289 void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7290   TL.setEllipsisLoc(readSourceLocation());
7291 }
7292 
VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL)7293 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7294   TL.setKWLoc(readSourceLocation());
7295   TL.setLParenLoc(readSourceLocation());
7296   TL.setRParenLoc(readSourceLocation());
7297   TL.setUnderlyingTInfo(GetTypeSourceInfo());
7298 }
7299 
readConceptReference()7300 ConceptReference *ASTRecordReader::readConceptReference() {
7301   auto NNS = readNestedNameSpecifierLoc();
7302   auto TemplateKWLoc = readSourceLocation();
7303   auto ConceptNameLoc = readDeclarationNameInfo();
7304   auto FoundDecl = readDeclAs<NamedDecl>();
7305   auto NamedConcept = readDeclAs<ConceptDecl>();
7306   auto *CR = ConceptReference::Create(
7307       getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7308       (readBool() ? readASTTemplateArgumentListInfo() : nullptr));
7309   return CR;
7310 }
7311 
VisitAutoTypeLoc(AutoTypeLoc TL)7312 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
7313   TL.setNameLoc(readSourceLocation());
7314   if (Reader.readBool())
7315     TL.setConceptReference(Reader.readConceptReference());
7316   if (Reader.readBool())
7317     TL.setRParenLoc(readSourceLocation());
7318 }
7319 
VisitDeducedTemplateSpecializationTypeLoc(DeducedTemplateSpecializationTypeLoc TL)7320 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7321     DeducedTemplateSpecializationTypeLoc TL) {
7322   TL.setTemplateNameLoc(readSourceLocation());
7323 }
7324 
VisitRecordTypeLoc(RecordTypeLoc TL)7325 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
7326   TL.setNameLoc(readSourceLocation());
7327 }
7328 
VisitEnumTypeLoc(EnumTypeLoc TL)7329 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
7330   TL.setNameLoc(readSourceLocation());
7331 }
7332 
VisitAttributedTypeLoc(AttributedTypeLoc TL)7333 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7334   TL.setAttr(ReadAttr());
7335 }
7336 
VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL)7337 void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7338   // Nothing to do
7339 }
7340 
VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL)7341 void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7342   // Nothing to do.
7343 }
7344 
VisitHLSLAttributedResourceTypeLoc(HLSLAttributedResourceTypeLoc TL)7345 void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7346     HLSLAttributedResourceTypeLoc TL) {
7347   // Nothing to do.
7348 }
7349 
VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL)7350 void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7351   // Nothing to do.
7352 }
7353 
VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)7354 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7355   TL.setNameLoc(readSourceLocation());
7356 }
7357 
VisitSubstTemplateTypeParmTypeLoc(SubstTemplateTypeParmTypeLoc TL)7358 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7359                                             SubstTemplateTypeParmTypeLoc TL) {
7360   TL.setNameLoc(readSourceLocation());
7361 }
7362 
VisitSubstTemplateTypeParmPackTypeLoc(SubstTemplateTypeParmPackTypeLoc TL)7363 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7364                                           SubstTemplateTypeParmPackTypeLoc TL) {
7365   TL.setNameLoc(readSourceLocation());
7366 }
7367 
VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL)7368 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7369                                            TemplateSpecializationTypeLoc TL) {
7370   TL.setTemplateKeywordLoc(readSourceLocation());
7371   TL.setTemplateNameLoc(readSourceLocation());
7372   TL.setLAngleLoc(readSourceLocation());
7373   TL.setRAngleLoc(readSourceLocation());
7374   for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
7375     TL.setArgLocInfo(i,
7376                      Reader.readTemplateArgumentLocInfo(
7377                          TL.getTypePtr()->template_arguments()[i].getKind()));
7378 }
7379 
VisitParenTypeLoc(ParenTypeLoc TL)7380 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7381   TL.setLParenLoc(readSourceLocation());
7382   TL.setRParenLoc(readSourceLocation());
7383 }
7384 
VisitElaboratedTypeLoc(ElaboratedTypeLoc TL)7385 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
7386   TL.setElaboratedKeywordLoc(readSourceLocation());
7387   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7388 }
7389 
VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL)7390 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
7391   TL.setNameLoc(readSourceLocation());
7392 }
7393 
VisitDependentNameTypeLoc(DependentNameTypeLoc TL)7394 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7395   TL.setElaboratedKeywordLoc(readSourceLocation());
7396   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7397   TL.setNameLoc(readSourceLocation());
7398 }
7399 
VisitDependentTemplateSpecializationTypeLoc(DependentTemplateSpecializationTypeLoc TL)7400 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
7401        DependentTemplateSpecializationTypeLoc TL) {
7402   TL.setElaboratedKeywordLoc(readSourceLocation());
7403   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
7404   TL.setTemplateKeywordLoc(readSourceLocation());
7405   TL.setTemplateNameLoc(readSourceLocation());
7406   TL.setLAngleLoc(readSourceLocation());
7407   TL.setRAngleLoc(readSourceLocation());
7408   for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
7409     TL.setArgLocInfo(I,
7410                      Reader.readTemplateArgumentLocInfo(
7411                          TL.getTypePtr()->template_arguments()[I].getKind()));
7412 }
7413 
VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL)7414 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7415   TL.setEllipsisLoc(readSourceLocation());
7416 }
7417 
VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL)7418 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7419   TL.setNameLoc(readSourceLocation());
7420   TL.setNameEndLoc(readSourceLocation());
7421 }
7422 
VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL)7423 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7424   if (TL.getNumProtocols()) {
7425     TL.setProtocolLAngleLoc(readSourceLocation());
7426     TL.setProtocolRAngleLoc(readSourceLocation());
7427   }
7428   for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7429     TL.setProtocolLoc(i, readSourceLocation());
7430 }
7431 
VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL)7432 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7433   TL.setHasBaseTypeAsWritten(Reader.readBool());
7434   TL.setTypeArgsLAngleLoc(readSourceLocation());
7435   TL.setTypeArgsRAngleLoc(readSourceLocation());
7436   for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
7437     TL.setTypeArgTInfo(i, GetTypeSourceInfo());
7438   TL.setProtocolLAngleLoc(readSourceLocation());
7439   TL.setProtocolRAngleLoc(readSourceLocation());
7440   for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
7441     TL.setProtocolLoc(i, readSourceLocation());
7442 }
7443 
VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL)7444 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7445   TL.setStarLoc(readSourceLocation());
7446 }
7447 
VisitAtomicTypeLoc(AtomicTypeLoc TL)7448 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7449   TL.setKWLoc(readSourceLocation());
7450   TL.setLParenLoc(readSourceLocation());
7451   TL.setRParenLoc(readSourceLocation());
7452 }
7453 
VisitPipeTypeLoc(PipeTypeLoc TL)7454 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7455   TL.setKWLoc(readSourceLocation());
7456 }
7457 
VisitBitIntTypeLoc(clang::BitIntTypeLoc TL)7458 void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7459   TL.setNameLoc(readSourceLocation());
7460 }
VisitDependentBitIntTypeLoc(clang::DependentBitIntTypeLoc TL)7461 void TypeLocReader::VisitDependentBitIntTypeLoc(
7462     clang::DependentBitIntTypeLoc TL) {
7463   TL.setNameLoc(readSourceLocation());
7464 }
7465 
readTypeLoc(TypeLoc TL)7466 void ASTRecordReader::readTypeLoc(TypeLoc TL) {
7467   TypeLocReader TLR(*this);
7468   for (; !TL.isNull(); TL = TL.getNextTypeLoc())
7469     TLR.Visit(TL);
7470 }
7471 
readTypeSourceInfo()7472 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() {
7473   QualType InfoTy = readType();
7474   if (InfoTy.isNull())
7475     return nullptr;
7476 
7477   TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
7478   readTypeLoc(TInfo->getTypeLoc());
7479   return TInfo;
7480 }
7481 
getIndexForTypeID(serialization::TypeID ID)7482 static unsigned getIndexForTypeID(serialization::TypeID ID) {
7483   return (ID & llvm::maskTrailingOnes<TypeID>(32)) >> Qualifiers::FastWidth;
7484 }
7485 
getModuleFileIndexForTypeID(serialization::TypeID ID)7486 static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID) {
7487   return ID >> 32;
7488 }
7489 
isPredefinedType(serialization::TypeID ID)7490 static bool isPredefinedType(serialization::TypeID ID) {
7491   // We don't need to erase the higher bits since if these bits are not 0,
7492   // it must be larger than NUM_PREDEF_TYPE_IDS.
7493   return (ID >> Qualifiers::FastWidth) < NUM_PREDEF_TYPE_IDS;
7494 }
7495 
7496 std::pair<ModuleFile *, unsigned>
translateTypeIDToIndex(serialization::TypeID ID) const7497 ASTReader::translateTypeIDToIndex(serialization::TypeID ID) const {
7498   assert(!isPredefinedType(ID) &&
7499          "Predefined type shouldn't be in TypesLoaded");
7500   unsigned ModuleFileIndex = getModuleFileIndexForTypeID(ID);
7501   assert(ModuleFileIndex && "Untranslated Local Decl?");
7502 
7503   ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7504   assert(OwningModuleFile &&
7505          "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7506 
7507   return {OwningModuleFile,
7508           OwningModuleFile->BaseTypeIndex + getIndexForTypeID(ID)};
7509 }
7510 
GetType(TypeID ID)7511 QualType ASTReader::GetType(TypeID ID) {
7512   assert(ContextObj && "reading type with no AST context");
7513   ASTContext &Context = *ContextObj;
7514 
7515   unsigned FastQuals = ID & Qualifiers::FastMask;
7516 
7517   if (isPredefinedType(ID)) {
7518     QualType T;
7519     unsigned Index = getIndexForTypeID(ID);
7520     switch ((PredefinedTypeIDs)Index) {
7521     case PREDEF_TYPE_LAST_ID:
7522       // We should never use this one.
7523       llvm_unreachable("Invalid predefined type");
7524       break;
7525     case PREDEF_TYPE_NULL_ID:
7526       return QualType();
7527     case PREDEF_TYPE_VOID_ID:
7528       T = Context.VoidTy;
7529       break;
7530     case PREDEF_TYPE_BOOL_ID:
7531       T = Context.BoolTy;
7532       break;
7533     case PREDEF_TYPE_CHAR_U_ID:
7534     case PREDEF_TYPE_CHAR_S_ID:
7535       // FIXME: Check that the signedness of CharTy is correct!
7536       T = Context.CharTy;
7537       break;
7538     case PREDEF_TYPE_UCHAR_ID:
7539       T = Context.UnsignedCharTy;
7540       break;
7541     case PREDEF_TYPE_USHORT_ID:
7542       T = Context.UnsignedShortTy;
7543       break;
7544     case PREDEF_TYPE_UINT_ID:
7545       T = Context.UnsignedIntTy;
7546       break;
7547     case PREDEF_TYPE_ULONG_ID:
7548       T = Context.UnsignedLongTy;
7549       break;
7550     case PREDEF_TYPE_ULONGLONG_ID:
7551       T = Context.UnsignedLongLongTy;
7552       break;
7553     case PREDEF_TYPE_UINT128_ID:
7554       T = Context.UnsignedInt128Ty;
7555       break;
7556     case PREDEF_TYPE_SCHAR_ID:
7557       T = Context.SignedCharTy;
7558       break;
7559     case PREDEF_TYPE_WCHAR_ID:
7560       T = Context.WCharTy;
7561       break;
7562     case PREDEF_TYPE_SHORT_ID:
7563       T = Context.ShortTy;
7564       break;
7565     case PREDEF_TYPE_INT_ID:
7566       T = Context.IntTy;
7567       break;
7568     case PREDEF_TYPE_LONG_ID:
7569       T = Context.LongTy;
7570       break;
7571     case PREDEF_TYPE_LONGLONG_ID:
7572       T = Context.LongLongTy;
7573       break;
7574     case PREDEF_TYPE_INT128_ID:
7575       T = Context.Int128Ty;
7576       break;
7577     case PREDEF_TYPE_BFLOAT16_ID:
7578       T = Context.BFloat16Ty;
7579       break;
7580     case PREDEF_TYPE_HALF_ID:
7581       T = Context.HalfTy;
7582       break;
7583     case PREDEF_TYPE_FLOAT_ID:
7584       T = Context.FloatTy;
7585       break;
7586     case PREDEF_TYPE_DOUBLE_ID:
7587       T = Context.DoubleTy;
7588       break;
7589     case PREDEF_TYPE_LONGDOUBLE_ID:
7590       T = Context.LongDoubleTy;
7591       break;
7592     case PREDEF_TYPE_SHORT_ACCUM_ID:
7593       T = Context.ShortAccumTy;
7594       break;
7595     case PREDEF_TYPE_ACCUM_ID:
7596       T = Context.AccumTy;
7597       break;
7598     case PREDEF_TYPE_LONG_ACCUM_ID:
7599       T = Context.LongAccumTy;
7600       break;
7601     case PREDEF_TYPE_USHORT_ACCUM_ID:
7602       T = Context.UnsignedShortAccumTy;
7603       break;
7604     case PREDEF_TYPE_UACCUM_ID:
7605       T = Context.UnsignedAccumTy;
7606       break;
7607     case PREDEF_TYPE_ULONG_ACCUM_ID:
7608       T = Context.UnsignedLongAccumTy;
7609       break;
7610     case PREDEF_TYPE_SHORT_FRACT_ID:
7611       T = Context.ShortFractTy;
7612       break;
7613     case PREDEF_TYPE_FRACT_ID:
7614       T = Context.FractTy;
7615       break;
7616     case PREDEF_TYPE_LONG_FRACT_ID:
7617       T = Context.LongFractTy;
7618       break;
7619     case PREDEF_TYPE_USHORT_FRACT_ID:
7620       T = Context.UnsignedShortFractTy;
7621       break;
7622     case PREDEF_TYPE_UFRACT_ID:
7623       T = Context.UnsignedFractTy;
7624       break;
7625     case PREDEF_TYPE_ULONG_FRACT_ID:
7626       T = Context.UnsignedLongFractTy;
7627       break;
7628     case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
7629       T = Context.SatShortAccumTy;
7630       break;
7631     case PREDEF_TYPE_SAT_ACCUM_ID:
7632       T = Context.SatAccumTy;
7633       break;
7634     case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
7635       T = Context.SatLongAccumTy;
7636       break;
7637     case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
7638       T = Context.SatUnsignedShortAccumTy;
7639       break;
7640     case PREDEF_TYPE_SAT_UACCUM_ID:
7641       T = Context.SatUnsignedAccumTy;
7642       break;
7643     case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
7644       T = Context.SatUnsignedLongAccumTy;
7645       break;
7646     case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
7647       T = Context.SatShortFractTy;
7648       break;
7649     case PREDEF_TYPE_SAT_FRACT_ID:
7650       T = Context.SatFractTy;
7651       break;
7652     case PREDEF_TYPE_SAT_LONG_FRACT_ID:
7653       T = Context.SatLongFractTy;
7654       break;
7655     case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
7656       T = Context.SatUnsignedShortFractTy;
7657       break;
7658     case PREDEF_TYPE_SAT_UFRACT_ID:
7659       T = Context.SatUnsignedFractTy;
7660       break;
7661     case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
7662       T = Context.SatUnsignedLongFractTy;
7663       break;
7664     case PREDEF_TYPE_FLOAT16_ID:
7665       T = Context.Float16Ty;
7666       break;
7667     case PREDEF_TYPE_FLOAT128_ID:
7668       T = Context.Float128Ty;
7669       break;
7670     case PREDEF_TYPE_IBM128_ID:
7671       T = Context.Ibm128Ty;
7672       break;
7673     case PREDEF_TYPE_OVERLOAD_ID:
7674       T = Context.OverloadTy;
7675       break;
7676     case PREDEF_TYPE_UNRESOLVED_TEMPLATE:
7677       T = Context.UnresolvedTemplateTy;
7678       break;
7679     case PREDEF_TYPE_BOUND_MEMBER:
7680       T = Context.BoundMemberTy;
7681       break;
7682     case PREDEF_TYPE_PSEUDO_OBJECT:
7683       T = Context.PseudoObjectTy;
7684       break;
7685     case PREDEF_TYPE_DEPENDENT_ID:
7686       T = Context.DependentTy;
7687       break;
7688     case PREDEF_TYPE_UNKNOWN_ANY:
7689       T = Context.UnknownAnyTy;
7690       break;
7691     case PREDEF_TYPE_NULLPTR_ID:
7692       T = Context.NullPtrTy;
7693       break;
7694     case PREDEF_TYPE_CHAR8_ID:
7695       T = Context.Char8Ty;
7696       break;
7697     case PREDEF_TYPE_CHAR16_ID:
7698       T = Context.Char16Ty;
7699       break;
7700     case PREDEF_TYPE_CHAR32_ID:
7701       T = Context.Char32Ty;
7702       break;
7703     case PREDEF_TYPE_OBJC_ID:
7704       T = Context.ObjCBuiltinIdTy;
7705       break;
7706     case PREDEF_TYPE_OBJC_CLASS:
7707       T = Context.ObjCBuiltinClassTy;
7708       break;
7709     case PREDEF_TYPE_OBJC_SEL:
7710       T = Context.ObjCBuiltinSelTy;
7711       break;
7712 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7713     case PREDEF_TYPE_##Id##_ID: \
7714       T = Context.SingletonId; \
7715       break;
7716 #include "clang/Basic/OpenCLImageTypes.def"
7717 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7718     case PREDEF_TYPE_##Id##_ID: \
7719       T = Context.Id##Ty; \
7720       break;
7721 #include "clang/Basic/OpenCLExtensionTypes.def"
7722     case PREDEF_TYPE_SAMPLER_ID:
7723       T = Context.OCLSamplerTy;
7724       break;
7725     case PREDEF_TYPE_EVENT_ID:
7726       T = Context.OCLEventTy;
7727       break;
7728     case PREDEF_TYPE_CLK_EVENT_ID:
7729       T = Context.OCLClkEventTy;
7730       break;
7731     case PREDEF_TYPE_QUEUE_ID:
7732       T = Context.OCLQueueTy;
7733       break;
7734     case PREDEF_TYPE_RESERVE_ID_ID:
7735       T = Context.OCLReserveIDTy;
7736       break;
7737     case PREDEF_TYPE_AUTO_DEDUCT:
7738       T = Context.getAutoDeductType();
7739       break;
7740     case PREDEF_TYPE_AUTO_RREF_DEDUCT:
7741       T = Context.getAutoRRefDeductType();
7742       break;
7743     case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
7744       T = Context.ARCUnbridgedCastTy;
7745       break;
7746     case PREDEF_TYPE_BUILTIN_FN:
7747       T = Context.BuiltinFnTy;
7748       break;
7749     case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX:
7750       T = Context.IncompleteMatrixIdxTy;
7751       break;
7752     case PREDEF_TYPE_ARRAY_SECTION:
7753       T = Context.ArraySectionTy;
7754       break;
7755     case PREDEF_TYPE_OMP_ARRAY_SHAPING:
7756       T = Context.OMPArrayShapingTy;
7757       break;
7758     case PREDEF_TYPE_OMP_ITERATOR:
7759       T = Context.OMPIteratorTy;
7760       break;
7761 #define SVE_TYPE(Name, Id, SingletonId) \
7762     case PREDEF_TYPE_##Id##_ID: \
7763       T = Context.SingletonId; \
7764       break;
7765 #include "clang/Basic/AArch64ACLETypes.def"
7766 #define PPC_VECTOR_TYPE(Name, Id, Size) \
7767     case PREDEF_TYPE_##Id##_ID: \
7768       T = Context.Id##Ty; \
7769       break;
7770 #include "clang/Basic/PPCTypes.def"
7771 #define RVV_TYPE(Name, Id, SingletonId) \
7772     case PREDEF_TYPE_##Id##_ID: \
7773       T = Context.SingletonId; \
7774       break;
7775 #include "clang/Basic/RISCVVTypes.def"
7776 #define WASM_TYPE(Name, Id, SingletonId)                                       \
7777   case PREDEF_TYPE_##Id##_ID:                                                  \
7778     T = Context.SingletonId;                                                   \
7779     break;
7780 #include "clang/Basic/WebAssemblyReferenceTypes.def"
7781 #define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align)                       \
7782   case PREDEF_TYPE_##Id##_ID:                                                  \
7783     T = Context.SingletonId;                                                   \
7784     break;
7785 #include "clang/Basic/AMDGPUTypes.def"
7786 #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)                            \
7787   case PREDEF_TYPE_##Id##_ID:                                                  \
7788     T = Context.SingletonId;                                                   \
7789     break;
7790 #include "clang/Basic/HLSLIntangibleTypes.def"
7791     }
7792 
7793     assert(!T.isNull() && "Unknown predefined type");
7794     return T.withFastQualifiers(FastQuals);
7795   }
7796 
7797   unsigned Index = translateTypeIDToIndex(ID).second;
7798 
7799   assert(Index < TypesLoaded.size() && "Type index out-of-range");
7800   if (TypesLoaded[Index].isNull()) {
7801     TypesLoaded[Index] = readTypeRecord(ID);
7802     if (TypesLoaded[Index].isNull())
7803       return QualType();
7804 
7805     TypesLoaded[Index]->setFromAST();
7806     if (DeserializationListener)
7807       DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
7808                                         TypesLoaded[Index]);
7809   }
7810 
7811   return TypesLoaded[Index].withFastQualifiers(FastQuals);
7812 }
7813 
getLocalType(ModuleFile & F,LocalTypeID LocalID)7814 QualType ASTReader::getLocalType(ModuleFile &F, LocalTypeID LocalID) {
7815   return GetType(getGlobalTypeID(F, LocalID));
7816 }
7817 
getGlobalTypeID(ModuleFile & F,LocalTypeID LocalID) const7818 serialization::TypeID ASTReader::getGlobalTypeID(ModuleFile &F,
7819                                                  LocalTypeID LocalID) const {
7820   if (isPredefinedType(LocalID))
7821     return LocalID;
7822 
7823   if (!F.ModuleOffsetMap.empty())
7824     ReadModuleOffsetMap(F);
7825 
7826   unsigned ModuleFileIndex = getModuleFileIndexForTypeID(LocalID);
7827   LocalID &= llvm::maskTrailingOnes<TypeID>(32);
7828 
7829   if (ModuleFileIndex == 0)
7830     LocalID -= NUM_PREDEF_TYPE_IDS << Qualifiers::FastWidth;
7831 
7832   ModuleFile &MF =
7833       ModuleFileIndex ? *F.TransitiveImports[ModuleFileIndex - 1] : F;
7834   ModuleFileIndex = MF.Index + 1;
7835   return ((uint64_t)ModuleFileIndex << 32) | LocalID;
7836 }
7837 
7838 TemplateArgumentLocInfo
readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)7839 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) {
7840   switch (Kind) {
7841   case TemplateArgument::Expression:
7842     return readExpr();
7843   case TemplateArgument::Type:
7844     return readTypeSourceInfo();
7845   case TemplateArgument::Template: {
7846     NestedNameSpecifierLoc QualifierLoc =
7847       readNestedNameSpecifierLoc();
7848     SourceLocation TemplateNameLoc = readSourceLocation();
7849     return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7850                                    TemplateNameLoc, SourceLocation());
7851   }
7852   case TemplateArgument::TemplateExpansion: {
7853     NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc();
7854     SourceLocation TemplateNameLoc = readSourceLocation();
7855     SourceLocation EllipsisLoc = readSourceLocation();
7856     return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7857                                    TemplateNameLoc, EllipsisLoc);
7858   }
7859   case TemplateArgument::Null:
7860   case TemplateArgument::Integral:
7861   case TemplateArgument::Declaration:
7862   case TemplateArgument::NullPtr:
7863   case TemplateArgument::StructuralValue:
7864   case TemplateArgument::Pack:
7865     // FIXME: Is this right?
7866     return TemplateArgumentLocInfo();
7867   }
7868   llvm_unreachable("unexpected template argument loc");
7869 }
7870 
readTemplateArgumentLoc()7871 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() {
7872   TemplateArgument Arg = readTemplateArgument();
7873 
7874   if (Arg.getKind() == TemplateArgument::Expression) {
7875     if (readBool()) // bool InfoHasSameExpr.
7876       return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
7877   }
7878   return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind()));
7879 }
7880 
readTemplateArgumentListInfo(TemplateArgumentListInfo & Result)7881 void ASTRecordReader::readTemplateArgumentListInfo(
7882     TemplateArgumentListInfo &Result) {
7883   Result.setLAngleLoc(readSourceLocation());
7884   Result.setRAngleLoc(readSourceLocation());
7885   unsigned NumArgsAsWritten = readInt();
7886   for (unsigned i = 0; i != NumArgsAsWritten; ++i)
7887     Result.addArgument(readTemplateArgumentLoc());
7888 }
7889 
7890 const ASTTemplateArgumentListInfo *
readASTTemplateArgumentListInfo()7891 ASTRecordReader::readASTTemplateArgumentListInfo() {
7892   TemplateArgumentListInfo Result;
7893   readTemplateArgumentListInfo(Result);
7894   return ASTTemplateArgumentListInfo::Create(getContext(), Result);
7895 }
7896 
GetExternalDecl(GlobalDeclID ID)7897 Decl *ASTReader::GetExternalDecl(GlobalDeclID ID) { return GetDecl(ID); }
7898 
CompleteRedeclChain(const Decl * D)7899 void ASTReader::CompleteRedeclChain(const Decl *D) {
7900   if (NumCurrentElementsDeserializing) {
7901     // We arrange to not care about the complete redeclaration chain while we're
7902     // deserializing. Just remember that the AST has marked this one as complete
7903     // but that it's not actually complete yet, so we know we still need to
7904     // complete it later.
7905     PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
7906     return;
7907   }
7908 
7909   if (!D->getDeclContext()) {
7910     assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
7911     return;
7912   }
7913 
7914   const DeclContext *DC = D->getDeclContext()->getRedeclContext();
7915 
7916   // If this is a named declaration, complete it by looking it up
7917   // within its context.
7918   //
7919   // FIXME: Merging a function definition should merge
7920   // all mergeable entities within it.
7921   if (isa<TranslationUnitDecl, NamespaceDecl, RecordDecl, EnumDecl>(DC)) {
7922     if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
7923       if (!getContext().getLangOpts().CPlusPlus &&
7924           isa<TranslationUnitDecl>(DC)) {
7925         // Outside of C++, we don't have a lookup table for the TU, so update
7926         // the identifier instead. (For C++ modules, we don't store decls
7927         // in the serialized identifier table, so we do the lookup in the TU.)
7928         auto *II = Name.getAsIdentifierInfo();
7929         assert(II && "non-identifier name in C?");
7930         if (II->isOutOfDate())
7931           updateOutOfDateIdentifier(*II);
7932       } else
7933         DC->lookup(Name);
7934     } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
7935       // Find all declarations of this kind from the relevant context.
7936       for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
7937         auto *DC = cast<DeclContext>(DCDecl);
7938         SmallVector<Decl*, 8> Decls;
7939         FindExternalLexicalDecls(
7940             DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
7941       }
7942     }
7943   }
7944 
7945   RedeclarableTemplateDecl *Template = nullptr;
7946   ArrayRef<TemplateArgument> Args;
7947   if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
7948     Template = CTSD->getSpecializedTemplate();
7949     Args = CTSD->getTemplateArgs().asArray();
7950   } else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
7951     Template = VTSD->getSpecializedTemplate();
7952     Args = VTSD->getTemplateArgs().asArray();
7953   } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
7954     if (auto *Tmplt = FD->getPrimaryTemplate()) {
7955       Template = Tmplt;
7956       Args = FD->getTemplateSpecializationArgs()->asArray();
7957     }
7958   }
7959 
7960   if (Template) {
7961     // For partitial specialization, load all the specializations for safety.
7962     if (isa<ClassTemplatePartialSpecializationDecl,
7963             VarTemplatePartialSpecializationDecl>(D))
7964       Template->loadLazySpecializationsImpl();
7965     else
7966       Template->loadLazySpecializationsImpl(Args);
7967   }
7968 }
7969 
7970 CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)7971 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
7972   RecordLocation Loc = getLocalBitOffset(Offset);
7973   BitstreamCursor &Cursor = Loc.F->DeclsCursor;
7974   SavedStreamPosition SavedPosition(Cursor);
7975   if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
7976     Error(std::move(Err));
7977     return nullptr;
7978   }
7979   ReadingKindTracker ReadingKind(Read_Decl, *this);
7980   Deserializing D(this);
7981 
7982   Expected<unsigned> MaybeCode = Cursor.ReadCode();
7983   if (!MaybeCode) {
7984     Error(MaybeCode.takeError());
7985     return nullptr;
7986   }
7987   unsigned Code = MaybeCode.get();
7988 
7989   ASTRecordReader Record(*this, *Loc.F);
7990   Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
7991   if (!MaybeRecCode) {
7992     Error(MaybeRecCode.takeError());
7993     return nullptr;
7994   }
7995   if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
7996     Error("malformed AST file: missing C++ ctor initializers");
7997     return nullptr;
7998   }
7999 
8000   return Record.readCXXCtorInitializers();
8001 }
8002 
GetExternalCXXBaseSpecifiers(uint64_t Offset)8003 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
8004   assert(ContextObj && "reading base specifiers with no AST context");
8005   ASTContext &Context = *ContextObj;
8006 
8007   RecordLocation Loc = getLocalBitOffset(Offset);
8008   BitstreamCursor &Cursor = Loc.F->DeclsCursor;
8009   SavedStreamPosition SavedPosition(Cursor);
8010   if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8011     Error(std::move(Err));
8012     return nullptr;
8013   }
8014   ReadingKindTracker ReadingKind(Read_Decl, *this);
8015   Deserializing D(this);
8016 
8017   Expected<unsigned> MaybeCode = Cursor.ReadCode();
8018   if (!MaybeCode) {
8019     Error(MaybeCode.takeError());
8020     return nullptr;
8021   }
8022   unsigned Code = MaybeCode.get();
8023 
8024   ASTRecordReader Record(*this, *Loc.F);
8025   Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
8026   if (!MaybeRecCode) {
8027     Error(MaybeCode.takeError());
8028     return nullptr;
8029   }
8030   unsigned RecCode = MaybeRecCode.get();
8031 
8032   if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
8033     Error("malformed AST file: missing C++ base specifiers");
8034     return nullptr;
8035   }
8036 
8037   unsigned NumBases = Record.readInt();
8038   void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
8039   CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
8040   for (unsigned I = 0; I != NumBases; ++I)
8041     Bases[I] = Record.readCXXBaseSpecifier();
8042   return Bases;
8043 }
8044 
getGlobalDeclID(ModuleFile & F,LocalDeclID LocalID) const8045 GlobalDeclID ASTReader::getGlobalDeclID(ModuleFile &F,
8046                                         LocalDeclID LocalID) const {
8047   if (LocalID < NUM_PREDEF_DECL_IDS)
8048     return GlobalDeclID(LocalID.getRawValue());
8049 
8050   unsigned OwningModuleFileIndex = LocalID.getModuleFileIndex();
8051   DeclID ID = LocalID.getLocalDeclIndex();
8052 
8053   if (!F.ModuleOffsetMap.empty())
8054     ReadModuleOffsetMap(F);
8055 
8056   ModuleFile *OwningModuleFile =
8057       OwningModuleFileIndex == 0
8058           ? &F
8059           : F.TransitiveImports[OwningModuleFileIndex - 1];
8060 
8061   if (OwningModuleFileIndex == 0)
8062     ID -= NUM_PREDEF_DECL_IDS;
8063 
8064   uint64_t NewModuleFileIndex = OwningModuleFile->Index + 1;
8065   return GlobalDeclID(NewModuleFileIndex, ID);
8066 }
8067 
isDeclIDFromModule(GlobalDeclID ID,ModuleFile & M) const8068 bool ASTReader::isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const {
8069   // Predefined decls aren't from any module.
8070   if (ID < NUM_PREDEF_DECL_IDS)
8071     return false;
8072 
8073   unsigned ModuleFileIndex = ID.getModuleFileIndex();
8074   return M.Index == ModuleFileIndex - 1;
8075 }
8076 
getOwningModuleFile(GlobalDeclID ID) const8077 ModuleFile *ASTReader::getOwningModuleFile(GlobalDeclID ID) const {
8078   // Predefined decls aren't from any module.
8079   if (ID < NUM_PREDEF_DECL_IDS)
8080     return nullptr;
8081 
8082   uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8083   assert(ModuleFileIndex && "Untranslated Local Decl?");
8084 
8085   return &getModuleManager()[ModuleFileIndex - 1];
8086 }
8087 
getOwningModuleFile(const Decl * D) const8088 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) const {
8089   if (!D->isFromASTFile())
8090     return nullptr;
8091 
8092   return getOwningModuleFile(D->getGlobalID());
8093 }
8094 
getSourceLocationForDeclID(GlobalDeclID ID)8095 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
8096   if (ID < NUM_PREDEF_DECL_IDS)
8097     return SourceLocation();
8098 
8099   if (Decl *D = GetExistingDecl(ID))
8100     return D->getLocation();
8101 
8102   SourceLocation Loc;
8103   DeclCursorForID(ID, Loc);
8104   return Loc;
8105 }
8106 
getPredefinedDecl(PredefinedDeclIDs ID)8107 Decl *ASTReader::getPredefinedDecl(PredefinedDeclIDs ID) {
8108   assert(ContextObj && "reading predefined decl without AST context");
8109   ASTContext &Context = *ContextObj;
8110   Decl *NewLoaded = nullptr;
8111   switch (ID) {
8112   case PREDEF_DECL_NULL_ID:
8113     return nullptr;
8114 
8115   case PREDEF_DECL_TRANSLATION_UNIT_ID:
8116     return Context.getTranslationUnitDecl();
8117 
8118   case PREDEF_DECL_OBJC_ID_ID:
8119     if (Context.ObjCIdDecl)
8120       return Context.ObjCIdDecl;
8121     NewLoaded = Context.getObjCIdDecl();
8122     break;
8123 
8124   case PREDEF_DECL_OBJC_SEL_ID:
8125     if (Context.ObjCSelDecl)
8126       return Context.ObjCSelDecl;
8127     NewLoaded = Context.getObjCSelDecl();
8128     break;
8129 
8130   case PREDEF_DECL_OBJC_CLASS_ID:
8131     if (Context.ObjCClassDecl)
8132       return Context.ObjCClassDecl;
8133     NewLoaded = Context.getObjCClassDecl();
8134     break;
8135 
8136   case PREDEF_DECL_OBJC_PROTOCOL_ID:
8137     if (Context.ObjCProtocolClassDecl)
8138       return Context.ObjCProtocolClassDecl;
8139     NewLoaded = Context.getObjCProtocolDecl();
8140     break;
8141 
8142   case PREDEF_DECL_INT_128_ID:
8143     if (Context.Int128Decl)
8144       return Context.Int128Decl;
8145     NewLoaded = Context.getInt128Decl();
8146     break;
8147 
8148   case PREDEF_DECL_UNSIGNED_INT_128_ID:
8149     if (Context.UInt128Decl)
8150       return Context.UInt128Decl;
8151     NewLoaded = Context.getUInt128Decl();
8152     break;
8153 
8154   case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
8155     if (Context.ObjCInstanceTypeDecl)
8156       return Context.ObjCInstanceTypeDecl;
8157     NewLoaded = Context.getObjCInstanceTypeDecl();
8158     break;
8159 
8160   case PREDEF_DECL_BUILTIN_VA_LIST_ID:
8161     if (Context.BuiltinVaListDecl)
8162       return Context.BuiltinVaListDecl;
8163     NewLoaded = Context.getBuiltinVaListDecl();
8164     break;
8165 
8166   case PREDEF_DECL_VA_LIST_TAG:
8167     if (Context.VaListTagDecl)
8168       return Context.VaListTagDecl;
8169     NewLoaded = Context.getVaListTagDecl();
8170     break;
8171 
8172   case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
8173     if (Context.BuiltinMSVaListDecl)
8174       return Context.BuiltinMSVaListDecl;
8175     NewLoaded = Context.getBuiltinMSVaListDecl();
8176     break;
8177 
8178   case PREDEF_DECL_BUILTIN_MS_GUID_ID:
8179     // ASTContext::getMSGuidTagDecl won't create MSGuidTagDecl conditionally.
8180     return Context.getMSGuidTagDecl();
8181 
8182   case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
8183     if (Context.ExternCContext)
8184       return Context.ExternCContext;
8185     NewLoaded = Context.getExternCContextDecl();
8186     break;
8187 
8188   case PREDEF_DECL_CF_CONSTANT_STRING_ID:
8189     if (Context.CFConstantStringTypeDecl)
8190       return Context.CFConstantStringTypeDecl;
8191     NewLoaded = Context.getCFConstantStringDecl();
8192     break;
8193 
8194   case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
8195     if (Context.CFConstantStringTagDecl)
8196       return Context.CFConstantStringTagDecl;
8197     NewLoaded = Context.getCFConstantStringTagDecl();
8198     break;
8199 
8200 #define BuiltinTemplate(BTName)                                                \
8201   case PREDEF_DECL##BTName##_ID:                                               \
8202     if (Context.Decl##BTName)                                                  \
8203       return Context.Decl##BTName;                                             \
8204     NewLoaded = Context.get##BTName##Decl();                                   \
8205     break;
8206 #include "clang/Basic/BuiltinTemplates.inc"
8207 
8208   case NUM_PREDEF_DECL_IDS:
8209     llvm_unreachable("Invalid decl ID");
8210     break;
8211   }
8212 
8213   assert(NewLoaded && "Failed to load predefined decl?");
8214 
8215   if (DeserializationListener)
8216     DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8217 
8218   return NewLoaded;
8219 }
8220 
translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const8221 unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID) const {
8222   ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8223   if (!OwningModuleFile) {
8224     assert(GlobalID < NUM_PREDEF_DECL_IDS && "Untransalted Global ID?");
8225     return GlobalID.getRawValue();
8226   }
8227 
8228   return OwningModuleFile->BaseDeclIndex + GlobalID.getLocalDeclIndex();
8229 }
8230 
GetExistingDecl(GlobalDeclID ID)8231 Decl *ASTReader::GetExistingDecl(GlobalDeclID ID) {
8232   assert(ContextObj && "reading decl with no AST context");
8233 
8234   if (ID < NUM_PREDEF_DECL_IDS) {
8235     Decl *D = getPredefinedDecl((PredefinedDeclIDs)ID);
8236     if (D) {
8237       // Track that we have merged the declaration with ID \p ID into the
8238       // pre-existing predefined declaration \p D.
8239       auto &Merged = KeyDecls[D->getCanonicalDecl()];
8240       if (Merged.empty())
8241         Merged.push_back(ID);
8242     }
8243     return D;
8244   }
8245 
8246   unsigned Index = translateGlobalDeclIDToIndex(ID);
8247 
8248   if (Index >= DeclsLoaded.size()) {
8249     assert(0 && "declaration ID out-of-range for AST file");
8250     Error("declaration ID out-of-range for AST file");
8251     return nullptr;
8252   }
8253 
8254   return DeclsLoaded[Index];
8255 }
8256 
GetDecl(GlobalDeclID ID)8257 Decl *ASTReader::GetDecl(GlobalDeclID ID) {
8258   if (ID < NUM_PREDEF_DECL_IDS)
8259     return GetExistingDecl(ID);
8260 
8261   unsigned Index = translateGlobalDeclIDToIndex(ID);
8262 
8263   if (Index >= DeclsLoaded.size()) {
8264     assert(0 && "declaration ID out-of-range for AST file");
8265     Error("declaration ID out-of-range for AST file");
8266     return nullptr;
8267   }
8268 
8269   if (!DeclsLoaded[Index]) {
8270     ReadDeclRecord(ID);
8271     if (DeserializationListener)
8272       DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8273   }
8274 
8275   return DeclsLoaded[Index];
8276 }
8277 
mapGlobalIDToModuleFileGlobalID(ModuleFile & M,GlobalDeclID GlobalID)8278 LocalDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
8279                                                        GlobalDeclID GlobalID) {
8280   if (GlobalID < NUM_PREDEF_DECL_IDS)
8281     return LocalDeclID::get(*this, M, GlobalID.getRawValue());
8282 
8283   if (!M.ModuleOffsetMap.empty())
8284     ReadModuleOffsetMap(M);
8285 
8286   ModuleFile *Owner = getOwningModuleFile(GlobalID);
8287   DeclID ID = GlobalID.getLocalDeclIndex();
8288 
8289   if (Owner == &M) {
8290     ID += NUM_PREDEF_DECL_IDS;
8291     return LocalDeclID::get(*this, M, ID);
8292   }
8293 
8294   uint64_t OrignalModuleFileIndex = 0;
8295   for (unsigned I = 0; I < M.TransitiveImports.size(); I++)
8296     if (M.TransitiveImports[I] == Owner) {
8297       OrignalModuleFileIndex = I + 1;
8298       break;
8299     }
8300 
8301   if (!OrignalModuleFileIndex)
8302     return LocalDeclID();
8303 
8304   return LocalDeclID::get(*this, M, OrignalModuleFileIndex, ID);
8305 }
8306 
ReadDeclID(ModuleFile & F,const RecordDataImpl & Record,unsigned & Idx)8307 GlobalDeclID ASTReader::ReadDeclID(ModuleFile &F, const RecordDataImpl &Record,
8308                                    unsigned &Idx) {
8309   if (Idx >= Record.size()) {
8310     Error("Corrupted AST file");
8311     return GlobalDeclID(0);
8312   }
8313 
8314   return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++]));
8315 }
8316 
8317 /// Resolve the offset of a statement into a statement.
8318 ///
8319 /// This operation will read a new statement from the external
8320 /// source each time it is called, and is meant to be used via a
8321 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
GetExternalDeclStmt(uint64_t Offset)8322 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
8323   // Switch case IDs are per Decl.
8324   ClearSwitchCaseIDs();
8325 
8326   // Offset here is a global offset across the entire chain.
8327   RecordLocation Loc = getLocalBitOffset(Offset);
8328   if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
8329     Error(std::move(Err));
8330     return nullptr;
8331   }
8332   assert(NumCurrentElementsDeserializing == 0 &&
8333          "should not be called while already deserializing");
8334   Deserializing D(this);
8335   return ReadStmtFromStream(*Loc.F);
8336 }
8337 
LoadExternalSpecializationsImpl(SpecLookupTableTy & SpecLookups,const Decl * D)8338 bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8339                                                 const Decl *D) {
8340   assert(D);
8341 
8342   auto It = SpecLookups.find(D);
8343   if (It == SpecLookups.end())
8344     return false;
8345 
8346   // Get Decl may violate the iterator from SpecializationsLookups so we store
8347   // the DeclIDs in ahead.
8348   llvm::SmallVector<serialization::reader::LazySpecializationInfo, 8> Infos =
8349       It->second.Table.findAll();
8350 
8351   // Since we've loaded all the specializations, we can erase it from
8352   // the lookup table.
8353   SpecLookups.erase(It);
8354 
8355   bool NewSpecsFound = false;
8356   Deserializing LookupResults(this);
8357   for (auto &Info : Infos) {
8358     if (GetExistingDecl(Info))
8359       continue;
8360     NewSpecsFound = true;
8361     GetDecl(Info);
8362   }
8363 
8364   return NewSpecsFound;
8365 }
8366 
LoadExternalSpecializations(const Decl * D,bool OnlyPartial)8367 bool ASTReader::LoadExternalSpecializations(const Decl *D, bool OnlyPartial) {
8368   assert(D);
8369 
8370   bool NewSpecsFound =
8371       LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8372   if (OnlyPartial)
8373     return NewSpecsFound;
8374 
8375   NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8376   return NewSpecsFound;
8377 }
8378 
LoadExternalSpecializationsImpl(SpecLookupTableTy & SpecLookups,const Decl * D,ArrayRef<TemplateArgument> TemplateArgs)8379 bool ASTReader::LoadExternalSpecializationsImpl(
8380     SpecLookupTableTy &SpecLookups, const Decl *D,
8381     ArrayRef<TemplateArgument> TemplateArgs) {
8382   assert(D);
8383 
8384   auto It = SpecLookups.find(D);
8385   if (It == SpecLookups.end())
8386     return false;
8387 
8388   llvm::TimeTraceScope TimeScope("Load External Specializations for ", [&] {
8389     std::string Name;
8390     llvm::raw_string_ostream OS(Name);
8391     auto *ND = cast<NamedDecl>(D);
8392     ND->getNameForDiagnostic(OS, ND->getASTContext().getPrintingPolicy(),
8393                              /*Qualified=*/true);
8394     return Name;
8395   });
8396 
8397   Deserializing LookupResults(this);
8398   auto HashValue = StableHashForTemplateArguments(TemplateArgs);
8399 
8400   // Get Decl may violate the iterator from SpecLookups
8401   llvm::SmallVector<serialization::reader::LazySpecializationInfo, 8> Infos =
8402       It->second.Table.find(HashValue);
8403 
8404   bool NewSpecsFound = false;
8405   for (auto &Info : Infos) {
8406     if (GetExistingDecl(Info))
8407       continue;
8408     NewSpecsFound = true;
8409     GetDecl(Info);
8410   }
8411 
8412   return NewSpecsFound;
8413 }
8414 
LoadExternalSpecializations(const Decl * D,ArrayRef<TemplateArgument> TemplateArgs)8415 bool ASTReader::LoadExternalSpecializations(
8416     const Decl *D, ArrayRef<TemplateArgument> TemplateArgs) {
8417   assert(D);
8418 
8419   bool NewDeclsFound = LoadExternalSpecializationsImpl(
8420       PartialSpecializationsLookups, D, TemplateArgs);
8421   NewDeclsFound |=
8422       LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8423 
8424   return NewDeclsFound;
8425 }
8426 
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Decls)8427 void ASTReader::FindExternalLexicalDecls(
8428     const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
8429     SmallVectorImpl<Decl *> &Decls) {
8430   bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
8431 
8432   auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
8433     assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
8434     for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8435       auto K = (Decl::Kind)+LexicalDecls[I];
8436       if (!IsKindWeWant(K))
8437         continue;
8438 
8439       auto ID = (DeclID) + LexicalDecls[I + 1];
8440 
8441       // Don't add predefined declarations to the lexical context more
8442       // than once.
8443       if (ID < NUM_PREDEF_DECL_IDS) {
8444         if (PredefsVisited[ID])
8445           continue;
8446 
8447         PredefsVisited[ID] = true;
8448       }
8449 
8450       if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) {
8451         assert(D->getKind() == K && "wrong kind for lexical decl");
8452         if (!DC->isDeclInLexicalTraversal(D))
8453           Decls.push_back(D);
8454       }
8455     }
8456   };
8457 
8458   if (isa<TranslationUnitDecl>(DC)) {
8459     for (const auto &Lexical : TULexicalDecls)
8460       Visit(Lexical.first, Lexical.second);
8461   } else {
8462     auto I = LexicalDecls.find(DC);
8463     if (I != LexicalDecls.end())
8464       Visit(I->second.first, I->second.second);
8465   }
8466 
8467   ++NumLexicalDeclContextsRead;
8468 }
8469 
8470 namespace {
8471 
8472 class UnalignedDeclIDComp {
8473   ASTReader &Reader;
8474   ModuleFile &Mod;
8475 
8476 public:
UnalignedDeclIDComp(ASTReader & Reader,ModuleFile & M)8477   UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M)
8478       : Reader(Reader), Mod(M) {}
8479 
operator ()(unaligned_decl_id_t L,unaligned_decl_id_t R) const8480   bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const {
8481     SourceLocation LHS = getLocation(L);
8482     SourceLocation RHS = getLocation(R);
8483     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8484   }
8485 
operator ()(SourceLocation LHS,unaligned_decl_id_t R) const8486   bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const {
8487     SourceLocation RHS = getLocation(R);
8488     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8489   }
8490 
operator ()(unaligned_decl_id_t L,SourceLocation RHS) const8491   bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const {
8492     SourceLocation LHS = getLocation(L);
8493     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
8494   }
8495 
getLocation(unaligned_decl_id_t ID) const8496   SourceLocation getLocation(unaligned_decl_id_t ID) const {
8497     return Reader.getSourceManager().getFileLoc(
8498         Reader.getSourceLocationForDeclID(
8499             Reader.getGlobalDeclID(Mod, LocalDeclID::get(Reader, Mod, ID))));
8500   }
8501 };
8502 
8503 } // namespace
8504 
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)8505 void ASTReader::FindFileRegionDecls(FileID File,
8506                                     unsigned Offset, unsigned Length,
8507                                     SmallVectorImpl<Decl *> &Decls) {
8508   SourceManager &SM = getSourceManager();
8509 
8510   llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
8511   if (I == FileDeclIDs.end())
8512     return;
8513 
8514   FileDeclsInfo &DInfo = I->second;
8515   if (DInfo.Decls.empty())
8516     return;
8517 
8518   SourceLocation
8519     BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
8520   SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
8521 
8522   UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod);
8523   ArrayRef<unaligned_decl_id_t>::iterator BeginIt =
8524       llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8525   if (BeginIt != DInfo.Decls.begin())
8526     --BeginIt;
8527 
8528   // If we are pointing at a top-level decl inside an objc container, we need
8529   // to backtrack until we find it otherwise we will fail to report that the
8530   // region overlaps with an objc container.
8531   while (BeginIt != DInfo.Decls.begin() &&
8532          GetDecl(getGlobalDeclID(*DInfo.Mod,
8533                                  LocalDeclID::get(*this, *DInfo.Mod, *BeginIt)))
8534              ->isTopLevelDeclInObjCContainer())
8535     --BeginIt;
8536 
8537   ArrayRef<unaligned_decl_id_t>::iterator EndIt =
8538       llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8539   if (EndIt != DInfo.Decls.end())
8540     ++EndIt;
8541 
8542   for (ArrayRef<unaligned_decl_id_t>::iterator DIt = BeginIt; DIt != EndIt;
8543        ++DIt)
8544     Decls.push_back(GetDecl(getGlobalDeclID(
8545         *DInfo.Mod, LocalDeclID::get(*this, *DInfo.Mod, *DIt))));
8546 }
8547 
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name,const DeclContext * OriginalDC)8548 bool ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
8549                                                DeclarationName Name,
8550                                                const DeclContext *OriginalDC) {
8551   assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
8552          "DeclContext has no visible decls in storage");
8553   if (!Name)
8554     return false;
8555 
8556   // Load the list of declarations.
8557   SmallVector<NamedDecl *, 64> Decls;
8558   llvm::SmallPtrSet<NamedDecl *, 8> Found;
8559 
8560   auto Find = [&, this](auto &&Table, auto &&Key) {
8561     for (GlobalDeclID ID : Table.find(Key)) {
8562       NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8563       if (ND->getDeclName() == Name && Found.insert(ND).second)
8564         Decls.push_back(ND);
8565     }
8566   };
8567 
8568   Deserializing LookupResults(this);
8569 
8570   // FIXME: Clear the redundancy with templated lambda in C++20 when that's
8571   // available.
8572   if (auto It = Lookups.find(DC); It != Lookups.end()) {
8573     ++NumVisibleDeclContextsRead;
8574     Find(It->second.Table, Name);
8575   }
8576 
8577   auto FindModuleLocalLookup = [&, this](Module *NamedModule) {
8578     if (auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8579       ++NumModuleLocalVisibleDeclContexts;
8580       Find(It->second.Table, std::make_pair(Name, NamedModule));
8581     }
8582   };
8583   if (auto *NamedModule =
8584           OriginalDC ? cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8585                      : nullptr)
8586     FindModuleLocalLookup(NamedModule);
8587   // See clang/test/Modules/ModulesLocalNamespace.cppm for the motiviation case.
8588   // We're going to find a decl but the decl context of the lookup is
8589   // unspecified. In this case, the OriginalDC may be the decl context in other
8590   // module.
8591   if (ContextObj && ContextObj->getCurrentNamedModule())
8592     FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8593 
8594   if (auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8595     ++NumTULocalVisibleDeclContexts;
8596     Find(It->second.Table, Name);
8597   }
8598 
8599   SetExternalVisibleDeclsForName(DC, Name, Decls);
8600   return !Decls.empty();
8601 }
8602 
completeVisibleDeclsMap(const DeclContext * DC)8603 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
8604   if (!DC->hasExternalVisibleStorage())
8605     return;
8606 
8607   DeclsMap Decls;
8608 
8609   auto findAll = [&](auto &LookupTables, unsigned &NumRead) {
8610     auto It = LookupTables.find(DC);
8611     if (It == LookupTables.end())
8612       return;
8613 
8614     NumRead++;
8615 
8616     for (GlobalDeclID ID : It->second.Table.findAll()) {
8617       NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
8618       Decls[ND->getDeclName()].push_back(ND);
8619     }
8620 
8621     // FIXME: Why a PCH test is failing if we remove the iterator after findAll?
8622   };
8623 
8624   findAll(Lookups, NumVisibleDeclContextsRead);
8625   findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8626   findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8627 
8628   for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
8629     SetExternalVisibleDeclsForName(DC, I->first, I->second);
8630   }
8631   const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
8632 }
8633 
8634 const serialization::reader::DeclContextLookupTable *
getLoadedLookupTables(DeclContext * Primary) const8635 ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
8636   auto I = Lookups.find(Primary);
8637   return I == Lookups.end() ? nullptr : &I->second;
8638 }
8639 
8640 const serialization::reader::ModuleLocalLookupTable *
getModuleLocalLookupTables(DeclContext * Primary) const8641 ASTReader::getModuleLocalLookupTables(DeclContext *Primary) const {
8642   auto I = ModuleLocalLookups.find(Primary);
8643   return I == ModuleLocalLookups.end() ? nullptr : &I->second;
8644 }
8645 
8646 const serialization::reader::DeclContextLookupTable *
getTULocalLookupTables(DeclContext * Primary) const8647 ASTReader::getTULocalLookupTables(DeclContext *Primary) const {
8648   auto I = TULocalLookups.find(Primary);
8649   return I == TULocalLookups.end() ? nullptr : &I->second;
8650 }
8651 
8652 serialization::reader::LazySpecializationInfoLookupTable *
getLoadedSpecializationsLookupTables(const Decl * D,bool IsPartial)8653 ASTReader::getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial) {
8654   assert(D->isCanonicalDecl());
8655   auto &LookupTable =
8656       IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8657   auto I = LookupTable.find(D);
8658   return I == LookupTable.end() ? nullptr : &I->second;
8659 }
8660 
haveUnloadedSpecializations(const Decl * D) const8661 bool ASTReader::haveUnloadedSpecializations(const Decl *D) const {
8662   assert(D->isCanonicalDecl());
8663   return PartialSpecializationsLookups.contains(D) ||
8664          SpecializationsLookups.contains(D);
8665 }
8666 
8667 /// Under non-PCH compilation the consumer receives the objc methods
8668 /// before receiving the implementation, and codegen depends on this.
8669 /// We simulate this by deserializing and passing to consumer the methods of the
8670 /// implementation before passing the deserialized implementation decl.
PassObjCImplDeclToConsumer(ObjCImplDecl * ImplD,ASTConsumer * Consumer)8671 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
8672                                        ASTConsumer *Consumer) {
8673   assert(ImplD && Consumer);
8674 
8675   for (auto *I : ImplD->methods())
8676     Consumer->HandleInterestingDecl(DeclGroupRef(I));
8677 
8678   Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
8679 }
8680 
PassInterestingDeclToConsumer(Decl * D)8681 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8682   if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8683     PassObjCImplDeclToConsumer(ImplD, Consumer);
8684   else
8685     Consumer->HandleInterestingDecl(DeclGroupRef(D));
8686 }
8687 
PassVTableToConsumer(CXXRecordDecl * RD)8688 void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8689   Consumer->HandleVTable(RD);
8690 }
8691 
StartTranslationUnit(ASTConsumer * Consumer)8692 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
8693   this->Consumer = Consumer;
8694 
8695   if (Consumer)
8696     PassInterestingDeclsToConsumer();
8697 
8698   if (DeserializationListener)
8699     DeserializationListener->ReaderInitialized(this);
8700 }
8701 
PrintStats()8702 void ASTReader::PrintStats() {
8703   std::fprintf(stderr, "*** AST File Statistics:\n");
8704 
8705   unsigned NumTypesLoaded =
8706       TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), QualType());
8707   unsigned NumDeclsLoaded =
8708       DeclsLoaded.size() -
8709       llvm::count(DeclsLoaded.materialized(), (Decl *)nullptr);
8710   unsigned NumIdentifiersLoaded =
8711       IdentifiersLoaded.size() -
8712       llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
8713   unsigned NumMacrosLoaded =
8714       MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
8715   unsigned NumSelectorsLoaded =
8716       SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
8717 
8718   if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
8719     std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
8720                  NumSLocEntriesRead, TotalNumSLocEntries,
8721                  ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
8722   if (!TypesLoaded.empty())
8723     std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
8724                  NumTypesLoaded, (unsigned)TypesLoaded.size(),
8725                  ((float)NumTypesLoaded/TypesLoaded.size() * 100));
8726   if (!DeclsLoaded.empty())
8727     std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
8728                  NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
8729                  ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
8730   if (!IdentifiersLoaded.empty())
8731     std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
8732                  NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
8733                  ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
8734   if (!MacrosLoaded.empty())
8735     std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
8736                  NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
8737                  ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
8738   if (!SelectorsLoaded.empty())
8739     std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
8740                  NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
8741                  ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
8742   if (TotalNumStatements)
8743     std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
8744                  NumStatementsRead, TotalNumStatements,
8745                  ((float)NumStatementsRead/TotalNumStatements * 100));
8746   if (TotalNumMacros)
8747     std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
8748                  NumMacrosRead, TotalNumMacros,
8749                  ((float)NumMacrosRead/TotalNumMacros * 100));
8750   if (TotalLexicalDeclContexts)
8751     std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
8752                  NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
8753                  ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
8754                   * 100));
8755   if (TotalVisibleDeclContexts)
8756     std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
8757                  NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
8758                  ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
8759                   * 100));
8760   if (TotalModuleLocalVisibleDeclContexts)
8761     std::fprintf(
8762         stderr, "  %u/%u module local visible declcontexts read (%f%%)\n",
8763         NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
8764         ((float)NumModuleLocalVisibleDeclContexts /
8765          TotalModuleLocalVisibleDeclContexts * 100));
8766   if (TotalTULocalVisibleDeclContexts)
8767     std::fprintf(stderr, "  %u/%u visible declcontexts in GMF read (%f%%)\n",
8768                  NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
8769                  ((float)NumTULocalVisibleDeclContexts /
8770                   TotalTULocalVisibleDeclContexts * 100));
8771   if (TotalNumMethodPoolEntries)
8772     std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
8773                  NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
8774                  ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
8775                   * 100));
8776   if (NumMethodPoolLookups)
8777     std::fprintf(stderr, "  %u/%u method pool lookups succeeded (%f%%)\n",
8778                  NumMethodPoolHits, NumMethodPoolLookups,
8779                  ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
8780   if (NumMethodPoolTableLookups)
8781     std::fprintf(stderr, "  %u/%u method pool table lookups succeeded (%f%%)\n",
8782                  NumMethodPoolTableHits, NumMethodPoolTableLookups,
8783                  ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
8784                   * 100.0));
8785   if (NumIdentifierLookupHits)
8786     std::fprintf(stderr,
8787                  "  %u / %u identifier table lookups succeeded (%f%%)\n",
8788                  NumIdentifierLookupHits, NumIdentifierLookups,
8789                  (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
8790 
8791   if (GlobalIndex) {
8792     std::fprintf(stderr, "\n");
8793     GlobalIndex->printStats();
8794   }
8795 
8796   std::fprintf(stderr, "\n");
8797   dump();
8798   std::fprintf(stderr, "\n");
8799 }
8800 
8801 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
8802 LLVM_DUMP_METHOD static void
dumpModuleIDMap(StringRef Name,const ContinuousRangeMap<Key,ModuleFile *,InitialCapacity> & Map)8803 dumpModuleIDMap(StringRef Name,
8804                 const ContinuousRangeMap<Key, ModuleFile *,
8805                                          InitialCapacity> &Map) {
8806   if (Map.begin() == Map.end())
8807     return;
8808 
8809   using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
8810 
8811   llvm::errs() << Name << ":\n";
8812   for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
8813        I != IEnd; ++I)
8814     llvm::errs() << "  " << (DeclID)I->first << " -> " << I->second->FileName
8815                  << "\n";
8816 }
8817 
dump()8818 LLVM_DUMP_METHOD void ASTReader::dump() {
8819   llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
8820   dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
8821   dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
8822   dumpModuleIDMap("Global macro map", GlobalMacroMap);
8823   dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
8824   dumpModuleIDMap("Global selector map", GlobalSelectorMap);
8825   dumpModuleIDMap("Global preprocessed entity map",
8826                   GlobalPreprocessedEntityMap);
8827 
8828   llvm::errs() << "\n*** PCH/Modules Loaded:";
8829   for (ModuleFile &M : ModuleMgr)
8830     M.dump();
8831 }
8832 
8833 /// Return the amount of memory used by memory buffers, breaking down
8834 /// by heap-backed versus mmap'ed memory.
getMemoryBufferSizes(MemoryBufferSizes & sizes) const8835 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
8836   for (ModuleFile &I : ModuleMgr) {
8837     if (llvm::MemoryBuffer *buf = I.Buffer) {
8838       size_t bytes = buf->getBufferSize();
8839       switch (buf->getBufferKind()) {
8840         case llvm::MemoryBuffer::MemoryBuffer_Malloc:
8841           sizes.malloc_bytes += bytes;
8842           break;
8843         case llvm::MemoryBuffer::MemoryBuffer_MMap:
8844           sizes.mmap_bytes += bytes;
8845           break;
8846       }
8847     }
8848   }
8849 }
8850 
InitializeSema(Sema & S)8851 void ASTReader::InitializeSema(Sema &S) {
8852   SemaObj = &S;
8853   S.addExternalSource(this);
8854 
8855   // Makes sure any declarations that were deserialized "too early"
8856   // still get added to the identifier's declaration chains.
8857   for (GlobalDeclID ID : PreloadedDeclIDs) {
8858     NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
8859     pushExternalDeclIntoScope(D, D->getDeclName());
8860   }
8861   PreloadedDeclIDs.clear();
8862 
8863   // FIXME: What happens if these are changed by a module import?
8864   if (!FPPragmaOptions.empty()) {
8865     assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
8866     FPOptionsOverride NewOverrides =
8867         FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
8868     SemaObj->CurFPFeatures =
8869         NewOverrides.applyOverrides(SemaObj->getLangOpts());
8870   }
8871 
8872   for (GlobalDeclID ID : DeclsWithEffectsToVerify) {
8873     Decl *D = GetDecl(ID);
8874     if (auto *FD = dyn_cast<FunctionDecl>(D))
8875       SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
8876     else if (auto *BD = dyn_cast<BlockDecl>(D))
8877       SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
8878     else
8879       llvm_unreachable("unexpected Decl type in DeclsWithEffectsToVerify");
8880   }
8881   DeclsWithEffectsToVerify.clear();
8882 
8883   SemaObj->OpenCLFeatures = OpenCLExtensions;
8884 
8885   UpdateSema();
8886 }
8887 
UpdateSema()8888 void ASTReader::UpdateSema() {
8889   assert(SemaObj && "no Sema to update");
8890 
8891   // Load the offsets of the declarations that Sema references.
8892   // They will be lazily deserialized when needed.
8893   if (!SemaDeclRefs.empty()) {
8894     assert(SemaDeclRefs.size() % 3 == 0);
8895     for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
8896       if (!SemaObj->StdNamespace)
8897         SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
8898       if (!SemaObj->StdBadAlloc)
8899         SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
8900       if (!SemaObj->StdAlignValT)
8901         SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
8902     }
8903     SemaDeclRefs.clear();
8904   }
8905 
8906   // Update the state of pragmas. Use the same API as if we had encountered the
8907   // pragma in the source.
8908   if(OptimizeOffPragmaLocation.isValid())
8909     SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
8910   if (PragmaMSStructState != -1)
8911     SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
8912   if (PointersToMembersPragmaLocation.isValid()) {
8913     SemaObj->ActOnPragmaMSPointersToMembers(
8914         (LangOptions::PragmaMSPointersToMembersKind)
8915             PragmaMSPointersToMembersState,
8916         PointersToMembersPragmaLocation);
8917   }
8918   SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
8919 
8920   if (PragmaAlignPackCurrentValue) {
8921     // The bottom of the stack might have a default value. It must be adjusted
8922     // to the current value to ensure that the packing state is preserved after
8923     // popping entries that were included/imported from a PCH/module.
8924     bool DropFirst = false;
8925     if (!PragmaAlignPackStack.empty() &&
8926         PragmaAlignPackStack.front().Location.isInvalid()) {
8927       assert(PragmaAlignPackStack.front().Value ==
8928                  SemaObj->AlignPackStack.DefaultValue &&
8929              "Expected a default alignment value");
8930       SemaObj->AlignPackStack.Stack.emplace_back(
8931           PragmaAlignPackStack.front().SlotLabel,
8932           SemaObj->AlignPackStack.CurrentValue,
8933           SemaObj->AlignPackStack.CurrentPragmaLocation,
8934           PragmaAlignPackStack.front().PushLocation);
8935       DropFirst = true;
8936     }
8937     for (const auto &Entry :
8938          llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
8939       SemaObj->AlignPackStack.Stack.emplace_back(
8940           Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
8941     }
8942     if (PragmaAlignPackCurrentLocation.isInvalid()) {
8943       assert(*PragmaAlignPackCurrentValue ==
8944                  SemaObj->AlignPackStack.DefaultValue &&
8945              "Expected a default align and pack value");
8946       // Keep the current values.
8947     } else {
8948       SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
8949       SemaObj->AlignPackStack.CurrentPragmaLocation =
8950           PragmaAlignPackCurrentLocation;
8951     }
8952   }
8953   if (FpPragmaCurrentValue) {
8954     // The bottom of the stack might have a default value. It must be adjusted
8955     // to the current value to ensure that fp-pragma state is preserved after
8956     // popping entries that were included/imported from a PCH/module.
8957     bool DropFirst = false;
8958     if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
8959       assert(FpPragmaStack.front().Value ==
8960                  SemaObj->FpPragmaStack.DefaultValue &&
8961              "Expected a default pragma float_control value");
8962       SemaObj->FpPragmaStack.Stack.emplace_back(
8963           FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
8964           SemaObj->FpPragmaStack.CurrentPragmaLocation,
8965           FpPragmaStack.front().PushLocation);
8966       DropFirst = true;
8967     }
8968     for (const auto &Entry :
8969          llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
8970       SemaObj->FpPragmaStack.Stack.emplace_back(
8971           Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
8972     if (FpPragmaCurrentLocation.isInvalid()) {
8973       assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
8974              "Expected a default pragma float_control value");
8975       // Keep the current values.
8976     } else {
8977       SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
8978       SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
8979     }
8980   }
8981 
8982   // For non-modular AST files, restore visiblity of modules.
8983   for (auto &Import : PendingImportedModulesSema) {
8984     if (Import.ImportLoc.isInvalid())
8985       continue;
8986     if (Module *Imported = getSubmodule(Import.ID)) {
8987       SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
8988     }
8989   }
8990   PendingImportedModulesSema.clear();
8991 }
8992 
get(StringRef Name)8993 IdentifierInfo *ASTReader::get(StringRef Name) {
8994   // Note that we are loading an identifier.
8995   Deserializing AnIdentifier(this);
8996 
8997   IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
8998                                   NumIdentifierLookups,
8999                                   NumIdentifierLookupHits);
9000 
9001   // We don't need to do identifier table lookups in C++ modules (we preload
9002   // all interesting declarations, and don't need to use the scope for name
9003   // lookups). Perform the lookup in PCH files, though, since we don't build
9004   // a complete initial identifier table if we're carrying on from a PCH.
9005   if (PP.getLangOpts().CPlusPlus) {
9006     for (auto *F : ModuleMgr.pch_modules())
9007       if (Visitor(*F))
9008         break;
9009   } else {
9010     // If there is a global index, look there first to determine which modules
9011     // provably do not have any results for this identifier.
9012     GlobalModuleIndex::HitSet Hits;
9013     GlobalModuleIndex::HitSet *HitsPtr = nullptr;
9014     if (!loadGlobalIndex()) {
9015       if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9016         HitsPtr = &Hits;
9017       }
9018     }
9019 
9020     ModuleMgr.visit(Visitor, HitsPtr);
9021   }
9022 
9023   IdentifierInfo *II = Visitor.getIdentifierInfo();
9024   markIdentifierUpToDate(II);
9025   return II;
9026 }
9027 
9028 namespace clang {
9029 
9030   /// An identifier-lookup iterator that enumerates all of the
9031   /// identifiers stored within a set of AST files.
9032   class ASTIdentifierIterator : public IdentifierIterator {
9033     /// The AST reader whose identifiers are being enumerated.
9034     const ASTReader &Reader;
9035 
9036     /// The current index into the chain of AST files stored in
9037     /// the AST reader.
9038     unsigned Index;
9039 
9040     /// The current position within the identifier lookup table
9041     /// of the current AST file.
9042     ASTIdentifierLookupTable::key_iterator Current;
9043 
9044     /// The end position within the identifier lookup table of
9045     /// the current AST file.
9046     ASTIdentifierLookupTable::key_iterator End;
9047 
9048     /// Whether to skip any modules in the ASTReader.
9049     bool SkipModules;
9050 
9051   public:
9052     explicit ASTIdentifierIterator(const ASTReader &Reader,
9053                                    bool SkipModules = false);
9054 
9055     StringRef Next() override;
9056   };
9057 
9058 } // namespace clang
9059 
ASTIdentifierIterator(const ASTReader & Reader,bool SkipModules)9060 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
9061                                              bool SkipModules)
9062     : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9063 }
9064 
Next()9065 StringRef ASTIdentifierIterator::Next() {
9066   while (Current == End) {
9067     // If we have exhausted all of our AST files, we're done.
9068     if (Index == 0)
9069       return StringRef();
9070 
9071     --Index;
9072     ModuleFile &F = Reader.ModuleMgr[Index];
9073     if (SkipModules && F.isModule())
9074       continue;
9075 
9076     ASTIdentifierLookupTable *IdTable =
9077         (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
9078     Current = IdTable->key_begin();
9079     End = IdTable->key_end();
9080   }
9081 
9082   // We have any identifiers remaining in the current AST file; return
9083   // the next one.
9084   StringRef Result = *Current;
9085   ++Current;
9086   return Result;
9087 }
9088 
9089 namespace {
9090 
9091 /// A utility for appending two IdentifierIterators.
9092 class ChainedIdentifierIterator : public IdentifierIterator {
9093   std::unique_ptr<IdentifierIterator> Current;
9094   std::unique_ptr<IdentifierIterator> Queued;
9095 
9096 public:
ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,std::unique_ptr<IdentifierIterator> Second)9097   ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
9098                             std::unique_ptr<IdentifierIterator> Second)
9099       : Current(std::move(First)), Queued(std::move(Second)) {}
9100 
Next()9101   StringRef Next() override {
9102     if (!Current)
9103       return StringRef();
9104 
9105     StringRef result = Current->Next();
9106     if (!result.empty())
9107       return result;
9108 
9109     // Try the queued iterator, which may itself be empty.
9110     Current.reset();
9111     std::swap(Current, Queued);
9112     return Next();
9113   }
9114 };
9115 
9116 } // namespace
9117 
getIdentifiers()9118 IdentifierIterator *ASTReader::getIdentifiers() {
9119   if (!loadGlobalIndex()) {
9120     std::unique_ptr<IdentifierIterator> ReaderIter(
9121         new ASTIdentifierIterator(*this, /*SkipModules=*/true));
9122     std::unique_ptr<IdentifierIterator> ModulesIter(
9123         GlobalIndex->createIdentifierIterator());
9124     return new ChainedIdentifierIterator(std::move(ReaderIter),
9125                                          std::move(ModulesIter));
9126   }
9127 
9128   return new ASTIdentifierIterator(*this);
9129 }
9130 
9131 namespace clang {
9132 namespace serialization {
9133 
9134   class ReadMethodPoolVisitor {
9135     ASTReader &Reader;
9136     Selector Sel;
9137     unsigned PriorGeneration;
9138     unsigned InstanceBits = 0;
9139     unsigned FactoryBits = 0;
9140     bool InstanceHasMoreThanOneDecl = false;
9141     bool FactoryHasMoreThanOneDecl = false;
9142     SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
9143     SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
9144 
9145   public:
ReadMethodPoolVisitor(ASTReader & Reader,Selector Sel,unsigned PriorGeneration)9146     ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
9147                           unsigned PriorGeneration)
9148         : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9149 
operator ()(ModuleFile & M)9150     bool operator()(ModuleFile &M) {
9151       if (!M.SelectorLookupTable)
9152         return false;
9153 
9154       // If we've already searched this module file, skip it now.
9155       if (M.Generation <= PriorGeneration)
9156         return true;
9157 
9158       ++Reader.NumMethodPoolTableLookups;
9159       ASTSelectorLookupTable *PoolTable
9160         = (ASTSelectorLookupTable*)M.SelectorLookupTable;
9161       ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9162       if (Pos == PoolTable->end())
9163         return false;
9164 
9165       ++Reader.NumMethodPoolTableHits;
9166       ++Reader.NumSelectorsRead;
9167       // FIXME: Not quite happy with the statistics here. We probably should
9168       // disable this tracking when called via LoadSelector.
9169       // Also, should entries without methods count as misses?
9170       ++Reader.NumMethodPoolEntriesRead;
9171       ASTSelectorLookupTrait::data_type Data = *Pos;
9172       if (Reader.DeserializationListener)
9173         Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
9174 
9175       // Append methods in the reverse order, so that later we can process them
9176       // in the order they appear in the source code by iterating through
9177       // the vector in the reverse order.
9178       InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
9179       FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
9180       InstanceBits = Data.InstanceBits;
9181       FactoryBits = Data.FactoryBits;
9182       InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
9183       FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
9184       return false;
9185     }
9186 
9187     /// Retrieve the instance methods found by this visitor.
getInstanceMethods() const9188     ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
9189       return InstanceMethods;
9190     }
9191 
9192     /// Retrieve the instance methods found by this visitor.
getFactoryMethods() const9193     ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
9194       return FactoryMethods;
9195     }
9196 
getInstanceBits() const9197     unsigned getInstanceBits() const { return InstanceBits; }
getFactoryBits() const9198     unsigned getFactoryBits() const { return FactoryBits; }
9199 
instanceHasMoreThanOneDecl() const9200     bool instanceHasMoreThanOneDecl() const {
9201       return InstanceHasMoreThanOneDecl;
9202     }
9203 
factoryHasMoreThanOneDecl() const9204     bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
9205   };
9206 
9207 } // namespace serialization
9208 } // namespace clang
9209 
9210 /// Add the given set of methods to the method list.
addMethodsToPool(Sema & S,ArrayRef<ObjCMethodDecl * > Methods,ObjCMethodList & List)9211 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
9212                              ObjCMethodList &List) {
9213   for (ObjCMethodDecl *M : llvm::reverse(Methods))
9214     S.ObjC().addMethodToGlobalList(&List, M);
9215 }
9216 
ReadMethodPool(Selector Sel)9217 void ASTReader::ReadMethodPool(Selector Sel) {
9218   // Get the selector generation and update it to the current generation.
9219   unsigned &Generation = SelectorGeneration[Sel];
9220   unsigned PriorGeneration = Generation;
9221   Generation = getGeneration();
9222   SelectorOutOfDate[Sel] = false;
9223 
9224   // Search for methods defined with this selector.
9225   ++NumMethodPoolLookups;
9226   ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
9227   ModuleMgr.visit(Visitor);
9228 
9229   if (Visitor.getInstanceMethods().empty() &&
9230       Visitor.getFactoryMethods().empty())
9231     return;
9232 
9233   ++NumMethodPoolHits;
9234 
9235   if (!getSema())
9236     return;
9237 
9238   Sema &S = *getSema();
9239   auto &Methods = S.ObjC().MethodPool[Sel];
9240 
9241   Methods.first.setBits(Visitor.getInstanceBits());
9242   Methods.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
9243   Methods.second.setBits(Visitor.getFactoryBits());
9244   Methods.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
9245 
9246   // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
9247   // when building a module we keep every method individually and may need to
9248   // update hasMoreThanOneDecl as we add the methods.
9249   addMethodsToPool(S, Visitor.getInstanceMethods(), Methods.first);
9250   addMethodsToPool(S, Visitor.getFactoryMethods(), Methods.second);
9251 }
9252 
updateOutOfDateSelector(Selector Sel)9253 void ASTReader::updateOutOfDateSelector(Selector Sel) {
9254   if (SelectorOutOfDate[Sel])
9255     ReadMethodPool(Sel);
9256 }
9257 
ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl * > & Namespaces)9258 void ASTReader::ReadKnownNamespaces(
9259                           SmallVectorImpl<NamespaceDecl *> &Namespaces) {
9260   Namespaces.clear();
9261 
9262   for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9263     if (NamespaceDecl *Namespace
9264                 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
9265       Namespaces.push_back(Namespace);
9266   }
9267 }
9268 
ReadUndefinedButUsed(llvm::MapVector<NamedDecl *,SourceLocation> & Undefined)9269 void ASTReader::ReadUndefinedButUsed(
9270     llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
9271   for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9272     UndefinedButUsedDecl &U = UndefinedButUsed[Idx++];
9273     NamedDecl *D = cast<NamedDecl>(GetDecl(U.ID));
9274     SourceLocation Loc = SourceLocation::getFromRawEncoding(U.RawLoc);
9275     Undefined.insert(std::make_pair(D, Loc));
9276   }
9277   UndefinedButUsed.clear();
9278 }
9279 
ReadMismatchingDeleteExpressions(llvm::MapVector<FieldDecl *,llvm::SmallVector<std::pair<SourceLocation,bool>,4>> & Exprs)9280 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
9281     FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
9282                                                      Exprs) {
9283   for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9284     FieldDecl *FD =
9285         cast<FieldDecl>(GetDecl(GlobalDeclID(DelayedDeleteExprs[Idx++])));
9286     uint64_t Count = DelayedDeleteExprs[Idx++];
9287     for (uint64_t C = 0; C < Count; ++C) {
9288       SourceLocation DeleteLoc =
9289           SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
9290       const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9291       Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9292     }
9293   }
9294 }
9295 
ReadTentativeDefinitions(SmallVectorImpl<VarDecl * > & TentativeDefs)9296 void ASTReader::ReadTentativeDefinitions(
9297                   SmallVectorImpl<VarDecl *> &TentativeDefs) {
9298   for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9299     VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
9300     if (Var)
9301       TentativeDefs.push_back(Var);
9302   }
9303   TentativeDefinitions.clear();
9304 }
9305 
ReadUnusedFileScopedDecls(SmallVectorImpl<const DeclaratorDecl * > & Decls)9306 void ASTReader::ReadUnusedFileScopedDecls(
9307                                SmallVectorImpl<const DeclaratorDecl *> &Decls) {
9308   for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9309     DeclaratorDecl *D
9310       = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
9311     if (D)
9312       Decls.push_back(D);
9313   }
9314   UnusedFileScopedDecls.clear();
9315 }
9316 
ReadDelegatingConstructors(SmallVectorImpl<CXXConstructorDecl * > & Decls)9317 void ASTReader::ReadDelegatingConstructors(
9318                                  SmallVectorImpl<CXXConstructorDecl *> &Decls) {
9319   for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9320     CXXConstructorDecl *D
9321       = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
9322     if (D)
9323       Decls.push_back(D);
9324   }
9325   DelegatingCtorDecls.clear();
9326 }
9327 
ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl * > & Decls)9328 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
9329   for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9330     TypedefNameDecl *D
9331       = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
9332     if (D)
9333       Decls.push_back(D);
9334   }
9335   ExtVectorDecls.clear();
9336 }
9337 
ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector<const TypedefNameDecl *,4> & Decls)9338 void ASTReader::ReadUnusedLocalTypedefNameCandidates(
9339     llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
9340   for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9341        ++I) {
9342     TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
9343         GetDecl(UnusedLocalTypedefNameCandidates[I]));
9344     if (D)
9345       Decls.insert(D);
9346   }
9347   UnusedLocalTypedefNameCandidates.clear();
9348 }
9349 
ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector<Decl *,4> & Decls)9350 void ASTReader::ReadDeclsToCheckForDeferredDiags(
9351     llvm::SmallSetVector<Decl *, 4> &Decls) {
9352   for (auto I : DeclsToCheckForDeferredDiags) {
9353     auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
9354     if (D)
9355       Decls.insert(D);
9356   }
9357   DeclsToCheckForDeferredDiags.clear();
9358 }
9359 
ReadReferencedSelectors(SmallVectorImpl<std::pair<Selector,SourceLocation>> & Sels)9360 void ASTReader::ReadReferencedSelectors(
9361        SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
9362   if (ReferencedSelectorsData.empty())
9363     return;
9364 
9365   // If there are @selector references added them to its pool. This is for
9366   // implementation of -Wselector.
9367   unsigned int DataSize = ReferencedSelectorsData.size()-1;
9368   unsigned I = 0;
9369   while (I < DataSize) {
9370     Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
9371     SourceLocation SelLoc
9372       = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
9373     Sels.push_back(std::make_pair(Sel, SelLoc));
9374   }
9375   ReferencedSelectorsData.clear();
9376 }
9377 
ReadWeakUndeclaredIdentifiers(SmallVectorImpl<std::pair<IdentifierInfo *,WeakInfo>> & WeakIDs)9378 void ASTReader::ReadWeakUndeclaredIdentifiers(
9379        SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
9380   if (WeakUndeclaredIdentifiers.empty())
9381     return;
9382 
9383   for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
9384     IdentifierInfo *WeakId
9385       = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9386     IdentifierInfo *AliasId
9387       = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
9388     SourceLocation Loc =
9389         SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
9390     WeakInfo WI(AliasId, Loc);
9391     WeakIDs.push_back(std::make_pair(WeakId, WI));
9392   }
9393   WeakUndeclaredIdentifiers.clear();
9394 }
9395 
ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> & VTables)9396 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
9397   for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
9398     ExternalVTableUse VT;
9399     VTableUse &TableInfo = VTableUses[Idx++];
9400     VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(TableInfo.ID));
9401     VT.Location = SourceLocation::getFromRawEncoding(TableInfo.RawLoc);
9402     VT.DefinitionRequired = TableInfo.Used;
9403     VTables.push_back(VT);
9404   }
9405 
9406   VTableUses.clear();
9407 }
9408 
ReadPendingInstantiations(SmallVectorImpl<std::pair<ValueDecl *,SourceLocation>> & Pending)9409 void ASTReader::ReadPendingInstantiations(
9410        SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
9411   for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9412     PendingInstantiation &Inst = PendingInstantiations[Idx++];
9413     ValueDecl *D = cast<ValueDecl>(GetDecl(Inst.ID));
9414     SourceLocation Loc = SourceLocation::getFromRawEncoding(Inst.RawLoc);
9415 
9416     Pending.push_back(std::make_pair(D, Loc));
9417   }
9418   PendingInstantiations.clear();
9419 }
9420 
ReadLateParsedTemplates(llvm::MapVector<const FunctionDecl *,std::unique_ptr<LateParsedTemplate>> & LPTMap)9421 void ASTReader::ReadLateParsedTemplates(
9422     llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9423         &LPTMap) {
9424   for (auto &LPT : LateParsedTemplates) {
9425     ModuleFile *FMod = LPT.first;
9426     RecordDataImpl &LateParsed = LPT.second;
9427     for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9428          /* In loop */) {
9429       FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx);
9430 
9431       auto LT = std::make_unique<LateParsedTemplate>();
9432       LT->D = ReadDecl(*FMod, LateParsed, Idx);
9433       LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
9434 
9435       ModuleFile *F = getOwningModuleFile(LT->D);
9436       assert(F && "No module");
9437 
9438       unsigned TokN = LateParsed[Idx++];
9439       LT->Toks.reserve(TokN);
9440       for (unsigned T = 0; T < TokN; ++T)
9441         LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
9442 
9443       LPTMap.insert(std::make_pair(FD, std::move(LT)));
9444     }
9445   }
9446 
9447   LateParsedTemplates.clear();
9448 }
9449 
AssignedLambdaNumbering(CXXRecordDecl * Lambda)9450 void ASTReader::AssignedLambdaNumbering(CXXRecordDecl *Lambda) {
9451   if (!Lambda->getLambdaContextDecl())
9452     return;
9453 
9454   auto LambdaInfo =
9455       std::make_pair(Lambda->getLambdaContextDecl()->getCanonicalDecl(),
9456                      Lambda->getLambdaIndexInContext());
9457 
9458   // Handle the import and then include case for lambdas.
9459   if (auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9460       Iter != LambdaDeclarationsForMerging.end() &&
9461       Iter->second->isFromASTFile() && Lambda->getFirstDecl() == Lambda) {
9462     CXXRecordDecl *Previous =
9463         cast<CXXRecordDecl>(Iter->second)->getMostRecentDecl();
9464     Lambda->setPreviousDecl(Previous);
9465     // FIXME: It will be best to use the Previous type when we creating the
9466     // lambda directly. But that requires us to get the lambda context decl and
9467     // lambda index before creating the lambda, which needs a drastic change in
9468     // the parser.
9469     const_cast<QualType &>(Lambda->TypeForDecl->CanonicalType) =
9470         Previous->TypeForDecl->CanonicalType;
9471     return;
9472   }
9473 
9474   // Keep track of this lambda so it can be merged with another lambda that
9475   // is loaded later.
9476   LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9477 }
9478 
LoadSelector(Selector Sel)9479 void ASTReader::LoadSelector(Selector Sel) {
9480   // It would be complicated to avoid reading the methods anyway. So don't.
9481   ReadMethodPool(Sel);
9482 }
9483 
SetIdentifierInfo(IdentifierID ID,IdentifierInfo * II)9484 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
9485   assert(ID && "Non-zero identifier ID required");
9486   unsigned Index = translateIdentifierIDToIndex(ID).second;
9487   assert(Index < IdentifiersLoaded.size() && "identifier ID out of range");
9488   IdentifiersLoaded[Index] = II;
9489   if (DeserializationListener)
9490     DeserializationListener->IdentifierRead(ID, II);
9491 }
9492 
9493 /// Set the globally-visible declarations associated with the given
9494 /// identifier.
9495 ///
9496 /// If the AST reader is currently in a state where the given declaration IDs
9497 /// cannot safely be resolved, they are queued until it is safe to resolve
9498 /// them.
9499 ///
9500 /// \param II an IdentifierInfo that refers to one or more globally-visible
9501 /// declarations.
9502 ///
9503 /// \param DeclIDs the set of declaration IDs with the name @p II that are
9504 /// visible at global scope.
9505 ///
9506 /// \param Decls if non-null, this vector will be populated with the set of
9507 /// deserialized declarations. These declarations will not be pushed into
9508 /// scope.
SetGloballyVisibleDecls(IdentifierInfo * II,const SmallVectorImpl<GlobalDeclID> & DeclIDs,SmallVectorImpl<Decl * > * Decls)9509 void ASTReader::SetGloballyVisibleDecls(
9510     IdentifierInfo *II, const SmallVectorImpl<GlobalDeclID> &DeclIDs,
9511     SmallVectorImpl<Decl *> *Decls) {
9512   if (NumCurrentElementsDeserializing && !Decls) {
9513     PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9514     return;
9515   }
9516 
9517   for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9518     if (!SemaObj) {
9519       // Queue this declaration so that it will be added to the
9520       // translation unit scope and identifier's declaration chain
9521       // once a Sema object is known.
9522       PreloadedDeclIDs.push_back(DeclIDs[I]);
9523       continue;
9524     }
9525 
9526     NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
9527 
9528     // If we're simply supposed to record the declarations, do so now.
9529     if (Decls) {
9530       Decls->push_back(D);
9531       continue;
9532     }
9533 
9534     // Introduce this declaration into the translation-unit scope
9535     // and add it to the declaration chain for this identifier, so
9536     // that (unqualified) name lookup will find it.
9537     pushExternalDeclIntoScope(D, II);
9538   }
9539 }
9540 
9541 std::pair<ModuleFile *, unsigned>
translateIdentifierIDToIndex(IdentifierID ID) const9542 ASTReader::translateIdentifierIDToIndex(IdentifierID ID) const {
9543   if (ID == 0)
9544     return {nullptr, 0};
9545 
9546   unsigned ModuleFileIndex = ID >> 32;
9547   unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9548 
9549   assert(ModuleFileIndex && "not translating loaded IdentifierID?");
9550   assert(getModuleManager().size() > ModuleFileIndex - 1);
9551 
9552   ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
9553   assert(LocalID < MF.LocalNumIdentifiers);
9554   return {&MF, MF.BaseIdentifierID + LocalID};
9555 }
9556 
DecodeIdentifierInfo(IdentifierID ID)9557 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
9558   if (ID == 0)
9559     return nullptr;
9560 
9561   if (IdentifiersLoaded.empty()) {
9562     Error("no identifier table in AST file");
9563     return nullptr;
9564   }
9565 
9566   auto [M, Index] = translateIdentifierIDToIndex(ID);
9567   if (!IdentifiersLoaded[Index]) {
9568     assert(M != nullptr && "Untranslated Identifier ID?");
9569     assert(Index >= M->BaseIdentifierID);
9570     unsigned LocalIndex = Index - M->BaseIdentifierID;
9571     const unsigned char *Data =
9572         M->IdentifierTableData + M->IdentifierOffsets[LocalIndex];
9573 
9574     ASTIdentifierLookupTrait Trait(*this, *M);
9575     auto KeyDataLen = Trait.ReadKeyDataLength(Data);
9576     auto Key = Trait.ReadKey(Data, KeyDataLen.first);
9577     auto &II = PP.getIdentifierTable().get(Key);
9578     IdentifiersLoaded[Index] = &II;
9579     bool IsModule = getPreprocessor().getCurrentModule() != nullptr;
9580     markIdentifierFromAST(*this, II, IsModule);
9581     if (DeserializationListener)
9582       DeserializationListener->IdentifierRead(ID, &II);
9583   }
9584 
9585   return IdentifiersLoaded[Index];
9586 }
9587 
getLocalIdentifier(ModuleFile & M,uint64_t LocalID)9588 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, uint64_t LocalID) {
9589   return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
9590 }
9591 
getGlobalIdentifierID(ModuleFile & M,uint64_t LocalID)9592 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID) {
9593   if (LocalID < NUM_PREDEF_IDENT_IDS)
9594     return LocalID;
9595 
9596   if (!M.ModuleOffsetMap.empty())
9597     ReadModuleOffsetMap(M);
9598 
9599   unsigned ModuleFileIndex = LocalID >> 32;
9600   LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9601   ModuleFile *MF =
9602       ModuleFileIndex ? M.TransitiveImports[ModuleFileIndex - 1] : &M;
9603   assert(MF && "malformed identifier ID encoding?");
9604 
9605   if (!ModuleFileIndex)
9606     LocalID -= NUM_PREDEF_IDENT_IDS;
9607 
9608   return ((IdentifierID)(MF->Index + 1) << 32) | LocalID;
9609 }
9610 
getMacro(MacroID ID)9611 MacroInfo *ASTReader::getMacro(MacroID ID) {
9612   if (ID == 0)
9613     return nullptr;
9614 
9615   if (MacrosLoaded.empty()) {
9616     Error("no macro table in AST file");
9617     return nullptr;
9618   }
9619 
9620   ID -= NUM_PREDEF_MACRO_IDS;
9621   if (!MacrosLoaded[ID]) {
9622     GlobalMacroMapType::iterator I
9623       = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
9624     assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
9625     ModuleFile *M = I->second;
9626     unsigned Index = ID - M->BaseMacroID;
9627     MacrosLoaded[ID] =
9628         ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]);
9629 
9630     if (DeserializationListener)
9631       DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
9632                                          MacrosLoaded[ID]);
9633   }
9634 
9635   return MacrosLoaded[ID];
9636 }
9637 
getGlobalMacroID(ModuleFile & M,unsigned LocalID)9638 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
9639   if (LocalID < NUM_PREDEF_MACRO_IDS)
9640     return LocalID;
9641 
9642   if (!M.ModuleOffsetMap.empty())
9643     ReadModuleOffsetMap(M);
9644 
9645   ContinuousRangeMap<uint32_t, int, 2>::iterator I
9646     = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
9647   assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
9648 
9649   return LocalID + I->second;
9650 }
9651 
9652 serialization::SubmoduleID
getGlobalSubmoduleID(ModuleFile & M,unsigned LocalID) const9653 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const {
9654   if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
9655     return LocalID;
9656 
9657   if (!M.ModuleOffsetMap.empty())
9658     ReadModuleOffsetMap(M);
9659 
9660   ContinuousRangeMap<uint32_t, int, 2>::iterator I
9661     = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
9662   assert(I != M.SubmoduleRemap.end()
9663          && "Invalid index into submodule index remap");
9664 
9665   return LocalID + I->second;
9666 }
9667 
getSubmodule(SubmoduleID GlobalID)9668 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
9669   if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
9670     assert(GlobalID == 0 && "Unhandled global submodule ID");
9671     return nullptr;
9672   }
9673 
9674   if (GlobalID > SubmodulesLoaded.size()) {
9675     Error("submodule ID out of range in AST file");
9676     return nullptr;
9677   }
9678 
9679   return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
9680 }
9681 
getModule(unsigned ID)9682 Module *ASTReader::getModule(unsigned ID) {
9683   return getSubmodule(ID);
9684 }
9685 
getLocalModuleFile(ModuleFile & M,unsigned ID) const9686 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &M, unsigned ID) const {
9687   if (ID & 1) {
9688     // It's a module, look it up by submodule ID.
9689     auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(M, ID >> 1));
9690     return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
9691   } else {
9692     // It's a prefix (preamble, PCH, ...). Look it up by index.
9693    int IndexFromEnd = static_cast<int>(ID >> 1);
9694     assert(IndexFromEnd && "got reference to unknown module file");
9695     return getModuleManager().pch_modules().end()[-IndexFromEnd];
9696   }
9697 }
9698 
getModuleFileID(ModuleFile * M)9699 unsigned ASTReader::getModuleFileID(ModuleFile *M) {
9700   if (!M)
9701     return 1;
9702 
9703   // For a file representing a module, use the submodule ID of the top-level
9704   // module as the file ID. For any other kind of file, the number of such
9705   // files loaded beforehand will be the same on reload.
9706   // FIXME: Is this true even if we have an explicit module file and a PCH?
9707   if (M->isModule())
9708     return ((M->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
9709 
9710   auto PCHModules = getModuleManager().pch_modules();
9711   auto I = llvm::find(PCHModules, M);
9712   assert(I != PCHModules.end() && "emitting reference to unknown file");
9713   return std::distance(I, PCHModules.end()) << 1;
9714 }
9715 
getSourceDescriptor(unsigned ID)9716 std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
9717   if (Module *M = getSubmodule(ID))
9718     return ASTSourceDescriptor(*M);
9719 
9720   // If there is only a single PCH, return it instead.
9721   // Chained PCH are not supported.
9722   const auto &PCHChain = ModuleMgr.pch_modules();
9723   if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
9724     ModuleFile &MF = ModuleMgr.getPrimaryModule();
9725     StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
9726     StringRef FileName = llvm::sys::path::filename(MF.FileName);
9727     return ASTSourceDescriptor(ModuleName,
9728                                llvm::sys::path::parent_path(MF.FileName),
9729                                FileName, MF.Signature);
9730   }
9731   return std::nullopt;
9732 }
9733 
hasExternalDefinitions(const Decl * FD)9734 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
9735   auto I = DefinitionSource.find(FD);
9736   if (I == DefinitionSource.end())
9737     return EK_ReplyHazy;
9738   return I->second ? EK_Never : EK_Always;
9739 }
9740 
wasThisDeclarationADefinition(const FunctionDecl * FD)9741 bool ASTReader::wasThisDeclarationADefinition(const FunctionDecl *FD) {
9742   return ThisDeclarationWasADefinitionSet.contains(FD);
9743 }
9744 
getLocalSelector(ModuleFile & M,unsigned LocalID)9745 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
9746   return DecodeSelector(getGlobalSelectorID(M, LocalID));
9747 }
9748 
DecodeSelector(serialization::SelectorID ID)9749 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
9750   if (ID == 0)
9751     return Selector();
9752 
9753   if (ID > SelectorsLoaded.size()) {
9754     Error("selector ID out of range in AST file");
9755     return Selector();
9756   }
9757 
9758   if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
9759     // Load this selector from the selector table.
9760     GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
9761     assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
9762     ModuleFile &M = *I->second;
9763     ASTSelectorLookupTrait Trait(*this, M);
9764     unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
9765     SelectorsLoaded[ID - 1] =
9766       Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
9767     if (DeserializationListener)
9768       DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
9769   }
9770 
9771   return SelectorsLoaded[ID - 1];
9772 }
9773 
GetExternalSelector(serialization::SelectorID ID)9774 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
9775   return DecodeSelector(ID);
9776 }
9777 
GetNumExternalSelectors()9778 uint32_t ASTReader::GetNumExternalSelectors() {
9779   // ID 0 (the null selector) is considered an external selector.
9780   return getTotalNumSelectors() + 1;
9781 }
9782 
9783 serialization::SelectorID
getGlobalSelectorID(ModuleFile & M,unsigned LocalID) const9784 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
9785   if (LocalID < NUM_PREDEF_SELECTOR_IDS)
9786     return LocalID;
9787 
9788   if (!M.ModuleOffsetMap.empty())
9789     ReadModuleOffsetMap(M);
9790 
9791   ContinuousRangeMap<uint32_t, int, 2>::iterator I
9792     = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
9793   assert(I != M.SelectorRemap.end()
9794          && "Invalid index into selector index remap");
9795 
9796   return LocalID + I->second;
9797 }
9798 
9799 DeclarationNameLoc
readDeclarationNameLoc(DeclarationName Name)9800 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) {
9801   switch (Name.getNameKind()) {
9802   case DeclarationName::CXXConstructorName:
9803   case DeclarationName::CXXDestructorName:
9804   case DeclarationName::CXXConversionFunctionName:
9805     return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo());
9806 
9807   case DeclarationName::CXXOperatorName:
9808     return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange());
9809 
9810   case DeclarationName::CXXLiteralOperatorName:
9811     return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc(
9812         readSourceLocation());
9813 
9814   case DeclarationName::Identifier:
9815   case DeclarationName::ObjCZeroArgSelector:
9816   case DeclarationName::ObjCOneArgSelector:
9817   case DeclarationName::ObjCMultiArgSelector:
9818   case DeclarationName::CXXUsingDirective:
9819   case DeclarationName::CXXDeductionGuideName:
9820     break;
9821   }
9822   return DeclarationNameLoc();
9823 }
9824 
readDeclarationNameInfo()9825 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() {
9826   DeclarationNameInfo NameInfo;
9827   NameInfo.setName(readDeclarationName());
9828   NameInfo.setLoc(readSourceLocation());
9829   NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
9830   return NameInfo;
9831 }
9832 
readTypeCoupledDeclRefInfo()9833 TypeCoupledDeclRefInfo ASTRecordReader::readTypeCoupledDeclRefInfo() {
9834   return TypeCoupledDeclRefInfo(readDeclAs<ValueDecl>(), readBool());
9835 }
9836 
readHLSLSpirvOperand()9837 SpirvOperand ASTRecordReader::readHLSLSpirvOperand() {
9838   auto Kind = readInt();
9839   auto ResultType = readQualType();
9840   auto Value = readAPInt();
9841   SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType, Value);
9842   assert(Op.isValid());
9843   return Op;
9844 }
9845 
readQualifierInfo(QualifierInfo & Info)9846 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) {
9847   Info.QualifierLoc = readNestedNameSpecifierLoc();
9848   unsigned NumTPLists = readInt();
9849   Info.NumTemplParamLists = NumTPLists;
9850   if (NumTPLists) {
9851     Info.TemplParamLists =
9852         new (getContext()) TemplateParameterList *[NumTPLists];
9853     for (unsigned i = 0; i != NumTPLists; ++i)
9854       Info.TemplParamLists[i] = readTemplateParameterList();
9855   }
9856 }
9857 
9858 TemplateParameterList *
readTemplateParameterList()9859 ASTRecordReader::readTemplateParameterList() {
9860   SourceLocation TemplateLoc = readSourceLocation();
9861   SourceLocation LAngleLoc = readSourceLocation();
9862   SourceLocation RAngleLoc = readSourceLocation();
9863 
9864   unsigned NumParams = readInt();
9865   SmallVector<NamedDecl *, 16> Params;
9866   Params.reserve(NumParams);
9867   while (NumParams--)
9868     Params.push_back(readDeclAs<NamedDecl>());
9869 
9870   bool HasRequiresClause = readBool();
9871   Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
9872 
9873   TemplateParameterList *TemplateParams = TemplateParameterList::Create(
9874       getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
9875   return TemplateParams;
9876 }
9877 
readTemplateArgumentList(SmallVectorImpl<TemplateArgument> & TemplArgs,bool Canonicalize)9878 void ASTRecordReader::readTemplateArgumentList(
9879                         SmallVectorImpl<TemplateArgument> &TemplArgs,
9880                         bool Canonicalize) {
9881   unsigned NumTemplateArgs = readInt();
9882   TemplArgs.reserve(NumTemplateArgs);
9883   while (NumTemplateArgs--)
9884     TemplArgs.push_back(readTemplateArgument(Canonicalize));
9885 }
9886 
9887 /// Read a UnresolvedSet structure.
readUnresolvedSet(LazyASTUnresolvedSet & Set)9888 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) {
9889   unsigned NumDecls = readInt();
9890   Set.reserve(getContext(), NumDecls);
9891   while (NumDecls--) {
9892     GlobalDeclID ID = readDeclID();
9893     AccessSpecifier AS = (AccessSpecifier) readInt();
9894     Set.addLazyDecl(getContext(), ID, AS);
9895   }
9896 }
9897 
9898 CXXBaseSpecifier
readCXXBaseSpecifier()9899 ASTRecordReader::readCXXBaseSpecifier() {
9900   bool isVirtual = readBool();
9901   bool isBaseOfClass = readBool();
9902   AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
9903   bool inheritConstructors = readBool();
9904   TypeSourceInfo *TInfo = readTypeSourceInfo();
9905   SourceRange Range = readSourceRange();
9906   SourceLocation EllipsisLoc = readSourceLocation();
9907   CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
9908                           EllipsisLoc);
9909   Result.setInheritConstructors(inheritConstructors);
9910   return Result;
9911 }
9912 
9913 CXXCtorInitializer **
readCXXCtorInitializers()9914 ASTRecordReader::readCXXCtorInitializers() {
9915   ASTContext &Context = getContext();
9916   unsigned NumInitializers = readInt();
9917   assert(NumInitializers && "wrote ctor initializers but have no inits");
9918   auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
9919   for (unsigned i = 0; i != NumInitializers; ++i) {
9920     TypeSourceInfo *TInfo = nullptr;
9921     bool IsBaseVirtual = false;
9922     FieldDecl *Member = nullptr;
9923     IndirectFieldDecl *IndirectMember = nullptr;
9924 
9925     CtorInitializerType Type = (CtorInitializerType) readInt();
9926     switch (Type) {
9927     case CTOR_INITIALIZER_BASE:
9928       TInfo = readTypeSourceInfo();
9929       IsBaseVirtual = readBool();
9930       break;
9931 
9932     case CTOR_INITIALIZER_DELEGATING:
9933       TInfo = readTypeSourceInfo();
9934       break;
9935 
9936      case CTOR_INITIALIZER_MEMBER:
9937       Member = readDeclAs<FieldDecl>();
9938       break;
9939 
9940      case CTOR_INITIALIZER_INDIRECT_MEMBER:
9941       IndirectMember = readDeclAs<IndirectFieldDecl>();
9942       break;
9943     }
9944 
9945     SourceLocation MemberOrEllipsisLoc = readSourceLocation();
9946     Expr *Init = readExpr();
9947     SourceLocation LParenLoc = readSourceLocation();
9948     SourceLocation RParenLoc = readSourceLocation();
9949 
9950     CXXCtorInitializer *BOMInit;
9951     if (Type == CTOR_INITIALIZER_BASE)
9952       BOMInit = new (Context)
9953           CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
9954                              RParenLoc, MemberOrEllipsisLoc);
9955     else if (Type == CTOR_INITIALIZER_DELEGATING)
9956       BOMInit = new (Context)
9957           CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
9958     else if (Member)
9959       BOMInit = new (Context)
9960           CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
9961                              Init, RParenLoc);
9962     else
9963       BOMInit = new (Context)
9964           CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
9965                              LParenLoc, Init, RParenLoc);
9966 
9967     if (/*IsWritten*/readBool()) {
9968       unsigned SourceOrder = readInt();
9969       BOMInit->setSourceOrder(SourceOrder);
9970     }
9971 
9972     CtorInitializers[i] = BOMInit;
9973   }
9974 
9975   return CtorInitializers;
9976 }
9977 
9978 NestedNameSpecifierLoc
readNestedNameSpecifierLoc()9979 ASTRecordReader::readNestedNameSpecifierLoc() {
9980   ASTContext &Context = getContext();
9981   unsigned N = readInt();
9982   NestedNameSpecifierLocBuilder Builder;
9983   for (unsigned I = 0; I != N; ++I) {
9984     auto Kind = readNestedNameSpecifierKind();
9985     switch (Kind) {
9986     case NestedNameSpecifier::Identifier: {
9987       IdentifierInfo *II = readIdentifier();
9988       SourceRange Range = readSourceRange();
9989       Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
9990       break;
9991     }
9992 
9993     case NestedNameSpecifier::Namespace: {
9994       NamespaceDecl *NS = readDeclAs<NamespaceDecl>();
9995       SourceRange Range = readSourceRange();
9996       Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
9997       break;
9998     }
9999 
10000     case NestedNameSpecifier::NamespaceAlias: {
10001       NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>();
10002       SourceRange Range = readSourceRange();
10003       Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
10004       break;
10005     }
10006 
10007     case NestedNameSpecifier::TypeSpec: {
10008       TypeSourceInfo *T = readTypeSourceInfo();
10009       if (!T)
10010         return NestedNameSpecifierLoc();
10011       SourceLocation ColonColonLoc = readSourceLocation();
10012       Builder.Extend(Context, T->getTypeLoc(), ColonColonLoc);
10013       break;
10014     }
10015 
10016     case NestedNameSpecifier::Global: {
10017       SourceLocation ColonColonLoc = readSourceLocation();
10018       Builder.MakeGlobal(Context, ColonColonLoc);
10019       break;
10020     }
10021 
10022     case NestedNameSpecifier::Super: {
10023       CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>();
10024       SourceRange Range = readSourceRange();
10025       Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
10026       break;
10027     }
10028     }
10029   }
10030 
10031   return Builder.getWithLocInContext(Context);
10032 }
10033 
ReadSourceRange(ModuleFile & F,const RecordData & Record,unsigned & Idx)10034 SourceRange ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
10035                                        unsigned &Idx) {
10036   SourceLocation beg = ReadSourceLocation(F, Record, Idx);
10037   SourceLocation end = ReadSourceLocation(F, Record, Idx);
10038   return SourceRange(beg, end);
10039 }
10040 
ReadBitVector(const RecordData & Record,const StringRef Blob)10041 llvm::BitVector ASTReader::ReadBitVector(const RecordData &Record,
10042                                          const StringRef Blob) {
10043   unsigned Count = Record[0];
10044   const char *Byte = Blob.data();
10045   llvm::BitVector Ret = llvm::BitVector(Count, false);
10046   for (unsigned I = 0; I < Count; ++Byte)
10047     for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10048       if (*Byte & (1 << Bit))
10049         Ret[I] = true;
10050   return Ret;
10051 }
10052 
10053 /// Read a floating-point value
readAPFloat(const llvm::fltSemantics & Sem)10054 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
10055   return llvm::APFloat(Sem, readAPInt());
10056 }
10057 
10058 // Read a string
ReadString(const RecordDataImpl & Record,unsigned & Idx)10059 std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
10060   unsigned Len = Record[Idx++];
10061   std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
10062   Idx += Len;
10063   return Result;
10064 }
10065 
ReadStringBlob(const RecordDataImpl & Record,unsigned & Idx,StringRef & Blob)10066 StringRef ASTReader::ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
10067                                     StringRef &Blob) {
10068   unsigned Len = Record[Idx++];
10069   StringRef Result = Blob.substr(0, Len);
10070   Blob = Blob.substr(Len);
10071   return Result;
10072 }
10073 
ReadPath(ModuleFile & F,const RecordData & Record,unsigned & Idx)10074 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
10075                                 unsigned &Idx) {
10076   return ReadPath(F.BaseDirectory, Record, Idx);
10077 }
10078 
ReadPath(StringRef BaseDirectory,const RecordData & Record,unsigned & Idx)10079 std::string ASTReader::ReadPath(StringRef BaseDirectory,
10080                                 const RecordData &Record, unsigned &Idx) {
10081   std::string Filename = ReadString(Record, Idx);
10082   return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10083 }
10084 
ReadPathBlob(StringRef BaseDirectory,const RecordData & Record,unsigned & Idx,StringRef & Blob)10085 std::string ASTReader::ReadPathBlob(StringRef BaseDirectory,
10086                                     const RecordData &Record, unsigned &Idx,
10087                                     StringRef &Blob) {
10088   StringRef Filename = ReadStringBlob(Record, Idx, Blob);
10089   return ResolveImportedPathAndAllocate(PathBuf, Filename, BaseDirectory);
10090 }
10091 
ReadVersionTuple(const RecordData & Record,unsigned & Idx)10092 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
10093                                          unsigned &Idx) {
10094   unsigned Major = Record[Idx++];
10095   unsigned Minor = Record[Idx++];
10096   unsigned Subminor = Record[Idx++];
10097   if (Minor == 0)
10098     return VersionTuple(Major);
10099   if (Subminor == 0)
10100     return VersionTuple(Major, Minor - 1);
10101   return VersionTuple(Major, Minor - 1, Subminor - 1);
10102 }
10103 
ReadCXXTemporary(ModuleFile & F,const RecordData & Record,unsigned & Idx)10104 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
10105                                           const RecordData &Record,
10106                                           unsigned &Idx) {
10107   CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
10108   return CXXTemporary::Create(getContext(), Decl);
10109 }
10110 
Diag(unsigned DiagID) const10111 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
10112   return Diag(CurrentImportLoc, DiagID);
10113 }
10114 
Diag(SourceLocation Loc,unsigned DiagID) const10115 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
10116   return Diags.Report(Loc, DiagID);
10117 }
10118 
runWithSufficientStackSpace(SourceLocation Loc,llvm::function_ref<void ()> Fn)10119 void ASTReader::runWithSufficientStackSpace(SourceLocation Loc,
10120                                             llvm::function_ref<void()> Fn) {
10121   // When Sema is available, avoid duplicate errors.
10122   if (SemaObj) {
10123     SemaObj->runWithSufficientStackSpace(Loc, Fn);
10124     return;
10125   }
10126 
10127   StackHandler.runWithSufficientStackSpace(Loc, Fn);
10128 }
10129 
10130 /// Retrieve the identifier table associated with the
10131 /// preprocessor.
getIdentifierTable()10132 IdentifierTable &ASTReader::getIdentifierTable() {
10133   return PP.getIdentifierTable();
10134 }
10135 
10136 /// Record that the given ID maps to the given switch-case
10137 /// statement.
RecordSwitchCaseID(SwitchCase * SC,unsigned ID)10138 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
10139   assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
10140          "Already have a SwitchCase with this ID");
10141   (*CurrSwitchCaseStmts)[ID] = SC;
10142 }
10143 
10144 /// Retrieve the switch-case statement with the given ID.
getSwitchCaseWithID(unsigned ID)10145 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
10146   assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
10147   return (*CurrSwitchCaseStmts)[ID];
10148 }
10149 
ClearSwitchCaseIDs()10150 void ASTReader::ClearSwitchCaseIDs() {
10151   CurrSwitchCaseStmts->clear();
10152 }
10153 
ReadComments()10154 void ASTReader::ReadComments() {
10155   ASTContext &Context = getContext();
10156   std::vector<RawComment *> Comments;
10157   for (SmallVectorImpl<std::pair<BitstreamCursor,
10158                                  serialization::ModuleFile *>>::iterator
10159        I = CommentsCursors.begin(),
10160        E = CommentsCursors.end();
10161        I != E; ++I) {
10162     Comments.clear();
10163     BitstreamCursor &Cursor = I->first;
10164     serialization::ModuleFile &F = *I->second;
10165     SavedStreamPosition SavedPosition(Cursor);
10166 
10167     RecordData Record;
10168     while (true) {
10169       Expected<llvm::BitstreamEntry> MaybeEntry =
10170           Cursor.advanceSkippingSubblocks(
10171               BitstreamCursor::AF_DontPopBlockAtEnd);
10172       if (!MaybeEntry) {
10173         Error(MaybeEntry.takeError());
10174         return;
10175       }
10176       llvm::BitstreamEntry Entry = MaybeEntry.get();
10177 
10178       switch (Entry.Kind) {
10179       case llvm::BitstreamEntry::SubBlock: // Handled for us already.
10180       case llvm::BitstreamEntry::Error:
10181         Error("malformed block record in AST file");
10182         return;
10183       case llvm::BitstreamEntry::EndBlock:
10184         goto NextCursor;
10185       case llvm::BitstreamEntry::Record:
10186         // The interesting case.
10187         break;
10188       }
10189 
10190       // Read a record.
10191       Record.clear();
10192       Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
10193       if (!MaybeComment) {
10194         Error(MaybeComment.takeError());
10195         return;
10196       }
10197       switch ((CommentRecordTypes)MaybeComment.get()) {
10198       case COMMENTS_RAW_COMMENT: {
10199         unsigned Idx = 0;
10200         SourceRange SR = ReadSourceRange(F, Record, Idx);
10201         RawComment::CommentKind Kind =
10202             (RawComment::CommentKind) Record[Idx++];
10203         bool IsTrailingComment = Record[Idx++];
10204         bool IsAlmostTrailingComment = Record[Idx++];
10205         Comments.push_back(new (Context) RawComment(
10206             SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10207         break;
10208       }
10209       }
10210     }
10211   NextCursor:
10212     for (RawComment *C : Comments) {
10213       SourceLocation CommentLoc = C->getBeginLoc();
10214       if (CommentLoc.isValid()) {
10215         FileIDAndOffset Loc = SourceMgr.getDecomposedLoc(CommentLoc);
10216         if (Loc.first.isValid())
10217           Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
10218       }
10219     }
10220   }
10221 }
10222 
visitInputFileInfos(serialization::ModuleFile & MF,bool IncludeSystem,llvm::function_ref<void (const serialization::InputFileInfo & IFI,bool IsSystem)> Visitor)10223 void ASTReader::visitInputFileInfos(
10224     serialization::ModuleFile &MF, bool IncludeSystem,
10225     llvm::function_ref<void(const serialization::InputFileInfo &IFI,
10226                             bool IsSystem)>
10227         Visitor) {
10228   unsigned NumUserInputs = MF.NumUserInputFiles;
10229   unsigned NumInputs = MF.InputFilesLoaded.size();
10230   assert(NumUserInputs <= NumInputs);
10231   unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10232   for (unsigned I = 0; I < N; ++I) {
10233     bool IsSystem = I >= NumUserInputs;
10234     InputFileInfo IFI = getInputFileInfo(MF, I+1);
10235     Visitor(IFI, IsSystem);
10236   }
10237 }
10238 
visitInputFiles(serialization::ModuleFile & MF,bool IncludeSystem,bool Complain,llvm::function_ref<void (const serialization::InputFile & IF,bool isSystem)> Visitor)10239 void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
10240                                 bool IncludeSystem, bool Complain,
10241                     llvm::function_ref<void(const serialization::InputFile &IF,
10242                                             bool isSystem)> Visitor) {
10243   unsigned NumUserInputs = MF.NumUserInputFiles;
10244   unsigned NumInputs = MF.InputFilesLoaded.size();
10245   assert(NumUserInputs <= NumInputs);
10246   unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10247   for (unsigned I = 0; I < N; ++I) {
10248     bool IsSystem = I >= NumUserInputs;
10249     InputFile IF = getInputFile(MF, I+1, Complain);
10250     Visitor(IF, IsSystem);
10251   }
10252 }
10253 
visitTopLevelModuleMaps(serialization::ModuleFile & MF,llvm::function_ref<void (FileEntryRef FE)> Visitor)10254 void ASTReader::visitTopLevelModuleMaps(
10255     serialization::ModuleFile &MF,
10256     llvm::function_ref<void(FileEntryRef FE)> Visitor) {
10257   unsigned NumInputs = MF.InputFilesLoaded.size();
10258   for (unsigned I = 0; I < NumInputs; ++I) {
10259     InputFileInfo IFI = getInputFileInfo(MF, I + 1);
10260     if (IFI.TopLevel && IFI.ModuleMap)
10261       if (auto FE = getInputFile(MF, I + 1).getFile())
10262         Visitor(*FE);
10263   }
10264 }
10265 
finishPendingActions()10266 void ASTReader::finishPendingActions() {
10267   while (!PendingIdentifierInfos.empty() ||
10268          !PendingDeducedFunctionTypes.empty() ||
10269          !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10270          !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10271          !PendingUpdateRecords.empty() ||
10272          !PendingObjCExtensionIvarRedeclarations.empty()) {
10273     // If any identifiers with corresponding top-level declarations have
10274     // been loaded, load those declarations now.
10275     using TopLevelDeclsMap =
10276         llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10277     TopLevelDeclsMap TopLevelDecls;
10278 
10279     while (!PendingIdentifierInfos.empty()) {
10280       IdentifierInfo *II = PendingIdentifierInfos.back().first;
10281       SmallVector<GlobalDeclID, 4> DeclIDs =
10282           std::move(PendingIdentifierInfos.back().second);
10283       PendingIdentifierInfos.pop_back();
10284 
10285       SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
10286     }
10287 
10288     // Load each function type that we deferred loading because it was a
10289     // deduced type that might refer to a local type declared within itself.
10290     for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10291       auto *FD = PendingDeducedFunctionTypes[I].first;
10292       FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
10293 
10294       if (auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10295         // If we gave a function a deduced return type, remember that we need to
10296         // propagate that along the redeclaration chain.
10297         if (DT->isDeduced()) {
10298           PendingDeducedTypeUpdates.insert(
10299               {FD->getCanonicalDecl(), FD->getReturnType()});
10300           continue;
10301         }
10302 
10303         // The function has undeduced DeduceType return type. We hope we can
10304         // find the deduced type by iterating the redecls in other modules
10305         // later.
10306         PendingUndeducedFunctionDecls.push_back(FD);
10307         continue;
10308       }
10309     }
10310     PendingDeducedFunctionTypes.clear();
10311 
10312     // Load each variable type that we deferred loading because it was a
10313     // deduced type that might refer to a local type declared within itself.
10314     for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10315       auto *VD = PendingDeducedVarTypes[I].first;
10316       VD->setType(GetType(PendingDeducedVarTypes[I].second));
10317     }
10318     PendingDeducedVarTypes.clear();
10319 
10320     // Load pending declaration chains.
10321     for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
10322       loadPendingDeclChain(PendingDeclChains[I].first,
10323                            PendingDeclChains[I].second);
10324     PendingDeclChains.clear();
10325 
10326     // Make the most recent of the top-level declarations visible.
10327     for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10328            TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10329       IdentifierInfo *II = TLD->first;
10330       for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10331         pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
10332       }
10333     }
10334 
10335     // Load any pending macro definitions.
10336     for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10337       IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10338       SmallVector<PendingMacroInfo, 2> GlobalIDs;
10339       GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10340       // Initialize the macro history from chained-PCHs ahead of module imports.
10341       for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10342            ++IDIdx) {
10343         const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10344         if (!Info.M->isModule())
10345           resolvePendingMacro(II, Info);
10346       }
10347       // Handle module imports.
10348       for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10349            ++IDIdx) {
10350         const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10351         if (Info.M->isModule())
10352           resolvePendingMacro(II, Info);
10353       }
10354     }
10355     PendingMacroIDs.clear();
10356 
10357     // Wire up the DeclContexts for Decls that we delayed setting until
10358     // recursive loading is completed.
10359     while (!PendingDeclContextInfos.empty()) {
10360       PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10361       PendingDeclContextInfos.pop_front();
10362       DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
10363       DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
10364       Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
10365     }
10366 
10367     // Perform any pending declaration updates.
10368     while (!PendingUpdateRecords.empty()) {
10369       auto Update = PendingUpdateRecords.pop_back_val();
10370       ReadingKindTracker ReadingKind(Read_Decl, *this);
10371       loadDeclUpdateRecords(Update);
10372     }
10373 
10374     while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10375       auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10376       auto DuplicateIvars =
10377           PendingObjCExtensionIvarRedeclarations.back().second;
10378       StructuralEquivalenceContext::NonEquivalentDeclSet NonEquivalentDecls;
10379       StructuralEquivalenceContext Ctx(
10380           ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10381           ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10382           StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
10383           /*Complain =*/false,
10384           /*ErrorOnTagTypeMismatch =*/true);
10385       if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10386         // Merge redeclared ivars with their predecessors.
10387         for (auto IvarPair : DuplicateIvars) {
10388           ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10389           // Change semantic DeclContext but keep the lexical one.
10390           Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10391                                     Ivar->getLexicalDeclContext(),
10392                                     getContext());
10393           getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
10394         }
10395         // Invalidate duplicate extension and the cached ivar list.
10396         ExtensionsPair.first->setInvalidDecl();
10397         ExtensionsPair.second->getClassInterface()
10398             ->getDefinition()
10399             ->setIvarList(nullptr);
10400       } else {
10401         for (auto IvarPair : DuplicateIvars) {
10402           Diag(IvarPair.first->getLocation(),
10403                diag::err_duplicate_ivar_declaration)
10404               << IvarPair.first->getIdentifier();
10405           Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10406         }
10407       }
10408       PendingObjCExtensionIvarRedeclarations.pop_back();
10409     }
10410   }
10411 
10412   // At this point, all update records for loaded decls are in place, so any
10413   // fake class definitions should have become real.
10414   assert(PendingFakeDefinitionData.empty() &&
10415          "faked up a class definition but never saw the real one");
10416 
10417   // If we deserialized any C++ or Objective-C class definitions, any
10418   // Objective-C protocol definitions, or any redeclarable templates, make sure
10419   // that all redeclarations point to the definitions. Note that this can only
10420   // happen now, after the redeclaration chains have been fully wired.
10421   for (Decl *D : PendingDefinitions) {
10422     if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10423       if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
10424         // Make sure that the TagType points at the definition.
10425         const_cast<TagType*>(TagT)->decl = TD;
10426       }
10427 
10428       if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
10429         for (auto *R = getMostRecentExistingDecl(RD); R;
10430              R = R->getPreviousDecl()) {
10431           assert((R == D) ==
10432                      cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
10433                  "declaration thinks it's the definition but it isn't");
10434           cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
10435         }
10436       }
10437 
10438       continue;
10439     }
10440 
10441     if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10442       // Make sure that the ObjCInterfaceType points at the definition.
10443       const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
10444         ->Decl = ID;
10445 
10446       for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10447         cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
10448 
10449       continue;
10450     }
10451 
10452     if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10453       for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10454         cast<ObjCProtocolDecl>(R)->Data = PD->Data;
10455 
10456       continue;
10457     }
10458 
10459     auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
10460     for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10461       cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
10462   }
10463   PendingDefinitions.clear();
10464 
10465   for (auto [D, Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10466     auto hasDefinitionImpl = [this](Decl *D, auto hasDefinitionImpl) {
10467       if (auto *VD = dyn_cast<VarDecl>(D))
10468         return VD->isThisDeclarationADefinition() ||
10469                VD->isThisDeclarationADemotedDefinition();
10470 
10471       if (auto *TD = dyn_cast<TagDecl>(D))
10472         return TD->isThisDeclarationADefinition() ||
10473                TD->isThisDeclarationADemotedDefinition();
10474 
10475       if (auto *FD = dyn_cast<FunctionDecl>(D))
10476         return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10477 
10478       if (auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10479         return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10480 
10481       // Conservatively return false here.
10482       return false;
10483     };
10484 
10485     auto hasDefinition = [&hasDefinitionImpl](Decl *D) {
10486       return hasDefinitionImpl(D, hasDefinitionImpl);
10487     };
10488 
10489     // It is not good to prevent multiple declarations since the forward
10490     // declaration is common. Let's try to avoid duplicated definitions
10491     // only.
10492     if (!hasDefinition(D) || !hasDefinition(Previous))
10493       continue;
10494 
10495     Module *PM = Previous->getOwningModule();
10496     Module *DM = D->getOwningModule();
10497     Diag(D->getLocation(), diag::warn_decls_in_multiple_modules)
10498         << cast<NamedDecl>(Previous) << PM->getTopLevelModuleName()
10499         << (DM ? DM->getTopLevelModuleName() : "global module");
10500     Diag(Previous->getLocation(), diag::note_also_found);
10501   }
10502   PendingWarningForDuplicatedDefsInModuleUnits.clear();
10503 
10504   // Load the bodies of any functions or methods we've encountered. We do
10505   // this now (delayed) so that we can be sure that the declaration chains
10506   // have been fully wired up (hasBody relies on this).
10507   // FIXME: We shouldn't require complete redeclaration chains here.
10508   for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10509                                PBEnd = PendingBodies.end();
10510        PB != PBEnd; ++PB) {
10511     if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10512       // FIXME: Check for =delete/=default?
10513       const FunctionDecl *Defn = nullptr;
10514       if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10515         FD->setLazyBody(PB->second);
10516       } else {
10517         auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
10518         mergeDefinitionVisibility(NonConstDefn, FD);
10519 
10520         if (!FD->isLateTemplateParsed() &&
10521             !NonConstDefn->isLateTemplateParsed() &&
10522             // We only perform ODR checks for decls not in the explicit
10523             // global module fragment.
10524             !shouldSkipCheckingODR(FD) &&
10525             !shouldSkipCheckingODR(NonConstDefn) &&
10526             FD->getODRHash() != NonConstDefn->getODRHash()) {
10527           if (!isa<CXXMethodDecl>(FD)) {
10528             PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10529           } else if (FD->getLexicalParent()->isFileContext() &&
10530                      NonConstDefn->getLexicalParent()->isFileContext()) {
10531             // Only diagnose out-of-line method definitions.  If they are
10532             // in class definitions, then an error will be generated when
10533             // processing the class bodies.
10534             PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10535           }
10536         }
10537       }
10538       continue;
10539     }
10540 
10541     ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
10542     if (!getContext().getLangOpts().Modules || !MD->hasBody())
10543       MD->setLazyBody(PB->second);
10544   }
10545   PendingBodies.clear();
10546 
10547   // Inform any classes that had members added that they now have more members.
10548   for (auto [RD, MD] : PendingAddedClassMembers) {
10549     RD->addedMember(MD);
10550   }
10551   PendingAddedClassMembers.clear();
10552 
10553   // Do some cleanup.
10554   for (auto *ND : PendingMergedDefinitionsToDeduplicate)
10555     getContext().deduplicateMergedDefinitionsFor(ND);
10556   PendingMergedDefinitionsToDeduplicate.clear();
10557 
10558   // For each decl chain that we wanted to complete while deserializing, mark
10559   // it as "still needs to be completed".
10560   for (Decl *D : PendingIncompleteDeclChains)
10561     markIncompleteDeclChain(D);
10562   PendingIncompleteDeclChains.clear();
10563 
10564   assert(PendingIdentifierInfos.empty() &&
10565          "Should be empty at the end of finishPendingActions");
10566   assert(PendingDeducedFunctionTypes.empty() &&
10567          "Should be empty at the end of finishPendingActions");
10568   assert(PendingDeducedVarTypes.empty() &&
10569          "Should be empty at the end of finishPendingActions");
10570   assert(PendingDeclChains.empty() &&
10571          "Should be empty at the end of finishPendingActions");
10572   assert(PendingMacroIDs.empty() &&
10573          "Should be empty at the end of finishPendingActions");
10574   assert(PendingDeclContextInfos.empty() &&
10575          "Should be empty at the end of finishPendingActions");
10576   assert(PendingUpdateRecords.empty() &&
10577          "Should be empty at the end of finishPendingActions");
10578   assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10579          "Should be empty at the end of finishPendingActions");
10580   assert(PendingFakeDefinitionData.empty() &&
10581          "Should be empty at the end of finishPendingActions");
10582   assert(PendingDefinitions.empty() &&
10583          "Should be empty at the end of finishPendingActions");
10584   assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10585          "Should be empty at the end of finishPendingActions");
10586   assert(PendingBodies.empty() &&
10587          "Should be empty at the end of finishPendingActions");
10588   assert(PendingAddedClassMembers.empty() &&
10589          "Should be empty at the end of finishPendingActions");
10590   assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10591          "Should be empty at the end of finishPendingActions");
10592   assert(PendingIncompleteDeclChains.empty() &&
10593          "Should be empty at the end of finishPendingActions");
10594 }
10595 
diagnoseOdrViolations()10596 void ASTReader::diagnoseOdrViolations() {
10597   if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10598       PendingRecordOdrMergeFailures.empty() &&
10599       PendingFunctionOdrMergeFailures.empty() &&
10600       PendingEnumOdrMergeFailures.empty() &&
10601       PendingObjCInterfaceOdrMergeFailures.empty() &&
10602       PendingObjCProtocolOdrMergeFailures.empty())
10603     return;
10604 
10605   // Trigger the import of the full definition of each class that had any
10606   // odr-merging problems, so we can produce better diagnostics for them.
10607   // These updates may in turn find and diagnose some ODR failures, so take
10608   // ownership of the set first.
10609   auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10610   PendingOdrMergeFailures.clear();
10611   for (auto &Merge : OdrMergeFailures) {
10612     Merge.first->buildLookup();
10613     Merge.first->decls_begin();
10614     Merge.first->bases_begin();
10615     Merge.first->vbases_begin();
10616     for (auto &RecordPair : Merge.second) {
10617       auto *RD = RecordPair.first;
10618       RD->decls_begin();
10619       RD->bases_begin();
10620       RD->vbases_begin();
10621     }
10622   }
10623 
10624   // Trigger the import of the full definition of each record in C/ObjC.
10625   auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10626   PendingRecordOdrMergeFailures.clear();
10627   for (auto &Merge : RecordOdrMergeFailures) {
10628     Merge.first->decls_begin();
10629     for (auto &D : Merge.second)
10630       D->decls_begin();
10631   }
10632 
10633   // Trigger the import of the full interface definition.
10634   auto ObjCInterfaceOdrMergeFailures =
10635       std::move(PendingObjCInterfaceOdrMergeFailures);
10636   PendingObjCInterfaceOdrMergeFailures.clear();
10637   for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
10638     Merge.first->decls_begin();
10639     for (auto &InterfacePair : Merge.second)
10640       InterfacePair.first->decls_begin();
10641   }
10642 
10643   // Trigger the import of functions.
10644   auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10645   PendingFunctionOdrMergeFailures.clear();
10646   for (auto &Merge : FunctionOdrMergeFailures) {
10647     Merge.first->buildLookup();
10648     Merge.first->decls_begin();
10649     Merge.first->getBody();
10650     for (auto &FD : Merge.second) {
10651       FD->buildLookup();
10652       FD->decls_begin();
10653       FD->getBody();
10654     }
10655   }
10656 
10657   // Trigger the import of enums.
10658   auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10659   PendingEnumOdrMergeFailures.clear();
10660   for (auto &Merge : EnumOdrMergeFailures) {
10661     Merge.first->decls_begin();
10662     for (auto &Enum : Merge.second) {
10663       Enum->decls_begin();
10664     }
10665   }
10666 
10667   // Trigger the import of the full protocol definition.
10668   auto ObjCProtocolOdrMergeFailures =
10669       std::move(PendingObjCProtocolOdrMergeFailures);
10670   PendingObjCProtocolOdrMergeFailures.clear();
10671   for (auto &Merge : ObjCProtocolOdrMergeFailures) {
10672     Merge.first->decls_begin();
10673     for (auto &ProtocolPair : Merge.second)
10674       ProtocolPair.first->decls_begin();
10675   }
10676 
10677   // For each declaration from a merged context, check that the canonical
10678   // definition of that context also contains a declaration of the same
10679   // entity.
10680   //
10681   // Caution: this loop does things that might invalidate iterators into
10682   // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
10683   while (!PendingOdrMergeChecks.empty()) {
10684     NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10685 
10686     // FIXME: Skip over implicit declarations for now. This matters for things
10687     // like implicitly-declared special member functions. This isn't entirely
10688     // correct; we can end up with multiple unmerged declarations of the same
10689     // implicit entity.
10690     if (D->isImplicit())
10691       continue;
10692 
10693     DeclContext *CanonDef = D->getDeclContext();
10694 
10695     bool Found = false;
10696     const Decl *DCanon = D->getCanonicalDecl();
10697 
10698     for (auto *RI : D->redecls()) {
10699       if (RI->getLexicalDeclContext() == CanonDef) {
10700         Found = true;
10701         break;
10702       }
10703     }
10704     if (Found)
10705       continue;
10706 
10707     // Quick check failed, time to do the slow thing. Note, we can't just
10708     // look up the name of D in CanonDef here, because the member that is
10709     // in CanonDef might not be found by name lookup (it might have been
10710     // replaced by a more recent declaration in the lookup table), and we
10711     // can't necessarily find it in the redeclaration chain because it might
10712     // be merely mergeable, not redeclarable.
10713     llvm::SmallVector<const NamedDecl*, 4> Candidates;
10714     for (auto *CanonMember : CanonDef->decls()) {
10715       if (CanonMember->getCanonicalDecl() == DCanon) {
10716         // This can happen if the declaration is merely mergeable and not
10717         // actually redeclarable (we looked for redeclarations earlier).
10718         //
10719         // FIXME: We should be able to detect this more efficiently, without
10720         // pulling in all of the members of CanonDef.
10721         Found = true;
10722         break;
10723       }
10724       if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
10725         if (ND->getDeclName() == D->getDeclName())
10726           Candidates.push_back(ND);
10727     }
10728 
10729     if (!Found) {
10730       // The AST doesn't like TagDecls becoming invalid after they've been
10731       // completed. We only really need to mark FieldDecls as invalid here.
10732       if (!isa<TagDecl>(D))
10733         D->setInvalidDecl();
10734 
10735       // Ensure we don't accidentally recursively enter deserialization while
10736       // we're producing our diagnostic.
10737       Deserializing RecursionGuard(this);
10738 
10739       std::string CanonDefModule =
10740           ODRDiagsEmitter::getOwningModuleNameForDiagnostic(
10741               cast<Decl>(CanonDef));
10742       Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
10743         << D << ODRDiagsEmitter::getOwningModuleNameForDiagnostic(D)
10744         << CanonDef << CanonDefModule.empty() << CanonDefModule;
10745 
10746       if (Candidates.empty())
10747         Diag(cast<Decl>(CanonDef)->getLocation(),
10748              diag::note_module_odr_violation_no_possible_decls) << D;
10749       else {
10750         for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
10751           Diag(Candidates[I]->getLocation(),
10752                diag::note_module_odr_violation_possible_decl)
10753             << Candidates[I];
10754       }
10755 
10756       DiagnosedOdrMergeFailures.insert(CanonDef);
10757     }
10758   }
10759 
10760   if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
10761       FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
10762       ObjCInterfaceOdrMergeFailures.empty() &&
10763       ObjCProtocolOdrMergeFailures.empty())
10764     return;
10765 
10766   ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
10767                                getPreprocessor().getLangOpts());
10768 
10769   // Issue any pending ODR-failure diagnostics.
10770   for (auto &Merge : OdrMergeFailures) {
10771     // If we've already pointed out a specific problem with this class, don't
10772     // bother issuing a general "something's different" diagnostic.
10773     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10774       continue;
10775 
10776     bool Diagnosed = false;
10777     CXXRecordDecl *FirstRecord = Merge.first;
10778     for (auto &RecordPair : Merge.second) {
10779       if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
10780                                         RecordPair.second)) {
10781         Diagnosed = true;
10782         break;
10783       }
10784     }
10785 
10786     if (!Diagnosed) {
10787       // All definitions are updates to the same declaration. This happens if a
10788       // module instantiates the declaration of a class template specialization
10789       // and two or more other modules instantiate its definition.
10790       //
10791       // FIXME: Indicate which modules had instantiations of this definition.
10792       // FIXME: How can this even happen?
10793       Diag(Merge.first->getLocation(),
10794            diag::err_module_odr_violation_different_instantiations)
10795           << Merge.first;
10796     }
10797   }
10798 
10799   // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
10800   // that in C++ this is done as a part of CXXRecordDecl ODR checking.
10801   for (auto &Merge : RecordOdrMergeFailures) {
10802     // If we've already pointed out a specific problem with this class, don't
10803     // bother issuing a general "something's different" diagnostic.
10804     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10805       continue;
10806 
10807     RecordDecl *FirstRecord = Merge.first;
10808     bool Diagnosed = false;
10809     for (auto *SecondRecord : Merge.second) {
10810       if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
10811         Diagnosed = true;
10812         break;
10813       }
10814     }
10815     (void)Diagnosed;
10816     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10817   }
10818 
10819   // Issue ODR failures diagnostics for functions.
10820   for (auto &Merge : FunctionOdrMergeFailures) {
10821     FunctionDecl *FirstFunction = Merge.first;
10822     bool Diagnosed = false;
10823     for (auto &SecondFunction : Merge.second) {
10824       if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
10825         Diagnosed = true;
10826         break;
10827       }
10828     }
10829     (void)Diagnosed;
10830     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10831   }
10832 
10833   // Issue ODR failures diagnostics for enums.
10834   for (auto &Merge : EnumOdrMergeFailures) {
10835     // If we've already pointed out a specific problem with this enum, don't
10836     // bother issuing a general "something's different" diagnostic.
10837     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10838       continue;
10839 
10840     EnumDecl *FirstEnum = Merge.first;
10841     bool Diagnosed = false;
10842     for (auto &SecondEnum : Merge.second) {
10843       if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
10844         Diagnosed = true;
10845         break;
10846       }
10847     }
10848     (void)Diagnosed;
10849     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10850   }
10851 
10852   for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
10853     // If we've already pointed out a specific problem with this interface,
10854     // don't bother issuing a general "something's different" diagnostic.
10855     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10856       continue;
10857 
10858     bool Diagnosed = false;
10859     ObjCInterfaceDecl *FirstID = Merge.first;
10860     for (auto &InterfacePair : Merge.second) {
10861       if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
10862                                         InterfacePair.second)) {
10863         Diagnosed = true;
10864         break;
10865       }
10866     }
10867     (void)Diagnosed;
10868     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10869   }
10870 
10871   for (auto &Merge : ObjCProtocolOdrMergeFailures) {
10872     // If we've already pointed out a specific problem with this protocol,
10873     // don't bother issuing a general "something's different" diagnostic.
10874     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10875       continue;
10876 
10877     ObjCProtocolDecl *FirstProtocol = Merge.first;
10878     bool Diagnosed = false;
10879     for (auto &ProtocolPair : Merge.second) {
10880       if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
10881                                         ProtocolPair.second)) {
10882         Diagnosed = true;
10883         break;
10884       }
10885     }
10886     (void)Diagnosed;
10887     assert(Diagnosed && "Unable to emit ODR diagnostic.");
10888   }
10889 }
10890 
StartedDeserializing()10891 void ASTReader::StartedDeserializing() {
10892   if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
10893     ReadTimer->startTimer();
10894 }
10895 
FinishedDeserializing()10896 void ASTReader::FinishedDeserializing() {
10897   assert(NumCurrentElementsDeserializing &&
10898          "FinishedDeserializing not paired with StartedDeserializing");
10899   if (NumCurrentElementsDeserializing == 1) {
10900     // We decrease NumCurrentElementsDeserializing only after pending actions
10901     // are finished, to avoid recursively re-calling finishPendingActions().
10902     finishPendingActions();
10903   }
10904   --NumCurrentElementsDeserializing;
10905 
10906   if (NumCurrentElementsDeserializing == 0) {
10907     {
10908       // Guard variable to avoid recursively entering the process of passing
10909       // decls to consumer.
10910       SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
10911                                                  /*NewValue=*/false);
10912 
10913       // Propagate exception specification and deduced type updates along
10914       // redeclaration chains.
10915       //
10916       // We do this now rather than in finishPendingActions because we want to
10917       // be able to walk the complete redeclaration chains of the updated decls.
10918       while (!PendingExceptionSpecUpdates.empty() ||
10919              !PendingDeducedTypeUpdates.empty() ||
10920              !PendingUndeducedFunctionDecls.empty()) {
10921         auto ESUpdates = std::move(PendingExceptionSpecUpdates);
10922         PendingExceptionSpecUpdates.clear();
10923         for (auto Update : ESUpdates) {
10924           ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
10925           auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
10926           auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
10927           if (auto *Listener = getContext().getASTMutationListener())
10928             Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
10929           for (auto *Redecl : Update.second->redecls())
10930             getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
10931         }
10932 
10933         auto DTUpdates = std::move(PendingDeducedTypeUpdates);
10934         PendingDeducedTypeUpdates.clear();
10935         for (auto Update : DTUpdates) {
10936           ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
10937           // FIXME: If the return type is already deduced, check that it
10938           // matches.
10939           getContext().adjustDeducedFunctionResultType(Update.first,
10940                                                        Update.second);
10941         }
10942 
10943         auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
10944         PendingUndeducedFunctionDecls.clear();
10945         // We hope we can find the deduced type for the functions by iterating
10946         // redeclarations in other modules.
10947         for (FunctionDecl *UndeducedFD : UDTUpdates)
10948           (void)UndeducedFD->getMostRecentDecl();
10949       }
10950 
10951       if (ReadTimer)
10952         ReadTimer->stopTimer();
10953 
10954       diagnoseOdrViolations();
10955     }
10956 
10957     // We are not in recursive loading, so it's safe to pass the "interesting"
10958     // decls to the consumer.
10959     if (Consumer)
10960       PassInterestingDeclsToConsumer();
10961   }
10962 }
10963 
pushExternalDeclIntoScope(NamedDecl * D,DeclarationName Name)10964 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
10965   if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
10966     // Remove any fake results before adding any real ones.
10967     auto It = PendingFakeLookupResults.find(II);
10968     if (It != PendingFakeLookupResults.end()) {
10969       for (auto *ND : It->second)
10970         SemaObj->IdResolver.RemoveDecl(ND);
10971       // FIXME: this works around module+PCH performance issue.
10972       // Rather than erase the result from the map, which is O(n), just clear
10973       // the vector of NamedDecls.
10974       It->second.clear();
10975     }
10976   }
10977 
10978   if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
10979     SemaObj->TUScope->AddDecl(D);
10980   } else if (SemaObj->TUScope) {
10981     // Adding the decl to IdResolver may have failed because it was already in
10982     // (even though it was not added in scope). If it is already in, make sure
10983     // it gets in the scope as well.
10984     if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
10985       SemaObj->TUScope->AddDecl(D);
10986   }
10987 }
10988 
ASTReader(Preprocessor & PP,ModuleCache & ModCache,ASTContext * Context,const PCHContainerReader & PCHContainerRdr,ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,StringRef isysroot,DisableValidationForModuleKind DisableValidationKind,bool AllowASTWithCompilerErrors,bool AllowConfigurationMismatch,bool ValidateSystemInputs,bool ForceValidateUserInputs,bool ValidateASTInputFilesContent,bool UseGlobalIndex,std::unique_ptr<llvm::Timer> ReadTimer)10989 ASTReader::ASTReader(Preprocessor &PP, ModuleCache &ModCache,
10990                      ASTContext *Context,
10991                      const PCHContainerReader &PCHContainerRdr,
10992                      ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
10993                      StringRef isysroot,
10994                      DisableValidationForModuleKind DisableValidationKind,
10995                      bool AllowASTWithCompilerErrors,
10996                      bool AllowConfigurationMismatch, bool ValidateSystemInputs,
10997                      bool ForceValidateUserInputs,
10998                      bool ValidateASTInputFilesContent, bool UseGlobalIndex,
10999                      std::unique_ptr<llvm::Timer> ReadTimer)
11000     : Listener(bool(DisableValidationKind & DisableValidationForModuleKind::PCH)
11001                    ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
11002                    : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
11003       SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
11004       PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11005       StackHandler(Diags), PP(PP), ContextObj(Context),
11006       ModuleMgr(PP.getFileManager(), ModCache, PCHContainerRdr,
11007                 PP.getHeaderSearchInfo()),
11008       DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11009       DisableValidationKind(DisableValidationKind),
11010       AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11011       AllowConfigurationMismatch(AllowConfigurationMismatch),
11012       ValidateSystemInputs(ValidateSystemInputs),
11013       ForceValidateUserInputs(ForceValidateUserInputs),
11014       ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11015       UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11016   SourceMgr.setExternalSLocEntrySource(this);
11017 
11018   PathBuf.reserve(256);
11019 
11020   for (const auto &Ext : Extensions) {
11021     auto BlockName = Ext->getExtensionMetadata().BlockName;
11022     auto Known = ModuleFileExtensions.find(BlockName);
11023     if (Known != ModuleFileExtensions.end()) {
11024       Diags.Report(diag::warn_duplicate_module_file_extension)
11025         << BlockName;
11026       continue;
11027     }
11028 
11029     ModuleFileExtensions.insert({BlockName, Ext});
11030   }
11031 }
11032 
~ASTReader()11033 ASTReader::~ASTReader() {
11034   if (OwnsDeserializationListener)
11035     delete DeserializationListener;
11036 }
11037 
getIdResolver()11038 IdentifierResolver &ASTReader::getIdResolver() {
11039   return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11040 }
11041 
readRecord(llvm::BitstreamCursor & Cursor,unsigned AbbrevID)11042 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
11043                                                unsigned AbbrevID) {
11044   Idx = 0;
11045   Record.clear();
11046   return Cursor.readRecord(AbbrevID, Record);
11047 }
11048 //===----------------------------------------------------------------------===//
11049 //// OMPClauseReader implementation
11050 ////===----------------------------------------------------------------------===//
11051 
11052 // This has to be in namespace clang because it's friended by all
11053 // of the OMP clauses.
11054 namespace clang {
11055 
11056 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
11057   ASTRecordReader &Record;
11058   ASTContext &Context;
11059 
11060 public:
OMPClauseReader(ASTRecordReader & Record)11061   OMPClauseReader(ASTRecordReader &Record)
11062       : Record(Record), Context(Record.getContext()) {}
11063 #define GEN_CLANG_CLAUSE_CLASS
11064 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11065 #include "llvm/Frontend/OpenMP/OMP.inc"
11066   OMPClause *readClause();
11067   void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
11068   void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
11069 };
11070 
11071 } // end namespace clang
11072 
readOMPClause()11073 OMPClause *ASTRecordReader::readOMPClause() {
11074   return OMPClauseReader(*this).readClause();
11075 }
11076 
readClause()11077 OMPClause *OMPClauseReader::readClause() {
11078   OMPClause *C = nullptr;
11079   switch (llvm::omp::Clause(Record.readInt())) {
11080   case llvm::omp::OMPC_if:
11081     C = new (Context) OMPIfClause();
11082     break;
11083   case llvm::omp::OMPC_final:
11084     C = new (Context) OMPFinalClause();
11085     break;
11086   case llvm::omp::OMPC_num_threads:
11087     C = new (Context) OMPNumThreadsClause();
11088     break;
11089   case llvm::omp::OMPC_safelen:
11090     C = new (Context) OMPSafelenClause();
11091     break;
11092   case llvm::omp::OMPC_simdlen:
11093     C = new (Context) OMPSimdlenClause();
11094     break;
11095   case llvm::omp::OMPC_sizes: {
11096     unsigned NumSizes = Record.readInt();
11097     C = OMPSizesClause::CreateEmpty(Context, NumSizes);
11098     break;
11099   }
11100   case llvm::omp::OMPC_permutation: {
11101     unsigned NumLoops = Record.readInt();
11102     C = OMPPermutationClause::CreateEmpty(Context, NumLoops);
11103     break;
11104   }
11105   case llvm::omp::OMPC_full:
11106     C = OMPFullClause::CreateEmpty(Context);
11107     break;
11108   case llvm::omp::OMPC_partial:
11109     C = OMPPartialClause::CreateEmpty(Context);
11110     break;
11111   case llvm::omp::OMPC_allocator:
11112     C = new (Context) OMPAllocatorClause();
11113     break;
11114   case llvm::omp::OMPC_collapse:
11115     C = new (Context) OMPCollapseClause();
11116     break;
11117   case llvm::omp::OMPC_default:
11118     C = new (Context) OMPDefaultClause();
11119     break;
11120   case llvm::omp::OMPC_proc_bind:
11121     C = new (Context) OMPProcBindClause();
11122     break;
11123   case llvm::omp::OMPC_schedule:
11124     C = new (Context) OMPScheduleClause();
11125     break;
11126   case llvm::omp::OMPC_ordered:
11127     C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11128     break;
11129   case llvm::omp::OMPC_nowait:
11130     C = new (Context) OMPNowaitClause();
11131     break;
11132   case llvm::omp::OMPC_untied:
11133     C = new (Context) OMPUntiedClause();
11134     break;
11135   case llvm::omp::OMPC_mergeable:
11136     C = new (Context) OMPMergeableClause();
11137     break;
11138   case llvm::omp::OMPC_read:
11139     C = new (Context) OMPReadClause();
11140     break;
11141   case llvm::omp::OMPC_write:
11142     C = new (Context) OMPWriteClause();
11143     break;
11144   case llvm::omp::OMPC_update:
11145     C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11146     break;
11147   case llvm::omp::OMPC_capture:
11148     C = new (Context) OMPCaptureClause();
11149     break;
11150   case llvm::omp::OMPC_compare:
11151     C = new (Context) OMPCompareClause();
11152     break;
11153   case llvm::omp::OMPC_fail:
11154     C = new (Context) OMPFailClause();
11155     break;
11156   case llvm::omp::OMPC_seq_cst:
11157     C = new (Context) OMPSeqCstClause();
11158     break;
11159   case llvm::omp::OMPC_acq_rel:
11160     C = new (Context) OMPAcqRelClause();
11161     break;
11162   case llvm::omp::OMPC_absent: {
11163     unsigned NumKinds = Record.readInt();
11164     C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11165     break;
11166   }
11167   case llvm::omp::OMPC_holds:
11168     C = new (Context) OMPHoldsClause();
11169     break;
11170   case llvm::omp::OMPC_contains: {
11171     unsigned NumKinds = Record.readInt();
11172     C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11173     break;
11174   }
11175   case llvm::omp::OMPC_no_openmp:
11176     C = new (Context) OMPNoOpenMPClause();
11177     break;
11178   case llvm::omp::OMPC_no_openmp_routines:
11179     C = new (Context) OMPNoOpenMPRoutinesClause();
11180     break;
11181   case llvm::omp::OMPC_no_openmp_constructs:
11182     C = new (Context) OMPNoOpenMPConstructsClause();
11183     break;
11184   case llvm::omp::OMPC_no_parallelism:
11185     C = new (Context) OMPNoParallelismClause();
11186     break;
11187   case llvm::omp::OMPC_acquire:
11188     C = new (Context) OMPAcquireClause();
11189     break;
11190   case llvm::omp::OMPC_release:
11191     C = new (Context) OMPReleaseClause();
11192     break;
11193   case llvm::omp::OMPC_relaxed:
11194     C = new (Context) OMPRelaxedClause();
11195     break;
11196   case llvm::omp::OMPC_weak:
11197     C = new (Context) OMPWeakClause();
11198     break;
11199   case llvm::omp::OMPC_threads:
11200     C = new (Context) OMPThreadsClause();
11201     break;
11202   case llvm::omp::OMPC_simd:
11203     C = new (Context) OMPSIMDClause();
11204     break;
11205   case llvm::omp::OMPC_nogroup:
11206     C = new (Context) OMPNogroupClause();
11207     break;
11208   case llvm::omp::OMPC_unified_address:
11209     C = new (Context) OMPUnifiedAddressClause();
11210     break;
11211   case llvm::omp::OMPC_unified_shared_memory:
11212     C = new (Context) OMPUnifiedSharedMemoryClause();
11213     break;
11214   case llvm::omp::OMPC_reverse_offload:
11215     C = new (Context) OMPReverseOffloadClause();
11216     break;
11217   case llvm::omp::OMPC_dynamic_allocators:
11218     C = new (Context) OMPDynamicAllocatorsClause();
11219     break;
11220   case llvm::omp::OMPC_atomic_default_mem_order:
11221     C = new (Context) OMPAtomicDefaultMemOrderClause();
11222     break;
11223   case llvm::omp::OMPC_self_maps:
11224     C = new (Context) OMPSelfMapsClause();
11225     break;
11226   case llvm::omp::OMPC_at:
11227     C = new (Context) OMPAtClause();
11228     break;
11229   case llvm::omp::OMPC_severity:
11230     C = new (Context) OMPSeverityClause();
11231     break;
11232   case llvm::omp::OMPC_message:
11233     C = new (Context) OMPMessageClause();
11234     break;
11235   case llvm::omp::OMPC_private:
11236     C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11237     break;
11238   case llvm::omp::OMPC_firstprivate:
11239     C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11240     break;
11241   case llvm::omp::OMPC_lastprivate:
11242     C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11243     break;
11244   case llvm::omp::OMPC_shared:
11245     C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11246     break;
11247   case llvm::omp::OMPC_reduction: {
11248     unsigned N = Record.readInt();
11249     auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
11250     C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11251     break;
11252   }
11253   case llvm::omp::OMPC_task_reduction:
11254     C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11255     break;
11256   case llvm::omp::OMPC_in_reduction:
11257     C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11258     break;
11259   case llvm::omp::OMPC_linear:
11260     C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11261     break;
11262   case llvm::omp::OMPC_aligned:
11263     C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
11264     break;
11265   case llvm::omp::OMPC_copyin:
11266     C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
11267     break;
11268   case llvm::omp::OMPC_copyprivate:
11269     C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
11270     break;
11271   case llvm::omp::OMPC_flush:
11272     C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
11273     break;
11274   case llvm::omp::OMPC_depobj:
11275     C = OMPDepobjClause::CreateEmpty(Context);
11276     break;
11277   case llvm::omp::OMPC_depend: {
11278     unsigned NumVars = Record.readInt();
11279     unsigned NumLoops = Record.readInt();
11280     C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
11281     break;
11282   }
11283   case llvm::omp::OMPC_device:
11284     C = new (Context) OMPDeviceClause();
11285     break;
11286   case llvm::omp::OMPC_map: {
11287     OMPMappableExprListSizeTy Sizes;
11288     Sizes.NumVars = Record.readInt();
11289     Sizes.NumUniqueDeclarations = Record.readInt();
11290     Sizes.NumComponentLists = Record.readInt();
11291     Sizes.NumComponents = Record.readInt();
11292     C = OMPMapClause::CreateEmpty(Context, Sizes);
11293     break;
11294   }
11295   case llvm::omp::OMPC_num_teams:
11296     C = OMPNumTeamsClause::CreateEmpty(Context, Record.readInt());
11297     break;
11298   case llvm::omp::OMPC_thread_limit:
11299     C = OMPThreadLimitClause::CreateEmpty(Context, Record.readInt());
11300     break;
11301   case llvm::omp::OMPC_priority:
11302     C = new (Context) OMPPriorityClause();
11303     break;
11304   case llvm::omp::OMPC_grainsize:
11305     C = new (Context) OMPGrainsizeClause();
11306     break;
11307   case llvm::omp::OMPC_num_tasks:
11308     C = new (Context) OMPNumTasksClause();
11309     break;
11310   case llvm::omp::OMPC_hint:
11311     C = new (Context) OMPHintClause();
11312     break;
11313   case llvm::omp::OMPC_dist_schedule:
11314     C = new (Context) OMPDistScheduleClause();
11315     break;
11316   case llvm::omp::OMPC_defaultmap:
11317     C = new (Context) OMPDefaultmapClause();
11318     break;
11319   case llvm::omp::OMPC_to: {
11320     OMPMappableExprListSizeTy Sizes;
11321     Sizes.NumVars = Record.readInt();
11322     Sizes.NumUniqueDeclarations = Record.readInt();
11323     Sizes.NumComponentLists = Record.readInt();
11324     Sizes.NumComponents = Record.readInt();
11325     C = OMPToClause::CreateEmpty(Context, Sizes);
11326     break;
11327   }
11328   case llvm::omp::OMPC_from: {
11329     OMPMappableExprListSizeTy Sizes;
11330     Sizes.NumVars = Record.readInt();
11331     Sizes.NumUniqueDeclarations = Record.readInt();
11332     Sizes.NumComponentLists = Record.readInt();
11333     Sizes.NumComponents = Record.readInt();
11334     C = OMPFromClause::CreateEmpty(Context, Sizes);
11335     break;
11336   }
11337   case llvm::omp::OMPC_use_device_ptr: {
11338     OMPMappableExprListSizeTy Sizes;
11339     Sizes.NumVars = Record.readInt();
11340     Sizes.NumUniqueDeclarations = Record.readInt();
11341     Sizes.NumComponentLists = Record.readInt();
11342     Sizes.NumComponents = Record.readInt();
11343     C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
11344     break;
11345   }
11346   case llvm::omp::OMPC_use_device_addr: {
11347     OMPMappableExprListSizeTy Sizes;
11348     Sizes.NumVars = Record.readInt();
11349     Sizes.NumUniqueDeclarations = Record.readInt();
11350     Sizes.NumComponentLists = Record.readInt();
11351     Sizes.NumComponents = Record.readInt();
11352     C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
11353     break;
11354   }
11355   case llvm::omp::OMPC_is_device_ptr: {
11356     OMPMappableExprListSizeTy Sizes;
11357     Sizes.NumVars = Record.readInt();
11358     Sizes.NumUniqueDeclarations = Record.readInt();
11359     Sizes.NumComponentLists = Record.readInt();
11360     Sizes.NumComponents = Record.readInt();
11361     C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
11362     break;
11363   }
11364   case llvm::omp::OMPC_has_device_addr: {
11365     OMPMappableExprListSizeTy Sizes;
11366     Sizes.NumVars = Record.readInt();
11367     Sizes.NumUniqueDeclarations = Record.readInt();
11368     Sizes.NumComponentLists = Record.readInt();
11369     Sizes.NumComponents = Record.readInt();
11370     C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
11371     break;
11372   }
11373   case llvm::omp::OMPC_allocate:
11374     C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
11375     break;
11376   case llvm::omp::OMPC_nontemporal:
11377     C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
11378     break;
11379   case llvm::omp::OMPC_inclusive:
11380     C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
11381     break;
11382   case llvm::omp::OMPC_exclusive:
11383     C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
11384     break;
11385   case llvm::omp::OMPC_order:
11386     C = new (Context) OMPOrderClause();
11387     break;
11388   case llvm::omp::OMPC_init:
11389     C = OMPInitClause::CreateEmpty(Context, Record.readInt());
11390     break;
11391   case llvm::omp::OMPC_use:
11392     C = new (Context) OMPUseClause();
11393     break;
11394   case llvm::omp::OMPC_destroy:
11395     C = new (Context) OMPDestroyClause();
11396     break;
11397   case llvm::omp::OMPC_novariants:
11398     C = new (Context) OMPNovariantsClause();
11399     break;
11400   case llvm::omp::OMPC_nocontext:
11401     C = new (Context) OMPNocontextClause();
11402     break;
11403   case llvm::omp::OMPC_detach:
11404     C = new (Context) OMPDetachClause();
11405     break;
11406   case llvm::omp::OMPC_uses_allocators:
11407     C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
11408     break;
11409   case llvm::omp::OMPC_affinity:
11410     C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
11411     break;
11412   case llvm::omp::OMPC_filter:
11413     C = new (Context) OMPFilterClause();
11414     break;
11415   case llvm::omp::OMPC_bind:
11416     C = OMPBindClause::CreateEmpty(Context);
11417     break;
11418   case llvm::omp::OMPC_align:
11419     C = new (Context) OMPAlignClause();
11420     break;
11421   case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11422     C = new (Context) OMPXDynCGroupMemClause();
11423     break;
11424   case llvm::omp::OMPC_doacross: {
11425     unsigned NumVars = Record.readInt();
11426     unsigned NumLoops = Record.readInt();
11427     C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
11428     break;
11429   }
11430   case llvm::omp::OMPC_ompx_attribute:
11431     C = new (Context) OMPXAttributeClause();
11432     break;
11433   case llvm::omp::OMPC_ompx_bare:
11434     C = new (Context) OMPXBareClause();
11435     break;
11436 #define OMP_CLAUSE_NO_CLASS(Enum, Str)                                         \
11437   case llvm::omp::Enum:                                                        \
11438     break;
11439 #include "llvm/Frontend/OpenMP/OMPKinds.def"
11440   default:
11441     break;
11442   }
11443   assert(C && "Unknown OMPClause type");
11444 
11445   Visit(C);
11446   C->setLocStart(Record.readSourceLocation());
11447   C->setLocEnd(Record.readSourceLocation());
11448 
11449   return C;
11450 }
11451 
VisitOMPClauseWithPreInit(OMPClauseWithPreInit * C)11452 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
11453   C->setPreInitStmt(Record.readSubStmt(),
11454                     static_cast<OpenMPDirectiveKind>(Record.readInt()));
11455 }
11456 
VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate * C)11457 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
11458   VisitOMPClauseWithPreInit(C);
11459   C->setPostUpdateExpr(Record.readSubExpr());
11460 }
11461 
VisitOMPIfClause(OMPIfClause * C)11462 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
11463   VisitOMPClauseWithPreInit(C);
11464   C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
11465   C->setNameModifierLoc(Record.readSourceLocation());
11466   C->setColonLoc(Record.readSourceLocation());
11467   C->setCondition(Record.readSubExpr());
11468   C->setLParenLoc(Record.readSourceLocation());
11469 }
11470 
VisitOMPFinalClause(OMPFinalClause * C)11471 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
11472   VisitOMPClauseWithPreInit(C);
11473   C->setCondition(Record.readSubExpr());
11474   C->setLParenLoc(Record.readSourceLocation());
11475 }
11476 
VisitOMPNumThreadsClause(OMPNumThreadsClause * C)11477 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
11478   VisitOMPClauseWithPreInit(C);
11479   C->setModifier(Record.readEnum<OpenMPNumThreadsClauseModifier>());
11480   C->setNumThreads(Record.readSubExpr());
11481   C->setModifierLoc(Record.readSourceLocation());
11482   C->setLParenLoc(Record.readSourceLocation());
11483 }
11484 
VisitOMPSafelenClause(OMPSafelenClause * C)11485 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
11486   C->setSafelen(Record.readSubExpr());
11487   C->setLParenLoc(Record.readSourceLocation());
11488 }
11489 
VisitOMPSimdlenClause(OMPSimdlenClause * C)11490 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
11491   C->setSimdlen(Record.readSubExpr());
11492   C->setLParenLoc(Record.readSourceLocation());
11493 }
11494 
VisitOMPSizesClause(OMPSizesClause * C)11495 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
11496   for (Expr *&E : C->getSizesRefs())
11497     E = Record.readSubExpr();
11498   C->setLParenLoc(Record.readSourceLocation());
11499 }
11500 
VisitOMPPermutationClause(OMPPermutationClause * C)11501 void OMPClauseReader::VisitOMPPermutationClause(OMPPermutationClause *C) {
11502   for (Expr *&E : C->getArgsRefs())
11503     E = Record.readSubExpr();
11504   C->setLParenLoc(Record.readSourceLocation());
11505 }
11506 
VisitOMPFullClause(OMPFullClause * C)11507 void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
11508 
VisitOMPPartialClause(OMPPartialClause * C)11509 void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
11510   C->setFactor(Record.readSubExpr());
11511   C->setLParenLoc(Record.readSourceLocation());
11512 }
11513 
VisitOMPAllocatorClause(OMPAllocatorClause * C)11514 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
11515   C->setAllocator(Record.readExpr());
11516   C->setLParenLoc(Record.readSourceLocation());
11517 }
11518 
VisitOMPCollapseClause(OMPCollapseClause * C)11519 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
11520   C->setNumForLoops(Record.readSubExpr());
11521   C->setLParenLoc(Record.readSourceLocation());
11522 }
11523 
VisitOMPDefaultClause(OMPDefaultClause * C)11524 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
11525   C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
11526   C->setLParenLoc(Record.readSourceLocation());
11527   C->setDefaultKindKwLoc(Record.readSourceLocation());
11528 }
11529 
VisitOMPProcBindClause(OMPProcBindClause * C)11530 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
11531   C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
11532   C->setLParenLoc(Record.readSourceLocation());
11533   C->setProcBindKindKwLoc(Record.readSourceLocation());
11534 }
11535 
VisitOMPScheduleClause(OMPScheduleClause * C)11536 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
11537   VisitOMPClauseWithPreInit(C);
11538   C->setScheduleKind(
11539        static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
11540   C->setFirstScheduleModifier(
11541       static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11542   C->setSecondScheduleModifier(
11543       static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
11544   C->setChunkSize(Record.readSubExpr());
11545   C->setLParenLoc(Record.readSourceLocation());
11546   C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11547   C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11548   C->setScheduleKindLoc(Record.readSourceLocation());
11549   C->setCommaLoc(Record.readSourceLocation());
11550 }
11551 
VisitOMPOrderedClause(OMPOrderedClause * C)11552 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
11553   C->setNumForLoops(Record.readSubExpr());
11554   for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11555     C->setLoopNumIterations(I, Record.readSubExpr());
11556   for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
11557     C->setLoopCounter(I, Record.readSubExpr());
11558   C->setLParenLoc(Record.readSourceLocation());
11559 }
11560 
VisitOMPDetachClause(OMPDetachClause * C)11561 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
11562   C->setEventHandler(Record.readSubExpr());
11563   C->setLParenLoc(Record.readSourceLocation());
11564 }
11565 
VisitOMPNowaitClause(OMPNowaitClause *)11566 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
11567 
VisitOMPUntiedClause(OMPUntiedClause *)11568 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11569 
VisitOMPMergeableClause(OMPMergeableClause *)11570 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11571 
VisitOMPReadClause(OMPReadClause *)11572 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11573 
VisitOMPWriteClause(OMPWriteClause *)11574 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11575 
VisitOMPUpdateClause(OMPUpdateClause * C)11576 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
11577   if (C->isExtended()) {
11578     C->setLParenLoc(Record.readSourceLocation());
11579     C->setArgumentLoc(Record.readSourceLocation());
11580     C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
11581   }
11582 }
11583 
VisitOMPCaptureClause(OMPCaptureClause *)11584 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
11585 
VisitOMPCompareClause(OMPCompareClause *)11586 void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
11587 
11588 // Read the parameter of fail clause. This will have been saved when
11589 // OMPClauseWriter is called.
VisitOMPFailClause(OMPFailClause * C)11590 void OMPClauseReader::VisitOMPFailClause(OMPFailClause *C) {
11591   C->setLParenLoc(Record.readSourceLocation());
11592   SourceLocation FailParameterLoc = Record.readSourceLocation();
11593   C->setFailParameterLoc(FailParameterLoc);
11594   OpenMPClauseKind CKind = Record.readEnum<OpenMPClauseKind>();
11595   C->setFailParameter(CKind);
11596 }
11597 
VisitOMPAbsentClause(OMPAbsentClause * C)11598 void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *C) {
11599   unsigned Count = C->getDirectiveKinds().size();
11600   C->setLParenLoc(Record.readSourceLocation());
11601   llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11602   DKVec.reserve(Count);
11603   for (unsigned I = 0; I < Count; I++) {
11604     DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
11605   }
11606   C->setDirectiveKinds(DKVec);
11607 }
11608 
VisitOMPHoldsClause(OMPHoldsClause * C)11609 void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *C) {
11610   C->setExpr(Record.readExpr());
11611   C->setLParenLoc(Record.readSourceLocation());
11612 }
11613 
VisitOMPContainsClause(OMPContainsClause * C)11614 void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *C) {
11615   unsigned Count = C->getDirectiveKinds().size();
11616   C->setLParenLoc(Record.readSourceLocation());
11617   llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11618   DKVec.reserve(Count);
11619   for (unsigned I = 0; I < Count; I++) {
11620     DKVec.push_back(Record.readEnum<OpenMPDirectiveKind>());
11621   }
11622   C->setDirectiveKinds(DKVec);
11623 }
11624 
VisitOMPNoOpenMPClause(OMPNoOpenMPClause *)11625 void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
11626 
VisitOMPNoOpenMPRoutinesClause(OMPNoOpenMPRoutinesClause *)11627 void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11628     OMPNoOpenMPRoutinesClause *) {}
11629 
VisitOMPNoOpenMPConstructsClause(OMPNoOpenMPConstructsClause *)11630 void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11631     OMPNoOpenMPConstructsClause *) {}
11632 
VisitOMPNoParallelismClause(OMPNoParallelismClause *)11633 void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
11634 
VisitOMPSeqCstClause(OMPSeqCstClause *)11635 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
11636 
VisitOMPAcqRelClause(OMPAcqRelClause *)11637 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
11638 
VisitOMPAcquireClause(OMPAcquireClause *)11639 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
11640 
VisitOMPReleaseClause(OMPReleaseClause *)11641 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
11642 
VisitOMPRelaxedClause(OMPRelaxedClause *)11643 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
11644 
VisitOMPWeakClause(OMPWeakClause *)11645 void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
11646 
VisitOMPThreadsClause(OMPThreadsClause *)11647 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
11648 
VisitOMPSIMDClause(OMPSIMDClause *)11649 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
11650 
VisitOMPNogroupClause(OMPNogroupClause *)11651 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
11652 
VisitOMPInitClause(OMPInitClause * C)11653 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
11654   unsigned NumVars = C->varlist_size();
11655   SmallVector<Expr *, 16> Vars;
11656   Vars.reserve(NumVars);
11657   for (unsigned I = 0; I != NumVars; ++I)
11658     Vars.push_back(Record.readSubExpr());
11659   C->setVarRefs(Vars);
11660   C->setIsTarget(Record.readBool());
11661   C->setIsTargetSync(Record.readBool());
11662   C->setLParenLoc(Record.readSourceLocation());
11663   C->setVarLoc(Record.readSourceLocation());
11664 }
11665 
VisitOMPUseClause(OMPUseClause * C)11666 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
11667   C->setInteropVar(Record.readSubExpr());
11668   C->setLParenLoc(Record.readSourceLocation());
11669   C->setVarLoc(Record.readSourceLocation());
11670 }
11671 
VisitOMPDestroyClause(OMPDestroyClause * C)11672 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
11673   C->setInteropVar(Record.readSubExpr());
11674   C->setLParenLoc(Record.readSourceLocation());
11675   C->setVarLoc(Record.readSourceLocation());
11676 }
11677 
VisitOMPNovariantsClause(OMPNovariantsClause * C)11678 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
11679   VisitOMPClauseWithPreInit(C);
11680   C->setCondition(Record.readSubExpr());
11681   C->setLParenLoc(Record.readSourceLocation());
11682 }
11683 
VisitOMPNocontextClause(OMPNocontextClause * C)11684 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
11685   VisitOMPClauseWithPreInit(C);
11686   C->setCondition(Record.readSubExpr());
11687   C->setLParenLoc(Record.readSourceLocation());
11688 }
11689 
VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *)11690 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
11691 
VisitOMPUnifiedSharedMemoryClause(OMPUnifiedSharedMemoryClause *)11692 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
11693     OMPUnifiedSharedMemoryClause *) {}
11694 
VisitOMPReverseOffloadClause(OMPReverseOffloadClause *)11695 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
11696 
11697 void
VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *)11698 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
11699 }
11700 
VisitOMPAtomicDefaultMemOrderClause(OMPAtomicDefaultMemOrderClause * C)11701 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
11702     OMPAtomicDefaultMemOrderClause *C) {
11703   C->setAtomicDefaultMemOrderKind(
11704       static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
11705   C->setLParenLoc(Record.readSourceLocation());
11706   C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
11707 }
11708 
VisitOMPSelfMapsClause(OMPSelfMapsClause *)11709 void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
11710 
VisitOMPAtClause(OMPAtClause * C)11711 void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
11712   C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
11713   C->setLParenLoc(Record.readSourceLocation());
11714   C->setAtKindKwLoc(Record.readSourceLocation());
11715 }
11716 
VisitOMPSeverityClause(OMPSeverityClause * C)11717 void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
11718   C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
11719   C->setLParenLoc(Record.readSourceLocation());
11720   C->setSeverityKindKwLoc(Record.readSourceLocation());
11721 }
11722 
VisitOMPMessageClause(OMPMessageClause * C)11723 void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
11724   C->setMessageString(Record.readSubExpr());
11725   C->setLParenLoc(Record.readSourceLocation());
11726 }
11727 
VisitOMPPrivateClause(OMPPrivateClause * C)11728 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
11729   C->setLParenLoc(Record.readSourceLocation());
11730   unsigned NumVars = C->varlist_size();
11731   SmallVector<Expr *, 16> Vars;
11732   Vars.reserve(NumVars);
11733   for (unsigned i = 0; i != NumVars; ++i)
11734     Vars.push_back(Record.readSubExpr());
11735   C->setVarRefs(Vars);
11736   Vars.clear();
11737   for (unsigned i = 0; i != NumVars; ++i)
11738     Vars.push_back(Record.readSubExpr());
11739   C->setPrivateCopies(Vars);
11740 }
11741 
VisitOMPFirstprivateClause(OMPFirstprivateClause * C)11742 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
11743   VisitOMPClauseWithPreInit(C);
11744   C->setLParenLoc(Record.readSourceLocation());
11745   unsigned NumVars = C->varlist_size();
11746   SmallVector<Expr *, 16> Vars;
11747   Vars.reserve(NumVars);
11748   for (unsigned i = 0; i != NumVars; ++i)
11749     Vars.push_back(Record.readSubExpr());
11750   C->setVarRefs(Vars);
11751   Vars.clear();
11752   for (unsigned i = 0; i != NumVars; ++i)
11753     Vars.push_back(Record.readSubExpr());
11754   C->setPrivateCopies(Vars);
11755   Vars.clear();
11756   for (unsigned i = 0; i != NumVars; ++i)
11757     Vars.push_back(Record.readSubExpr());
11758   C->setInits(Vars);
11759 }
11760 
VisitOMPLastprivateClause(OMPLastprivateClause * C)11761 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
11762   VisitOMPClauseWithPostUpdate(C);
11763   C->setLParenLoc(Record.readSourceLocation());
11764   C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
11765   C->setKindLoc(Record.readSourceLocation());
11766   C->setColonLoc(Record.readSourceLocation());
11767   unsigned NumVars = C->varlist_size();
11768   SmallVector<Expr *, 16> Vars;
11769   Vars.reserve(NumVars);
11770   for (unsigned i = 0; i != NumVars; ++i)
11771     Vars.push_back(Record.readSubExpr());
11772   C->setVarRefs(Vars);
11773   Vars.clear();
11774   for (unsigned i = 0; i != NumVars; ++i)
11775     Vars.push_back(Record.readSubExpr());
11776   C->setPrivateCopies(Vars);
11777   Vars.clear();
11778   for (unsigned i = 0; i != NumVars; ++i)
11779     Vars.push_back(Record.readSubExpr());
11780   C->setSourceExprs(Vars);
11781   Vars.clear();
11782   for (unsigned i = 0; i != NumVars; ++i)
11783     Vars.push_back(Record.readSubExpr());
11784   C->setDestinationExprs(Vars);
11785   Vars.clear();
11786   for (unsigned i = 0; i != NumVars; ++i)
11787     Vars.push_back(Record.readSubExpr());
11788   C->setAssignmentOps(Vars);
11789 }
11790 
VisitOMPSharedClause(OMPSharedClause * C)11791 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
11792   C->setLParenLoc(Record.readSourceLocation());
11793   unsigned NumVars = C->varlist_size();
11794   SmallVector<Expr *, 16> Vars;
11795   Vars.reserve(NumVars);
11796   for (unsigned i = 0; i != NumVars; ++i)
11797     Vars.push_back(Record.readSubExpr());
11798   C->setVarRefs(Vars);
11799 }
11800 
VisitOMPReductionClause(OMPReductionClause * C)11801 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
11802   VisitOMPClauseWithPostUpdate(C);
11803   C->setLParenLoc(Record.readSourceLocation());
11804   C->setModifierLoc(Record.readSourceLocation());
11805   C->setColonLoc(Record.readSourceLocation());
11806   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11807   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11808   C->setQualifierLoc(NNSL);
11809   C->setNameInfo(DNI);
11810 
11811   unsigned NumVars = C->varlist_size();
11812   SmallVector<Expr *, 16> Vars;
11813   Vars.reserve(NumVars);
11814   for (unsigned i = 0; i != NumVars; ++i)
11815     Vars.push_back(Record.readSubExpr());
11816   C->setVarRefs(Vars);
11817   Vars.clear();
11818   for (unsigned i = 0; i != NumVars; ++i)
11819     Vars.push_back(Record.readSubExpr());
11820   C->setPrivates(Vars);
11821   Vars.clear();
11822   for (unsigned i = 0; i != NumVars; ++i)
11823     Vars.push_back(Record.readSubExpr());
11824   C->setLHSExprs(Vars);
11825   Vars.clear();
11826   for (unsigned i = 0; i != NumVars; ++i)
11827     Vars.push_back(Record.readSubExpr());
11828   C->setRHSExprs(Vars);
11829   Vars.clear();
11830   for (unsigned i = 0; i != NumVars; ++i)
11831     Vars.push_back(Record.readSubExpr());
11832   C->setReductionOps(Vars);
11833   if (C->getModifier() == OMPC_REDUCTION_inscan) {
11834     Vars.clear();
11835     for (unsigned i = 0; i != NumVars; ++i)
11836       Vars.push_back(Record.readSubExpr());
11837     C->setInscanCopyOps(Vars);
11838     Vars.clear();
11839     for (unsigned i = 0; i != NumVars; ++i)
11840       Vars.push_back(Record.readSubExpr());
11841     C->setInscanCopyArrayTemps(Vars);
11842     Vars.clear();
11843     for (unsigned i = 0; i != NumVars; ++i)
11844       Vars.push_back(Record.readSubExpr());
11845     C->setInscanCopyArrayElems(Vars);
11846   }
11847   unsigned NumFlags = Record.readInt();
11848   SmallVector<bool, 16> Flags;
11849   Flags.reserve(NumFlags);
11850   for ([[maybe_unused]] unsigned I : llvm::seq<unsigned>(NumFlags))
11851     Flags.push_back(Record.readInt());
11852   C->setPrivateVariableReductionFlags(Flags);
11853 }
11854 
VisitOMPTaskReductionClause(OMPTaskReductionClause * C)11855 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
11856   VisitOMPClauseWithPostUpdate(C);
11857   C->setLParenLoc(Record.readSourceLocation());
11858   C->setColonLoc(Record.readSourceLocation());
11859   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11860   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11861   C->setQualifierLoc(NNSL);
11862   C->setNameInfo(DNI);
11863 
11864   unsigned NumVars = C->varlist_size();
11865   SmallVector<Expr *, 16> Vars;
11866   Vars.reserve(NumVars);
11867   for (unsigned I = 0; I != NumVars; ++I)
11868     Vars.push_back(Record.readSubExpr());
11869   C->setVarRefs(Vars);
11870   Vars.clear();
11871   for (unsigned I = 0; I != NumVars; ++I)
11872     Vars.push_back(Record.readSubExpr());
11873   C->setPrivates(Vars);
11874   Vars.clear();
11875   for (unsigned I = 0; I != NumVars; ++I)
11876     Vars.push_back(Record.readSubExpr());
11877   C->setLHSExprs(Vars);
11878   Vars.clear();
11879   for (unsigned I = 0; I != NumVars; ++I)
11880     Vars.push_back(Record.readSubExpr());
11881   C->setRHSExprs(Vars);
11882   Vars.clear();
11883   for (unsigned I = 0; I != NumVars; ++I)
11884     Vars.push_back(Record.readSubExpr());
11885   C->setReductionOps(Vars);
11886 }
11887 
VisitOMPInReductionClause(OMPInReductionClause * C)11888 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
11889   VisitOMPClauseWithPostUpdate(C);
11890   C->setLParenLoc(Record.readSourceLocation());
11891   C->setColonLoc(Record.readSourceLocation());
11892   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11893   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11894   C->setQualifierLoc(NNSL);
11895   C->setNameInfo(DNI);
11896 
11897   unsigned NumVars = C->varlist_size();
11898   SmallVector<Expr *, 16> Vars;
11899   Vars.reserve(NumVars);
11900   for (unsigned I = 0; I != NumVars; ++I)
11901     Vars.push_back(Record.readSubExpr());
11902   C->setVarRefs(Vars);
11903   Vars.clear();
11904   for (unsigned I = 0; I != NumVars; ++I)
11905     Vars.push_back(Record.readSubExpr());
11906   C->setPrivates(Vars);
11907   Vars.clear();
11908   for (unsigned I = 0; I != NumVars; ++I)
11909     Vars.push_back(Record.readSubExpr());
11910   C->setLHSExprs(Vars);
11911   Vars.clear();
11912   for (unsigned I = 0; I != NumVars; ++I)
11913     Vars.push_back(Record.readSubExpr());
11914   C->setRHSExprs(Vars);
11915   Vars.clear();
11916   for (unsigned I = 0; I != NumVars; ++I)
11917     Vars.push_back(Record.readSubExpr());
11918   C->setReductionOps(Vars);
11919   Vars.clear();
11920   for (unsigned I = 0; I != NumVars; ++I)
11921     Vars.push_back(Record.readSubExpr());
11922   C->setTaskgroupDescriptors(Vars);
11923 }
11924 
VisitOMPLinearClause(OMPLinearClause * C)11925 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
11926   VisitOMPClauseWithPostUpdate(C);
11927   C->setLParenLoc(Record.readSourceLocation());
11928   C->setColonLoc(Record.readSourceLocation());
11929   C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
11930   C->setModifierLoc(Record.readSourceLocation());
11931   unsigned NumVars = C->varlist_size();
11932   SmallVector<Expr *, 16> Vars;
11933   Vars.reserve(NumVars);
11934   for (unsigned i = 0; i != NumVars; ++i)
11935     Vars.push_back(Record.readSubExpr());
11936   C->setVarRefs(Vars);
11937   Vars.clear();
11938   for (unsigned i = 0; i != NumVars; ++i)
11939     Vars.push_back(Record.readSubExpr());
11940   C->setPrivates(Vars);
11941   Vars.clear();
11942   for (unsigned i = 0; i != NumVars; ++i)
11943     Vars.push_back(Record.readSubExpr());
11944   C->setInits(Vars);
11945   Vars.clear();
11946   for (unsigned i = 0; i != NumVars; ++i)
11947     Vars.push_back(Record.readSubExpr());
11948   C->setUpdates(Vars);
11949   Vars.clear();
11950   for (unsigned i = 0; i != NumVars; ++i)
11951     Vars.push_back(Record.readSubExpr());
11952   C->setFinals(Vars);
11953   C->setStep(Record.readSubExpr());
11954   C->setCalcStep(Record.readSubExpr());
11955   Vars.clear();
11956   for (unsigned I = 0; I != NumVars + 1; ++I)
11957     Vars.push_back(Record.readSubExpr());
11958   C->setUsedExprs(Vars);
11959 }
11960 
VisitOMPAlignedClause(OMPAlignedClause * C)11961 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
11962   C->setLParenLoc(Record.readSourceLocation());
11963   C->setColonLoc(Record.readSourceLocation());
11964   unsigned NumVars = C->varlist_size();
11965   SmallVector<Expr *, 16> Vars;
11966   Vars.reserve(NumVars);
11967   for (unsigned i = 0; i != NumVars; ++i)
11968     Vars.push_back(Record.readSubExpr());
11969   C->setVarRefs(Vars);
11970   C->setAlignment(Record.readSubExpr());
11971 }
11972 
VisitOMPCopyinClause(OMPCopyinClause * C)11973 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
11974   C->setLParenLoc(Record.readSourceLocation());
11975   unsigned NumVars = C->varlist_size();
11976   SmallVector<Expr *, 16> Exprs;
11977   Exprs.reserve(NumVars);
11978   for (unsigned i = 0; i != NumVars; ++i)
11979     Exprs.push_back(Record.readSubExpr());
11980   C->setVarRefs(Exprs);
11981   Exprs.clear();
11982   for (unsigned i = 0; i != NumVars; ++i)
11983     Exprs.push_back(Record.readSubExpr());
11984   C->setSourceExprs(Exprs);
11985   Exprs.clear();
11986   for (unsigned i = 0; i != NumVars; ++i)
11987     Exprs.push_back(Record.readSubExpr());
11988   C->setDestinationExprs(Exprs);
11989   Exprs.clear();
11990   for (unsigned i = 0; i != NumVars; ++i)
11991     Exprs.push_back(Record.readSubExpr());
11992   C->setAssignmentOps(Exprs);
11993 }
11994 
VisitOMPCopyprivateClause(OMPCopyprivateClause * C)11995 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
11996   C->setLParenLoc(Record.readSourceLocation());
11997   unsigned NumVars = C->varlist_size();
11998   SmallVector<Expr *, 16> Exprs;
11999   Exprs.reserve(NumVars);
12000   for (unsigned i = 0; i != NumVars; ++i)
12001     Exprs.push_back(Record.readSubExpr());
12002   C->setVarRefs(Exprs);
12003   Exprs.clear();
12004   for (unsigned i = 0; i != NumVars; ++i)
12005     Exprs.push_back(Record.readSubExpr());
12006   C->setSourceExprs(Exprs);
12007   Exprs.clear();
12008   for (unsigned i = 0; i != NumVars; ++i)
12009     Exprs.push_back(Record.readSubExpr());
12010   C->setDestinationExprs(Exprs);
12011   Exprs.clear();
12012   for (unsigned i = 0; i != NumVars; ++i)
12013     Exprs.push_back(Record.readSubExpr());
12014   C->setAssignmentOps(Exprs);
12015 }
12016 
VisitOMPFlushClause(OMPFlushClause * C)12017 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
12018   C->setLParenLoc(Record.readSourceLocation());
12019   unsigned NumVars = C->varlist_size();
12020   SmallVector<Expr *, 16> Vars;
12021   Vars.reserve(NumVars);
12022   for (unsigned i = 0; i != NumVars; ++i)
12023     Vars.push_back(Record.readSubExpr());
12024   C->setVarRefs(Vars);
12025 }
12026 
VisitOMPDepobjClause(OMPDepobjClause * C)12027 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
12028   C->setDepobj(Record.readSubExpr());
12029   C->setLParenLoc(Record.readSourceLocation());
12030 }
12031 
VisitOMPDependClause(OMPDependClause * C)12032 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
12033   C->setLParenLoc(Record.readSourceLocation());
12034   C->setModifier(Record.readSubExpr());
12035   C->setDependencyKind(
12036       static_cast<OpenMPDependClauseKind>(Record.readInt()));
12037   C->setDependencyLoc(Record.readSourceLocation());
12038   C->setColonLoc(Record.readSourceLocation());
12039   C->setOmpAllMemoryLoc(Record.readSourceLocation());
12040   unsigned NumVars = C->varlist_size();
12041   SmallVector<Expr *, 16> Vars;
12042   Vars.reserve(NumVars);
12043   for (unsigned I = 0; I != NumVars; ++I)
12044     Vars.push_back(Record.readSubExpr());
12045   C->setVarRefs(Vars);
12046   for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12047     C->setLoopData(I, Record.readSubExpr());
12048 }
12049 
VisitOMPDeviceClause(OMPDeviceClause * C)12050 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
12051   VisitOMPClauseWithPreInit(C);
12052   C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
12053   C->setDevice(Record.readSubExpr());
12054   C->setModifierLoc(Record.readSourceLocation());
12055   C->setLParenLoc(Record.readSourceLocation());
12056 }
12057 
VisitOMPMapClause(OMPMapClause * C)12058 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
12059   C->setLParenLoc(Record.readSourceLocation());
12060   bool HasIteratorModifier = false;
12061   for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
12062     C->setMapTypeModifier(
12063         I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
12064     C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12065     if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12066       HasIteratorModifier = true;
12067   }
12068   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12069   C->setMapperIdInfo(Record.readDeclarationNameInfo());
12070   C->setMapType(
12071      static_cast<OpenMPMapClauseKind>(Record.readInt()));
12072   C->setMapLoc(Record.readSourceLocation());
12073   C->setColonLoc(Record.readSourceLocation());
12074   auto NumVars = C->varlist_size();
12075   auto UniqueDecls = C->getUniqueDeclarationsNum();
12076   auto TotalLists = C->getTotalComponentListNum();
12077   auto TotalComponents = C->getTotalComponentsNum();
12078 
12079   SmallVector<Expr *, 16> Vars;
12080   Vars.reserve(NumVars);
12081   for (unsigned i = 0; i != NumVars; ++i)
12082     Vars.push_back(Record.readExpr());
12083   C->setVarRefs(Vars);
12084 
12085   SmallVector<Expr *, 16> UDMappers;
12086   UDMappers.reserve(NumVars);
12087   for (unsigned I = 0; I < NumVars; ++I)
12088     UDMappers.push_back(Record.readExpr());
12089   C->setUDMapperRefs(UDMappers);
12090 
12091   if (HasIteratorModifier)
12092     C->setIteratorModifier(Record.readExpr());
12093 
12094   SmallVector<ValueDecl *, 16> Decls;
12095   Decls.reserve(UniqueDecls);
12096   for (unsigned i = 0; i < UniqueDecls; ++i)
12097     Decls.push_back(Record.readDeclAs<ValueDecl>());
12098   C->setUniqueDecls(Decls);
12099 
12100   SmallVector<unsigned, 16> ListsPerDecl;
12101   ListsPerDecl.reserve(UniqueDecls);
12102   for (unsigned i = 0; i < UniqueDecls; ++i)
12103     ListsPerDecl.push_back(Record.readInt());
12104   C->setDeclNumLists(ListsPerDecl);
12105 
12106   SmallVector<unsigned, 32> ListSizes;
12107   ListSizes.reserve(TotalLists);
12108   for (unsigned i = 0; i < TotalLists; ++i)
12109     ListSizes.push_back(Record.readInt());
12110   C->setComponentListSizes(ListSizes);
12111 
12112   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12113   Components.reserve(TotalComponents);
12114   for (unsigned i = 0; i < TotalComponents; ++i) {
12115     Expr *AssociatedExprPr = Record.readExpr();
12116     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12117     Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12118                             /*IsNonContiguous=*/false);
12119   }
12120   C->setComponents(Components, ListSizes);
12121 }
12122 
VisitOMPAllocateClause(OMPAllocateClause * C)12123 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
12124   C->setFirstAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12125   C->setSecondAllocateModifier(Record.readEnum<OpenMPAllocateClauseModifier>());
12126   C->setLParenLoc(Record.readSourceLocation());
12127   C->setColonLoc(Record.readSourceLocation());
12128   C->setAllocator(Record.readSubExpr());
12129   C->setAlignment(Record.readSubExpr());
12130   unsigned NumVars = C->varlist_size();
12131   SmallVector<Expr *, 16> Vars;
12132   Vars.reserve(NumVars);
12133   for (unsigned i = 0; i != NumVars; ++i)
12134     Vars.push_back(Record.readSubExpr());
12135   C->setVarRefs(Vars);
12136 }
12137 
VisitOMPNumTeamsClause(OMPNumTeamsClause * C)12138 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
12139   VisitOMPClauseWithPreInit(C);
12140   C->setLParenLoc(Record.readSourceLocation());
12141   unsigned NumVars = C->varlist_size();
12142   SmallVector<Expr *, 16> Vars;
12143   Vars.reserve(NumVars);
12144   for (unsigned I = 0; I != NumVars; ++I)
12145     Vars.push_back(Record.readSubExpr());
12146   C->setVarRefs(Vars);
12147 }
12148 
VisitOMPThreadLimitClause(OMPThreadLimitClause * C)12149 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
12150   VisitOMPClauseWithPreInit(C);
12151   C->setLParenLoc(Record.readSourceLocation());
12152   unsigned NumVars = C->varlist_size();
12153   SmallVector<Expr *, 16> Vars;
12154   Vars.reserve(NumVars);
12155   for (unsigned I = 0; I != NumVars; ++I)
12156     Vars.push_back(Record.readSubExpr());
12157   C->setVarRefs(Vars);
12158 }
12159 
VisitOMPPriorityClause(OMPPriorityClause * C)12160 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
12161   VisitOMPClauseWithPreInit(C);
12162   C->setPriority(Record.readSubExpr());
12163   C->setLParenLoc(Record.readSourceLocation());
12164 }
12165 
VisitOMPGrainsizeClause(OMPGrainsizeClause * C)12166 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
12167   VisitOMPClauseWithPreInit(C);
12168   C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
12169   C->setGrainsize(Record.readSubExpr());
12170   C->setModifierLoc(Record.readSourceLocation());
12171   C->setLParenLoc(Record.readSourceLocation());
12172 }
12173 
VisitOMPNumTasksClause(OMPNumTasksClause * C)12174 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
12175   VisitOMPClauseWithPreInit(C);
12176   C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
12177   C->setNumTasks(Record.readSubExpr());
12178   C->setModifierLoc(Record.readSourceLocation());
12179   C->setLParenLoc(Record.readSourceLocation());
12180 }
12181 
VisitOMPHintClause(OMPHintClause * C)12182 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
12183   C->setHint(Record.readSubExpr());
12184   C->setLParenLoc(Record.readSourceLocation());
12185 }
12186 
VisitOMPDistScheduleClause(OMPDistScheduleClause * C)12187 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
12188   VisitOMPClauseWithPreInit(C);
12189   C->setDistScheduleKind(
12190       static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
12191   C->setChunkSize(Record.readSubExpr());
12192   C->setLParenLoc(Record.readSourceLocation());
12193   C->setDistScheduleKindLoc(Record.readSourceLocation());
12194   C->setCommaLoc(Record.readSourceLocation());
12195 }
12196 
VisitOMPDefaultmapClause(OMPDefaultmapClause * C)12197 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
12198   C->setDefaultmapKind(
12199        static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
12200   C->setDefaultmapModifier(
12201       static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
12202   C->setLParenLoc(Record.readSourceLocation());
12203   C->setDefaultmapModifierLoc(Record.readSourceLocation());
12204   C->setDefaultmapKindLoc(Record.readSourceLocation());
12205 }
12206 
VisitOMPToClause(OMPToClause * C)12207 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
12208   C->setLParenLoc(Record.readSourceLocation());
12209   for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12210     C->setMotionModifier(
12211         I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12212     C->setMotionModifierLoc(I, Record.readSourceLocation());
12213   }
12214   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12215   C->setMapperIdInfo(Record.readDeclarationNameInfo());
12216   C->setColonLoc(Record.readSourceLocation());
12217   auto NumVars = C->varlist_size();
12218   auto UniqueDecls = C->getUniqueDeclarationsNum();
12219   auto TotalLists = C->getTotalComponentListNum();
12220   auto TotalComponents = C->getTotalComponentsNum();
12221 
12222   SmallVector<Expr *, 16> Vars;
12223   Vars.reserve(NumVars);
12224   for (unsigned i = 0; i != NumVars; ++i)
12225     Vars.push_back(Record.readSubExpr());
12226   C->setVarRefs(Vars);
12227 
12228   SmallVector<Expr *, 16> UDMappers;
12229   UDMappers.reserve(NumVars);
12230   for (unsigned I = 0; I < NumVars; ++I)
12231     UDMappers.push_back(Record.readSubExpr());
12232   C->setUDMapperRefs(UDMappers);
12233 
12234   SmallVector<ValueDecl *, 16> Decls;
12235   Decls.reserve(UniqueDecls);
12236   for (unsigned i = 0; i < UniqueDecls; ++i)
12237     Decls.push_back(Record.readDeclAs<ValueDecl>());
12238   C->setUniqueDecls(Decls);
12239 
12240   SmallVector<unsigned, 16> ListsPerDecl;
12241   ListsPerDecl.reserve(UniqueDecls);
12242   for (unsigned i = 0; i < UniqueDecls; ++i)
12243     ListsPerDecl.push_back(Record.readInt());
12244   C->setDeclNumLists(ListsPerDecl);
12245 
12246   SmallVector<unsigned, 32> ListSizes;
12247   ListSizes.reserve(TotalLists);
12248   for (unsigned i = 0; i < TotalLists; ++i)
12249     ListSizes.push_back(Record.readInt());
12250   C->setComponentListSizes(ListSizes);
12251 
12252   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12253   Components.reserve(TotalComponents);
12254   for (unsigned i = 0; i < TotalComponents; ++i) {
12255     Expr *AssociatedExprPr = Record.readSubExpr();
12256     bool IsNonContiguous = Record.readBool();
12257     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12258     Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12259   }
12260   C->setComponents(Components, ListSizes);
12261 }
12262 
VisitOMPFromClause(OMPFromClause * C)12263 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
12264   C->setLParenLoc(Record.readSourceLocation());
12265   for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
12266     C->setMotionModifier(
12267         I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
12268     C->setMotionModifierLoc(I, Record.readSourceLocation());
12269   }
12270   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12271   C->setMapperIdInfo(Record.readDeclarationNameInfo());
12272   C->setColonLoc(Record.readSourceLocation());
12273   auto NumVars = C->varlist_size();
12274   auto UniqueDecls = C->getUniqueDeclarationsNum();
12275   auto TotalLists = C->getTotalComponentListNum();
12276   auto TotalComponents = C->getTotalComponentsNum();
12277 
12278   SmallVector<Expr *, 16> Vars;
12279   Vars.reserve(NumVars);
12280   for (unsigned i = 0; i != NumVars; ++i)
12281     Vars.push_back(Record.readSubExpr());
12282   C->setVarRefs(Vars);
12283 
12284   SmallVector<Expr *, 16> UDMappers;
12285   UDMappers.reserve(NumVars);
12286   for (unsigned I = 0; I < NumVars; ++I)
12287     UDMappers.push_back(Record.readSubExpr());
12288   C->setUDMapperRefs(UDMappers);
12289 
12290   SmallVector<ValueDecl *, 16> Decls;
12291   Decls.reserve(UniqueDecls);
12292   for (unsigned i = 0; i < UniqueDecls; ++i)
12293     Decls.push_back(Record.readDeclAs<ValueDecl>());
12294   C->setUniqueDecls(Decls);
12295 
12296   SmallVector<unsigned, 16> ListsPerDecl;
12297   ListsPerDecl.reserve(UniqueDecls);
12298   for (unsigned i = 0; i < UniqueDecls; ++i)
12299     ListsPerDecl.push_back(Record.readInt());
12300   C->setDeclNumLists(ListsPerDecl);
12301 
12302   SmallVector<unsigned, 32> ListSizes;
12303   ListSizes.reserve(TotalLists);
12304   for (unsigned i = 0; i < TotalLists; ++i)
12305     ListSizes.push_back(Record.readInt());
12306   C->setComponentListSizes(ListSizes);
12307 
12308   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12309   Components.reserve(TotalComponents);
12310   for (unsigned i = 0; i < TotalComponents; ++i) {
12311     Expr *AssociatedExprPr = Record.readSubExpr();
12312     bool IsNonContiguous = Record.readBool();
12313     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12314     Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12315   }
12316   C->setComponents(Components, ListSizes);
12317 }
12318 
VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause * C)12319 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
12320   C->setLParenLoc(Record.readSourceLocation());
12321   auto NumVars = C->varlist_size();
12322   auto UniqueDecls = C->getUniqueDeclarationsNum();
12323   auto TotalLists = C->getTotalComponentListNum();
12324   auto TotalComponents = C->getTotalComponentsNum();
12325 
12326   SmallVector<Expr *, 16> Vars;
12327   Vars.reserve(NumVars);
12328   for (unsigned i = 0; i != NumVars; ++i)
12329     Vars.push_back(Record.readSubExpr());
12330   C->setVarRefs(Vars);
12331   Vars.clear();
12332   for (unsigned i = 0; i != NumVars; ++i)
12333     Vars.push_back(Record.readSubExpr());
12334   C->setPrivateCopies(Vars);
12335   Vars.clear();
12336   for (unsigned i = 0; i != NumVars; ++i)
12337     Vars.push_back(Record.readSubExpr());
12338   C->setInits(Vars);
12339 
12340   SmallVector<ValueDecl *, 16> Decls;
12341   Decls.reserve(UniqueDecls);
12342   for (unsigned i = 0; i < UniqueDecls; ++i)
12343     Decls.push_back(Record.readDeclAs<ValueDecl>());
12344   C->setUniqueDecls(Decls);
12345 
12346   SmallVector<unsigned, 16> ListsPerDecl;
12347   ListsPerDecl.reserve(UniqueDecls);
12348   for (unsigned i = 0; i < UniqueDecls; ++i)
12349     ListsPerDecl.push_back(Record.readInt());
12350   C->setDeclNumLists(ListsPerDecl);
12351 
12352   SmallVector<unsigned, 32> ListSizes;
12353   ListSizes.reserve(TotalLists);
12354   for (unsigned i = 0; i < TotalLists; ++i)
12355     ListSizes.push_back(Record.readInt());
12356   C->setComponentListSizes(ListSizes);
12357 
12358   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12359   Components.reserve(TotalComponents);
12360   for (unsigned i = 0; i < TotalComponents; ++i) {
12361     auto *AssociatedExprPr = Record.readSubExpr();
12362     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12363     Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12364                             /*IsNonContiguous=*/false);
12365   }
12366   C->setComponents(Components, ListSizes);
12367 }
12368 
VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause * C)12369 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
12370   C->setLParenLoc(Record.readSourceLocation());
12371   auto NumVars = C->varlist_size();
12372   auto UniqueDecls = C->getUniqueDeclarationsNum();
12373   auto TotalLists = C->getTotalComponentListNum();
12374   auto TotalComponents = C->getTotalComponentsNum();
12375 
12376   SmallVector<Expr *, 16> Vars;
12377   Vars.reserve(NumVars);
12378   for (unsigned i = 0; i != NumVars; ++i)
12379     Vars.push_back(Record.readSubExpr());
12380   C->setVarRefs(Vars);
12381 
12382   SmallVector<ValueDecl *, 16> Decls;
12383   Decls.reserve(UniqueDecls);
12384   for (unsigned i = 0; i < UniqueDecls; ++i)
12385     Decls.push_back(Record.readDeclAs<ValueDecl>());
12386   C->setUniqueDecls(Decls);
12387 
12388   SmallVector<unsigned, 16> ListsPerDecl;
12389   ListsPerDecl.reserve(UniqueDecls);
12390   for (unsigned i = 0; i < UniqueDecls; ++i)
12391     ListsPerDecl.push_back(Record.readInt());
12392   C->setDeclNumLists(ListsPerDecl);
12393 
12394   SmallVector<unsigned, 32> ListSizes;
12395   ListSizes.reserve(TotalLists);
12396   for (unsigned i = 0; i < TotalLists; ++i)
12397     ListSizes.push_back(Record.readInt());
12398   C->setComponentListSizes(ListSizes);
12399 
12400   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12401   Components.reserve(TotalComponents);
12402   for (unsigned i = 0; i < TotalComponents; ++i) {
12403     Expr *AssociatedExpr = Record.readSubExpr();
12404     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12405     Components.emplace_back(AssociatedExpr, AssociatedDecl,
12406                             /*IsNonContiguous*/ false);
12407   }
12408   C->setComponents(Components, ListSizes);
12409 }
12410 
VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause * C)12411 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
12412   C->setLParenLoc(Record.readSourceLocation());
12413   auto NumVars = C->varlist_size();
12414   auto UniqueDecls = C->getUniqueDeclarationsNum();
12415   auto TotalLists = C->getTotalComponentListNum();
12416   auto TotalComponents = C->getTotalComponentsNum();
12417 
12418   SmallVector<Expr *, 16> Vars;
12419   Vars.reserve(NumVars);
12420   for (unsigned i = 0; i != NumVars; ++i)
12421     Vars.push_back(Record.readSubExpr());
12422   C->setVarRefs(Vars);
12423   Vars.clear();
12424 
12425   SmallVector<ValueDecl *, 16> Decls;
12426   Decls.reserve(UniqueDecls);
12427   for (unsigned i = 0; i < UniqueDecls; ++i)
12428     Decls.push_back(Record.readDeclAs<ValueDecl>());
12429   C->setUniqueDecls(Decls);
12430 
12431   SmallVector<unsigned, 16> ListsPerDecl;
12432   ListsPerDecl.reserve(UniqueDecls);
12433   for (unsigned i = 0; i < UniqueDecls; ++i)
12434     ListsPerDecl.push_back(Record.readInt());
12435   C->setDeclNumLists(ListsPerDecl);
12436 
12437   SmallVector<unsigned, 32> ListSizes;
12438   ListSizes.reserve(TotalLists);
12439   for (unsigned i = 0; i < TotalLists; ++i)
12440     ListSizes.push_back(Record.readInt());
12441   C->setComponentListSizes(ListSizes);
12442 
12443   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12444   Components.reserve(TotalComponents);
12445   for (unsigned i = 0; i < TotalComponents; ++i) {
12446     Expr *AssociatedExpr = Record.readSubExpr();
12447     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12448     Components.emplace_back(AssociatedExpr, AssociatedDecl,
12449                             /*IsNonContiguous=*/false);
12450   }
12451   C->setComponents(Components, ListSizes);
12452 }
12453 
VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause * C)12454 void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
12455   C->setLParenLoc(Record.readSourceLocation());
12456   auto NumVars = C->varlist_size();
12457   auto UniqueDecls = C->getUniqueDeclarationsNum();
12458   auto TotalLists = C->getTotalComponentListNum();
12459   auto TotalComponents = C->getTotalComponentsNum();
12460 
12461   SmallVector<Expr *, 16> Vars;
12462   Vars.reserve(NumVars);
12463   for (unsigned I = 0; I != NumVars; ++I)
12464     Vars.push_back(Record.readSubExpr());
12465   C->setVarRefs(Vars);
12466   Vars.clear();
12467 
12468   SmallVector<ValueDecl *, 16> Decls;
12469   Decls.reserve(UniqueDecls);
12470   for (unsigned I = 0; I < UniqueDecls; ++I)
12471     Decls.push_back(Record.readDeclAs<ValueDecl>());
12472   C->setUniqueDecls(Decls);
12473 
12474   SmallVector<unsigned, 16> ListsPerDecl;
12475   ListsPerDecl.reserve(UniqueDecls);
12476   for (unsigned I = 0; I < UniqueDecls; ++I)
12477     ListsPerDecl.push_back(Record.readInt());
12478   C->setDeclNumLists(ListsPerDecl);
12479 
12480   SmallVector<unsigned, 32> ListSizes;
12481   ListSizes.reserve(TotalLists);
12482   for (unsigned i = 0; i < TotalLists; ++i)
12483     ListSizes.push_back(Record.readInt());
12484   C->setComponentListSizes(ListSizes);
12485 
12486   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12487   Components.reserve(TotalComponents);
12488   for (unsigned I = 0; I < TotalComponents; ++I) {
12489     Expr *AssociatedExpr = Record.readSubExpr();
12490     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12491     Components.emplace_back(AssociatedExpr, AssociatedDecl,
12492                             /*IsNonContiguous=*/false);
12493   }
12494   C->setComponents(Components, ListSizes);
12495 }
12496 
VisitOMPNontemporalClause(OMPNontemporalClause * C)12497 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
12498   C->setLParenLoc(Record.readSourceLocation());
12499   unsigned NumVars = C->varlist_size();
12500   SmallVector<Expr *, 16> Vars;
12501   Vars.reserve(NumVars);
12502   for (unsigned i = 0; i != NumVars; ++i)
12503     Vars.push_back(Record.readSubExpr());
12504   C->setVarRefs(Vars);
12505   Vars.clear();
12506   Vars.reserve(NumVars);
12507   for (unsigned i = 0; i != NumVars; ++i)
12508     Vars.push_back(Record.readSubExpr());
12509   C->setPrivateRefs(Vars);
12510 }
12511 
VisitOMPInclusiveClause(OMPInclusiveClause * C)12512 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
12513   C->setLParenLoc(Record.readSourceLocation());
12514   unsigned NumVars = C->varlist_size();
12515   SmallVector<Expr *, 16> Vars;
12516   Vars.reserve(NumVars);
12517   for (unsigned i = 0; i != NumVars; ++i)
12518     Vars.push_back(Record.readSubExpr());
12519   C->setVarRefs(Vars);
12520 }
12521 
VisitOMPExclusiveClause(OMPExclusiveClause * C)12522 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
12523   C->setLParenLoc(Record.readSourceLocation());
12524   unsigned NumVars = C->varlist_size();
12525   SmallVector<Expr *, 16> Vars;
12526   Vars.reserve(NumVars);
12527   for (unsigned i = 0; i != NumVars; ++i)
12528     Vars.push_back(Record.readSubExpr());
12529   C->setVarRefs(Vars);
12530 }
12531 
VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause * C)12532 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
12533   C->setLParenLoc(Record.readSourceLocation());
12534   unsigned NumOfAllocators = C->getNumberOfAllocators();
12535   SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
12536   Data.reserve(NumOfAllocators);
12537   for (unsigned I = 0; I != NumOfAllocators; ++I) {
12538     OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
12539     D.Allocator = Record.readSubExpr();
12540     D.AllocatorTraits = Record.readSubExpr();
12541     D.LParenLoc = Record.readSourceLocation();
12542     D.RParenLoc = Record.readSourceLocation();
12543   }
12544   C->setAllocatorsData(Data);
12545 }
12546 
VisitOMPAffinityClause(OMPAffinityClause * C)12547 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
12548   C->setLParenLoc(Record.readSourceLocation());
12549   C->setModifier(Record.readSubExpr());
12550   C->setColonLoc(Record.readSourceLocation());
12551   unsigned NumOfLocators = C->varlist_size();
12552   SmallVector<Expr *, 4> Locators;
12553   Locators.reserve(NumOfLocators);
12554   for (unsigned I = 0; I != NumOfLocators; ++I)
12555     Locators.push_back(Record.readSubExpr());
12556   C->setVarRefs(Locators);
12557 }
12558 
VisitOMPOrderClause(OMPOrderClause * C)12559 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
12560   C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
12561   C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
12562   C->setLParenLoc(Record.readSourceLocation());
12563   C->setKindKwLoc(Record.readSourceLocation());
12564   C->setModifierKwLoc(Record.readSourceLocation());
12565 }
12566 
VisitOMPFilterClause(OMPFilterClause * C)12567 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
12568   VisitOMPClauseWithPreInit(C);
12569   C->setThreadID(Record.readSubExpr());
12570   C->setLParenLoc(Record.readSourceLocation());
12571 }
12572 
VisitOMPBindClause(OMPBindClause * C)12573 void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
12574   C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
12575   C->setLParenLoc(Record.readSourceLocation());
12576   C->setBindKindLoc(Record.readSourceLocation());
12577 }
12578 
VisitOMPAlignClause(OMPAlignClause * C)12579 void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
12580   C->setAlignment(Record.readExpr());
12581   C->setLParenLoc(Record.readSourceLocation());
12582 }
12583 
VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause * C)12584 void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
12585   VisitOMPClauseWithPreInit(C);
12586   C->setSize(Record.readSubExpr());
12587   C->setLParenLoc(Record.readSourceLocation());
12588 }
12589 
VisitOMPDoacrossClause(OMPDoacrossClause * C)12590 void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
12591   C->setLParenLoc(Record.readSourceLocation());
12592   C->setDependenceType(
12593       static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
12594   C->setDependenceLoc(Record.readSourceLocation());
12595   C->setColonLoc(Record.readSourceLocation());
12596   unsigned NumVars = C->varlist_size();
12597   SmallVector<Expr *, 16> Vars;
12598   Vars.reserve(NumVars);
12599   for (unsigned I = 0; I != NumVars; ++I)
12600     Vars.push_back(Record.readSubExpr());
12601   C->setVarRefs(Vars);
12602   for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
12603     C->setLoopData(I, Record.readSubExpr());
12604 }
12605 
VisitOMPXAttributeClause(OMPXAttributeClause * C)12606 void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *C) {
12607   AttrVec Attrs;
12608   Record.readAttributes(Attrs);
12609   C->setAttrs(Attrs);
12610   C->setLocStart(Record.readSourceLocation());
12611   C->setLParenLoc(Record.readSourceLocation());
12612   C->setLocEnd(Record.readSourceLocation());
12613 }
12614 
VisitOMPXBareClause(OMPXBareClause * C)12615 void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *C) {}
12616 
readOMPTraitInfo()12617 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() {
12618   OMPTraitInfo &TI = getContext().getNewOMPTraitInfo();
12619   TI.Sets.resize(readUInt32());
12620   for (auto &Set : TI.Sets) {
12621     Set.Kind = readEnum<llvm::omp::TraitSet>();
12622     Set.Selectors.resize(readUInt32());
12623     for (auto &Selector : Set.Selectors) {
12624       Selector.Kind = readEnum<llvm::omp::TraitSelector>();
12625       Selector.ScoreOrCondition = nullptr;
12626       if (readBool())
12627         Selector.ScoreOrCondition = readExprRef();
12628       Selector.Properties.resize(readUInt32());
12629       for (auto &Property : Selector.Properties)
12630         Property.Kind = readEnum<llvm::omp::TraitProperty>();
12631     }
12632   }
12633   return &TI;
12634 }
12635 
readOMPChildren(OMPChildren * Data)12636 void ASTRecordReader::readOMPChildren(OMPChildren *Data) {
12637   if (!Data)
12638     return;
12639   if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12640     // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
12641     skipInts(3);
12642   }
12643   SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
12644   for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
12645     Clauses[I] = readOMPClause();
12646   Data->setClauses(Clauses);
12647   if (Data->hasAssociatedStmt())
12648     Data->setAssociatedStmt(readStmt());
12649   for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
12650     Data->getChildren()[I] = readStmt();
12651 }
12652 
readOpenACCVarList()12653 SmallVector<Expr *> ASTRecordReader::readOpenACCVarList() {
12654   unsigned NumVars = readInt();
12655   llvm::SmallVector<Expr *> VarList;
12656   for (unsigned I = 0; I < NumVars; ++I)
12657     VarList.push_back(readExpr());
12658   return VarList;
12659 }
12660 
readOpenACCIntExprList()12661 SmallVector<Expr *> ASTRecordReader::readOpenACCIntExprList() {
12662   unsigned NumExprs = readInt();
12663   llvm::SmallVector<Expr *> ExprList;
12664   for (unsigned I = 0; I < NumExprs; ++I)
12665     ExprList.push_back(readSubExpr());
12666   return ExprList;
12667 }
12668 
readOpenACCClause()12669 OpenACCClause *ASTRecordReader::readOpenACCClause() {
12670   OpenACCClauseKind ClauseKind = readEnum<OpenACCClauseKind>();
12671   SourceLocation BeginLoc = readSourceLocation();
12672   SourceLocation EndLoc = readSourceLocation();
12673 
12674   switch (ClauseKind) {
12675   case OpenACCClauseKind::Default: {
12676     SourceLocation LParenLoc = readSourceLocation();
12677     OpenACCDefaultClauseKind DCK = readEnum<OpenACCDefaultClauseKind>();
12678     return OpenACCDefaultClause::Create(getContext(), DCK, BeginLoc, LParenLoc,
12679                                         EndLoc);
12680   }
12681   case OpenACCClauseKind::If: {
12682     SourceLocation LParenLoc = readSourceLocation();
12683     Expr *CondExpr = readSubExpr();
12684     return OpenACCIfClause::Create(getContext(), BeginLoc, LParenLoc, CondExpr,
12685                                    EndLoc);
12686   }
12687   case OpenACCClauseKind::Self: {
12688     SourceLocation LParenLoc = readSourceLocation();
12689     bool isConditionExprClause = readBool();
12690     if (isConditionExprClause) {
12691       Expr *CondExpr = readBool() ? readSubExpr() : nullptr;
12692       return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc,
12693                                        CondExpr, EndLoc);
12694     }
12695     unsigned NumVars = readInt();
12696     llvm::SmallVector<Expr *> VarList;
12697     for (unsigned I = 0; I < NumVars; ++I)
12698       VarList.push_back(readSubExpr());
12699     return OpenACCSelfClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
12700                                      EndLoc);
12701   }
12702   case OpenACCClauseKind::NumGangs: {
12703     SourceLocation LParenLoc = readSourceLocation();
12704     unsigned NumClauses = readInt();
12705     llvm::SmallVector<Expr *> IntExprs;
12706     for (unsigned I = 0; I < NumClauses; ++I)
12707       IntExprs.push_back(readSubExpr());
12708     return OpenACCNumGangsClause::Create(getContext(), BeginLoc, LParenLoc,
12709                                          IntExprs, EndLoc);
12710   }
12711   case OpenACCClauseKind::NumWorkers: {
12712     SourceLocation LParenLoc = readSourceLocation();
12713     Expr *IntExpr = readSubExpr();
12714     return OpenACCNumWorkersClause::Create(getContext(), BeginLoc, LParenLoc,
12715                                            IntExpr, EndLoc);
12716   }
12717   case OpenACCClauseKind::DeviceNum: {
12718     SourceLocation LParenLoc = readSourceLocation();
12719     Expr *IntExpr = readSubExpr();
12720     return OpenACCDeviceNumClause::Create(getContext(), BeginLoc, LParenLoc,
12721                                            IntExpr, EndLoc);
12722   }
12723   case OpenACCClauseKind::DefaultAsync: {
12724     SourceLocation LParenLoc = readSourceLocation();
12725     Expr *IntExpr = readSubExpr();
12726     return OpenACCDefaultAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
12727                                              IntExpr, EndLoc);
12728   }
12729   case OpenACCClauseKind::VectorLength: {
12730     SourceLocation LParenLoc = readSourceLocation();
12731     Expr *IntExpr = readSubExpr();
12732     return OpenACCVectorLengthClause::Create(getContext(), BeginLoc, LParenLoc,
12733                                              IntExpr, EndLoc);
12734   }
12735   case OpenACCClauseKind::Private: {
12736     SourceLocation LParenLoc = readSourceLocation();
12737     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12738     return OpenACCPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
12739                                         VarList, EndLoc);
12740   }
12741   case OpenACCClauseKind::Host: {
12742     SourceLocation LParenLoc = readSourceLocation();
12743     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12744     return OpenACCHostClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
12745                                      EndLoc);
12746   }
12747   case OpenACCClauseKind::Device: {
12748     SourceLocation LParenLoc = readSourceLocation();
12749     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12750     return OpenACCDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
12751                                        VarList, EndLoc);
12752   }
12753   case OpenACCClauseKind::FirstPrivate: {
12754     SourceLocation LParenLoc = readSourceLocation();
12755     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12756     return OpenACCFirstPrivateClause::Create(getContext(), BeginLoc, LParenLoc,
12757                                              VarList, EndLoc);
12758   }
12759   case OpenACCClauseKind::Attach: {
12760     SourceLocation LParenLoc = readSourceLocation();
12761     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12762     return OpenACCAttachClause::Create(getContext(), BeginLoc, LParenLoc,
12763                                        VarList, EndLoc);
12764   }
12765   case OpenACCClauseKind::Detach: {
12766     SourceLocation LParenLoc = readSourceLocation();
12767     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12768     return OpenACCDetachClause::Create(getContext(), BeginLoc, LParenLoc,
12769                                        VarList, EndLoc);
12770   }
12771   case OpenACCClauseKind::Delete: {
12772     SourceLocation LParenLoc = readSourceLocation();
12773     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12774     return OpenACCDeleteClause::Create(getContext(), BeginLoc, LParenLoc,
12775                                        VarList, EndLoc);
12776   }
12777   case OpenACCClauseKind::UseDevice: {
12778     SourceLocation LParenLoc = readSourceLocation();
12779     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12780     return OpenACCUseDeviceClause::Create(getContext(), BeginLoc, LParenLoc,
12781                                           VarList, EndLoc);
12782   }
12783   case OpenACCClauseKind::DevicePtr: {
12784     SourceLocation LParenLoc = readSourceLocation();
12785     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12786     return OpenACCDevicePtrClause::Create(getContext(), BeginLoc, LParenLoc,
12787                                           VarList, EndLoc);
12788   }
12789   case OpenACCClauseKind::NoCreate: {
12790     SourceLocation LParenLoc = readSourceLocation();
12791     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12792     return OpenACCNoCreateClause::Create(getContext(), BeginLoc, LParenLoc,
12793                                          VarList, EndLoc);
12794   }
12795   case OpenACCClauseKind::Present: {
12796     SourceLocation LParenLoc = readSourceLocation();
12797     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12798     return OpenACCPresentClause::Create(getContext(), BeginLoc, LParenLoc,
12799                                         VarList, EndLoc);
12800   }
12801   case OpenACCClauseKind::PCopy:
12802   case OpenACCClauseKind::PresentOrCopy:
12803   case OpenACCClauseKind::Copy: {
12804     SourceLocation LParenLoc = readSourceLocation();
12805     OpenACCModifierKind ModList = readEnum<OpenACCModifierKind>();
12806     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12807     return OpenACCCopyClause::Create(getContext(), ClauseKind, BeginLoc,
12808                                      LParenLoc, ModList, VarList, EndLoc);
12809   }
12810   case OpenACCClauseKind::CopyIn:
12811   case OpenACCClauseKind::PCopyIn:
12812   case OpenACCClauseKind::PresentOrCopyIn: {
12813     SourceLocation LParenLoc = readSourceLocation();
12814     OpenACCModifierKind ModList = readEnum<OpenACCModifierKind>();
12815     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12816     return OpenACCCopyInClause::Create(getContext(), ClauseKind, BeginLoc,
12817                                        LParenLoc, ModList, VarList, EndLoc);
12818   }
12819   case OpenACCClauseKind::CopyOut:
12820   case OpenACCClauseKind::PCopyOut:
12821   case OpenACCClauseKind::PresentOrCopyOut: {
12822     SourceLocation LParenLoc = readSourceLocation();
12823     OpenACCModifierKind ModList = readEnum<OpenACCModifierKind>();
12824     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12825     return OpenACCCopyOutClause::Create(getContext(), ClauseKind, BeginLoc,
12826                                         LParenLoc, ModList, VarList, EndLoc);
12827   }
12828   case OpenACCClauseKind::Create:
12829   case OpenACCClauseKind::PCreate:
12830   case OpenACCClauseKind::PresentOrCreate: {
12831     SourceLocation LParenLoc = readSourceLocation();
12832     OpenACCModifierKind ModList = readEnum<OpenACCModifierKind>();
12833     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12834     return OpenACCCreateClause::Create(getContext(), ClauseKind, BeginLoc,
12835                                        LParenLoc, ModList, VarList, EndLoc);
12836   }
12837   case OpenACCClauseKind::Async: {
12838     SourceLocation LParenLoc = readSourceLocation();
12839     Expr *AsyncExpr = readBool() ? readSubExpr() : nullptr;
12840     return OpenACCAsyncClause::Create(getContext(), BeginLoc, LParenLoc,
12841                                       AsyncExpr, EndLoc);
12842   }
12843   case OpenACCClauseKind::Wait: {
12844     SourceLocation LParenLoc = readSourceLocation();
12845     Expr *DevNumExpr = readBool() ? readSubExpr() : nullptr;
12846     SourceLocation QueuesLoc = readSourceLocation();
12847     llvm::SmallVector<Expr *> QueueIdExprs = readOpenACCIntExprList();
12848     return OpenACCWaitClause::Create(getContext(), BeginLoc, LParenLoc,
12849                                      DevNumExpr, QueuesLoc, QueueIdExprs,
12850                                      EndLoc);
12851   }
12852   case OpenACCClauseKind::DeviceType:
12853   case OpenACCClauseKind::DType: {
12854     SourceLocation LParenLoc = readSourceLocation();
12855     llvm::SmallVector<DeviceTypeArgument> Archs;
12856     unsigned NumArchs = readInt();
12857 
12858     for (unsigned I = 0; I < NumArchs; ++I) {
12859       IdentifierInfo *Ident = readBool() ? readIdentifier() : nullptr;
12860       SourceLocation Loc = readSourceLocation();
12861       Archs.emplace_back(Loc, Ident);
12862     }
12863 
12864     return OpenACCDeviceTypeClause::Create(getContext(), ClauseKind, BeginLoc,
12865                                            LParenLoc, Archs, EndLoc);
12866   }
12867   case OpenACCClauseKind::Reduction: {
12868     SourceLocation LParenLoc = readSourceLocation();
12869     OpenACCReductionOperator Op = readEnum<OpenACCReductionOperator>();
12870     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12871     return OpenACCReductionClause::Create(getContext(), BeginLoc, LParenLoc, Op,
12872                                           VarList, EndLoc);
12873   }
12874   case OpenACCClauseKind::Seq:
12875     return OpenACCSeqClause::Create(getContext(), BeginLoc, EndLoc);
12876   case OpenACCClauseKind::NoHost:
12877     return OpenACCNoHostClause::Create(getContext(), BeginLoc, EndLoc);
12878   case OpenACCClauseKind::Finalize:
12879     return OpenACCFinalizeClause::Create(getContext(), BeginLoc, EndLoc);
12880   case OpenACCClauseKind::IfPresent:
12881     return OpenACCIfPresentClause::Create(getContext(), BeginLoc, EndLoc);
12882   case OpenACCClauseKind::Independent:
12883     return OpenACCIndependentClause::Create(getContext(), BeginLoc, EndLoc);
12884   case OpenACCClauseKind::Auto:
12885     return OpenACCAutoClause::Create(getContext(), BeginLoc, EndLoc);
12886   case OpenACCClauseKind::Collapse: {
12887     SourceLocation LParenLoc = readSourceLocation();
12888     bool HasForce = readBool();
12889     Expr *LoopCount = readSubExpr();
12890     return OpenACCCollapseClause::Create(getContext(), BeginLoc, LParenLoc,
12891                                          HasForce, LoopCount, EndLoc);
12892   }
12893   case OpenACCClauseKind::Tile: {
12894     SourceLocation LParenLoc = readSourceLocation();
12895     unsigned NumClauses = readInt();
12896     llvm::SmallVector<Expr *> SizeExprs;
12897     for (unsigned I = 0; I < NumClauses; ++I)
12898       SizeExprs.push_back(readSubExpr());
12899     return OpenACCTileClause::Create(getContext(), BeginLoc, LParenLoc,
12900                                      SizeExprs, EndLoc);
12901   }
12902   case OpenACCClauseKind::Gang: {
12903     SourceLocation LParenLoc = readSourceLocation();
12904     unsigned NumExprs = readInt();
12905     llvm::SmallVector<OpenACCGangKind> GangKinds;
12906     llvm::SmallVector<Expr *> Exprs;
12907     for (unsigned I = 0; I < NumExprs; ++I) {
12908       GangKinds.push_back(readEnum<OpenACCGangKind>());
12909       // Can't use `readSubExpr` because this is usable from a 'decl' construct.
12910       Exprs.push_back(readExpr());
12911     }
12912     return OpenACCGangClause::Create(getContext(), BeginLoc, LParenLoc,
12913                                      GangKinds, Exprs, EndLoc);
12914   }
12915   case OpenACCClauseKind::Worker: {
12916     SourceLocation LParenLoc = readSourceLocation();
12917     Expr *WorkerExpr = readBool() ? readSubExpr() : nullptr;
12918     return OpenACCWorkerClause::Create(getContext(), BeginLoc, LParenLoc,
12919                                        WorkerExpr, EndLoc);
12920   }
12921   case OpenACCClauseKind::Vector: {
12922     SourceLocation LParenLoc = readSourceLocation();
12923     Expr *VectorExpr = readBool() ? readSubExpr() : nullptr;
12924     return OpenACCVectorClause::Create(getContext(), BeginLoc, LParenLoc,
12925                                        VectorExpr, EndLoc);
12926   }
12927   case OpenACCClauseKind::Link: {
12928     SourceLocation LParenLoc = readSourceLocation();
12929     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12930     return OpenACCLinkClause::Create(getContext(), BeginLoc, LParenLoc, VarList,
12931                                      EndLoc);
12932   }
12933   case OpenACCClauseKind::DeviceResident: {
12934     SourceLocation LParenLoc = readSourceLocation();
12935     llvm::SmallVector<Expr *> VarList = readOpenACCVarList();
12936     return OpenACCDeviceResidentClause::Create(getContext(), BeginLoc,
12937                                                LParenLoc, VarList, EndLoc);
12938   }
12939 
12940   case OpenACCClauseKind::Bind: {
12941     SourceLocation LParenLoc = readSourceLocation();
12942     bool IsString = readBool();
12943     if (IsString)
12944       return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
12945                                        cast<StringLiteral>(readExpr()), EndLoc);
12946     return OpenACCBindClause::Create(getContext(), BeginLoc, LParenLoc,
12947                                      readIdentifier(), EndLoc);
12948   }
12949   case OpenACCClauseKind::Shortloop:
12950   case OpenACCClauseKind::Invalid:
12951     llvm_unreachable("Clause serialization not yet implemented");
12952   }
12953   llvm_unreachable("Invalid Clause Kind");
12954 }
12955 
readOpenACCClauseList(MutableArrayRef<const OpenACCClause * > Clauses)12956 void ASTRecordReader::readOpenACCClauseList(
12957     MutableArrayRef<const OpenACCClause *> Clauses) {
12958   for (unsigned I = 0; I < Clauses.size(); ++I)
12959     Clauses[I] = readOpenACCClause();
12960 }
12961 
readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr * A)12962 void ASTRecordReader::readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A) {
12963   unsigned NumVars = readInt();
12964   A->Clauses.resize(NumVars);
12965   readOpenACCClauseList(A->Clauses);
12966 }
12967 
getStableHashForModuleName(StringRef PrimaryModuleName)12968 static unsigned getStableHashForModuleName(StringRef PrimaryModuleName) {
12969   // TODO: Maybe it is better to check PrimaryModuleName is a valid
12970   // module name?
12971   llvm::FoldingSetNodeID ID;
12972   ID.AddString(PrimaryModuleName);
12973   return ID.computeStableHash();
12974 }
12975 
getPrimaryModuleHash(const Module * M)12976 UnsignedOrNone clang::getPrimaryModuleHash(const Module *M) {
12977   if (!M)
12978     return std::nullopt;
12979 
12980   if (M->isHeaderLikeModule())
12981     return std::nullopt;
12982 
12983   if (M->isGlobalModule())
12984     return std::nullopt;
12985 
12986   StringRef PrimaryModuleName = M->getPrimaryModuleInterfaceName();
12987   return getStableHashForModuleName(PrimaryModuleName);
12988 }
12989