xref: /freebsd/contrib/llvm-project/clang/lib/Serialization/ASTReader.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric //===- ASTReader.cpp - AST File Reader ------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric //  This file defines the ASTReader class, which reads AST files.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "ASTCommon.h"
140b57cec5SDimitry Andric #include "ASTReaderInternals.h"
150b57cec5SDimitry Andric #include "clang/AST/ASTConsumer.h"
160b57cec5SDimitry Andric #include "clang/AST/ASTContext.h"
170b57cec5SDimitry Andric #include "clang/AST/ASTMutationListener.h"
1881ad6265SDimitry Andric #include "clang/AST/ASTStructuralEquivalence.h"
190b57cec5SDimitry Andric #include "clang/AST/ASTUnresolvedSet.h"
20349cc55cSDimitry Andric #include "clang/AST/AbstractTypeReader.h"
210b57cec5SDimitry Andric #include "clang/AST/Decl.h"
220b57cec5SDimitry Andric #include "clang/AST/DeclBase.h"
230b57cec5SDimitry Andric #include "clang/AST/DeclCXX.h"
240b57cec5SDimitry Andric #include "clang/AST/DeclFriend.h"
250b57cec5SDimitry Andric #include "clang/AST/DeclGroup.h"
260b57cec5SDimitry Andric #include "clang/AST/DeclObjC.h"
270b57cec5SDimitry Andric #include "clang/AST/DeclTemplate.h"
280b57cec5SDimitry Andric #include "clang/AST/DeclarationName.h"
290b57cec5SDimitry Andric #include "clang/AST/Expr.h"
300b57cec5SDimitry Andric #include "clang/AST/ExprCXX.h"
310b57cec5SDimitry Andric #include "clang/AST/ExternalASTSource.h"
320b57cec5SDimitry Andric #include "clang/AST/NestedNameSpecifier.h"
33bdd1243dSDimitry Andric #include "clang/AST/ODRDiagsEmitter.h"
340b57cec5SDimitry Andric #include "clang/AST/ODRHash.h"
35349cc55cSDimitry Andric #include "clang/AST/OpenMPClause.h"
360b57cec5SDimitry Andric #include "clang/AST/RawCommentList.h"
370b57cec5SDimitry Andric #include "clang/AST/TemplateBase.h"
380b57cec5SDimitry Andric #include "clang/AST/TemplateName.h"
390b57cec5SDimitry Andric #include "clang/AST/Type.h"
400b57cec5SDimitry Andric #include "clang/AST/TypeLoc.h"
410b57cec5SDimitry Andric #include "clang/AST/TypeLocVisitor.h"
420b57cec5SDimitry Andric #include "clang/AST/UnresolvedSet.h"
430b57cec5SDimitry Andric #include "clang/Basic/CommentOptions.h"
440b57cec5SDimitry Andric #include "clang/Basic/Diagnostic.h"
45349cc55cSDimitry Andric #include "clang/Basic/DiagnosticError.h"
460b57cec5SDimitry Andric #include "clang/Basic/DiagnosticOptions.h"
4781ad6265SDimitry Andric #include "clang/Basic/DiagnosticSema.h"
480b57cec5SDimitry Andric #include "clang/Basic/ExceptionSpecificationType.h"
490b57cec5SDimitry Andric #include "clang/Basic/FileManager.h"
500b57cec5SDimitry Andric #include "clang/Basic/FileSystemOptions.h"
510b57cec5SDimitry Andric #include "clang/Basic/IdentifierTable.h"
520b57cec5SDimitry Andric #include "clang/Basic/LLVM.h"
530b57cec5SDimitry Andric #include "clang/Basic/LangOptions.h"
540b57cec5SDimitry Andric #include "clang/Basic/Module.h"
550b57cec5SDimitry Andric #include "clang/Basic/ObjCRuntime.h"
56349cc55cSDimitry Andric #include "clang/Basic/OpenMPKinds.h"
570b57cec5SDimitry Andric #include "clang/Basic/OperatorKinds.h"
580b57cec5SDimitry Andric #include "clang/Basic/PragmaKinds.h"
590b57cec5SDimitry Andric #include "clang/Basic/Sanitizers.h"
600b57cec5SDimitry Andric #include "clang/Basic/SourceLocation.h"
610b57cec5SDimitry Andric #include "clang/Basic/SourceManager.h"
620b57cec5SDimitry Andric #include "clang/Basic/SourceManagerInternals.h"
630b57cec5SDimitry Andric #include "clang/Basic/Specifiers.h"
640b57cec5SDimitry Andric #include "clang/Basic/TargetInfo.h"
650b57cec5SDimitry Andric #include "clang/Basic/TargetOptions.h"
660b57cec5SDimitry Andric #include "clang/Basic/TokenKinds.h"
670b57cec5SDimitry Andric #include "clang/Basic/Version.h"
680b57cec5SDimitry Andric #include "clang/Lex/HeaderSearch.h"
690b57cec5SDimitry Andric #include "clang/Lex/HeaderSearchOptions.h"
700b57cec5SDimitry Andric #include "clang/Lex/MacroInfo.h"
710b57cec5SDimitry Andric #include "clang/Lex/ModuleMap.h"
720b57cec5SDimitry Andric #include "clang/Lex/PreprocessingRecord.h"
730b57cec5SDimitry Andric #include "clang/Lex/Preprocessor.h"
740b57cec5SDimitry Andric #include "clang/Lex/PreprocessorOptions.h"
750b57cec5SDimitry Andric #include "clang/Lex/Token.h"
760b57cec5SDimitry Andric #include "clang/Sema/ObjCMethodList.h"
770b57cec5SDimitry Andric #include "clang/Sema/Scope.h"
780b57cec5SDimitry Andric #include "clang/Sema/Sema.h"
790b57cec5SDimitry Andric #include "clang/Sema/Weak.h"
800b57cec5SDimitry Andric #include "clang/Serialization/ASTBitCodes.h"
810b57cec5SDimitry Andric #include "clang/Serialization/ASTDeserializationListener.h"
82349cc55cSDimitry Andric #include "clang/Serialization/ASTRecordReader.h"
830b57cec5SDimitry Andric #include "clang/Serialization/ContinuousRangeMap.h"
840b57cec5SDimitry Andric #include "clang/Serialization/GlobalModuleIndex.h"
850b57cec5SDimitry Andric #include "clang/Serialization/InMemoryModuleCache.h"
86480093f4SDimitry Andric #include "clang/Serialization/ModuleFile.h"
870b57cec5SDimitry Andric #include "clang/Serialization/ModuleFileExtension.h"
880b57cec5SDimitry Andric #include "clang/Serialization/ModuleManager.h"
890b57cec5SDimitry Andric #include "clang/Serialization/PCHContainerOperations.h"
900b57cec5SDimitry Andric #include "clang/Serialization/SerializationDiagnostic.h"
910b57cec5SDimitry Andric #include "llvm/ADT/APFloat.h"
920b57cec5SDimitry Andric #include "llvm/ADT/APInt.h"
930b57cec5SDimitry Andric #include "llvm/ADT/APSInt.h"
940b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h"
950b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
965ffd83dbSDimitry Andric #include "llvm/ADT/FloatingPointMode.h"
970b57cec5SDimitry Andric #include "llvm/ADT/FoldingSet.h"
980b57cec5SDimitry Andric #include "llvm/ADT/Hashing.h"
990b57cec5SDimitry Andric #include "llvm/ADT/IntrusiveRefCntPtr.h"
1000b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
1010b57cec5SDimitry Andric #include "llvm/ADT/ScopeExit.h"
1020b57cec5SDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
1030b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
1040b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
1050b57cec5SDimitry Andric #include "llvm/ADT/StringExtras.h"
1060b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h"
1070b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
1080b57cec5SDimitry Andric #include "llvm/ADT/iterator_range.h"
1090b57cec5SDimitry Andric #include "llvm/Bitstream/BitstreamReader.h"
1100b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
1110b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
1120b57cec5SDimitry Andric #include "llvm/Support/Compression.h"
1130b57cec5SDimitry Andric #include "llvm/Support/DJB.h"
1140b57cec5SDimitry Andric #include "llvm/Support/Endian.h"
1150b57cec5SDimitry Andric #include "llvm/Support/Error.h"
1160b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
1170b57cec5SDimitry Andric #include "llvm/Support/FileSystem.h"
118fe6060f1SDimitry Andric #include "llvm/Support/LEB128.h"
1190b57cec5SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
1200b57cec5SDimitry Andric #include "llvm/Support/Path.h"
1210b57cec5SDimitry Andric #include "llvm/Support/SaveAndRestore.h"
122bdd1243dSDimitry Andric #include "llvm/Support/TimeProfiler.h"
1230b57cec5SDimitry Andric #include "llvm/Support/Timer.h"
1240b57cec5SDimitry Andric #include "llvm/Support/VersionTuple.h"
1250b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
126*06c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
1270b57cec5SDimitry Andric #include <algorithm>
1280b57cec5SDimitry Andric #include <cassert>
1290b57cec5SDimitry Andric #include <cstddef>
1300b57cec5SDimitry Andric #include <cstdint>
1310b57cec5SDimitry Andric #include <cstdio>
1320b57cec5SDimitry Andric #include <ctime>
1330b57cec5SDimitry Andric #include <iterator>
1340b57cec5SDimitry Andric #include <limits>
1350b57cec5SDimitry Andric #include <map>
1360b57cec5SDimitry Andric #include <memory>
137bdd1243dSDimitry Andric #include <optional>
1380b57cec5SDimitry Andric #include <string>
1390b57cec5SDimitry Andric #include <system_error>
1400b57cec5SDimitry Andric #include <tuple>
1410b57cec5SDimitry Andric #include <utility>
1420b57cec5SDimitry Andric #include <vector>
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric using namespace clang;
1450b57cec5SDimitry Andric using namespace clang::serialization;
1460b57cec5SDimitry Andric using namespace clang::serialization::reader;
1470b57cec5SDimitry Andric using llvm::BitstreamCursor;
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
1500b57cec5SDimitry Andric // ChainedASTReaderListener implementation
1510b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
1520b57cec5SDimitry Andric 
1530b57cec5SDimitry Andric bool
1540b57cec5SDimitry Andric ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
1550b57cec5SDimitry Andric   return First->ReadFullVersionInformation(FullVersion) ||
1560b57cec5SDimitry Andric          Second->ReadFullVersionInformation(FullVersion);
1570b57cec5SDimitry Andric }
1580b57cec5SDimitry Andric 
1590b57cec5SDimitry Andric void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
1600b57cec5SDimitry Andric   First->ReadModuleName(ModuleName);
1610b57cec5SDimitry Andric   Second->ReadModuleName(ModuleName);
1620b57cec5SDimitry Andric }
1630b57cec5SDimitry Andric 
1640b57cec5SDimitry Andric void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
1650b57cec5SDimitry Andric   First->ReadModuleMapFile(ModuleMapPath);
1660b57cec5SDimitry Andric   Second->ReadModuleMapFile(ModuleMapPath);
1670b57cec5SDimitry Andric }
1680b57cec5SDimitry Andric 
1690b57cec5SDimitry Andric bool
1700b57cec5SDimitry Andric ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
1710b57cec5SDimitry Andric                                               bool Complain,
1720b57cec5SDimitry Andric                                               bool AllowCompatibleDifferences) {
1730b57cec5SDimitry Andric   return First->ReadLanguageOptions(LangOpts, Complain,
1740b57cec5SDimitry Andric                                     AllowCompatibleDifferences) ||
1750b57cec5SDimitry Andric          Second->ReadLanguageOptions(LangOpts, Complain,
1760b57cec5SDimitry Andric                                      AllowCompatibleDifferences);
1770b57cec5SDimitry Andric }
1780b57cec5SDimitry Andric 
1790b57cec5SDimitry Andric bool ChainedASTReaderListener::ReadTargetOptions(
1800b57cec5SDimitry Andric     const TargetOptions &TargetOpts, bool Complain,
1810b57cec5SDimitry Andric     bool AllowCompatibleDifferences) {
1820b57cec5SDimitry Andric   return First->ReadTargetOptions(TargetOpts, Complain,
1830b57cec5SDimitry Andric                                   AllowCompatibleDifferences) ||
1840b57cec5SDimitry Andric          Second->ReadTargetOptions(TargetOpts, Complain,
1850b57cec5SDimitry Andric                                    AllowCompatibleDifferences);
1860b57cec5SDimitry Andric }
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric bool ChainedASTReaderListener::ReadDiagnosticOptions(
1890b57cec5SDimitry Andric     IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
1900b57cec5SDimitry Andric   return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
1910b57cec5SDimitry Andric          Second->ReadDiagnosticOptions(DiagOpts, Complain);
1920b57cec5SDimitry Andric }
1930b57cec5SDimitry Andric 
1940b57cec5SDimitry Andric bool
1950b57cec5SDimitry Andric ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
1960b57cec5SDimitry Andric                                                 bool Complain) {
1970b57cec5SDimitry Andric   return First->ReadFileSystemOptions(FSOpts, Complain) ||
1980b57cec5SDimitry Andric          Second->ReadFileSystemOptions(FSOpts, Complain);
1990b57cec5SDimitry Andric }
2000b57cec5SDimitry Andric 
2010b57cec5SDimitry Andric bool ChainedASTReaderListener::ReadHeaderSearchOptions(
2020b57cec5SDimitry Andric     const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
2030b57cec5SDimitry Andric     bool Complain) {
2040b57cec5SDimitry Andric   return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
2050b57cec5SDimitry Andric                                         Complain) ||
2060b57cec5SDimitry Andric          Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
2070b57cec5SDimitry Andric                                          Complain);
2080b57cec5SDimitry Andric }
2090b57cec5SDimitry Andric 
2100b57cec5SDimitry Andric bool ChainedASTReaderListener::ReadPreprocessorOptions(
2110b57cec5SDimitry Andric     const PreprocessorOptions &PPOpts, bool Complain,
2120b57cec5SDimitry Andric     std::string &SuggestedPredefines) {
2130b57cec5SDimitry Andric   return First->ReadPreprocessorOptions(PPOpts, Complain,
2140b57cec5SDimitry Andric                                         SuggestedPredefines) ||
2150b57cec5SDimitry Andric          Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
2160b57cec5SDimitry Andric }
2170b57cec5SDimitry Andric 
2180b57cec5SDimitry Andric void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
2190b57cec5SDimitry Andric                                            unsigned Value) {
2200b57cec5SDimitry Andric   First->ReadCounter(M, Value);
2210b57cec5SDimitry Andric   Second->ReadCounter(M, Value);
2220b57cec5SDimitry Andric }
2230b57cec5SDimitry Andric 
2240b57cec5SDimitry Andric bool ChainedASTReaderListener::needsInputFileVisitation() {
2250b57cec5SDimitry Andric   return First->needsInputFileVisitation() ||
2260b57cec5SDimitry Andric          Second->needsInputFileVisitation();
2270b57cec5SDimitry Andric }
2280b57cec5SDimitry Andric 
2290b57cec5SDimitry Andric bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
2300b57cec5SDimitry Andric   return First->needsSystemInputFileVisitation() ||
2310b57cec5SDimitry Andric   Second->needsSystemInputFileVisitation();
2320b57cec5SDimitry Andric }
2330b57cec5SDimitry Andric 
2340b57cec5SDimitry Andric void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
2350b57cec5SDimitry Andric                                                ModuleKind Kind) {
2360b57cec5SDimitry Andric   First->visitModuleFile(Filename, Kind);
2370b57cec5SDimitry Andric   Second->visitModuleFile(Filename, Kind);
2380b57cec5SDimitry Andric }
2390b57cec5SDimitry Andric 
2400b57cec5SDimitry Andric bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
2410b57cec5SDimitry Andric                                               bool isSystem,
2420b57cec5SDimitry Andric                                               bool isOverridden,
2430b57cec5SDimitry Andric                                               bool isExplicitModule) {
2440b57cec5SDimitry Andric   bool Continue = false;
2450b57cec5SDimitry Andric   if (First->needsInputFileVisitation() &&
2460b57cec5SDimitry Andric       (!isSystem || First->needsSystemInputFileVisitation()))
2470b57cec5SDimitry Andric     Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
2480b57cec5SDimitry Andric                                       isExplicitModule);
2490b57cec5SDimitry Andric   if (Second->needsInputFileVisitation() &&
2500b57cec5SDimitry Andric       (!isSystem || Second->needsSystemInputFileVisitation()))
2510b57cec5SDimitry Andric     Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
2520b57cec5SDimitry Andric                                        isExplicitModule);
2530b57cec5SDimitry Andric   return Continue;
2540b57cec5SDimitry Andric }
2550b57cec5SDimitry Andric 
2560b57cec5SDimitry Andric void ChainedASTReaderListener::readModuleFileExtension(
2570b57cec5SDimitry Andric        const ModuleFileExtensionMetadata &Metadata) {
2580b57cec5SDimitry Andric   First->readModuleFileExtension(Metadata);
2590b57cec5SDimitry Andric   Second->readModuleFileExtension(Metadata);
2600b57cec5SDimitry Andric }
2610b57cec5SDimitry Andric 
2620b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
2630b57cec5SDimitry Andric // PCH validator implementation
2640b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
2650b57cec5SDimitry Andric 
2660b57cec5SDimitry Andric ASTReaderListener::~ASTReaderListener() = default;
2670b57cec5SDimitry Andric 
2680b57cec5SDimitry Andric /// Compare the given set of language options against an existing set of
2690b57cec5SDimitry Andric /// language options.
2700b57cec5SDimitry Andric ///
2710b57cec5SDimitry Andric /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
2720b57cec5SDimitry Andric /// \param AllowCompatibleDifferences If true, differences between compatible
2730b57cec5SDimitry Andric ///        language options will be permitted.
2740b57cec5SDimitry Andric ///
2750b57cec5SDimitry Andric /// \returns true if the languagae options mis-match, false otherwise.
2760b57cec5SDimitry Andric static bool checkLanguageOptions(const LangOptions &LangOpts,
2770b57cec5SDimitry Andric                                  const LangOptions &ExistingLangOpts,
2780b57cec5SDimitry Andric                                  DiagnosticsEngine *Diags,
2790b57cec5SDimitry Andric                                  bool AllowCompatibleDifferences = true) {
2800b57cec5SDimitry Andric #define LANGOPT(Name, Bits, Default, Description)                   \
2810b57cec5SDimitry Andric   if (ExistingLangOpts.Name != LangOpts.Name) {                     \
282*06c3fb27SDimitry Andric     if (Diags) {                                                    \
283*06c3fb27SDimitry Andric       if (Bits == 1)                                                \
2840b57cec5SDimitry Andric         Diags->Report(diag::err_pch_langopt_mismatch)               \
2850b57cec5SDimitry Andric           << Description << LangOpts.Name << ExistingLangOpts.Name; \
286*06c3fb27SDimitry Andric       else                                                          \
287*06c3fb27SDimitry Andric         Diags->Report(diag::err_pch_langopt_value_mismatch)         \
288*06c3fb27SDimitry Andric           << Description;                                           \
289*06c3fb27SDimitry Andric     }                                                               \
2900b57cec5SDimitry Andric     return true;                                                    \
2910b57cec5SDimitry Andric   }
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric #define VALUE_LANGOPT(Name, Bits, Default, Description)   \
2940b57cec5SDimitry Andric   if (ExistingLangOpts.Name != LangOpts.Name) {           \
2950b57cec5SDimitry Andric     if (Diags)                                            \
2960b57cec5SDimitry Andric       Diags->Report(diag::err_pch_langopt_value_mismatch) \
2970b57cec5SDimitry Andric         << Description;                                   \
2980b57cec5SDimitry Andric     return true;                                          \
2990b57cec5SDimitry Andric   }
3000b57cec5SDimitry Andric 
3010b57cec5SDimitry Andric #define ENUM_LANGOPT(Name, Type, Bits, Default, Description)   \
3020b57cec5SDimitry Andric   if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) {  \
3030b57cec5SDimitry Andric     if (Diags)                                                 \
3040b57cec5SDimitry Andric       Diags->Report(diag::err_pch_langopt_value_mismatch)      \
3050b57cec5SDimitry Andric         << Description;                                        \
3060b57cec5SDimitry Andric     return true;                                               \
3070b57cec5SDimitry Andric   }
3080b57cec5SDimitry Andric 
3090b57cec5SDimitry Andric #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description)  \
3100b57cec5SDimitry Andric   if (!AllowCompatibleDifferences)                            \
3110b57cec5SDimitry Andric     LANGOPT(Name, Bits, Default, Description)
3120b57cec5SDimitry Andric 
3130b57cec5SDimitry Andric #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description)  \
3140b57cec5SDimitry Andric   if (!AllowCompatibleDifferences)                                 \
3150b57cec5SDimitry Andric     ENUM_LANGOPT(Name, Bits, Default, Description)
3160b57cec5SDimitry Andric 
3170b57cec5SDimitry Andric #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
3180b57cec5SDimitry Andric   if (!AllowCompatibleDifferences)                                 \
3190b57cec5SDimitry Andric     VALUE_LANGOPT(Name, Bits, Default, Description)
3200b57cec5SDimitry Andric 
3210b57cec5SDimitry Andric #define BENIGN_LANGOPT(Name, Bits, Default, Description)
3220b57cec5SDimitry Andric #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
32381ad6265SDimitry Andric #define BENIGN_VALUE_LANGOPT(Name, Bits, Default, Description)
3240b57cec5SDimitry Andric #include "clang/Basic/LangOptions.def"
3250b57cec5SDimitry Andric 
3260b57cec5SDimitry Andric   if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
3270b57cec5SDimitry Andric     if (Diags)
3280b57cec5SDimitry Andric       Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
3290b57cec5SDimitry Andric     return true;
3300b57cec5SDimitry Andric   }
3310b57cec5SDimitry Andric 
3320b57cec5SDimitry Andric   if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
3330b57cec5SDimitry Andric     if (Diags)
3340b57cec5SDimitry Andric       Diags->Report(diag::err_pch_langopt_value_mismatch)
3350b57cec5SDimitry Andric       << "target Objective-C runtime";
3360b57cec5SDimitry Andric     return true;
3370b57cec5SDimitry Andric   }
3380b57cec5SDimitry Andric 
3390b57cec5SDimitry Andric   if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
3400b57cec5SDimitry Andric       LangOpts.CommentOpts.BlockCommandNames) {
3410b57cec5SDimitry Andric     if (Diags)
3420b57cec5SDimitry Andric       Diags->Report(diag::err_pch_langopt_value_mismatch)
3430b57cec5SDimitry Andric         << "block command names";
3440b57cec5SDimitry Andric     return true;
3450b57cec5SDimitry Andric   }
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric   // Sanitizer feature mismatches are treated as compatible differences. If
3480b57cec5SDimitry Andric   // compatible differences aren't allowed, we still only want to check for
3490b57cec5SDimitry Andric   // mismatches of non-modular sanitizers (the only ones which can affect AST
3500b57cec5SDimitry Andric   // generation).
3510b57cec5SDimitry Andric   if (!AllowCompatibleDifferences) {
3520b57cec5SDimitry Andric     SanitizerMask ModularSanitizers = getPPTransparentSanitizers();
3530b57cec5SDimitry Andric     SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize;
3540b57cec5SDimitry Andric     SanitizerSet ImportedSanitizers = LangOpts.Sanitize;
3550b57cec5SDimitry Andric     ExistingSanitizers.clear(ModularSanitizers);
3560b57cec5SDimitry Andric     ImportedSanitizers.clear(ModularSanitizers);
3570b57cec5SDimitry Andric     if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) {
3580b57cec5SDimitry Andric       const std::string Flag = "-fsanitize=";
3590b57cec5SDimitry Andric       if (Diags) {
3600b57cec5SDimitry Andric #define SANITIZER(NAME, ID)                                                    \
3610b57cec5SDimitry Andric   {                                                                            \
3620b57cec5SDimitry Andric     bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID);         \
3630b57cec5SDimitry Andric     bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID);         \
3640b57cec5SDimitry Andric     if (InExistingModule != InImportedModule)                                  \
3650b57cec5SDimitry Andric       Diags->Report(diag::err_pch_targetopt_feature_mismatch)                  \
3660b57cec5SDimitry Andric           << InExistingModule << (Flag + NAME);                                \
3670b57cec5SDimitry Andric   }
3680b57cec5SDimitry Andric #include "clang/Basic/Sanitizers.def"
3690b57cec5SDimitry Andric       }
3700b57cec5SDimitry Andric       return true;
3710b57cec5SDimitry Andric     }
3720b57cec5SDimitry Andric   }
3730b57cec5SDimitry Andric 
3740b57cec5SDimitry Andric   return false;
3750b57cec5SDimitry Andric }
3760b57cec5SDimitry Andric 
3770b57cec5SDimitry Andric /// Compare the given set of target options against an existing set of
3780b57cec5SDimitry Andric /// target options.
3790b57cec5SDimitry Andric ///
3800b57cec5SDimitry Andric /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
3810b57cec5SDimitry Andric ///
3820b57cec5SDimitry Andric /// \returns true if the target options mis-match, false otherwise.
3830b57cec5SDimitry Andric static bool checkTargetOptions(const TargetOptions &TargetOpts,
3840b57cec5SDimitry Andric                                const TargetOptions &ExistingTargetOpts,
3850b57cec5SDimitry Andric                                DiagnosticsEngine *Diags,
3860b57cec5SDimitry Andric                                bool AllowCompatibleDifferences = true) {
3870b57cec5SDimitry Andric #define CHECK_TARGET_OPT(Field, Name)                             \
3880b57cec5SDimitry Andric   if (TargetOpts.Field != ExistingTargetOpts.Field) {             \
3890b57cec5SDimitry Andric     if (Diags)                                                    \
3900b57cec5SDimitry Andric       Diags->Report(diag::err_pch_targetopt_mismatch)             \
3910b57cec5SDimitry Andric         << Name << TargetOpts.Field << ExistingTargetOpts.Field;  \
3920b57cec5SDimitry Andric     return true;                                                  \
3930b57cec5SDimitry Andric   }
3940b57cec5SDimitry Andric 
3950b57cec5SDimitry Andric   // The triple and ABI must match exactly.
3960b57cec5SDimitry Andric   CHECK_TARGET_OPT(Triple, "target");
3970b57cec5SDimitry Andric   CHECK_TARGET_OPT(ABI, "target ABI");
3980b57cec5SDimitry Andric 
3990b57cec5SDimitry Andric   // We can tolerate different CPUs in many cases, notably when one CPU
4000b57cec5SDimitry Andric   // supports a strict superset of another. When allowing compatible
4010b57cec5SDimitry Andric   // differences skip this check.
402e8d8bef9SDimitry Andric   if (!AllowCompatibleDifferences) {
4030b57cec5SDimitry Andric     CHECK_TARGET_OPT(CPU, "target CPU");
404e8d8bef9SDimitry Andric     CHECK_TARGET_OPT(TuneCPU, "tune CPU");
405e8d8bef9SDimitry Andric   }
4060b57cec5SDimitry Andric 
4070b57cec5SDimitry Andric #undef CHECK_TARGET_OPT
4080b57cec5SDimitry Andric 
4090b57cec5SDimitry Andric   // Compare feature sets.
4100b57cec5SDimitry Andric   SmallVector<StringRef, 4> ExistingFeatures(
4110b57cec5SDimitry Andric                                              ExistingTargetOpts.FeaturesAsWritten.begin(),
4120b57cec5SDimitry Andric                                              ExistingTargetOpts.FeaturesAsWritten.end());
4130b57cec5SDimitry Andric   SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
4140b57cec5SDimitry Andric                                          TargetOpts.FeaturesAsWritten.end());
4150b57cec5SDimitry Andric   llvm::sort(ExistingFeatures);
4160b57cec5SDimitry Andric   llvm::sort(ReadFeatures);
4170b57cec5SDimitry Andric 
4180b57cec5SDimitry Andric   // We compute the set difference in both directions explicitly so that we can
4190b57cec5SDimitry Andric   // diagnose the differences differently.
4200b57cec5SDimitry Andric   SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
4210b57cec5SDimitry Andric   std::set_difference(
4220b57cec5SDimitry Andric       ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
4230b57cec5SDimitry Andric       ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
4240b57cec5SDimitry Andric   std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
4250b57cec5SDimitry Andric                       ExistingFeatures.begin(), ExistingFeatures.end(),
4260b57cec5SDimitry Andric                       std::back_inserter(UnmatchedReadFeatures));
4270b57cec5SDimitry Andric 
4280b57cec5SDimitry Andric   // If we are allowing compatible differences and the read feature set is
4290b57cec5SDimitry Andric   // a strict subset of the existing feature set, there is nothing to diagnose.
4300b57cec5SDimitry Andric   if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
4310b57cec5SDimitry Andric     return false;
4320b57cec5SDimitry Andric 
4330b57cec5SDimitry Andric   if (Diags) {
4340b57cec5SDimitry Andric     for (StringRef Feature : UnmatchedReadFeatures)
4350b57cec5SDimitry Andric       Diags->Report(diag::err_pch_targetopt_feature_mismatch)
4360b57cec5SDimitry Andric           << /* is-existing-feature */ false << Feature;
4370b57cec5SDimitry Andric     for (StringRef Feature : UnmatchedExistingFeatures)
4380b57cec5SDimitry Andric       Diags->Report(diag::err_pch_targetopt_feature_mismatch)
4390b57cec5SDimitry Andric           << /* is-existing-feature */ true << Feature;
4400b57cec5SDimitry Andric   }
4410b57cec5SDimitry Andric 
4420b57cec5SDimitry Andric   return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
4430b57cec5SDimitry Andric }
4440b57cec5SDimitry Andric 
4450b57cec5SDimitry Andric bool
4460b57cec5SDimitry Andric PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
4470b57cec5SDimitry Andric                                   bool Complain,
4480b57cec5SDimitry Andric                                   bool AllowCompatibleDifferences) {
4490b57cec5SDimitry Andric   const LangOptions &ExistingLangOpts = PP.getLangOpts();
4500b57cec5SDimitry Andric   return checkLanguageOptions(LangOpts, ExistingLangOpts,
4510b57cec5SDimitry Andric                               Complain ? &Reader.Diags : nullptr,
4520b57cec5SDimitry Andric                               AllowCompatibleDifferences);
4530b57cec5SDimitry Andric }
4540b57cec5SDimitry Andric 
4550b57cec5SDimitry Andric bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
4560b57cec5SDimitry Andric                                      bool Complain,
4570b57cec5SDimitry Andric                                      bool AllowCompatibleDifferences) {
4580b57cec5SDimitry Andric   const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
4590b57cec5SDimitry Andric   return checkTargetOptions(TargetOpts, ExistingTargetOpts,
4600b57cec5SDimitry Andric                             Complain ? &Reader.Diags : nullptr,
4610b57cec5SDimitry Andric                             AllowCompatibleDifferences);
4620b57cec5SDimitry Andric }
4630b57cec5SDimitry Andric 
4640b57cec5SDimitry Andric namespace {
4650b57cec5SDimitry Andric 
4660b57cec5SDimitry Andric using MacroDefinitionsMap =
4670b57cec5SDimitry Andric     llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>;
4680b57cec5SDimitry Andric using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
4690b57cec5SDimitry Andric 
4700b57cec5SDimitry Andric } // namespace
4710b57cec5SDimitry Andric 
4720b57cec5SDimitry Andric static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
4730b57cec5SDimitry Andric                                          DiagnosticsEngine &Diags,
4740b57cec5SDimitry Andric                                          bool Complain) {
4750b57cec5SDimitry Andric   using Level = DiagnosticsEngine::Level;
4760b57cec5SDimitry Andric 
4770b57cec5SDimitry Andric   // Check current mappings for new -Werror mappings, and the stored mappings
4780b57cec5SDimitry Andric   // for cases that were explicitly mapped to *not* be errors that are now
4790b57cec5SDimitry Andric   // errors because of options like -Werror.
4800b57cec5SDimitry Andric   DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
4810b57cec5SDimitry Andric 
4820b57cec5SDimitry Andric   for (DiagnosticsEngine *MappingSource : MappingSources) {
4830b57cec5SDimitry Andric     for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
4840b57cec5SDimitry Andric       diag::kind DiagID = DiagIDMappingPair.first;
4850b57cec5SDimitry Andric       Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
4860b57cec5SDimitry Andric       if (CurLevel < DiagnosticsEngine::Error)
4870b57cec5SDimitry Andric         continue; // not significant
4880b57cec5SDimitry Andric       Level StoredLevel =
4890b57cec5SDimitry Andric           StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
4900b57cec5SDimitry Andric       if (StoredLevel < DiagnosticsEngine::Error) {
4910b57cec5SDimitry Andric         if (Complain)
4920b57cec5SDimitry Andric           Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
4930b57cec5SDimitry Andric               Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
4940b57cec5SDimitry Andric         return true;
4950b57cec5SDimitry Andric       }
4960b57cec5SDimitry Andric     }
4970b57cec5SDimitry Andric   }
4980b57cec5SDimitry Andric 
4990b57cec5SDimitry Andric   return false;
5000b57cec5SDimitry Andric }
5010b57cec5SDimitry Andric 
5020b57cec5SDimitry Andric static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
5030b57cec5SDimitry Andric   diag::Severity Ext = Diags.getExtensionHandlingBehavior();
5040b57cec5SDimitry Andric   if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
5050b57cec5SDimitry Andric     return true;
5060b57cec5SDimitry Andric   return Ext >= diag::Severity::Error;
5070b57cec5SDimitry Andric }
5080b57cec5SDimitry Andric 
5090b57cec5SDimitry Andric static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
5100b57cec5SDimitry Andric                                     DiagnosticsEngine &Diags,
5110b57cec5SDimitry Andric                                     bool IsSystem, bool Complain) {
5120b57cec5SDimitry Andric   // Top-level options
5130b57cec5SDimitry Andric   if (IsSystem) {
5140b57cec5SDimitry Andric     if (Diags.getSuppressSystemWarnings())
5150b57cec5SDimitry Andric       return false;
5160b57cec5SDimitry Andric     // If -Wsystem-headers was not enabled before, be conservative
5170b57cec5SDimitry Andric     if (StoredDiags.getSuppressSystemWarnings()) {
5180b57cec5SDimitry Andric       if (Complain)
5190b57cec5SDimitry Andric         Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
5200b57cec5SDimitry Andric       return true;
5210b57cec5SDimitry Andric     }
5220b57cec5SDimitry Andric   }
5230b57cec5SDimitry Andric 
5240b57cec5SDimitry Andric   if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
5250b57cec5SDimitry Andric     if (Complain)
5260b57cec5SDimitry Andric       Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
5270b57cec5SDimitry Andric     return true;
5280b57cec5SDimitry Andric   }
5290b57cec5SDimitry Andric 
5300b57cec5SDimitry Andric   if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
5310b57cec5SDimitry Andric       !StoredDiags.getEnableAllWarnings()) {
5320b57cec5SDimitry Andric     if (Complain)
5330b57cec5SDimitry Andric       Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
5340b57cec5SDimitry Andric     return true;
5350b57cec5SDimitry Andric   }
5360b57cec5SDimitry Andric 
5370b57cec5SDimitry Andric   if (isExtHandlingFromDiagsError(Diags) &&
5380b57cec5SDimitry Andric       !isExtHandlingFromDiagsError(StoredDiags)) {
5390b57cec5SDimitry Andric     if (Complain)
5400b57cec5SDimitry Andric       Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
5410b57cec5SDimitry Andric     return true;
5420b57cec5SDimitry Andric   }
5430b57cec5SDimitry Andric 
5440b57cec5SDimitry Andric   return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
5450b57cec5SDimitry Andric }
5460b57cec5SDimitry Andric 
5470b57cec5SDimitry Andric /// Return the top import module if it is implicit, nullptr otherwise.
5480b57cec5SDimitry Andric static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr,
5490b57cec5SDimitry Andric                                           Preprocessor &PP) {
5500b57cec5SDimitry Andric   // If the original import came from a file explicitly generated by the user,
5510b57cec5SDimitry Andric   // don't check the diagnostic mappings.
5520b57cec5SDimitry Andric   // FIXME: currently this is approximated by checking whether this is not a
5530b57cec5SDimitry Andric   // module import of an implicitly-loaded module file.
5540b57cec5SDimitry Andric   // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
5550b57cec5SDimitry Andric   // the transitive closure of its imports, since unrelated modules cannot be
5560b57cec5SDimitry Andric   // imported until after this module finishes validation.
5570b57cec5SDimitry Andric   ModuleFile *TopImport = &*ModuleMgr.rbegin();
5580b57cec5SDimitry Andric   while (!TopImport->ImportedBy.empty())
5590b57cec5SDimitry Andric     TopImport = TopImport->ImportedBy[0];
5600b57cec5SDimitry Andric   if (TopImport->Kind != MK_ImplicitModule)
5610b57cec5SDimitry Andric     return nullptr;
5620b57cec5SDimitry Andric 
5630b57cec5SDimitry Andric   StringRef ModuleName = TopImport->ModuleName;
5640b57cec5SDimitry Andric   assert(!ModuleName.empty() && "diagnostic options read before module name");
5650b57cec5SDimitry Andric 
566349cc55cSDimitry Andric   Module *M =
567349cc55cSDimitry Andric       PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc);
5680b57cec5SDimitry Andric   assert(M && "missing module");
5690b57cec5SDimitry Andric   return M;
5700b57cec5SDimitry Andric }
5710b57cec5SDimitry Andric 
5720b57cec5SDimitry Andric bool PCHValidator::ReadDiagnosticOptions(
5730b57cec5SDimitry Andric     IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
5740b57cec5SDimitry Andric   DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
5750b57cec5SDimitry Andric   IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
5760b57cec5SDimitry Andric   IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
5770b57cec5SDimitry Andric       new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
5780b57cec5SDimitry Andric   // This should never fail, because we would have processed these options
5790b57cec5SDimitry Andric   // before writing them to an ASTFile.
5800b57cec5SDimitry Andric   ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
5810b57cec5SDimitry Andric 
5820b57cec5SDimitry Andric   ModuleManager &ModuleMgr = Reader.getModuleManager();
5830b57cec5SDimitry Andric   assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
5840b57cec5SDimitry Andric 
5850b57cec5SDimitry Andric   Module *TopM = getTopImportImplicitModule(ModuleMgr, PP);
5860b57cec5SDimitry Andric   if (!TopM)
5870b57cec5SDimitry Andric     return false;
5880b57cec5SDimitry Andric 
5890b57cec5SDimitry Andric   // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
5900b57cec5SDimitry Andric   // contains the union of their flags.
5910b57cec5SDimitry Andric   return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem,
5920b57cec5SDimitry Andric                                  Complain);
5930b57cec5SDimitry Andric }
5940b57cec5SDimitry Andric 
5950b57cec5SDimitry Andric /// Collect the macro definitions provided by the given preprocessor
5960b57cec5SDimitry Andric /// options.
5970b57cec5SDimitry Andric static void
5980b57cec5SDimitry Andric collectMacroDefinitions(const PreprocessorOptions &PPOpts,
5990b57cec5SDimitry Andric                         MacroDefinitionsMap &Macros,
6000b57cec5SDimitry Andric                         SmallVectorImpl<StringRef> *MacroNames = nullptr) {
6010b57cec5SDimitry Andric   for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
6020b57cec5SDimitry Andric     StringRef Macro = PPOpts.Macros[I].first;
6030b57cec5SDimitry Andric     bool IsUndef = PPOpts.Macros[I].second;
6040b57cec5SDimitry Andric 
6050b57cec5SDimitry Andric     std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
6060b57cec5SDimitry Andric     StringRef MacroName = MacroPair.first;
6070b57cec5SDimitry Andric     StringRef MacroBody = MacroPair.second;
6080b57cec5SDimitry Andric 
6090b57cec5SDimitry Andric     // For an #undef'd macro, we only care about the name.
6100b57cec5SDimitry Andric     if (IsUndef) {
6110b57cec5SDimitry Andric       if (MacroNames && !Macros.count(MacroName))
6120b57cec5SDimitry Andric         MacroNames->push_back(MacroName);
6130b57cec5SDimitry Andric 
6140b57cec5SDimitry Andric       Macros[MacroName] = std::make_pair("", true);
6150b57cec5SDimitry Andric       continue;
6160b57cec5SDimitry Andric     }
6170b57cec5SDimitry Andric 
6180b57cec5SDimitry Andric     // For a #define'd macro, figure out the actual definition.
6190b57cec5SDimitry Andric     if (MacroName.size() == Macro.size())
6200b57cec5SDimitry Andric       MacroBody = "1";
6210b57cec5SDimitry Andric     else {
6220b57cec5SDimitry Andric       // Note: GCC drops anything following an end-of-line character.
6230b57cec5SDimitry Andric       StringRef::size_type End = MacroBody.find_first_of("\n\r");
6240b57cec5SDimitry Andric       MacroBody = MacroBody.substr(0, End);
6250b57cec5SDimitry Andric     }
6260b57cec5SDimitry Andric 
6270b57cec5SDimitry Andric     if (MacroNames && !Macros.count(MacroName))
6280b57cec5SDimitry Andric       MacroNames->push_back(MacroName);
6290b57cec5SDimitry Andric     Macros[MacroName] = std::make_pair(MacroBody, false);
6300b57cec5SDimitry Andric   }
6310b57cec5SDimitry Andric }
6320b57cec5SDimitry Andric 
63361cfbce3SDimitry Andric enum OptionValidation {
63461cfbce3SDimitry Andric   OptionValidateNone,
63561cfbce3SDimitry Andric   OptionValidateContradictions,
63661cfbce3SDimitry Andric   OptionValidateStrictMatches,
63761cfbce3SDimitry Andric };
63861cfbce3SDimitry Andric 
6390b57cec5SDimitry Andric /// Check the preprocessor options deserialized from the control block
6400b57cec5SDimitry Andric /// against the preprocessor options in an existing preprocessor.
6410b57cec5SDimitry Andric ///
6420b57cec5SDimitry Andric /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
64361cfbce3SDimitry Andric /// \param Validation If set to OptionValidateNone, ignore differences in
64461cfbce3SDimitry Andric ///        preprocessor options. If set to OptionValidateContradictions,
64561cfbce3SDimitry Andric ///        require that options passed both in the AST file and on the command
64661cfbce3SDimitry Andric ///        line (-D or -U) match, but tolerate options missing in one or the
64761cfbce3SDimitry Andric ///        other. If set to OptionValidateContradictions, require that there
64861cfbce3SDimitry Andric ///        are no differences in the options between the two.
64961cfbce3SDimitry Andric static bool checkPreprocessorOptions(
65061cfbce3SDimitry Andric     const PreprocessorOptions &PPOpts,
65161cfbce3SDimitry Andric     const PreprocessorOptions &ExistingPPOpts, DiagnosticsEngine *Diags,
65261cfbce3SDimitry Andric     FileManager &FileMgr, std::string &SuggestedPredefines,
6530b57cec5SDimitry Andric     const LangOptions &LangOpts,
65461cfbce3SDimitry Andric     OptionValidation Validation = OptionValidateContradictions) {
6550b57cec5SDimitry Andric   // Check macro definitions.
6560b57cec5SDimitry Andric   MacroDefinitionsMap ASTFileMacros;
6570b57cec5SDimitry Andric   collectMacroDefinitions(PPOpts, ASTFileMacros);
6580b57cec5SDimitry Andric   MacroDefinitionsMap ExistingMacros;
6590b57cec5SDimitry Andric   SmallVector<StringRef, 4> ExistingMacroNames;
6600b57cec5SDimitry Andric   collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
6610b57cec5SDimitry Andric 
662*06c3fb27SDimitry Andric   // Use a line marker to enter the <command line> file, as the defines and
663*06c3fb27SDimitry Andric   // undefines here will have come from the command line.
664*06c3fb27SDimitry Andric   SuggestedPredefines += "# 1 \"<command line>\" 1\n";
665*06c3fb27SDimitry Andric 
6660b57cec5SDimitry Andric   for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
6670b57cec5SDimitry Andric     // Dig out the macro definition in the existing preprocessor options.
6680b57cec5SDimitry Andric     StringRef MacroName = ExistingMacroNames[I];
6690b57cec5SDimitry Andric     std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
6700b57cec5SDimitry Andric 
6710b57cec5SDimitry Andric     // Check whether we know anything about this macro name or not.
6720b57cec5SDimitry Andric     llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known =
6730b57cec5SDimitry Andric         ASTFileMacros.find(MacroName);
67461cfbce3SDimitry Andric     if (Validation == OptionValidateNone || Known == ASTFileMacros.end()) {
67561cfbce3SDimitry Andric       if (Validation == OptionValidateStrictMatches) {
67661cfbce3SDimitry Andric         // If strict matches are requested, don't tolerate any extra defines on
67761cfbce3SDimitry Andric         // the command line that are missing in the AST file.
67861cfbce3SDimitry Andric         if (Diags) {
67961cfbce3SDimitry Andric           Diags->Report(diag::err_pch_macro_def_undef) << MacroName << true;
68061cfbce3SDimitry Andric         }
68161cfbce3SDimitry Andric         return true;
68261cfbce3SDimitry Andric       }
6830b57cec5SDimitry Andric       // FIXME: Check whether this identifier was referenced anywhere in the
6840b57cec5SDimitry Andric       // AST file. If so, we should reject the AST file. Unfortunately, this
6850b57cec5SDimitry Andric       // information isn't in the control block. What shall we do about it?
6860b57cec5SDimitry Andric 
6870b57cec5SDimitry Andric       if (Existing.second) {
6880b57cec5SDimitry Andric         SuggestedPredefines += "#undef ";
6890b57cec5SDimitry Andric         SuggestedPredefines += MacroName.str();
6900b57cec5SDimitry Andric         SuggestedPredefines += '\n';
6910b57cec5SDimitry Andric       } else {
6920b57cec5SDimitry Andric         SuggestedPredefines += "#define ";
6930b57cec5SDimitry Andric         SuggestedPredefines += MacroName.str();
6940b57cec5SDimitry Andric         SuggestedPredefines += ' ';
6950b57cec5SDimitry Andric         SuggestedPredefines += Existing.first.str();
6960b57cec5SDimitry Andric         SuggestedPredefines += '\n';
6970b57cec5SDimitry Andric       }
6980b57cec5SDimitry Andric       continue;
6990b57cec5SDimitry Andric     }
7000b57cec5SDimitry Andric 
7010b57cec5SDimitry Andric     // If the macro was defined in one but undef'd in the other, we have a
7020b57cec5SDimitry Andric     // conflict.
7030b57cec5SDimitry Andric     if (Existing.second != Known->second.second) {
7040b57cec5SDimitry Andric       if (Diags) {
7050b57cec5SDimitry Andric         Diags->Report(diag::err_pch_macro_def_undef)
7060b57cec5SDimitry Andric           << MacroName << Known->second.second;
7070b57cec5SDimitry Andric       }
7080b57cec5SDimitry Andric       return true;
7090b57cec5SDimitry Andric     }
7100b57cec5SDimitry Andric 
7110b57cec5SDimitry Andric     // If the macro was #undef'd in both, or if the macro bodies are identical,
7120b57cec5SDimitry Andric     // it's fine.
71361cfbce3SDimitry Andric     if (Existing.second || Existing.first == Known->second.first) {
71461cfbce3SDimitry Andric       ASTFileMacros.erase(Known);
7150b57cec5SDimitry Andric       continue;
71661cfbce3SDimitry Andric     }
7170b57cec5SDimitry Andric 
7180b57cec5SDimitry Andric     // The macro bodies differ; complain.
7190b57cec5SDimitry Andric     if (Diags) {
7200b57cec5SDimitry Andric       Diags->Report(diag::err_pch_macro_def_conflict)
7210b57cec5SDimitry Andric         << MacroName << Known->second.first << Existing.first;
7220b57cec5SDimitry Andric     }
7230b57cec5SDimitry Andric     return true;
7240b57cec5SDimitry Andric   }
725*06c3fb27SDimitry Andric 
726*06c3fb27SDimitry Andric   // Leave the <command line> file and return to <built-in>.
727*06c3fb27SDimitry Andric   SuggestedPredefines += "# 1 \"<built-in>\" 2\n";
728*06c3fb27SDimitry Andric 
72961cfbce3SDimitry Andric   if (Validation == OptionValidateStrictMatches) {
73061cfbce3SDimitry Andric     // If strict matches are requested, don't tolerate any extra defines in
73161cfbce3SDimitry Andric     // the AST file that are missing on the command line.
73261cfbce3SDimitry Andric     for (const auto &MacroName : ASTFileMacros.keys()) {
73361cfbce3SDimitry Andric       if (Diags) {
73461cfbce3SDimitry Andric         Diags->Report(diag::err_pch_macro_def_undef) << MacroName << false;
73561cfbce3SDimitry Andric       }
73661cfbce3SDimitry Andric       return true;
73761cfbce3SDimitry Andric     }
73861cfbce3SDimitry Andric   }
7390b57cec5SDimitry Andric 
7400b57cec5SDimitry Andric   // Check whether we're using predefines.
74161cfbce3SDimitry Andric   if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines &&
74261cfbce3SDimitry Andric       Validation != OptionValidateNone) {
7430b57cec5SDimitry Andric     if (Diags) {
7440b57cec5SDimitry Andric       Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
7450b57cec5SDimitry Andric     }
7460b57cec5SDimitry Andric     return true;
7470b57cec5SDimitry Andric   }
7480b57cec5SDimitry Andric 
7490b57cec5SDimitry Andric   // Detailed record is important since it is used for the module cache hash.
7500b57cec5SDimitry Andric   if (LangOpts.Modules &&
75161cfbce3SDimitry Andric       PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord &&
75261cfbce3SDimitry Andric       Validation != OptionValidateNone) {
7530b57cec5SDimitry Andric     if (Diags) {
7540b57cec5SDimitry Andric       Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
7550b57cec5SDimitry Andric     }
7560b57cec5SDimitry Andric     return true;
7570b57cec5SDimitry Andric   }
7580b57cec5SDimitry Andric 
7590b57cec5SDimitry Andric   // Compute the #include and #include_macros lines we need.
7600b57cec5SDimitry Andric   for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
7610b57cec5SDimitry Andric     StringRef File = ExistingPPOpts.Includes[I];
7620b57cec5SDimitry Andric 
7630b57cec5SDimitry Andric     if (!ExistingPPOpts.ImplicitPCHInclude.empty() &&
7640b57cec5SDimitry Andric         !ExistingPPOpts.PCHThroughHeader.empty()) {
7650b57cec5SDimitry Andric       // In case the through header is an include, we must add all the includes
7660b57cec5SDimitry Andric       // to the predefines so the start point can be determined.
7670b57cec5SDimitry Andric       SuggestedPredefines += "#include \"";
7680b57cec5SDimitry Andric       SuggestedPredefines += File;
7690b57cec5SDimitry Andric       SuggestedPredefines += "\"\n";
7700b57cec5SDimitry Andric       continue;
7710b57cec5SDimitry Andric     }
7720b57cec5SDimitry Andric 
7730b57cec5SDimitry Andric     if (File == ExistingPPOpts.ImplicitPCHInclude)
7740b57cec5SDimitry Andric       continue;
7750b57cec5SDimitry Andric 
776349cc55cSDimitry Andric     if (llvm::is_contained(PPOpts.Includes, File))
7770b57cec5SDimitry Andric       continue;
7780b57cec5SDimitry Andric 
7790b57cec5SDimitry Andric     SuggestedPredefines += "#include \"";
7800b57cec5SDimitry Andric     SuggestedPredefines += File;
7810b57cec5SDimitry Andric     SuggestedPredefines += "\"\n";
7820b57cec5SDimitry Andric   }
7830b57cec5SDimitry Andric 
7840b57cec5SDimitry Andric   for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
7850b57cec5SDimitry Andric     StringRef File = ExistingPPOpts.MacroIncludes[I];
786349cc55cSDimitry Andric     if (llvm::is_contained(PPOpts.MacroIncludes, File))
7870b57cec5SDimitry Andric       continue;
7880b57cec5SDimitry Andric 
7890b57cec5SDimitry Andric     SuggestedPredefines += "#__include_macros \"";
7900b57cec5SDimitry Andric     SuggestedPredefines += File;
7910b57cec5SDimitry Andric     SuggestedPredefines += "\"\n##\n";
7920b57cec5SDimitry Andric   }
7930b57cec5SDimitry Andric 
7940b57cec5SDimitry Andric   return false;
7950b57cec5SDimitry Andric }
7960b57cec5SDimitry Andric 
7970b57cec5SDimitry Andric bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
7980b57cec5SDimitry Andric                                            bool Complain,
7990b57cec5SDimitry Andric                                            std::string &SuggestedPredefines) {
8000b57cec5SDimitry Andric   const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
8010b57cec5SDimitry Andric 
8020b57cec5SDimitry Andric   return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
8030b57cec5SDimitry Andric                                   Complain? &Reader.Diags : nullptr,
8040b57cec5SDimitry Andric                                   PP.getFileManager(),
8050b57cec5SDimitry Andric                                   SuggestedPredefines,
8060b57cec5SDimitry Andric                                   PP.getLangOpts());
8070b57cec5SDimitry Andric }
8080b57cec5SDimitry Andric 
8090b57cec5SDimitry Andric bool SimpleASTReaderListener::ReadPreprocessorOptions(
8100b57cec5SDimitry Andric                                   const PreprocessorOptions &PPOpts,
8110b57cec5SDimitry Andric                                   bool Complain,
8120b57cec5SDimitry Andric                                   std::string &SuggestedPredefines) {
81361cfbce3SDimitry Andric   return checkPreprocessorOptions(PPOpts, PP.getPreprocessorOpts(), nullptr,
81461cfbce3SDimitry Andric                                   PP.getFileManager(), SuggestedPredefines,
81561cfbce3SDimitry Andric                                   PP.getLangOpts(), OptionValidateNone);
8160b57cec5SDimitry Andric }
8170b57cec5SDimitry Andric 
8180b57cec5SDimitry Andric /// Check the header search options deserialized from the control block
8190b57cec5SDimitry Andric /// against the header search options in an existing preprocessor.
8200b57cec5SDimitry Andric ///
8210b57cec5SDimitry Andric /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
8220b57cec5SDimitry Andric static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
8230b57cec5SDimitry Andric                                      StringRef SpecificModuleCachePath,
8240b57cec5SDimitry Andric                                      StringRef ExistingModuleCachePath,
8250b57cec5SDimitry Andric                                      DiagnosticsEngine *Diags,
826fe6060f1SDimitry Andric                                      const LangOptions &LangOpts,
827fe6060f1SDimitry Andric                                      const PreprocessorOptions &PPOpts) {
8280b57cec5SDimitry Andric   if (LangOpts.Modules) {
829fe6060f1SDimitry Andric     if (SpecificModuleCachePath != ExistingModuleCachePath &&
830fe6060f1SDimitry Andric         !PPOpts.AllowPCHWithDifferentModulesCachePath) {
8310b57cec5SDimitry Andric       if (Diags)
8320b57cec5SDimitry Andric         Diags->Report(diag::err_pch_modulecache_mismatch)
8330b57cec5SDimitry Andric           << SpecificModuleCachePath << ExistingModuleCachePath;
8340b57cec5SDimitry Andric       return true;
8350b57cec5SDimitry Andric     }
8360b57cec5SDimitry Andric   }
8370b57cec5SDimitry Andric 
8380b57cec5SDimitry Andric   return false;
8390b57cec5SDimitry Andric }
8400b57cec5SDimitry Andric 
8410b57cec5SDimitry Andric bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
8420b57cec5SDimitry Andric                                            StringRef SpecificModuleCachePath,
8430b57cec5SDimitry Andric                                            bool Complain) {
8440b57cec5SDimitry Andric   return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
8450b57cec5SDimitry Andric                                   PP.getHeaderSearchInfo().getModuleCachePath(),
8460b57cec5SDimitry Andric                                   Complain ? &Reader.Diags : nullptr,
847fe6060f1SDimitry Andric                                   PP.getLangOpts(), PP.getPreprocessorOpts());
8480b57cec5SDimitry Andric }
8490b57cec5SDimitry Andric 
8500b57cec5SDimitry Andric void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
8510b57cec5SDimitry Andric   PP.setCounterValue(Value);
8520b57cec5SDimitry Andric }
8530b57cec5SDimitry Andric 
8540b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8550b57cec5SDimitry Andric // AST reader implementation
8560b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8570b57cec5SDimitry Andric 
858fe6060f1SDimitry Andric static uint64_t readULEB(const unsigned char *&P) {
859fe6060f1SDimitry Andric   unsigned Length = 0;
860fe6060f1SDimitry Andric   const char *Error = nullptr;
861fe6060f1SDimitry Andric 
862fe6060f1SDimitry Andric   uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error);
863fe6060f1SDimitry Andric   if (Error)
864fe6060f1SDimitry Andric     llvm::report_fatal_error(Error);
865fe6060f1SDimitry Andric   P += Length;
866fe6060f1SDimitry Andric   return Val;
867fe6060f1SDimitry Andric }
868fe6060f1SDimitry Andric 
869fe6060f1SDimitry Andric /// Read ULEB-encoded key length and data length.
870fe6060f1SDimitry Andric static std::pair<unsigned, unsigned>
871fe6060f1SDimitry Andric readULEBKeyDataLength(const unsigned char *&P) {
872fe6060f1SDimitry Andric   unsigned KeyLen = readULEB(P);
873fe6060f1SDimitry Andric   if ((unsigned)KeyLen != KeyLen)
874fe6060f1SDimitry Andric     llvm::report_fatal_error("key too large");
875fe6060f1SDimitry Andric 
876fe6060f1SDimitry Andric   unsigned DataLen = readULEB(P);
877fe6060f1SDimitry Andric   if ((unsigned)DataLen != DataLen)
878fe6060f1SDimitry Andric     llvm::report_fatal_error("data too large");
879fe6060f1SDimitry Andric 
880fe6060f1SDimitry Andric   return std::make_pair(KeyLen, DataLen);
881fe6060f1SDimitry Andric }
882fe6060f1SDimitry Andric 
8830b57cec5SDimitry Andric void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
8840b57cec5SDimitry Andric                                            bool TakeOwnership) {
8850b57cec5SDimitry Andric   DeserializationListener = Listener;
8860b57cec5SDimitry Andric   OwnsDeserializationListener = TakeOwnership;
8870b57cec5SDimitry Andric }
8880b57cec5SDimitry Andric 
8890b57cec5SDimitry Andric unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
8900b57cec5SDimitry Andric   return serialization::ComputeHash(Sel);
8910b57cec5SDimitry Andric }
8920b57cec5SDimitry Andric 
8930b57cec5SDimitry Andric std::pair<unsigned, unsigned>
8940b57cec5SDimitry Andric ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
895fe6060f1SDimitry Andric   return readULEBKeyDataLength(d);
8960b57cec5SDimitry Andric }
8970b57cec5SDimitry Andric 
8980b57cec5SDimitry Andric ASTSelectorLookupTrait::internal_key_type
8990b57cec5SDimitry Andric ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
9000b57cec5SDimitry Andric   using namespace llvm::support;
9010b57cec5SDimitry Andric 
9020b57cec5SDimitry Andric   SelectorTable &SelTable = Reader.getContext().Selectors;
9030b57cec5SDimitry Andric   unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
9040b57cec5SDimitry Andric   IdentifierInfo *FirstII = Reader.getLocalIdentifier(
9050b57cec5SDimitry Andric       F, endian::readNext<uint32_t, little, unaligned>(d));
9060b57cec5SDimitry Andric   if (N == 0)
9070b57cec5SDimitry Andric     return SelTable.getNullarySelector(FirstII);
9080b57cec5SDimitry Andric   else if (N == 1)
9090b57cec5SDimitry Andric     return SelTable.getUnarySelector(FirstII);
9100b57cec5SDimitry Andric 
9110b57cec5SDimitry Andric   SmallVector<IdentifierInfo *, 16> Args;
9120b57cec5SDimitry Andric   Args.push_back(FirstII);
9130b57cec5SDimitry Andric   for (unsigned I = 1; I != N; ++I)
9140b57cec5SDimitry Andric     Args.push_back(Reader.getLocalIdentifier(
9150b57cec5SDimitry Andric         F, endian::readNext<uint32_t, little, unaligned>(d)));
9160b57cec5SDimitry Andric 
9170b57cec5SDimitry Andric   return SelTable.getSelector(N, Args.data());
9180b57cec5SDimitry Andric }
9190b57cec5SDimitry Andric 
9200b57cec5SDimitry Andric ASTSelectorLookupTrait::data_type
9210b57cec5SDimitry Andric ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
9220b57cec5SDimitry Andric                                  unsigned DataLen) {
9230b57cec5SDimitry Andric   using namespace llvm::support;
9240b57cec5SDimitry Andric 
9250b57cec5SDimitry Andric   data_type Result;
9260b57cec5SDimitry Andric 
9270b57cec5SDimitry Andric   Result.ID = Reader.getGlobalSelectorID(
9280b57cec5SDimitry Andric       F, endian::readNext<uint32_t, little, unaligned>(d));
9290b57cec5SDimitry Andric   unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
9300b57cec5SDimitry Andric   unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
9310b57cec5SDimitry Andric   Result.InstanceBits = FullInstanceBits & 0x3;
9320b57cec5SDimitry Andric   Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
9330b57cec5SDimitry Andric   Result.FactoryBits = FullFactoryBits & 0x3;
9340b57cec5SDimitry Andric   Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
9350b57cec5SDimitry Andric   unsigned NumInstanceMethods = FullInstanceBits >> 3;
9360b57cec5SDimitry Andric   unsigned NumFactoryMethods = FullFactoryBits >> 3;
9370b57cec5SDimitry Andric 
9380b57cec5SDimitry Andric   // Load instance methods
9390b57cec5SDimitry Andric   for (unsigned I = 0; I != NumInstanceMethods; ++I) {
9400b57cec5SDimitry Andric     if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
9410b57cec5SDimitry Andric             F, endian::readNext<uint32_t, little, unaligned>(d)))
9420b57cec5SDimitry Andric       Result.Instance.push_back(Method);
9430b57cec5SDimitry Andric   }
9440b57cec5SDimitry Andric 
9450b57cec5SDimitry Andric   // Load factory methods
9460b57cec5SDimitry Andric   for (unsigned I = 0; I != NumFactoryMethods; ++I) {
9470b57cec5SDimitry Andric     if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
9480b57cec5SDimitry Andric             F, endian::readNext<uint32_t, little, unaligned>(d)))
9490b57cec5SDimitry Andric       Result.Factory.push_back(Method);
9500b57cec5SDimitry Andric   }
9510b57cec5SDimitry Andric 
9520b57cec5SDimitry Andric   return Result;
9530b57cec5SDimitry Andric }
9540b57cec5SDimitry Andric 
9550b57cec5SDimitry Andric unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
9560b57cec5SDimitry Andric   return llvm::djbHash(a);
9570b57cec5SDimitry Andric }
9580b57cec5SDimitry Andric 
9590b57cec5SDimitry Andric std::pair<unsigned, unsigned>
9600b57cec5SDimitry Andric ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
961fe6060f1SDimitry Andric   return readULEBKeyDataLength(d);
9620b57cec5SDimitry Andric }
9630b57cec5SDimitry Andric 
9640b57cec5SDimitry Andric ASTIdentifierLookupTraitBase::internal_key_type
9650b57cec5SDimitry Andric ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
9660b57cec5SDimitry Andric   assert(n >= 2 && d[n-1] == '\0');
9670b57cec5SDimitry Andric   return StringRef((const char*) d, n-1);
9680b57cec5SDimitry Andric }
9690b57cec5SDimitry Andric 
9700b57cec5SDimitry Andric /// Whether the given identifier is "interesting".
9710b57cec5SDimitry Andric static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
9720b57cec5SDimitry Andric                                     bool IsModule) {
973927c847dSDimitry Andric   return II.hadMacroDefinition() || II.isPoisoned() ||
974927c847dSDimitry Andric          (!IsModule && II.getObjCOrBuiltinID()) ||
9750b57cec5SDimitry Andric          II.hasRevertedTokenIDToIdentifier() ||
9760b57cec5SDimitry Andric          (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) &&
9770b57cec5SDimitry Andric           II.getFETokenInfo());
9780b57cec5SDimitry Andric }
9790b57cec5SDimitry Andric 
9800b57cec5SDimitry Andric static bool readBit(unsigned &Bits) {
9810b57cec5SDimitry Andric   bool Value = Bits & 0x1;
9820b57cec5SDimitry Andric   Bits >>= 1;
9830b57cec5SDimitry Andric   return Value;
9840b57cec5SDimitry Andric }
9850b57cec5SDimitry Andric 
9860b57cec5SDimitry Andric IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
9870b57cec5SDimitry Andric   using namespace llvm::support;
9880b57cec5SDimitry Andric 
9890b57cec5SDimitry Andric   unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
9900b57cec5SDimitry Andric   return Reader.getGlobalIdentifierID(F, RawID >> 1);
9910b57cec5SDimitry Andric }
9920b57cec5SDimitry Andric 
9930b57cec5SDimitry Andric static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
9940b57cec5SDimitry Andric   if (!II.isFromAST()) {
9950b57cec5SDimitry Andric     II.setIsFromAST();
9960b57cec5SDimitry Andric     bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
9970b57cec5SDimitry Andric     if (isInterestingIdentifier(Reader, II, IsModule))
9980b57cec5SDimitry Andric       II.setChangedSinceDeserialization();
9990b57cec5SDimitry Andric   }
10000b57cec5SDimitry Andric }
10010b57cec5SDimitry Andric 
10020b57cec5SDimitry Andric IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
10030b57cec5SDimitry Andric                                                    const unsigned char* d,
10040b57cec5SDimitry Andric                                                    unsigned DataLen) {
10050b57cec5SDimitry Andric   using namespace llvm::support;
10060b57cec5SDimitry Andric 
10070b57cec5SDimitry Andric   unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
10080b57cec5SDimitry Andric   bool IsInteresting = RawID & 0x01;
10090b57cec5SDimitry Andric 
10100b57cec5SDimitry Andric   // Wipe out the "is interesting" bit.
10110b57cec5SDimitry Andric   RawID = RawID >> 1;
10120b57cec5SDimitry Andric 
10130b57cec5SDimitry Andric   // Build the IdentifierInfo and link the identifier ID with it.
10140b57cec5SDimitry Andric   IdentifierInfo *II = KnownII;
10150b57cec5SDimitry Andric   if (!II) {
10160b57cec5SDimitry Andric     II = &Reader.getIdentifierTable().getOwn(k);
10170b57cec5SDimitry Andric     KnownII = II;
10180b57cec5SDimitry Andric   }
10190b57cec5SDimitry Andric   markIdentifierFromAST(Reader, *II);
10200b57cec5SDimitry Andric   Reader.markIdentifierUpToDate(II);
10210b57cec5SDimitry Andric 
10220b57cec5SDimitry Andric   IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
10230b57cec5SDimitry Andric   if (!IsInteresting) {
10240b57cec5SDimitry Andric     // For uninteresting identifiers, there's nothing else to do. Just notify
10250b57cec5SDimitry Andric     // the reader that we've finished loading this identifier.
10260b57cec5SDimitry Andric     Reader.SetIdentifierInfo(ID, II);
10270b57cec5SDimitry Andric     return II;
10280b57cec5SDimitry Andric   }
10290b57cec5SDimitry Andric 
10300b57cec5SDimitry Andric   unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
10310b57cec5SDimitry Andric   unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
10320b57cec5SDimitry Andric   bool CPlusPlusOperatorKeyword = readBit(Bits);
10330b57cec5SDimitry Andric   bool HasRevertedTokenIDToIdentifier = readBit(Bits);
10340b57cec5SDimitry Andric   bool Poisoned = readBit(Bits);
10350b57cec5SDimitry Andric   bool ExtensionToken = readBit(Bits);
10360b57cec5SDimitry Andric   bool HadMacroDefinition = readBit(Bits);
10370b57cec5SDimitry Andric 
10380b57cec5SDimitry Andric   assert(Bits == 0 && "Extra bits in the identifier?");
10390b57cec5SDimitry Andric   DataLen -= 8;
10400b57cec5SDimitry Andric 
10410b57cec5SDimitry Andric   // Set or check the various bits in the IdentifierInfo structure.
10420b57cec5SDimitry Andric   // Token IDs are read-only.
10430b57cec5SDimitry Andric   if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
10440b57cec5SDimitry Andric     II->revertTokenIDToIdentifier();
10450b57cec5SDimitry Andric   if (!F.isModule())
10460b57cec5SDimitry Andric     II->setObjCOrBuiltinID(ObjCOrBuiltinID);
10470b57cec5SDimitry Andric   assert(II->isExtensionToken() == ExtensionToken &&
10480b57cec5SDimitry Andric          "Incorrect extension token flag");
10490b57cec5SDimitry Andric   (void)ExtensionToken;
10500b57cec5SDimitry Andric   if (Poisoned)
10510b57cec5SDimitry Andric     II->setIsPoisoned(true);
10520b57cec5SDimitry Andric   assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
10530b57cec5SDimitry Andric          "Incorrect C++ operator keyword flag");
10540b57cec5SDimitry Andric   (void)CPlusPlusOperatorKeyword;
10550b57cec5SDimitry Andric 
10560b57cec5SDimitry Andric   // If this identifier is a macro, deserialize the macro
10570b57cec5SDimitry Andric   // definition.
10580b57cec5SDimitry Andric   if (HadMacroDefinition) {
10590b57cec5SDimitry Andric     uint32_t MacroDirectivesOffset =
10600b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(d);
10610b57cec5SDimitry Andric     DataLen -= 4;
10620b57cec5SDimitry Andric 
10630b57cec5SDimitry Andric     Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
10640b57cec5SDimitry Andric   }
10650b57cec5SDimitry Andric 
10660b57cec5SDimitry Andric   Reader.SetIdentifierInfo(ID, II);
10670b57cec5SDimitry Andric 
10680b57cec5SDimitry Andric   // Read all of the declarations visible at global scope with this
10690b57cec5SDimitry Andric   // name.
10700b57cec5SDimitry Andric   if (DataLen > 0) {
10710b57cec5SDimitry Andric     SmallVector<uint32_t, 4> DeclIDs;
10720b57cec5SDimitry Andric     for (; DataLen > 0; DataLen -= 4)
10730b57cec5SDimitry Andric       DeclIDs.push_back(Reader.getGlobalDeclID(
10740b57cec5SDimitry Andric           F, endian::readNext<uint32_t, little, unaligned>(d)));
10750b57cec5SDimitry Andric     Reader.SetGloballyVisibleDecls(II, DeclIDs);
10760b57cec5SDimitry Andric   }
10770b57cec5SDimitry Andric 
10780b57cec5SDimitry Andric   return II;
10790b57cec5SDimitry Andric }
10800b57cec5SDimitry Andric 
10810b57cec5SDimitry Andric DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
10820b57cec5SDimitry Andric     : Kind(Name.getNameKind()) {
10830b57cec5SDimitry Andric   switch (Kind) {
10840b57cec5SDimitry Andric   case DeclarationName::Identifier:
10850b57cec5SDimitry Andric     Data = (uint64_t)Name.getAsIdentifierInfo();
10860b57cec5SDimitry Andric     break;
10870b57cec5SDimitry Andric   case DeclarationName::ObjCZeroArgSelector:
10880b57cec5SDimitry Andric   case DeclarationName::ObjCOneArgSelector:
10890b57cec5SDimitry Andric   case DeclarationName::ObjCMultiArgSelector:
10900b57cec5SDimitry Andric     Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
10910b57cec5SDimitry Andric     break;
10920b57cec5SDimitry Andric   case DeclarationName::CXXOperatorName:
10930b57cec5SDimitry Andric     Data = Name.getCXXOverloadedOperator();
10940b57cec5SDimitry Andric     break;
10950b57cec5SDimitry Andric   case DeclarationName::CXXLiteralOperatorName:
10960b57cec5SDimitry Andric     Data = (uint64_t)Name.getCXXLiteralIdentifier();
10970b57cec5SDimitry Andric     break;
10980b57cec5SDimitry Andric   case DeclarationName::CXXDeductionGuideName:
10990b57cec5SDimitry Andric     Data = (uint64_t)Name.getCXXDeductionGuideTemplate()
11000b57cec5SDimitry Andric                ->getDeclName().getAsIdentifierInfo();
11010b57cec5SDimitry Andric     break;
11020b57cec5SDimitry Andric   case DeclarationName::CXXConstructorName:
11030b57cec5SDimitry Andric   case DeclarationName::CXXDestructorName:
11040b57cec5SDimitry Andric   case DeclarationName::CXXConversionFunctionName:
11050b57cec5SDimitry Andric   case DeclarationName::CXXUsingDirective:
11060b57cec5SDimitry Andric     Data = 0;
11070b57cec5SDimitry Andric     break;
11080b57cec5SDimitry Andric   }
11090b57cec5SDimitry Andric }
11100b57cec5SDimitry Andric 
11110b57cec5SDimitry Andric unsigned DeclarationNameKey::getHash() const {
11120b57cec5SDimitry Andric   llvm::FoldingSetNodeID ID;
11130b57cec5SDimitry Andric   ID.AddInteger(Kind);
11140b57cec5SDimitry Andric 
11150b57cec5SDimitry Andric   switch (Kind) {
11160b57cec5SDimitry Andric   case DeclarationName::Identifier:
11170b57cec5SDimitry Andric   case DeclarationName::CXXLiteralOperatorName:
11180b57cec5SDimitry Andric   case DeclarationName::CXXDeductionGuideName:
11190b57cec5SDimitry Andric     ID.AddString(((IdentifierInfo*)Data)->getName());
11200b57cec5SDimitry Andric     break;
11210b57cec5SDimitry Andric   case DeclarationName::ObjCZeroArgSelector:
11220b57cec5SDimitry Andric   case DeclarationName::ObjCOneArgSelector:
11230b57cec5SDimitry Andric   case DeclarationName::ObjCMultiArgSelector:
11240b57cec5SDimitry Andric     ID.AddInteger(serialization::ComputeHash(Selector(Data)));
11250b57cec5SDimitry Andric     break;
11260b57cec5SDimitry Andric   case DeclarationName::CXXOperatorName:
11270b57cec5SDimitry Andric     ID.AddInteger((OverloadedOperatorKind)Data);
11280b57cec5SDimitry Andric     break;
11290b57cec5SDimitry Andric   case DeclarationName::CXXConstructorName:
11300b57cec5SDimitry Andric   case DeclarationName::CXXDestructorName:
11310b57cec5SDimitry Andric   case DeclarationName::CXXConversionFunctionName:
11320b57cec5SDimitry Andric   case DeclarationName::CXXUsingDirective:
11330b57cec5SDimitry Andric     break;
11340b57cec5SDimitry Andric   }
11350b57cec5SDimitry Andric 
11360b57cec5SDimitry Andric   return ID.ComputeHash();
11370b57cec5SDimitry Andric }
11380b57cec5SDimitry Andric 
11390b57cec5SDimitry Andric ModuleFile *
11400b57cec5SDimitry Andric ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
11410b57cec5SDimitry Andric   using namespace llvm::support;
11420b57cec5SDimitry Andric 
11430b57cec5SDimitry Andric   uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
11440b57cec5SDimitry Andric   return Reader.getLocalModuleFile(F, ModuleFileID);
11450b57cec5SDimitry Andric }
11460b57cec5SDimitry Andric 
11470b57cec5SDimitry Andric std::pair<unsigned, unsigned>
11480b57cec5SDimitry Andric ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
1149fe6060f1SDimitry Andric   return readULEBKeyDataLength(d);
11500b57cec5SDimitry Andric }
11510b57cec5SDimitry Andric 
11520b57cec5SDimitry Andric ASTDeclContextNameLookupTrait::internal_key_type
11530b57cec5SDimitry Andric ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
11540b57cec5SDimitry Andric   using namespace llvm::support;
11550b57cec5SDimitry Andric 
11560b57cec5SDimitry Andric   auto Kind = (DeclarationName::NameKind)*d++;
11570b57cec5SDimitry Andric   uint64_t Data;
11580b57cec5SDimitry Andric   switch (Kind) {
11590b57cec5SDimitry Andric   case DeclarationName::Identifier:
11600b57cec5SDimitry Andric   case DeclarationName::CXXLiteralOperatorName:
11610b57cec5SDimitry Andric   case DeclarationName::CXXDeductionGuideName:
11620b57cec5SDimitry Andric     Data = (uint64_t)Reader.getLocalIdentifier(
11630b57cec5SDimitry Andric         F, endian::readNext<uint32_t, little, unaligned>(d));
11640b57cec5SDimitry Andric     break;
11650b57cec5SDimitry Andric   case DeclarationName::ObjCZeroArgSelector:
11660b57cec5SDimitry Andric   case DeclarationName::ObjCOneArgSelector:
11670b57cec5SDimitry Andric   case DeclarationName::ObjCMultiArgSelector:
11680b57cec5SDimitry Andric     Data =
11690b57cec5SDimitry Andric         (uint64_t)Reader.getLocalSelector(
11700b57cec5SDimitry Andric                              F, endian::readNext<uint32_t, little, unaligned>(
11710b57cec5SDimitry Andric                                     d)).getAsOpaquePtr();
11720b57cec5SDimitry Andric     break;
11730b57cec5SDimitry Andric   case DeclarationName::CXXOperatorName:
11740b57cec5SDimitry Andric     Data = *d++; // OverloadedOperatorKind
11750b57cec5SDimitry Andric     break;
11760b57cec5SDimitry Andric   case DeclarationName::CXXConstructorName:
11770b57cec5SDimitry Andric   case DeclarationName::CXXDestructorName:
11780b57cec5SDimitry Andric   case DeclarationName::CXXConversionFunctionName:
11790b57cec5SDimitry Andric   case DeclarationName::CXXUsingDirective:
11800b57cec5SDimitry Andric     Data = 0;
11810b57cec5SDimitry Andric     break;
11820b57cec5SDimitry Andric   }
11830b57cec5SDimitry Andric 
11840b57cec5SDimitry Andric   return DeclarationNameKey(Kind, Data);
11850b57cec5SDimitry Andric }
11860b57cec5SDimitry Andric 
11870b57cec5SDimitry Andric void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
11880b57cec5SDimitry Andric                                                  const unsigned char *d,
11890b57cec5SDimitry Andric                                                  unsigned DataLen,
11900b57cec5SDimitry Andric                                                  data_type_builder &Val) {
11910b57cec5SDimitry Andric   using namespace llvm::support;
11920b57cec5SDimitry Andric 
11930b57cec5SDimitry Andric   for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
11940b57cec5SDimitry Andric     uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
11950b57cec5SDimitry Andric     Val.insert(Reader.getGlobalDeclID(F, LocalID));
11960b57cec5SDimitry Andric   }
11970b57cec5SDimitry Andric }
11980b57cec5SDimitry Andric 
11990b57cec5SDimitry Andric bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
12000b57cec5SDimitry Andric                                               BitstreamCursor &Cursor,
12010b57cec5SDimitry Andric                                               uint64_t Offset,
12020b57cec5SDimitry Andric                                               DeclContext *DC) {
12030b57cec5SDimitry Andric   assert(Offset != 0);
12040b57cec5SDimitry Andric 
12050b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Cursor);
12060b57cec5SDimitry Andric   if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
12070b57cec5SDimitry Andric     Error(std::move(Err));
12080b57cec5SDimitry Andric     return true;
12090b57cec5SDimitry Andric   }
12100b57cec5SDimitry Andric 
12110b57cec5SDimitry Andric   RecordData Record;
12120b57cec5SDimitry Andric   StringRef Blob;
12130b57cec5SDimitry Andric   Expected<unsigned> MaybeCode = Cursor.ReadCode();
12140b57cec5SDimitry Andric   if (!MaybeCode) {
12150b57cec5SDimitry Andric     Error(MaybeCode.takeError());
12160b57cec5SDimitry Andric     return true;
12170b57cec5SDimitry Andric   }
12180b57cec5SDimitry Andric   unsigned Code = MaybeCode.get();
12190b57cec5SDimitry Andric 
12200b57cec5SDimitry Andric   Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
12210b57cec5SDimitry Andric   if (!MaybeRecCode) {
12220b57cec5SDimitry Andric     Error(MaybeRecCode.takeError());
12230b57cec5SDimitry Andric     return true;
12240b57cec5SDimitry Andric   }
12250b57cec5SDimitry Andric   unsigned RecCode = MaybeRecCode.get();
12260b57cec5SDimitry Andric   if (RecCode != DECL_CONTEXT_LEXICAL) {
12270b57cec5SDimitry Andric     Error("Expected lexical block");
12280b57cec5SDimitry Andric     return true;
12290b57cec5SDimitry Andric   }
12300b57cec5SDimitry Andric 
12310b57cec5SDimitry Andric   assert(!isa<TranslationUnitDecl>(DC) &&
12320b57cec5SDimitry Andric          "expected a TU_UPDATE_LEXICAL record for TU");
12330b57cec5SDimitry Andric   // If we are handling a C++ class template instantiation, we can see multiple
12340b57cec5SDimitry Andric   // lexical updates for the same record. It's important that we select only one
12350b57cec5SDimitry Andric   // of them, so that field numbering works properly. Just pick the first one we
12360b57cec5SDimitry Andric   // see.
12370b57cec5SDimitry Andric   auto &Lex = LexicalDecls[DC];
12380b57cec5SDimitry Andric   if (!Lex.first) {
12390b57cec5SDimitry Andric     Lex = std::make_pair(
1240bdd1243dSDimitry Andric         &M, llvm::ArrayRef(
12410b57cec5SDimitry Andric                 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
12420b57cec5SDimitry Andric                     Blob.data()),
12430b57cec5SDimitry Andric                 Blob.size() / 4));
12440b57cec5SDimitry Andric   }
12450b57cec5SDimitry Andric   DC->setHasExternalLexicalStorage(true);
12460b57cec5SDimitry Andric   return false;
12470b57cec5SDimitry Andric }
12480b57cec5SDimitry Andric 
12490b57cec5SDimitry Andric bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
12500b57cec5SDimitry Andric                                               BitstreamCursor &Cursor,
12510b57cec5SDimitry Andric                                               uint64_t Offset,
12520b57cec5SDimitry Andric                                               DeclID ID) {
12530b57cec5SDimitry Andric   assert(Offset != 0);
12540b57cec5SDimitry Andric 
12550b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Cursor);
12560b57cec5SDimitry Andric   if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
12570b57cec5SDimitry Andric     Error(std::move(Err));
12580b57cec5SDimitry Andric     return true;
12590b57cec5SDimitry Andric   }
12600b57cec5SDimitry Andric 
12610b57cec5SDimitry Andric   RecordData Record;
12620b57cec5SDimitry Andric   StringRef Blob;
12630b57cec5SDimitry Andric   Expected<unsigned> MaybeCode = Cursor.ReadCode();
12640b57cec5SDimitry Andric   if (!MaybeCode) {
12650b57cec5SDimitry Andric     Error(MaybeCode.takeError());
12660b57cec5SDimitry Andric     return true;
12670b57cec5SDimitry Andric   }
12680b57cec5SDimitry Andric   unsigned Code = MaybeCode.get();
12690b57cec5SDimitry Andric 
12700b57cec5SDimitry Andric   Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob);
12710b57cec5SDimitry Andric   if (!MaybeRecCode) {
12720b57cec5SDimitry Andric     Error(MaybeRecCode.takeError());
12730b57cec5SDimitry Andric     return true;
12740b57cec5SDimitry Andric   }
12750b57cec5SDimitry Andric   unsigned RecCode = MaybeRecCode.get();
12760b57cec5SDimitry Andric   if (RecCode != DECL_CONTEXT_VISIBLE) {
12770b57cec5SDimitry Andric     Error("Expected visible lookup table block");
12780b57cec5SDimitry Andric     return true;
12790b57cec5SDimitry Andric   }
12800b57cec5SDimitry Andric 
12810b57cec5SDimitry Andric   // We can't safely determine the primary context yet, so delay attaching the
12820b57cec5SDimitry Andric   // lookup table until we're done with recursive deserialization.
12830b57cec5SDimitry Andric   auto *Data = (const unsigned char*)Blob.data();
12840b57cec5SDimitry Andric   PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
12850b57cec5SDimitry Andric   return false;
12860b57cec5SDimitry Andric }
12870b57cec5SDimitry Andric 
12880b57cec5SDimitry Andric void ASTReader::Error(StringRef Msg) const {
12890b57cec5SDimitry Andric   Error(diag::err_fe_pch_malformed, Msg);
12900b57cec5SDimitry Andric   if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
12910b57cec5SDimitry Andric       !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
12920b57cec5SDimitry Andric     Diag(diag::note_module_cache_path)
12930b57cec5SDimitry Andric       << PP.getHeaderSearchInfo().getModuleCachePath();
12940b57cec5SDimitry Andric   }
12950b57cec5SDimitry Andric }
12960b57cec5SDimitry Andric 
1297480093f4SDimitry Andric void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2,
1298480093f4SDimitry Andric                       StringRef Arg3) const {
12990b57cec5SDimitry Andric   if (Diags.isDiagnosticInFlight())
1300480093f4SDimitry Andric     Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3);
13010b57cec5SDimitry Andric   else
1302480093f4SDimitry Andric     Diag(DiagID) << Arg1 << Arg2 << Arg3;
13030b57cec5SDimitry Andric }
13040b57cec5SDimitry Andric 
13050b57cec5SDimitry Andric void ASTReader::Error(llvm::Error &&Err) const {
1306349cc55cSDimitry Andric   llvm::Error RemainingErr =
1307349cc55cSDimitry Andric       handleErrors(std::move(Err), [this](const DiagnosticError &E) {
1308349cc55cSDimitry Andric         auto Diag = E.getDiagnostic().second;
1309349cc55cSDimitry Andric 
1310349cc55cSDimitry Andric         // Ideally we'd just emit it, but have to handle a possible in-flight
1311349cc55cSDimitry Andric         // diagnostic. Note that the location is currently ignored as well.
1312349cc55cSDimitry Andric         auto NumArgs = Diag.getStorage()->NumDiagArgs;
1313349cc55cSDimitry Andric         assert(NumArgs <= 3 && "Can only have up to 3 arguments");
1314349cc55cSDimitry Andric         StringRef Arg1, Arg2, Arg3;
1315349cc55cSDimitry Andric         switch (NumArgs) {
1316349cc55cSDimitry Andric         case 3:
1317349cc55cSDimitry Andric           Arg3 = Diag.getStringArg(2);
1318bdd1243dSDimitry Andric           [[fallthrough]];
1319349cc55cSDimitry Andric         case 2:
1320349cc55cSDimitry Andric           Arg2 = Diag.getStringArg(1);
1321bdd1243dSDimitry Andric           [[fallthrough]];
1322349cc55cSDimitry Andric         case 1:
1323349cc55cSDimitry Andric           Arg1 = Diag.getStringArg(0);
1324349cc55cSDimitry Andric         }
1325349cc55cSDimitry Andric         Error(Diag.getDiagID(), Arg1, Arg2, Arg3);
1326349cc55cSDimitry Andric       });
1327349cc55cSDimitry Andric   if (RemainingErr)
1328349cc55cSDimitry Andric     Error(toString(std::move(RemainingErr)));
13290b57cec5SDimitry Andric }
13300b57cec5SDimitry Andric 
13310b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
13320b57cec5SDimitry Andric // Source Manager Deserialization
13330b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
13340b57cec5SDimitry Andric 
13350b57cec5SDimitry Andric /// Read the line table in the source manager block.
1336349cc55cSDimitry Andric void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) {
13370b57cec5SDimitry Andric   unsigned Idx = 0;
13380b57cec5SDimitry Andric   LineTableInfo &LineTable = SourceMgr.getLineTable();
13390b57cec5SDimitry Andric 
13400b57cec5SDimitry Andric   // Parse the file names
13410b57cec5SDimitry Andric   std::map<int, int> FileIDs;
13420b57cec5SDimitry Andric   FileIDs[-1] = -1; // For unspecified filenames.
13430b57cec5SDimitry Andric   for (unsigned I = 0; Record[Idx]; ++I) {
13440b57cec5SDimitry Andric     // Extract the file name
13450b57cec5SDimitry Andric     auto Filename = ReadPath(F, Record, Idx);
13460b57cec5SDimitry Andric     FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
13470b57cec5SDimitry Andric   }
13480b57cec5SDimitry Andric   ++Idx;
13490b57cec5SDimitry Andric 
13500b57cec5SDimitry Andric   // Parse the line entries
13510b57cec5SDimitry Andric   std::vector<LineEntry> Entries;
13520b57cec5SDimitry Andric   while (Idx < Record.size()) {
1353bdd1243dSDimitry Andric     FileID FID = ReadFileID(F, Record, Idx);
13540b57cec5SDimitry Andric 
13550b57cec5SDimitry Andric     // Extract the line entries
13560b57cec5SDimitry Andric     unsigned NumEntries = Record[Idx++];
13570b57cec5SDimitry Andric     assert(NumEntries && "no line entries for file ID");
13580b57cec5SDimitry Andric     Entries.clear();
13590b57cec5SDimitry Andric     Entries.reserve(NumEntries);
13600b57cec5SDimitry Andric     for (unsigned I = 0; I != NumEntries; ++I) {
13610b57cec5SDimitry Andric       unsigned FileOffset = Record[Idx++];
13620b57cec5SDimitry Andric       unsigned LineNo = Record[Idx++];
13630b57cec5SDimitry Andric       int FilenameID = FileIDs[Record[Idx++]];
13640b57cec5SDimitry Andric       SrcMgr::CharacteristicKind FileKind
13650b57cec5SDimitry Andric         = (SrcMgr::CharacteristicKind)Record[Idx++];
13660b57cec5SDimitry Andric       unsigned IncludeOffset = Record[Idx++];
13670b57cec5SDimitry Andric       Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
13680b57cec5SDimitry Andric                                        FileKind, IncludeOffset));
13690b57cec5SDimitry Andric     }
1370bdd1243dSDimitry Andric     LineTable.AddEntry(FID, Entries);
13710b57cec5SDimitry Andric   }
13720b57cec5SDimitry Andric }
13730b57cec5SDimitry Andric 
13740b57cec5SDimitry Andric /// Read a source manager block
1375349cc55cSDimitry Andric llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
13760b57cec5SDimitry Andric   using namespace SrcMgr;
13770b57cec5SDimitry Andric 
13780b57cec5SDimitry Andric   BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
13790b57cec5SDimitry Andric 
13800b57cec5SDimitry Andric   // Set the source-location entry cursor to the current position in
13810b57cec5SDimitry Andric   // the stream. This cursor will be used to read the contents of the
13820b57cec5SDimitry Andric   // source manager block initially, and then lazily read
13830b57cec5SDimitry Andric   // source-location entries as needed.
13840b57cec5SDimitry Andric   SLocEntryCursor = F.Stream;
13850b57cec5SDimitry Andric 
13860b57cec5SDimitry Andric   // The stream itself is going to skip over the source manager block.
1387349cc55cSDimitry Andric   if (llvm::Error Err = F.Stream.SkipBlock())
1388349cc55cSDimitry Andric     return Err;
13890b57cec5SDimitry Andric 
13900b57cec5SDimitry Andric   // Enter the source manager block.
1391349cc55cSDimitry Andric   if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID))
1392349cc55cSDimitry Andric     return Err;
13935ffd83dbSDimitry Andric   F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo();
13940b57cec5SDimitry Andric 
13950b57cec5SDimitry Andric   RecordData Record;
13960b57cec5SDimitry Andric   while (true) {
13970b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeE =
13980b57cec5SDimitry Andric         SLocEntryCursor.advanceSkippingSubblocks();
1399349cc55cSDimitry Andric     if (!MaybeE)
1400349cc55cSDimitry Andric       return MaybeE.takeError();
14010b57cec5SDimitry Andric     llvm::BitstreamEntry E = MaybeE.get();
14020b57cec5SDimitry Andric 
14030b57cec5SDimitry Andric     switch (E.Kind) {
14040b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
14050b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
1406349cc55cSDimitry Andric       return llvm::createStringError(std::errc::illegal_byte_sequence,
1407349cc55cSDimitry Andric                                      "malformed block record in AST file");
14080b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
1409349cc55cSDimitry Andric       return llvm::Error::success();
14100b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
14110b57cec5SDimitry Andric       // The interesting case.
14120b57cec5SDimitry Andric       break;
14130b57cec5SDimitry Andric     }
14140b57cec5SDimitry Andric 
14150b57cec5SDimitry Andric     // Read a record.
14160b57cec5SDimitry Andric     Record.clear();
14170b57cec5SDimitry Andric     StringRef Blob;
14180b57cec5SDimitry Andric     Expected<unsigned> MaybeRecord =
14190b57cec5SDimitry Andric         SLocEntryCursor.readRecord(E.ID, Record, &Blob);
1420349cc55cSDimitry Andric     if (!MaybeRecord)
1421349cc55cSDimitry Andric       return MaybeRecord.takeError();
14220b57cec5SDimitry Andric     switch (MaybeRecord.get()) {
14230b57cec5SDimitry Andric     default:  // Default behavior: ignore.
14240b57cec5SDimitry Andric       break;
14250b57cec5SDimitry Andric 
14260b57cec5SDimitry Andric     case SM_SLOC_FILE_ENTRY:
14270b57cec5SDimitry Andric     case SM_SLOC_BUFFER_ENTRY:
14280b57cec5SDimitry Andric     case SM_SLOC_EXPANSION_ENTRY:
14290b57cec5SDimitry Andric       // Once we hit one of the source location entries, we're done.
1430349cc55cSDimitry Andric       return llvm::Error::success();
14310b57cec5SDimitry Andric     }
14320b57cec5SDimitry Andric   }
14330b57cec5SDimitry Andric }
14340b57cec5SDimitry Andric 
14350b57cec5SDimitry Andric bool ASTReader::ReadSLocEntry(int ID) {
14360b57cec5SDimitry Andric   if (ID == 0)
14370b57cec5SDimitry Andric     return false;
14380b57cec5SDimitry Andric 
14390b57cec5SDimitry Andric   if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
14400b57cec5SDimitry Andric     Error("source location entry ID out-of-range for AST file");
14410b57cec5SDimitry Andric     return true;
14420b57cec5SDimitry Andric   }
14430b57cec5SDimitry Andric 
14440b57cec5SDimitry Andric   // Local helper to read the (possibly-compressed) buffer data following the
14450b57cec5SDimitry Andric   // entry record.
14460b57cec5SDimitry Andric   auto ReadBuffer = [this](
14470b57cec5SDimitry Andric       BitstreamCursor &SLocEntryCursor,
14480b57cec5SDimitry Andric       StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
14490b57cec5SDimitry Andric     RecordData Record;
14500b57cec5SDimitry Andric     StringRef Blob;
14510b57cec5SDimitry Andric     Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode();
14520b57cec5SDimitry Andric     if (!MaybeCode) {
14530b57cec5SDimitry Andric       Error(MaybeCode.takeError());
14540b57cec5SDimitry Andric       return nullptr;
14550b57cec5SDimitry Andric     }
14560b57cec5SDimitry Andric     unsigned Code = MaybeCode.get();
14570b57cec5SDimitry Andric 
14580b57cec5SDimitry Andric     Expected<unsigned> MaybeRecCode =
14590b57cec5SDimitry Andric         SLocEntryCursor.readRecord(Code, Record, &Blob);
14600b57cec5SDimitry Andric     if (!MaybeRecCode) {
14610b57cec5SDimitry Andric       Error(MaybeRecCode.takeError());
14620b57cec5SDimitry Andric       return nullptr;
14630b57cec5SDimitry Andric     }
14640b57cec5SDimitry Andric     unsigned RecCode = MaybeRecCode.get();
14650b57cec5SDimitry Andric 
14660b57cec5SDimitry Andric     if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1467bdd1243dSDimitry Andric       // Inspect the first byte to differentiate zlib (\x78) and zstd
1468bdd1243dSDimitry Andric       // (little-endian 0xFD2FB528).
1469bdd1243dSDimitry Andric       const llvm::compression::Format F =
1470bdd1243dSDimitry Andric           Blob.size() > 0 && Blob.data()[0] == 0x78
1471bdd1243dSDimitry Andric               ? llvm::compression::Format::Zlib
1472bdd1243dSDimitry Andric               : llvm::compression::Format::Zstd;
1473bdd1243dSDimitry Andric       if (const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1474bdd1243dSDimitry Andric         Error(Reason);
14750b57cec5SDimitry Andric         return nullptr;
14760b57cec5SDimitry Andric       }
1477bdd1243dSDimitry Andric       SmallVector<uint8_t, 0> Decompressed;
1478bdd1243dSDimitry Andric       if (llvm::Error E = llvm::compression::decompress(
1479bdd1243dSDimitry Andric               F, llvm::arrayRefFromStringRef(Blob), Decompressed, Record[0])) {
14800b57cec5SDimitry Andric         Error("could not decompress embedded file contents: " +
14810b57cec5SDimitry Andric               llvm::toString(std::move(E)));
14820b57cec5SDimitry Andric         return nullptr;
14830b57cec5SDimitry Andric       }
1484753f127fSDimitry Andric       return llvm::MemoryBuffer::getMemBufferCopy(
1485bdd1243dSDimitry Andric           llvm::toStringRef(Decompressed), Name);
14860b57cec5SDimitry Andric     } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
14870b57cec5SDimitry Andric       return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
14880b57cec5SDimitry Andric     } else {
14890b57cec5SDimitry Andric       Error("AST record has invalid code");
14900b57cec5SDimitry Andric       return nullptr;
14910b57cec5SDimitry Andric     }
14920b57cec5SDimitry Andric   };
14930b57cec5SDimitry Andric 
14940b57cec5SDimitry Andric   ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
14950b57cec5SDimitry Andric   if (llvm::Error Err = F->SLocEntryCursor.JumpToBit(
14965ffd83dbSDimitry Andric           F->SLocEntryOffsetsBase +
14970b57cec5SDimitry Andric           F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) {
14980b57cec5SDimitry Andric     Error(std::move(Err));
14990b57cec5SDimitry Andric     return true;
15000b57cec5SDimitry Andric   }
15010b57cec5SDimitry Andric 
15020b57cec5SDimitry Andric   BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1503fe6060f1SDimitry Andric   SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset;
15040b57cec5SDimitry Andric 
15050b57cec5SDimitry Andric   ++NumSLocEntriesRead;
15060b57cec5SDimitry Andric   Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance();
15070b57cec5SDimitry Andric   if (!MaybeEntry) {
15080b57cec5SDimitry Andric     Error(MaybeEntry.takeError());
15090b57cec5SDimitry Andric     return true;
15100b57cec5SDimitry Andric   }
15110b57cec5SDimitry Andric   llvm::BitstreamEntry Entry = MaybeEntry.get();
15120b57cec5SDimitry Andric 
15130b57cec5SDimitry Andric   if (Entry.Kind != llvm::BitstreamEntry::Record) {
15140b57cec5SDimitry Andric     Error("incorrectly-formatted source location entry in AST file");
15150b57cec5SDimitry Andric     return true;
15160b57cec5SDimitry Andric   }
15170b57cec5SDimitry Andric 
15180b57cec5SDimitry Andric   RecordData Record;
15190b57cec5SDimitry Andric   StringRef Blob;
15200b57cec5SDimitry Andric   Expected<unsigned> MaybeSLOC =
15210b57cec5SDimitry Andric       SLocEntryCursor.readRecord(Entry.ID, Record, &Blob);
15220b57cec5SDimitry Andric   if (!MaybeSLOC) {
15230b57cec5SDimitry Andric     Error(MaybeSLOC.takeError());
15240b57cec5SDimitry Andric     return true;
15250b57cec5SDimitry Andric   }
15260b57cec5SDimitry Andric   switch (MaybeSLOC.get()) {
15270b57cec5SDimitry Andric   default:
15280b57cec5SDimitry Andric     Error("incorrectly-formatted source location entry in AST file");
15290b57cec5SDimitry Andric     return true;
15300b57cec5SDimitry Andric 
15310b57cec5SDimitry Andric   case SM_SLOC_FILE_ENTRY: {
15320b57cec5SDimitry Andric     // We will detect whether a file changed and return 'Failure' for it, but
15330b57cec5SDimitry Andric     // we will also try to fail gracefully by setting up the SLocEntry.
15340b57cec5SDimitry Andric     unsigned InputID = Record[4];
15350b57cec5SDimitry Andric     InputFile IF = getInputFile(*F, InputID);
1536bdd1243dSDimitry Andric     OptionalFileEntryRef File = IF.getFile();
15370b57cec5SDimitry Andric     bool OverriddenBuffer = IF.isOverridden();
15380b57cec5SDimitry Andric 
15390b57cec5SDimitry Andric     // Note that we only check if a File was returned. If it was out-of-date
15400b57cec5SDimitry Andric     // we have complained but we will continue creating a FileID to recover
15410b57cec5SDimitry Andric     // gracefully.
15420b57cec5SDimitry Andric     if (!File)
15430b57cec5SDimitry Andric       return true;
15440b57cec5SDimitry Andric 
15450b57cec5SDimitry Andric     SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
15460b57cec5SDimitry Andric     if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
15470b57cec5SDimitry Andric       // This is the module's main file.
15480b57cec5SDimitry Andric       IncludeLoc = getImportLocation(F);
15490b57cec5SDimitry Andric     }
15500b57cec5SDimitry Andric     SrcMgr::CharacteristicKind
15510b57cec5SDimitry Andric       FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1552e8d8bef9SDimitry Andric     FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID,
1553e8d8bef9SDimitry Andric                                         BaseOffset + Record[0]);
15540b57cec5SDimitry Andric     SrcMgr::FileInfo &FileInfo =
15550b57cec5SDimitry Andric           const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
15560b57cec5SDimitry Andric     FileInfo.NumCreatedFIDs = Record[5];
15570b57cec5SDimitry Andric     if (Record[3])
15580b57cec5SDimitry Andric       FileInfo.setHasLineDirectives();
15590b57cec5SDimitry Andric 
15600b57cec5SDimitry Andric     unsigned NumFileDecls = Record[7];
15610b57cec5SDimitry Andric     if (NumFileDecls && ContextObj) {
1562a7dea167SDimitry Andric       const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
15630b57cec5SDimitry Andric       assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1564bdd1243dSDimitry Andric       FileDeclIDs[FID] =
1565bdd1243dSDimitry Andric           FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls));
15660b57cec5SDimitry Andric     }
15670b57cec5SDimitry Andric 
1568e8d8bef9SDimitry Andric     const SrcMgr::ContentCache &ContentCache =
1569e8d8bef9SDimitry Andric         SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter));
1570e8d8bef9SDimitry Andric     if (OverriddenBuffer && !ContentCache.BufferOverridden &&
1571e8d8bef9SDimitry Andric         ContentCache.ContentsEntry == ContentCache.OrigEntry &&
1572e8d8bef9SDimitry Andric         !ContentCache.getBufferIfLoaded()) {
15730b57cec5SDimitry Andric       auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
15740b57cec5SDimitry Andric       if (!Buffer)
15750b57cec5SDimitry Andric         return true;
1576e8d8bef9SDimitry Andric       SourceMgr.overrideFileContents(*File, std::move(Buffer));
15770b57cec5SDimitry Andric     }
15780b57cec5SDimitry Andric 
15790b57cec5SDimitry Andric     break;
15800b57cec5SDimitry Andric   }
15810b57cec5SDimitry Andric 
15820b57cec5SDimitry Andric   case SM_SLOC_BUFFER_ENTRY: {
15830b57cec5SDimitry Andric     const char *Name = Blob.data();
15840b57cec5SDimitry Andric     unsigned Offset = Record[0];
15850b57cec5SDimitry Andric     SrcMgr::CharacteristicKind
15860b57cec5SDimitry Andric       FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
15870b57cec5SDimitry Andric     SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
15880b57cec5SDimitry Andric     if (IncludeLoc.isInvalid() && F->isModule()) {
15890b57cec5SDimitry Andric       IncludeLoc = getImportLocation(F);
15900b57cec5SDimitry Andric     }
15910b57cec5SDimitry Andric 
15920b57cec5SDimitry Andric     auto Buffer = ReadBuffer(SLocEntryCursor, Name);
15930b57cec5SDimitry Andric     if (!Buffer)
15940b57cec5SDimitry Andric       return true;
1595*06c3fb27SDimitry Andric     FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
15960b57cec5SDimitry Andric                                         BaseOffset + Offset, IncludeLoc);
1597*06c3fb27SDimitry Andric     if (Record[3]) {
1598*06c3fb27SDimitry Andric       auto &FileInfo =
1599*06c3fb27SDimitry Andric           const_cast<SrcMgr::FileInfo &>(SourceMgr.getSLocEntry(FID).getFile());
1600*06c3fb27SDimitry Andric       FileInfo.setHasLineDirectives();
1601*06c3fb27SDimitry Andric     }
16020b57cec5SDimitry Andric     break;
16030b57cec5SDimitry Andric   }
16040b57cec5SDimitry Andric 
16050b57cec5SDimitry Andric   case SM_SLOC_EXPANSION_ENTRY: {
160681ad6265SDimitry Andric     LocSeq::State Seq;
160781ad6265SDimitry Andric     SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1], Seq);
160881ad6265SDimitry Andric     SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2], Seq);
160981ad6265SDimitry Andric     SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3], Seq);
161081ad6265SDimitry Andric     SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
161181ad6265SDimitry Andric                                  Record[5], Record[4], ID,
16120b57cec5SDimitry Andric                                  BaseOffset + Record[0]);
16130b57cec5SDimitry Andric     break;
16140b57cec5SDimitry Andric   }
16150b57cec5SDimitry Andric   }
16160b57cec5SDimitry Andric 
16170b57cec5SDimitry Andric   return false;
16180b57cec5SDimitry Andric }
16190b57cec5SDimitry Andric 
16200b57cec5SDimitry Andric std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
16210b57cec5SDimitry Andric   if (ID == 0)
16220b57cec5SDimitry Andric     return std::make_pair(SourceLocation(), "");
16230b57cec5SDimitry Andric 
16240b57cec5SDimitry Andric   if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
16250b57cec5SDimitry Andric     Error("source location entry ID out-of-range for AST file");
16260b57cec5SDimitry Andric     return std::make_pair(SourceLocation(), "");
16270b57cec5SDimitry Andric   }
16280b57cec5SDimitry Andric 
16290b57cec5SDimitry Andric   // Find which module file this entry lands in.
16300b57cec5SDimitry Andric   ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
16310b57cec5SDimitry Andric   if (!M->isModule())
16320b57cec5SDimitry Andric     return std::make_pair(SourceLocation(), "");
16330b57cec5SDimitry Andric 
16340b57cec5SDimitry Andric   // FIXME: Can we map this down to a particular submodule? That would be
16350b57cec5SDimitry Andric   // ideal.
16360b57cec5SDimitry Andric   return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
16370b57cec5SDimitry Andric }
16380b57cec5SDimitry Andric 
16390b57cec5SDimitry Andric /// Find the location where the module F is imported.
16400b57cec5SDimitry Andric SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
16410b57cec5SDimitry Andric   if (F->ImportLoc.isValid())
16420b57cec5SDimitry Andric     return F->ImportLoc;
16430b57cec5SDimitry Andric 
16440b57cec5SDimitry Andric   // Otherwise we have a PCH. It's considered to be "imported" at the first
16450b57cec5SDimitry Andric   // location of its includer.
16460b57cec5SDimitry Andric   if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
16470b57cec5SDimitry Andric     // Main file is the importer.
16480b57cec5SDimitry Andric     assert(SourceMgr.getMainFileID().isValid() && "missing main file");
16490b57cec5SDimitry Andric     return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
16500b57cec5SDimitry Andric   }
16510b57cec5SDimitry Andric   return F->ImportedBy[0]->FirstLoc;
16520b57cec5SDimitry Andric }
16530b57cec5SDimitry Andric 
16540b57cec5SDimitry Andric /// Enter a subblock of the specified BlockID with the specified cursor. Read
16550b57cec5SDimitry Andric /// the abbreviations that are at the top of the block and then leave the cursor
16560b57cec5SDimitry Andric /// pointing into the block.
1657349cc55cSDimitry Andric llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor,
1658349cc55cSDimitry Andric                                         unsigned BlockID,
16595ffd83dbSDimitry Andric                                         uint64_t *StartOfBlockOffset) {
1660349cc55cSDimitry Andric   if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
1661349cc55cSDimitry Andric     return Err;
16620b57cec5SDimitry Andric 
16635ffd83dbSDimitry Andric   if (StartOfBlockOffset)
16645ffd83dbSDimitry Andric     *StartOfBlockOffset = Cursor.GetCurrentBitNo();
16655ffd83dbSDimitry Andric 
16660b57cec5SDimitry Andric   while (true) {
16670b57cec5SDimitry Andric     uint64_t Offset = Cursor.GetCurrentBitNo();
16680b57cec5SDimitry Andric     Expected<unsigned> MaybeCode = Cursor.ReadCode();
1669349cc55cSDimitry Andric     if (!MaybeCode)
1670349cc55cSDimitry Andric       return MaybeCode.takeError();
16710b57cec5SDimitry Andric     unsigned Code = MaybeCode.get();
16720b57cec5SDimitry Andric 
16730b57cec5SDimitry Andric     // We expect all abbrevs to be at the start of the block.
16740b57cec5SDimitry Andric     if (Code != llvm::bitc::DEFINE_ABBREV) {
1675349cc55cSDimitry Andric       if (llvm::Error Err = Cursor.JumpToBit(Offset))
1676349cc55cSDimitry Andric         return Err;
1677349cc55cSDimitry Andric       return llvm::Error::success();
16780b57cec5SDimitry Andric     }
1679349cc55cSDimitry Andric     if (llvm::Error Err = Cursor.ReadAbbrevRecord())
1680349cc55cSDimitry Andric       return Err;
16810b57cec5SDimitry Andric   }
16820b57cec5SDimitry Andric }
16830b57cec5SDimitry Andric 
16840b57cec5SDimitry Andric Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
16850b57cec5SDimitry Andric                            unsigned &Idx) {
16860b57cec5SDimitry Andric   Token Tok;
16870b57cec5SDimitry Andric   Tok.startToken();
16880b57cec5SDimitry Andric   Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1689bdd1243dSDimitry Andric   Tok.setKind((tok::TokenKind)Record[Idx++]);
1690bdd1243dSDimitry Andric   Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1691bdd1243dSDimitry Andric 
1692bdd1243dSDimitry Andric   if (Tok.isAnnotation()) {
1693bdd1243dSDimitry Andric     Tok.setAnnotationEndLoc(ReadSourceLocation(F, Record, Idx));
1694bdd1243dSDimitry Andric     switch (Tok.getKind()) {
1695bdd1243dSDimitry Andric     case tok::annot_pragma_loop_hint: {
1696bdd1243dSDimitry Andric       auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo;
1697bdd1243dSDimitry Andric       Info->PragmaName = ReadToken(F, Record, Idx);
1698bdd1243dSDimitry Andric       Info->Option = ReadToken(F, Record, Idx);
1699bdd1243dSDimitry Andric       unsigned NumTokens = Record[Idx++];
1700bdd1243dSDimitry Andric       SmallVector<Token, 4> Toks;
1701bdd1243dSDimitry Andric       Toks.reserve(NumTokens);
1702bdd1243dSDimitry Andric       for (unsigned I = 0; I < NumTokens; ++I)
1703bdd1243dSDimitry Andric         Toks.push_back(ReadToken(F, Record, Idx));
1704bdd1243dSDimitry Andric       Info->Toks = llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
1705bdd1243dSDimitry Andric       Tok.setAnnotationValue(static_cast<void *>(Info));
1706bdd1243dSDimitry Andric       break;
1707bdd1243dSDimitry Andric     }
1708*06c3fb27SDimitry Andric     case tok::annot_pragma_pack: {
1709*06c3fb27SDimitry Andric       auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo;
1710*06c3fb27SDimitry Andric       Info->Action = static_cast<Sema::PragmaMsStackAction>(Record[Idx++]);
1711*06c3fb27SDimitry Andric       auto SlotLabel = ReadString(Record, Idx);
1712*06c3fb27SDimitry Andric       Info->SlotLabel =
1713*06c3fb27SDimitry Andric           llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
1714*06c3fb27SDimitry Andric       Info->Alignment = ReadToken(F, Record, Idx);
1715*06c3fb27SDimitry Andric       Tok.setAnnotationValue(static_cast<void *>(Info));
1716*06c3fb27SDimitry Andric       break;
1717*06c3fb27SDimitry Andric     }
1718bdd1243dSDimitry Andric     // Some annotation tokens do not use the PtrData field.
1719bdd1243dSDimitry Andric     case tok::annot_pragma_openmp:
1720bdd1243dSDimitry Andric     case tok::annot_pragma_openmp_end:
1721bdd1243dSDimitry Andric     case tok::annot_pragma_unused:
1722bdd1243dSDimitry Andric       break;
1723bdd1243dSDimitry Andric     default:
1724bdd1243dSDimitry Andric       llvm_unreachable("missing deserialization code for annotation token");
1725bdd1243dSDimitry Andric     }
1726bdd1243dSDimitry Andric   } else {
17270b57cec5SDimitry Andric     Tok.setLength(Record[Idx++]);
17280b57cec5SDimitry Andric     if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
17290b57cec5SDimitry Andric       Tok.setIdentifierInfo(II);
1730bdd1243dSDimitry Andric   }
17310b57cec5SDimitry Andric   return Tok;
17320b57cec5SDimitry Andric }
17330b57cec5SDimitry Andric 
17340b57cec5SDimitry Andric MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
17350b57cec5SDimitry Andric   BitstreamCursor &Stream = F.MacroCursor;
17360b57cec5SDimitry Andric 
17370b57cec5SDimitry Andric   // Keep track of where we are in the stream, then jump back there
17380b57cec5SDimitry Andric   // after reading this macro.
17390b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Stream);
17400b57cec5SDimitry Andric 
17410b57cec5SDimitry Andric   if (llvm::Error Err = Stream.JumpToBit(Offset)) {
17420b57cec5SDimitry Andric     // FIXME this drops errors on the floor.
17430b57cec5SDimitry Andric     consumeError(std::move(Err));
17440b57cec5SDimitry Andric     return nullptr;
17450b57cec5SDimitry Andric   }
17460b57cec5SDimitry Andric   RecordData Record;
17470b57cec5SDimitry Andric   SmallVector<IdentifierInfo*, 16> MacroParams;
17480b57cec5SDimitry Andric   MacroInfo *Macro = nullptr;
174981ad6265SDimitry Andric   llvm::MutableArrayRef<Token> MacroTokens;
17500b57cec5SDimitry Andric 
17510b57cec5SDimitry Andric   while (true) {
17520b57cec5SDimitry Andric     // Advance to the next record, but if we get to the end of the block, don't
17530b57cec5SDimitry Andric     // pop it (removing all the abbreviations from the cursor) since we want to
17540b57cec5SDimitry Andric     // be able to reseek within the block and read entries.
17550b57cec5SDimitry Andric     unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
17560b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry =
17570b57cec5SDimitry Andric         Stream.advanceSkippingSubblocks(Flags);
17580b57cec5SDimitry Andric     if (!MaybeEntry) {
17590b57cec5SDimitry Andric       Error(MaybeEntry.takeError());
17600b57cec5SDimitry Andric       return Macro;
17610b57cec5SDimitry Andric     }
17620b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
17630b57cec5SDimitry Andric 
17640b57cec5SDimitry Andric     switch (Entry.Kind) {
17650b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
17660b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
17670b57cec5SDimitry Andric       Error("malformed block record in AST file");
17680b57cec5SDimitry Andric       return Macro;
17690b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
17700b57cec5SDimitry Andric       return Macro;
17710b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
17720b57cec5SDimitry Andric       // The interesting case.
17730b57cec5SDimitry Andric       break;
17740b57cec5SDimitry Andric     }
17750b57cec5SDimitry Andric 
17760b57cec5SDimitry Andric     // Read a record.
17770b57cec5SDimitry Andric     Record.clear();
17780b57cec5SDimitry Andric     PreprocessorRecordTypes RecType;
17790b57cec5SDimitry Andric     if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record))
17800b57cec5SDimitry Andric       RecType = (PreprocessorRecordTypes)MaybeRecType.get();
17810b57cec5SDimitry Andric     else {
17820b57cec5SDimitry Andric       Error(MaybeRecType.takeError());
17830b57cec5SDimitry Andric       return Macro;
17840b57cec5SDimitry Andric     }
17850b57cec5SDimitry Andric     switch (RecType) {
17860b57cec5SDimitry Andric     case PP_MODULE_MACRO:
17870b57cec5SDimitry Andric     case PP_MACRO_DIRECTIVE_HISTORY:
17880b57cec5SDimitry Andric       return Macro;
17890b57cec5SDimitry Andric 
17900b57cec5SDimitry Andric     case PP_MACRO_OBJECT_LIKE:
17910b57cec5SDimitry Andric     case PP_MACRO_FUNCTION_LIKE: {
17920b57cec5SDimitry Andric       // If we already have a macro, that means that we've hit the end
17930b57cec5SDimitry Andric       // of the definition of the macro we were looking for. We're
17940b57cec5SDimitry Andric       // done.
17950b57cec5SDimitry Andric       if (Macro)
17960b57cec5SDimitry Andric         return Macro;
17970b57cec5SDimitry Andric 
17980b57cec5SDimitry Andric       unsigned NextIndex = 1; // Skip identifier ID.
17990b57cec5SDimitry Andric       SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
18000b57cec5SDimitry Andric       MacroInfo *MI = PP.AllocateMacroInfo(Loc);
18010b57cec5SDimitry Andric       MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
18020b57cec5SDimitry Andric       MI->setIsUsed(Record[NextIndex++]);
18030b57cec5SDimitry Andric       MI->setUsedForHeaderGuard(Record[NextIndex++]);
180481ad6265SDimitry Andric       MacroTokens = MI->allocateTokens(Record[NextIndex++],
180581ad6265SDimitry Andric                                        PP.getPreprocessorAllocator());
18060b57cec5SDimitry Andric       if (RecType == PP_MACRO_FUNCTION_LIKE) {
18070b57cec5SDimitry Andric         // Decode function-like macro info.
18080b57cec5SDimitry Andric         bool isC99VarArgs = Record[NextIndex++];
18090b57cec5SDimitry Andric         bool isGNUVarArgs = Record[NextIndex++];
18100b57cec5SDimitry Andric         bool hasCommaPasting = Record[NextIndex++];
18110b57cec5SDimitry Andric         MacroParams.clear();
18120b57cec5SDimitry Andric         unsigned NumArgs = Record[NextIndex++];
18130b57cec5SDimitry Andric         for (unsigned i = 0; i != NumArgs; ++i)
18140b57cec5SDimitry Andric           MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++]));
18150b57cec5SDimitry Andric 
18160b57cec5SDimitry Andric         // Install function-like macro info.
18170b57cec5SDimitry Andric         MI->setIsFunctionLike();
18180b57cec5SDimitry Andric         if (isC99VarArgs) MI->setIsC99Varargs();
18190b57cec5SDimitry Andric         if (isGNUVarArgs) MI->setIsGNUVarargs();
18200b57cec5SDimitry Andric         if (hasCommaPasting) MI->setHasCommaPasting();
18210b57cec5SDimitry Andric         MI->setParameterList(MacroParams, PP.getPreprocessorAllocator());
18220b57cec5SDimitry Andric       }
18230b57cec5SDimitry Andric 
18240b57cec5SDimitry Andric       // Remember that we saw this macro last so that we add the tokens that
18250b57cec5SDimitry Andric       // form its body to it.
18260b57cec5SDimitry Andric       Macro = MI;
18270b57cec5SDimitry Andric 
18280b57cec5SDimitry Andric       if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
18290b57cec5SDimitry Andric           Record[NextIndex]) {
18300b57cec5SDimitry Andric         // We have a macro definition. Register the association
18310b57cec5SDimitry Andric         PreprocessedEntityID
18320b57cec5SDimitry Andric             GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
18330b57cec5SDimitry Andric         PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
18340b57cec5SDimitry Andric         PreprocessingRecord::PPEntityID PPID =
18350b57cec5SDimitry Andric             PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
18360b57cec5SDimitry Andric         MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
18370b57cec5SDimitry Andric             PPRec.getPreprocessedEntity(PPID));
18380b57cec5SDimitry Andric         if (PPDef)
18390b57cec5SDimitry Andric           PPRec.RegisterMacroDefinition(Macro, PPDef);
18400b57cec5SDimitry Andric       }
18410b57cec5SDimitry Andric 
18420b57cec5SDimitry Andric       ++NumMacrosRead;
18430b57cec5SDimitry Andric       break;
18440b57cec5SDimitry Andric     }
18450b57cec5SDimitry Andric 
18460b57cec5SDimitry Andric     case PP_TOKEN: {
18470b57cec5SDimitry Andric       // If we see a TOKEN before a PP_MACRO_*, then the file is
18480b57cec5SDimitry Andric       // erroneous, just pretend we didn't see this.
18490b57cec5SDimitry Andric       if (!Macro) break;
185081ad6265SDimitry Andric       if (MacroTokens.empty()) {
185181ad6265SDimitry Andric         Error("unexpected number of macro tokens for a macro in AST file");
185281ad6265SDimitry Andric         return Macro;
185381ad6265SDimitry Andric       }
18540b57cec5SDimitry Andric 
18550b57cec5SDimitry Andric       unsigned Idx = 0;
185681ad6265SDimitry Andric       MacroTokens[0] = ReadToken(F, Record, Idx);
185781ad6265SDimitry Andric       MacroTokens = MacroTokens.drop_front();
18580b57cec5SDimitry Andric       break;
18590b57cec5SDimitry Andric     }
18600b57cec5SDimitry Andric     }
18610b57cec5SDimitry Andric   }
18620b57cec5SDimitry Andric }
18630b57cec5SDimitry Andric 
18640b57cec5SDimitry Andric PreprocessedEntityID
18650b57cec5SDimitry Andric ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M,
18660b57cec5SDimitry Andric                                          unsigned LocalID) const {
18670b57cec5SDimitry Andric   if (!M.ModuleOffsetMap.empty())
18680b57cec5SDimitry Andric     ReadModuleOffsetMap(M);
18690b57cec5SDimitry Andric 
18700b57cec5SDimitry Andric   ContinuousRangeMap<uint32_t, int, 2>::const_iterator
18710b57cec5SDimitry Andric     I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
18720b57cec5SDimitry Andric   assert(I != M.PreprocessedEntityRemap.end()
18730b57cec5SDimitry Andric          && "Invalid index into preprocessed entity index remap");
18740b57cec5SDimitry Andric 
18750b57cec5SDimitry Andric   return LocalID + I->second;
18760b57cec5SDimitry Andric }
18770b57cec5SDimitry Andric 
1878*06c3fb27SDimitry Andric const FileEntry *HeaderFileInfoTrait::getFile(const internal_key_type &Key) {
1879*06c3fb27SDimitry Andric   FileManager &FileMgr = Reader.getFileManager();
1880*06c3fb27SDimitry Andric   if (!Key.Imported) {
1881*06c3fb27SDimitry Andric     if (auto File = FileMgr.getFile(Key.Filename))
1882*06c3fb27SDimitry Andric       return *File;
1883*06c3fb27SDimitry Andric     return nullptr;
1884*06c3fb27SDimitry Andric   }
1885*06c3fb27SDimitry Andric 
1886*06c3fb27SDimitry Andric   std::string Resolved = std::string(Key.Filename);
1887*06c3fb27SDimitry Andric   Reader.ResolveImportedPath(M, Resolved);
1888*06c3fb27SDimitry Andric   if (auto File = FileMgr.getFile(Resolved))
1889*06c3fb27SDimitry Andric     return *File;
1890*06c3fb27SDimitry Andric   return nullptr;
1891*06c3fb27SDimitry Andric }
1892*06c3fb27SDimitry Andric 
18930b57cec5SDimitry Andric unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
18940b57cec5SDimitry Andric   return llvm::hash_combine(ikey.Size, ikey.ModTime);
18950b57cec5SDimitry Andric }
18960b57cec5SDimitry Andric 
18970b57cec5SDimitry Andric HeaderFileInfoTrait::internal_key_type
18980b57cec5SDimitry Andric HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
18990b57cec5SDimitry Andric   internal_key_type ikey = {FE->getSize(),
19000b57cec5SDimitry Andric                             M.HasTimestamps ? FE->getModificationTime() : 0,
19010b57cec5SDimitry Andric                             FE->getName(), /*Imported*/ false};
19020b57cec5SDimitry Andric   return ikey;
19030b57cec5SDimitry Andric }
19040b57cec5SDimitry Andric 
19050b57cec5SDimitry Andric bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
19060b57cec5SDimitry Andric   if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
19070b57cec5SDimitry Andric     return false;
19080b57cec5SDimitry Andric 
19090b57cec5SDimitry Andric   if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
19100b57cec5SDimitry Andric     return true;
19110b57cec5SDimitry Andric 
19120b57cec5SDimitry Andric   // Determine whether the actual files are equivalent.
1913*06c3fb27SDimitry Andric   const FileEntry *FEA = getFile(a);
1914*06c3fb27SDimitry Andric   const FileEntry *FEB = getFile(b);
19150b57cec5SDimitry Andric   return FEA && FEA == FEB;
19160b57cec5SDimitry Andric }
19170b57cec5SDimitry Andric 
19180b57cec5SDimitry Andric std::pair<unsigned, unsigned>
19190b57cec5SDimitry Andric HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1920fe6060f1SDimitry Andric   return readULEBKeyDataLength(d);
19210b57cec5SDimitry Andric }
19220b57cec5SDimitry Andric 
19230b57cec5SDimitry Andric HeaderFileInfoTrait::internal_key_type
19240b57cec5SDimitry Andric HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
19250b57cec5SDimitry Andric   using namespace llvm::support;
19260b57cec5SDimitry Andric 
19270b57cec5SDimitry Andric   internal_key_type ikey;
19280b57cec5SDimitry Andric   ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
19290b57cec5SDimitry Andric   ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
19300b57cec5SDimitry Andric   ikey.Filename = (const char *)d;
19310b57cec5SDimitry Andric   ikey.Imported = true;
19320b57cec5SDimitry Andric   return ikey;
19330b57cec5SDimitry Andric }
19340b57cec5SDimitry Andric 
19350b57cec5SDimitry Andric HeaderFileInfoTrait::data_type
19360b57cec5SDimitry Andric HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
19370b57cec5SDimitry Andric                               unsigned DataLen) {
19380b57cec5SDimitry Andric   using namespace llvm::support;
19390b57cec5SDimitry Andric 
19400b57cec5SDimitry Andric   const unsigned char *End = d + DataLen;
19410b57cec5SDimitry Andric   HeaderFileInfo HFI;
19420b57cec5SDimitry Andric   unsigned Flags = *d++;
1943*06c3fb27SDimitry Andric 
1944*06c3fb27SDimitry Andric   bool Included = (Flags >> 6) & 0x01;
1945*06c3fb27SDimitry Andric   if (Included)
1946*06c3fb27SDimitry Andric     if (const FileEntry *FE = getFile(key))
1947*06c3fb27SDimitry Andric       // Not using \c Preprocessor::markIncluded(), since that would attempt to
1948*06c3fb27SDimitry Andric       // deserialize this header file info again.
1949*06c3fb27SDimitry Andric       Reader.getPreprocessor().getIncludedFiles().insert(FE);
1950*06c3fb27SDimitry Andric 
19510b57cec5SDimitry Andric   // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
19520b57cec5SDimitry Andric   HFI.isImport |= (Flags >> 5) & 0x01;
19530b57cec5SDimitry Andric   HFI.isPragmaOnce |= (Flags >> 4) & 0x01;
19540b57cec5SDimitry Andric   HFI.DirInfo = (Flags >> 1) & 0x07;
19550b57cec5SDimitry Andric   HFI.IndexHeaderMapHeader = Flags & 0x01;
19560b57cec5SDimitry Andric   HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
19570b57cec5SDimitry Andric       M, endian::readNext<uint32_t, little, unaligned>(d));
19580b57cec5SDimitry Andric   if (unsigned FrameworkOffset =
19590b57cec5SDimitry Andric           endian::readNext<uint32_t, little, unaligned>(d)) {
19600b57cec5SDimitry Andric     // The framework offset is 1 greater than the actual offset,
19610b57cec5SDimitry Andric     // since 0 is used as an indicator for "no framework name".
19620b57cec5SDimitry Andric     StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
19630b57cec5SDimitry Andric     HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
19640b57cec5SDimitry Andric   }
19650b57cec5SDimitry Andric 
19660b57cec5SDimitry Andric   assert((End - d) % 4 == 0 &&
19670b57cec5SDimitry Andric          "Wrong data length in HeaderFileInfo deserialization");
19680b57cec5SDimitry Andric   while (d != End) {
19690b57cec5SDimitry Andric     uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1970bdd1243dSDimitry Andric     auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 7);
1971bdd1243dSDimitry Andric     LocalSMID >>= 3;
19720b57cec5SDimitry Andric 
19730b57cec5SDimitry Andric     // This header is part of a module. Associate it with the module to enable
19740b57cec5SDimitry Andric     // implicit module import.
19750b57cec5SDimitry Andric     SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
19760b57cec5SDimitry Andric     Module *Mod = Reader.getSubmodule(GlobalSMID);
19770b57cec5SDimitry Andric     FileManager &FileMgr = Reader.getFileManager();
19780b57cec5SDimitry Andric     ModuleMap &ModMap =
19790b57cec5SDimitry Andric         Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
19800b57cec5SDimitry Andric 
19815ffd83dbSDimitry Andric     std::string Filename = std::string(key.Filename);
19820b57cec5SDimitry Andric     if (key.Imported)
19830b57cec5SDimitry Andric       Reader.ResolveImportedPath(M, Filename);
1984*06c3fb27SDimitry Andric     if (auto FE = FileMgr.getOptionalFileRef(Filename)) {
1985fe6060f1SDimitry Andric       // FIXME: NameAsWritten
1986*06c3fb27SDimitry Andric       Module::Header H = {std::string(key.Filename), "", *FE};
1987*06c3fb27SDimitry Andric       ModMap.addHeader(Mod, H, HeaderRole, /*Imported=*/true);
1988*06c3fb27SDimitry Andric     }
1989bdd1243dSDimitry Andric     HFI.isModuleHeader |= ModuleMap::isModular(HeaderRole);
19900b57cec5SDimitry Andric   }
19910b57cec5SDimitry Andric 
19920b57cec5SDimitry Andric   // This HeaderFileInfo was externally loaded.
19930b57cec5SDimitry Andric   HFI.External = true;
19940b57cec5SDimitry Andric   HFI.IsValid = true;
19950b57cec5SDimitry Andric   return HFI;
19960b57cec5SDimitry Andric }
19970b57cec5SDimitry Andric 
19985ffd83dbSDimitry Andric void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M,
19995ffd83dbSDimitry Andric                                 uint32_t MacroDirectivesOffset) {
20000b57cec5SDimitry Andric   assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
20010b57cec5SDimitry Andric   PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
20020b57cec5SDimitry Andric }
20030b57cec5SDimitry Andric 
20040b57cec5SDimitry Andric void ASTReader::ReadDefinedMacros() {
20050b57cec5SDimitry Andric   // Note that we are loading defined macros.
20060b57cec5SDimitry Andric   Deserializing Macros(this);
20070b57cec5SDimitry Andric 
20080b57cec5SDimitry Andric   for (ModuleFile &I : llvm::reverse(ModuleMgr)) {
20090b57cec5SDimitry Andric     BitstreamCursor &MacroCursor = I.MacroCursor;
20100b57cec5SDimitry Andric 
20110b57cec5SDimitry Andric     // If there was no preprocessor block, skip this file.
20120b57cec5SDimitry Andric     if (MacroCursor.getBitcodeBytes().empty())
20130b57cec5SDimitry Andric       continue;
20140b57cec5SDimitry Andric 
20150b57cec5SDimitry Andric     BitstreamCursor Cursor = MacroCursor;
20160b57cec5SDimitry Andric     if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
20170b57cec5SDimitry Andric       Error(std::move(Err));
20180b57cec5SDimitry Andric       return;
20190b57cec5SDimitry Andric     }
20200b57cec5SDimitry Andric 
20210b57cec5SDimitry Andric     RecordData Record;
20220b57cec5SDimitry Andric     while (true) {
20230b57cec5SDimitry Andric       Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks();
20240b57cec5SDimitry Andric       if (!MaybeE) {
20250b57cec5SDimitry Andric         Error(MaybeE.takeError());
20260b57cec5SDimitry Andric         return;
20270b57cec5SDimitry Andric       }
20280b57cec5SDimitry Andric       llvm::BitstreamEntry E = MaybeE.get();
20290b57cec5SDimitry Andric 
20300b57cec5SDimitry Andric       switch (E.Kind) {
20310b57cec5SDimitry Andric       case llvm::BitstreamEntry::SubBlock: // Handled for us already.
20320b57cec5SDimitry Andric       case llvm::BitstreamEntry::Error:
20330b57cec5SDimitry Andric         Error("malformed block record in AST file");
20340b57cec5SDimitry Andric         return;
20350b57cec5SDimitry Andric       case llvm::BitstreamEntry::EndBlock:
20360b57cec5SDimitry Andric         goto NextCursor;
20370b57cec5SDimitry Andric 
20380b57cec5SDimitry Andric       case llvm::BitstreamEntry::Record: {
20390b57cec5SDimitry Andric         Record.clear();
20400b57cec5SDimitry Andric         Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record);
20410b57cec5SDimitry Andric         if (!MaybeRecord) {
20420b57cec5SDimitry Andric           Error(MaybeRecord.takeError());
20430b57cec5SDimitry Andric           return;
20440b57cec5SDimitry Andric         }
20450b57cec5SDimitry Andric         switch (MaybeRecord.get()) {
20460b57cec5SDimitry Andric         default:  // Default behavior: ignore.
20470b57cec5SDimitry Andric           break;
20480b57cec5SDimitry Andric 
20490b57cec5SDimitry Andric         case PP_MACRO_OBJECT_LIKE:
20500b57cec5SDimitry Andric         case PP_MACRO_FUNCTION_LIKE: {
20510b57cec5SDimitry Andric           IdentifierInfo *II = getLocalIdentifier(I, Record[0]);
20520b57cec5SDimitry Andric           if (II->isOutOfDate())
20530b57cec5SDimitry Andric             updateOutOfDateIdentifier(*II);
20540b57cec5SDimitry Andric           break;
20550b57cec5SDimitry Andric         }
20560b57cec5SDimitry Andric 
20570b57cec5SDimitry Andric         case PP_TOKEN:
20580b57cec5SDimitry Andric           // Ignore tokens.
20590b57cec5SDimitry Andric           break;
20600b57cec5SDimitry Andric         }
20610b57cec5SDimitry Andric         break;
20620b57cec5SDimitry Andric       }
20630b57cec5SDimitry Andric       }
20640b57cec5SDimitry Andric     }
20650b57cec5SDimitry Andric     NextCursor:  ;
20660b57cec5SDimitry Andric   }
20670b57cec5SDimitry Andric }
20680b57cec5SDimitry Andric 
20690b57cec5SDimitry Andric namespace {
20700b57cec5SDimitry Andric 
20710b57cec5SDimitry Andric   /// Visitor class used to look up identifirs in an AST file.
20720b57cec5SDimitry Andric   class IdentifierLookupVisitor {
20730b57cec5SDimitry Andric     StringRef Name;
20740b57cec5SDimitry Andric     unsigned NameHash;
20750b57cec5SDimitry Andric     unsigned PriorGeneration;
20760b57cec5SDimitry Andric     unsigned &NumIdentifierLookups;
20770b57cec5SDimitry Andric     unsigned &NumIdentifierLookupHits;
20780b57cec5SDimitry Andric     IdentifierInfo *Found = nullptr;
20790b57cec5SDimitry Andric 
20800b57cec5SDimitry Andric   public:
20810b57cec5SDimitry Andric     IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
20820b57cec5SDimitry Andric                             unsigned &NumIdentifierLookups,
20830b57cec5SDimitry Andric                             unsigned &NumIdentifierLookupHits)
20840b57cec5SDimitry Andric       : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
20850b57cec5SDimitry Andric         PriorGeneration(PriorGeneration),
20860b57cec5SDimitry Andric         NumIdentifierLookups(NumIdentifierLookups),
20870b57cec5SDimitry Andric         NumIdentifierLookupHits(NumIdentifierLookupHits) {}
20880b57cec5SDimitry Andric 
20890b57cec5SDimitry Andric     bool operator()(ModuleFile &M) {
20900b57cec5SDimitry Andric       // If we've already searched this module file, skip it now.
20910b57cec5SDimitry Andric       if (M.Generation <= PriorGeneration)
20920b57cec5SDimitry Andric         return true;
20930b57cec5SDimitry Andric 
20940b57cec5SDimitry Andric       ASTIdentifierLookupTable *IdTable
20950b57cec5SDimitry Andric         = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
20960b57cec5SDimitry Andric       if (!IdTable)
20970b57cec5SDimitry Andric         return false;
20980b57cec5SDimitry Andric 
20990b57cec5SDimitry Andric       ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
21000b57cec5SDimitry Andric                                      Found);
21010b57cec5SDimitry Andric       ++NumIdentifierLookups;
21020b57cec5SDimitry Andric       ASTIdentifierLookupTable::iterator Pos =
21030b57cec5SDimitry Andric           IdTable->find_hashed(Name, NameHash, &Trait);
21040b57cec5SDimitry Andric       if (Pos == IdTable->end())
21050b57cec5SDimitry Andric         return false;
21060b57cec5SDimitry Andric 
21070b57cec5SDimitry Andric       // Dereferencing the iterator has the effect of building the
21080b57cec5SDimitry Andric       // IdentifierInfo node and populating it with the various
21090b57cec5SDimitry Andric       // declarations it needs.
21100b57cec5SDimitry Andric       ++NumIdentifierLookupHits;
21110b57cec5SDimitry Andric       Found = *Pos;
21120b57cec5SDimitry Andric       return true;
21130b57cec5SDimitry Andric     }
21140b57cec5SDimitry Andric 
21150b57cec5SDimitry Andric     // Retrieve the identifier info found within the module
21160b57cec5SDimitry Andric     // files.
21170b57cec5SDimitry Andric     IdentifierInfo *getIdentifierInfo() const { return Found; }
21180b57cec5SDimitry Andric   };
21190b57cec5SDimitry Andric 
21200b57cec5SDimitry Andric } // namespace
21210b57cec5SDimitry Andric 
21220b57cec5SDimitry Andric void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
21230b57cec5SDimitry Andric   // Note that we are loading an identifier.
21240b57cec5SDimitry Andric   Deserializing AnIdentifier(this);
21250b57cec5SDimitry Andric 
21260b57cec5SDimitry Andric   unsigned PriorGeneration = 0;
21270b57cec5SDimitry Andric   if (getContext().getLangOpts().Modules)
21280b57cec5SDimitry Andric     PriorGeneration = IdentifierGeneration[&II];
21290b57cec5SDimitry Andric 
21300b57cec5SDimitry Andric   // If there is a global index, look there first to determine which modules
21310b57cec5SDimitry Andric   // provably do not have any results for this identifier.
21320b57cec5SDimitry Andric   GlobalModuleIndex::HitSet Hits;
21330b57cec5SDimitry Andric   GlobalModuleIndex::HitSet *HitsPtr = nullptr;
21340b57cec5SDimitry Andric   if (!loadGlobalIndex()) {
21350b57cec5SDimitry Andric     if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
21360b57cec5SDimitry Andric       HitsPtr = &Hits;
21370b57cec5SDimitry Andric     }
21380b57cec5SDimitry Andric   }
21390b57cec5SDimitry Andric 
21400b57cec5SDimitry Andric   IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
21410b57cec5SDimitry Andric                                   NumIdentifierLookups,
21420b57cec5SDimitry Andric                                   NumIdentifierLookupHits);
21430b57cec5SDimitry Andric   ModuleMgr.visit(Visitor, HitsPtr);
21440b57cec5SDimitry Andric   markIdentifierUpToDate(&II);
21450b57cec5SDimitry Andric }
21460b57cec5SDimitry Andric 
21470b57cec5SDimitry Andric void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
21480b57cec5SDimitry Andric   if (!II)
21490b57cec5SDimitry Andric     return;
21500b57cec5SDimitry Andric 
21510b57cec5SDimitry Andric   II->setOutOfDate(false);
21520b57cec5SDimitry Andric 
21530b57cec5SDimitry Andric   // Update the generation for this identifier.
21540b57cec5SDimitry Andric   if (getContext().getLangOpts().Modules)
21550b57cec5SDimitry Andric     IdentifierGeneration[II] = getGeneration();
21560b57cec5SDimitry Andric }
21570b57cec5SDimitry Andric 
21580b57cec5SDimitry Andric void ASTReader::resolvePendingMacro(IdentifierInfo *II,
21590b57cec5SDimitry Andric                                     const PendingMacroInfo &PMInfo) {
21600b57cec5SDimitry Andric   ModuleFile &M = *PMInfo.M;
21610b57cec5SDimitry Andric 
21620b57cec5SDimitry Andric   BitstreamCursor &Cursor = M.MacroCursor;
21630b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Cursor);
21645ffd83dbSDimitry Andric   if (llvm::Error Err =
21655ffd83dbSDimitry Andric           Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) {
21660b57cec5SDimitry Andric     Error(std::move(Err));
21670b57cec5SDimitry Andric     return;
21680b57cec5SDimitry Andric   }
21690b57cec5SDimitry Andric 
21700b57cec5SDimitry Andric   struct ModuleMacroRecord {
21710b57cec5SDimitry Andric     SubmoduleID SubModID;
21720b57cec5SDimitry Andric     MacroInfo *MI;
21730b57cec5SDimitry Andric     SmallVector<SubmoduleID, 8> Overrides;
21740b57cec5SDimitry Andric   };
21750b57cec5SDimitry Andric   llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
21760b57cec5SDimitry Andric 
21770b57cec5SDimitry Andric   // We expect to see a sequence of PP_MODULE_MACRO records listing exported
21780b57cec5SDimitry Andric   // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
21790b57cec5SDimitry Andric   // macro histroy.
21800b57cec5SDimitry Andric   RecordData Record;
21810b57cec5SDimitry Andric   while (true) {
21820b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry =
21830b57cec5SDimitry Andric         Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
21840b57cec5SDimitry Andric     if (!MaybeEntry) {
21850b57cec5SDimitry Andric       Error(MaybeEntry.takeError());
21860b57cec5SDimitry Andric       return;
21870b57cec5SDimitry Andric     }
21880b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
21890b57cec5SDimitry Andric 
21900b57cec5SDimitry Andric     if (Entry.Kind != llvm::BitstreamEntry::Record) {
21910b57cec5SDimitry Andric       Error("malformed block record in AST file");
21920b57cec5SDimitry Andric       return;
21930b57cec5SDimitry Andric     }
21940b57cec5SDimitry Andric 
21950b57cec5SDimitry Andric     Record.clear();
21960b57cec5SDimitry Andric     Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record);
21970b57cec5SDimitry Andric     if (!MaybePP) {
21980b57cec5SDimitry Andric       Error(MaybePP.takeError());
21990b57cec5SDimitry Andric       return;
22000b57cec5SDimitry Andric     }
22010b57cec5SDimitry Andric     switch ((PreprocessorRecordTypes)MaybePP.get()) {
22020b57cec5SDimitry Andric     case PP_MACRO_DIRECTIVE_HISTORY:
22030b57cec5SDimitry Andric       break;
22040b57cec5SDimitry Andric 
22050b57cec5SDimitry Andric     case PP_MODULE_MACRO: {
22060b57cec5SDimitry Andric       ModuleMacros.push_back(ModuleMacroRecord());
22070b57cec5SDimitry Andric       auto &Info = ModuleMacros.back();
22080b57cec5SDimitry Andric       Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
22090b57cec5SDimitry Andric       Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
22100b57cec5SDimitry Andric       for (int I = 2, N = Record.size(); I != N; ++I)
22110b57cec5SDimitry Andric         Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
22120b57cec5SDimitry Andric       continue;
22130b57cec5SDimitry Andric     }
22140b57cec5SDimitry Andric 
22150b57cec5SDimitry Andric     default:
22160b57cec5SDimitry Andric       Error("malformed block record in AST file");
22170b57cec5SDimitry Andric       return;
22180b57cec5SDimitry Andric     }
22190b57cec5SDimitry Andric 
22200b57cec5SDimitry Andric     // We found the macro directive history; that's the last record
22210b57cec5SDimitry Andric     // for this macro.
22220b57cec5SDimitry Andric     break;
22230b57cec5SDimitry Andric   }
22240b57cec5SDimitry Andric 
22250b57cec5SDimitry Andric   // Module macros are listed in reverse dependency order.
22260b57cec5SDimitry Andric   {
22270b57cec5SDimitry Andric     std::reverse(ModuleMacros.begin(), ModuleMacros.end());
22280b57cec5SDimitry Andric     llvm::SmallVector<ModuleMacro*, 8> Overrides;
22290b57cec5SDimitry Andric     for (auto &MMR : ModuleMacros) {
22300b57cec5SDimitry Andric       Overrides.clear();
22310b57cec5SDimitry Andric       for (unsigned ModID : MMR.Overrides) {
22320b57cec5SDimitry Andric         Module *Mod = getSubmodule(ModID);
22330b57cec5SDimitry Andric         auto *Macro = PP.getModuleMacro(Mod, II);
22340b57cec5SDimitry Andric         assert(Macro && "missing definition for overridden macro");
22350b57cec5SDimitry Andric         Overrides.push_back(Macro);
22360b57cec5SDimitry Andric       }
22370b57cec5SDimitry Andric 
22380b57cec5SDimitry Andric       bool Inserted = false;
22390b57cec5SDimitry Andric       Module *Owner = getSubmodule(MMR.SubModID);
22400b57cec5SDimitry Andric       PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
22410b57cec5SDimitry Andric     }
22420b57cec5SDimitry Andric   }
22430b57cec5SDimitry Andric 
22440b57cec5SDimitry Andric   // Don't read the directive history for a module; we don't have anywhere
22450b57cec5SDimitry Andric   // to put it.
22460b57cec5SDimitry Andric   if (M.isModule())
22470b57cec5SDimitry Andric     return;
22480b57cec5SDimitry Andric 
22490b57cec5SDimitry Andric   // Deserialize the macro directives history in reverse source-order.
22500b57cec5SDimitry Andric   MacroDirective *Latest = nullptr, *Earliest = nullptr;
22510b57cec5SDimitry Andric   unsigned Idx = 0, N = Record.size();
22520b57cec5SDimitry Andric   while (Idx < N) {
22530b57cec5SDimitry Andric     MacroDirective *MD = nullptr;
22540b57cec5SDimitry Andric     SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
22550b57cec5SDimitry Andric     MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
22560b57cec5SDimitry Andric     switch (K) {
22570b57cec5SDimitry Andric     case MacroDirective::MD_Define: {
22580b57cec5SDimitry Andric       MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
22590b57cec5SDimitry Andric       MD = PP.AllocateDefMacroDirective(MI, Loc);
22600b57cec5SDimitry Andric       break;
22610b57cec5SDimitry Andric     }
22620b57cec5SDimitry Andric     case MacroDirective::MD_Undefine:
22630b57cec5SDimitry Andric       MD = PP.AllocateUndefMacroDirective(Loc);
22640b57cec5SDimitry Andric       break;
22650b57cec5SDimitry Andric     case MacroDirective::MD_Visibility:
22660b57cec5SDimitry Andric       bool isPublic = Record[Idx++];
22670b57cec5SDimitry Andric       MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
22680b57cec5SDimitry Andric       break;
22690b57cec5SDimitry Andric     }
22700b57cec5SDimitry Andric 
22710b57cec5SDimitry Andric     if (!Latest)
22720b57cec5SDimitry Andric       Latest = MD;
22730b57cec5SDimitry Andric     if (Earliest)
22740b57cec5SDimitry Andric       Earliest->setPrevious(MD);
22750b57cec5SDimitry Andric     Earliest = MD;
22760b57cec5SDimitry Andric   }
22770b57cec5SDimitry Andric 
22780b57cec5SDimitry Andric   if (Latest)
22790b57cec5SDimitry Andric     PP.setLoadedMacroDirective(II, Earliest, Latest);
22800b57cec5SDimitry Andric }
22810b57cec5SDimitry Andric 
2282e8d8bef9SDimitry Andric bool ASTReader::shouldDisableValidationForFile(
2283e8d8bef9SDimitry Andric     const serialization::ModuleFile &M) const {
2284e8d8bef9SDimitry Andric   if (DisableValidationKind == DisableValidationForModuleKind::None)
2285e8d8bef9SDimitry Andric     return false;
2286e8d8bef9SDimitry Andric 
2287e8d8bef9SDimitry Andric   // If a PCH is loaded and validation is disabled for PCH then disable
2288e8d8bef9SDimitry Andric   // validation for the PCH and the modules it loads.
228981ad6265SDimitry Andric   ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);
2290e8d8bef9SDimitry Andric 
2291e8d8bef9SDimitry Andric   switch (K) {
2292e8d8bef9SDimitry Andric   case MK_MainFile:
2293e8d8bef9SDimitry Andric   case MK_Preamble:
2294e8d8bef9SDimitry Andric   case MK_PCH:
2295e8d8bef9SDimitry Andric     return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2296e8d8bef9SDimitry Andric   case MK_ImplicitModule:
2297e8d8bef9SDimitry Andric   case MK_ExplicitModule:
2298e8d8bef9SDimitry Andric   case MK_PrebuiltModule:
2299e8d8bef9SDimitry Andric     return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2300e8d8bef9SDimitry Andric   }
2301e8d8bef9SDimitry Andric 
2302e8d8bef9SDimitry Andric   return false;
2303e8d8bef9SDimitry Andric }
2304e8d8bef9SDimitry Andric 
2305bdd1243dSDimitry Andric InputFileInfo ASTReader::getInputFileInfo(ModuleFile &F, unsigned ID) {
2306bdd1243dSDimitry Andric   // If this ID is bogus, just return an empty input file.
2307bdd1243dSDimitry Andric   if (ID == 0 || ID > F.InputFileInfosLoaded.size())
2308bdd1243dSDimitry Andric     return InputFileInfo();
2309bdd1243dSDimitry Andric 
2310bdd1243dSDimitry Andric   // If we've already loaded this input file, return it.
2311bdd1243dSDimitry Andric   if (!F.InputFileInfosLoaded[ID - 1].Filename.empty())
2312bdd1243dSDimitry Andric     return F.InputFileInfosLoaded[ID - 1];
2313bdd1243dSDimitry Andric 
23140b57cec5SDimitry Andric   // Go find this input file.
23150b57cec5SDimitry Andric   BitstreamCursor &Cursor = F.InputFilesCursor;
23160b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Cursor);
23170b57cec5SDimitry Andric   if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
23180b57cec5SDimitry Andric     // FIXME this drops errors on the floor.
23190b57cec5SDimitry Andric     consumeError(std::move(Err));
23200b57cec5SDimitry Andric   }
23210b57cec5SDimitry Andric 
23220b57cec5SDimitry Andric   Expected<unsigned> MaybeCode = Cursor.ReadCode();
23230b57cec5SDimitry Andric   if (!MaybeCode) {
23240b57cec5SDimitry Andric     // FIXME this drops errors on the floor.
23250b57cec5SDimitry Andric     consumeError(MaybeCode.takeError());
23260b57cec5SDimitry Andric   }
23270b57cec5SDimitry Andric   unsigned Code = MaybeCode.get();
23280b57cec5SDimitry Andric   RecordData Record;
23290b57cec5SDimitry Andric   StringRef Blob;
23300b57cec5SDimitry Andric 
23310b57cec5SDimitry Andric   if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob))
23320b57cec5SDimitry Andric     assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE &&
23330b57cec5SDimitry Andric            "invalid record type for input file");
23340b57cec5SDimitry Andric   else {
23350b57cec5SDimitry Andric     // FIXME this drops errors on the floor.
23360b57cec5SDimitry Andric     consumeError(Maybe.takeError());
23370b57cec5SDimitry Andric   }
23380b57cec5SDimitry Andric 
23390b57cec5SDimitry Andric   assert(Record[0] == ID && "Bogus stored ID or offset");
23400b57cec5SDimitry Andric   InputFileInfo R;
23410b57cec5SDimitry Andric   R.StoredSize = static_cast<off_t>(Record[1]);
23420b57cec5SDimitry Andric   R.StoredTime = static_cast<time_t>(Record[2]);
23430b57cec5SDimitry Andric   R.Overridden = static_cast<bool>(Record[3]);
23440b57cec5SDimitry Andric   R.Transient = static_cast<bool>(Record[4]);
23450b57cec5SDimitry Andric   R.TopLevelModuleMap = static_cast<bool>(Record[5]);
23465ffd83dbSDimitry Andric   R.Filename = std::string(Blob);
23470b57cec5SDimitry Andric   ResolveImportedPath(F, R.Filename);
2348a7dea167SDimitry Andric 
2349a7dea167SDimitry Andric   Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
2350a7dea167SDimitry Andric   if (!MaybeEntry) // FIXME this drops errors on the floor.
2351a7dea167SDimitry Andric     consumeError(MaybeEntry.takeError());
2352a7dea167SDimitry Andric   llvm::BitstreamEntry Entry = MaybeEntry.get();
2353a7dea167SDimitry Andric   assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2354a7dea167SDimitry Andric          "expected record type for input file hash");
2355a7dea167SDimitry Andric 
2356a7dea167SDimitry Andric   Record.clear();
2357a7dea167SDimitry Andric   if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record))
2358a7dea167SDimitry Andric     assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH &&
2359a7dea167SDimitry Andric            "invalid record type for input file hash");
2360a7dea167SDimitry Andric   else {
2361a7dea167SDimitry Andric     // FIXME this drops errors on the floor.
2362a7dea167SDimitry Andric     consumeError(Maybe.takeError());
2363a7dea167SDimitry Andric   }
2364a7dea167SDimitry Andric   R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) |
2365a7dea167SDimitry Andric                   static_cast<uint64_t>(Record[0]);
2366bdd1243dSDimitry Andric 
2367bdd1243dSDimitry Andric   // Note that we've loaded this input file info.
2368bdd1243dSDimitry Andric   F.InputFileInfosLoaded[ID - 1] = R;
23690b57cec5SDimitry Andric   return R;
23700b57cec5SDimitry Andric }
23710b57cec5SDimitry Andric 
23720b57cec5SDimitry Andric static unsigned moduleKindForDiagnostic(ModuleKind Kind);
23730b57cec5SDimitry Andric InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
23740b57cec5SDimitry Andric   // If this ID is bogus, just return an empty input file.
23750b57cec5SDimitry Andric   if (ID == 0 || ID > F.InputFilesLoaded.size())
23760b57cec5SDimitry Andric     return InputFile();
23770b57cec5SDimitry Andric 
23780b57cec5SDimitry Andric   // If we've already loaded this input file, return it.
23790b57cec5SDimitry Andric   if (F.InputFilesLoaded[ID-1].getFile())
23800b57cec5SDimitry Andric     return F.InputFilesLoaded[ID-1];
23810b57cec5SDimitry Andric 
23820b57cec5SDimitry Andric   if (F.InputFilesLoaded[ID-1].isNotFound())
23830b57cec5SDimitry Andric     return InputFile();
23840b57cec5SDimitry Andric 
23850b57cec5SDimitry Andric   // Go find this input file.
23860b57cec5SDimitry Andric   BitstreamCursor &Cursor = F.InputFilesCursor;
23870b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Cursor);
23880b57cec5SDimitry Andric   if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) {
23890b57cec5SDimitry Andric     // FIXME this drops errors on the floor.
23900b57cec5SDimitry Andric     consumeError(std::move(Err));
23910b57cec5SDimitry Andric   }
23920b57cec5SDimitry Andric 
2393bdd1243dSDimitry Andric   InputFileInfo FI = getInputFileInfo(F, ID);
23940b57cec5SDimitry Andric   off_t StoredSize = FI.StoredSize;
23950b57cec5SDimitry Andric   time_t StoredTime = FI.StoredTime;
23960b57cec5SDimitry Andric   bool Overridden = FI.Overridden;
23970b57cec5SDimitry Andric   bool Transient = FI.Transient;
23980b57cec5SDimitry Andric   StringRef Filename = FI.Filename;
2399a7dea167SDimitry Andric   uint64_t StoredContentHash = FI.ContentHash;
24000b57cec5SDimitry Andric 
2401*06c3fb27SDimitry Andric   // For standard C++ modules, we don't need to check the inputs.
2402*06c3fb27SDimitry Andric   bool SkipChecks = F.StandardCXXModule;
2403*06c3fb27SDimitry Andric 
2404bdd1243dSDimitry Andric   OptionalFileEntryRefDegradesToFileEntryPtr File = OptionalFileEntryRef(
2405bdd1243dSDimitry Andric       expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)));
24060b57cec5SDimitry Andric 
24070b57cec5SDimitry Andric   // For an overridden file, create a virtual file with the stored
24080b57cec5SDimitry Andric   // size/timestamp.
2409*06c3fb27SDimitry Andric   if ((Overridden || Transient || SkipChecks) && !File)
2410e8d8bef9SDimitry Andric     File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime);
24110b57cec5SDimitry Andric 
2412e8d8bef9SDimitry Andric   if (!File) {
24130b57cec5SDimitry Andric     if (Complain) {
24140b57cec5SDimitry Andric       std::string ErrorStr = "could not find file '";
24150b57cec5SDimitry Andric       ErrorStr += Filename;
24160b57cec5SDimitry Andric       ErrorStr += "' referenced by AST file '";
24170b57cec5SDimitry Andric       ErrorStr += F.FileName;
24180b57cec5SDimitry Andric       ErrorStr += "'";
24190b57cec5SDimitry Andric       Error(ErrorStr);
24200b57cec5SDimitry Andric     }
24210b57cec5SDimitry Andric     // Record that we didn't find the file.
24220b57cec5SDimitry Andric     F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
24230b57cec5SDimitry Andric     return InputFile();
24240b57cec5SDimitry Andric   }
24250b57cec5SDimitry Andric 
24260b57cec5SDimitry Andric   // Check if there was a request to override the contents of the file
24270b57cec5SDimitry Andric   // that was part of the precompiled header. Overriding such a file
24280b57cec5SDimitry Andric   // can lead to problems when lexing using the source locations from the
24290b57cec5SDimitry Andric   // PCH.
24300b57cec5SDimitry Andric   SourceManager &SM = getSourceManager();
24310b57cec5SDimitry Andric   // FIXME: Reject if the overrides are different.
2432*06c3fb27SDimitry Andric   if ((!Overridden && !Transient) && !SkipChecks && SM.isFileOverridden(File)) {
24330b57cec5SDimitry Andric     if (Complain)
24340b57cec5SDimitry Andric       Error(diag::err_fe_pch_file_overridden, Filename);
2435a7dea167SDimitry Andric 
2436a7dea167SDimitry Andric     // After emitting the diagnostic, bypass the overriding file to recover
2437a7dea167SDimitry Andric     // (this creates a separate FileEntry).
2438a7dea167SDimitry Andric     File = SM.bypassFileContentsOverride(*File);
2439a7dea167SDimitry Andric     if (!File) {
2440a7dea167SDimitry Andric       F.InputFilesLoaded[ID - 1] = InputFile::getNotFound();
2441a7dea167SDimitry Andric       return InputFile();
2442a7dea167SDimitry Andric     }
24430b57cec5SDimitry Andric   }
24440b57cec5SDimitry Andric 
2445349cc55cSDimitry Andric   struct Change {
2446349cc55cSDimitry Andric     enum ModificationKind {
2447a7dea167SDimitry Andric       Size,
2448a7dea167SDimitry Andric       ModTime,
2449a7dea167SDimitry Andric       Content,
2450a7dea167SDimitry Andric       None,
2451349cc55cSDimitry Andric     } Kind;
2452bdd1243dSDimitry Andric     std::optional<int64_t> Old = std::nullopt;
2453bdd1243dSDimitry Andric     std::optional<int64_t> New = std::nullopt;
2454a7dea167SDimitry Andric   };
2455a7dea167SDimitry Andric   auto HasInputFileChanged = [&]() {
2456a7dea167SDimitry Andric     if (StoredSize != File->getSize())
2457349cc55cSDimitry Andric       return Change{Change::Size, StoredSize, File->getSize()};
2458e8d8bef9SDimitry Andric     if (!shouldDisableValidationForFile(F) && StoredTime &&
2459a7dea167SDimitry Andric         StoredTime != File->getModificationTime()) {
2460349cc55cSDimitry Andric       Change MTimeChange = {Change::ModTime, StoredTime,
2461349cc55cSDimitry Andric                             File->getModificationTime()};
2462349cc55cSDimitry Andric 
2463a7dea167SDimitry Andric       // In case the modification time changes but not the content,
2464a7dea167SDimitry Andric       // accept the cached file as legit.
2465a7dea167SDimitry Andric       if (ValidateASTInputFilesContent &&
2466a7dea167SDimitry Andric           StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) {
2467a7dea167SDimitry Andric         auto MemBuffOrError = FileMgr.getBufferForFile(File);
2468a7dea167SDimitry Andric         if (!MemBuffOrError) {
2469a7dea167SDimitry Andric           if (!Complain)
2470349cc55cSDimitry Andric             return MTimeChange;
2471a7dea167SDimitry Andric           std::string ErrorStr = "could not get buffer for file '";
2472a7dea167SDimitry Andric           ErrorStr += File->getName();
2473a7dea167SDimitry Andric           ErrorStr += "'";
2474a7dea167SDimitry Andric           Error(ErrorStr);
2475349cc55cSDimitry Andric           return MTimeChange;
2476a7dea167SDimitry Andric         }
24770b57cec5SDimitry Andric 
2478349cc55cSDimitry Andric         // FIXME: hash_value is not guaranteed to be stable!
2479a7dea167SDimitry Andric         auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer());
2480a7dea167SDimitry Andric         if (StoredContentHash == static_cast<uint64_t>(ContentHash))
2481349cc55cSDimitry Andric           return Change{Change::None};
2482349cc55cSDimitry Andric 
2483349cc55cSDimitry Andric         return Change{Change::Content};
2484a7dea167SDimitry Andric       }
2485349cc55cSDimitry Andric       return MTimeChange;
2486a7dea167SDimitry Andric     }
2487349cc55cSDimitry Andric     return Change{Change::None};
2488a7dea167SDimitry Andric   };
2489a7dea167SDimitry Andric 
2490a7dea167SDimitry Andric   bool IsOutOfDate = false;
2491*06c3fb27SDimitry Andric   auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
24920b57cec5SDimitry Andric   // For an overridden file, there is nothing to validate.
2493349cc55cSDimitry Andric   if (!Overridden && FileChange.Kind != Change::None) {
2494e8d8bef9SDimitry Andric     if (Complain && !Diags.isDiagnosticInFlight()) {
24950b57cec5SDimitry Andric       // Build a list of the PCH imports that got us here (in reverse).
24960b57cec5SDimitry Andric       SmallVector<ModuleFile *, 4> ImportStack(1, &F);
24970b57cec5SDimitry Andric       while (!ImportStack.back()->ImportedBy.empty())
24980b57cec5SDimitry Andric         ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
24990b57cec5SDimitry Andric 
25000b57cec5SDimitry Andric       // The top-level PCH is stale.
25010b57cec5SDimitry Andric       StringRef TopLevelPCHName(ImportStack.back()->FileName);
2502e8d8bef9SDimitry Andric       Diag(diag::err_fe_ast_file_modified)
2503e8d8bef9SDimitry Andric           << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)
2504349cc55cSDimitry Andric           << TopLevelPCHName << FileChange.Kind
2505349cc55cSDimitry Andric           << (FileChange.Old && FileChange.New)
250681ad6265SDimitry Andric           << llvm::itostr(FileChange.Old.value_or(0))
250781ad6265SDimitry Andric           << llvm::itostr(FileChange.New.value_or(0));
25080b57cec5SDimitry Andric 
25090b57cec5SDimitry Andric       // Print the import stack.
2510e8d8bef9SDimitry Andric       if (ImportStack.size() > 1) {
25110b57cec5SDimitry Andric         Diag(diag::note_pch_required_by)
25120b57cec5SDimitry Andric           << Filename << ImportStack[0]->FileName;
25130b57cec5SDimitry Andric         for (unsigned I = 1; I < ImportStack.size(); ++I)
25140b57cec5SDimitry Andric           Diag(diag::note_pch_required_by)
25150b57cec5SDimitry Andric             << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
25160b57cec5SDimitry Andric       }
25170b57cec5SDimitry Andric 
25180b57cec5SDimitry Andric       Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
25190b57cec5SDimitry Andric     }
25200b57cec5SDimitry Andric 
25210b57cec5SDimitry Andric     IsOutOfDate = true;
25220b57cec5SDimitry Andric   }
25230b57cec5SDimitry Andric   // FIXME: If the file is overridden and we've already opened it,
25240b57cec5SDimitry Andric   // issue an error (or split it into a separate FileEntry).
25250b57cec5SDimitry Andric 
2526e8d8bef9SDimitry Andric   InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
25270b57cec5SDimitry Andric 
25280b57cec5SDimitry Andric   // Note that we've loaded this input file.
25290b57cec5SDimitry Andric   F.InputFilesLoaded[ID-1] = IF;
25300b57cec5SDimitry Andric   return IF;
25310b57cec5SDimitry Andric }
25320b57cec5SDimitry Andric 
25330b57cec5SDimitry Andric /// If we are loading a relocatable PCH or module file, and the filename
25340b57cec5SDimitry Andric /// is not an absolute path, add the system or module root to the beginning of
25350b57cec5SDimitry Andric /// the file name.
25360b57cec5SDimitry Andric void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
25370b57cec5SDimitry Andric   // Resolve relative to the base directory, if we have one.
25380b57cec5SDimitry Andric   if (!M.BaseDirectory.empty())
25390b57cec5SDimitry Andric     return ResolveImportedPath(Filename, M.BaseDirectory);
25400b57cec5SDimitry Andric }
25410b57cec5SDimitry Andric 
25420b57cec5SDimitry Andric void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2543*06c3fb27SDimitry Andric   if (Filename.empty() || llvm::sys::path::is_absolute(Filename) ||
2544*06c3fb27SDimitry Andric       Filename == "<built-in>" || Filename == "<command line>")
25450b57cec5SDimitry Andric     return;
25460b57cec5SDimitry Andric 
25470b57cec5SDimitry Andric   SmallString<128> Buffer;
25480b57cec5SDimitry Andric   llvm::sys::path::append(Buffer, Prefix, Filename);
25490b57cec5SDimitry Andric   Filename.assign(Buffer.begin(), Buffer.end());
25500b57cec5SDimitry Andric }
25510b57cec5SDimitry Andric 
25520b57cec5SDimitry Andric static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
25530b57cec5SDimitry Andric   switch (ARR) {
25540b57cec5SDimitry Andric   case ASTReader::Failure: return true;
25550b57cec5SDimitry Andric   case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
25560b57cec5SDimitry Andric   case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
25570b57cec5SDimitry Andric   case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
25580b57cec5SDimitry Andric   case ASTReader::ConfigurationMismatch:
25590b57cec5SDimitry Andric     return !(Caps & ASTReader::ARR_ConfigurationMismatch);
25600b57cec5SDimitry Andric   case ASTReader::HadErrors: return true;
25610b57cec5SDimitry Andric   case ASTReader::Success: return false;
25620b57cec5SDimitry Andric   }
25630b57cec5SDimitry Andric 
25640b57cec5SDimitry Andric   llvm_unreachable("unknown ASTReadResult");
25650b57cec5SDimitry Andric }
25660b57cec5SDimitry Andric 
25670b57cec5SDimitry Andric ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
25680b57cec5SDimitry Andric     BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
25690b57cec5SDimitry Andric     bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
25700b57cec5SDimitry Andric     std::string &SuggestedPredefines) {
25710b57cec5SDimitry Andric   if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) {
25720b57cec5SDimitry Andric     // FIXME this drops errors on the floor.
25730b57cec5SDimitry Andric     consumeError(std::move(Err));
25740b57cec5SDimitry Andric     return Failure;
25750b57cec5SDimitry Andric   }
25760b57cec5SDimitry Andric 
25770b57cec5SDimitry Andric   // Read all of the records in the options block.
25780b57cec5SDimitry Andric   RecordData Record;
25790b57cec5SDimitry Andric   ASTReadResult Result = Success;
25800b57cec5SDimitry Andric   while (true) {
25810b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
25820b57cec5SDimitry Andric     if (!MaybeEntry) {
25830b57cec5SDimitry Andric       // FIXME this drops errors on the floor.
25840b57cec5SDimitry Andric       consumeError(MaybeEntry.takeError());
25850b57cec5SDimitry Andric       return Failure;
25860b57cec5SDimitry Andric     }
25870b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
25880b57cec5SDimitry Andric 
25890b57cec5SDimitry Andric     switch (Entry.Kind) {
25900b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
25910b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock:
25920b57cec5SDimitry Andric       return Failure;
25930b57cec5SDimitry Andric 
25940b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
25950b57cec5SDimitry Andric       return Result;
25960b57cec5SDimitry Andric 
25970b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
25980b57cec5SDimitry Andric       // The interesting case.
25990b57cec5SDimitry Andric       break;
26000b57cec5SDimitry Andric     }
26010b57cec5SDimitry Andric 
26020b57cec5SDimitry Andric     // Read and process a record.
26030b57cec5SDimitry Andric     Record.clear();
26040b57cec5SDimitry Andric     Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record);
26050b57cec5SDimitry Andric     if (!MaybeRecordType) {
26060b57cec5SDimitry Andric       // FIXME this drops errors on the floor.
26070b57cec5SDimitry Andric       consumeError(MaybeRecordType.takeError());
26080b57cec5SDimitry Andric       return Failure;
26090b57cec5SDimitry Andric     }
26100b57cec5SDimitry Andric     switch ((OptionsRecordTypes)MaybeRecordType.get()) {
26110b57cec5SDimitry Andric     case LANGUAGE_OPTIONS: {
26120b57cec5SDimitry Andric       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
26130b57cec5SDimitry Andric       if (ParseLanguageOptions(Record, Complain, Listener,
26140b57cec5SDimitry Andric                                AllowCompatibleConfigurationMismatch))
26150b57cec5SDimitry Andric         Result = ConfigurationMismatch;
26160b57cec5SDimitry Andric       break;
26170b57cec5SDimitry Andric     }
26180b57cec5SDimitry Andric 
26190b57cec5SDimitry Andric     case TARGET_OPTIONS: {
26200b57cec5SDimitry Andric       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
26210b57cec5SDimitry Andric       if (ParseTargetOptions(Record, Complain, Listener,
26220b57cec5SDimitry Andric                              AllowCompatibleConfigurationMismatch))
26230b57cec5SDimitry Andric         Result = ConfigurationMismatch;
26240b57cec5SDimitry Andric       break;
26250b57cec5SDimitry Andric     }
26260b57cec5SDimitry Andric 
26270b57cec5SDimitry Andric     case FILE_SYSTEM_OPTIONS: {
26280b57cec5SDimitry Andric       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
26290b57cec5SDimitry Andric       if (!AllowCompatibleConfigurationMismatch &&
26300b57cec5SDimitry Andric           ParseFileSystemOptions(Record, Complain, Listener))
26310b57cec5SDimitry Andric         Result = ConfigurationMismatch;
26320b57cec5SDimitry Andric       break;
26330b57cec5SDimitry Andric     }
26340b57cec5SDimitry Andric 
26350b57cec5SDimitry Andric     case HEADER_SEARCH_OPTIONS: {
26360b57cec5SDimitry Andric       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
26370b57cec5SDimitry Andric       if (!AllowCompatibleConfigurationMismatch &&
26380b57cec5SDimitry Andric           ParseHeaderSearchOptions(Record, Complain, Listener))
26390b57cec5SDimitry Andric         Result = ConfigurationMismatch;
26400b57cec5SDimitry Andric       break;
26410b57cec5SDimitry Andric     }
26420b57cec5SDimitry Andric 
26430b57cec5SDimitry Andric     case PREPROCESSOR_OPTIONS:
26440b57cec5SDimitry Andric       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
26450b57cec5SDimitry Andric       if (!AllowCompatibleConfigurationMismatch &&
26460b57cec5SDimitry Andric           ParsePreprocessorOptions(Record, Complain, Listener,
26470b57cec5SDimitry Andric                                    SuggestedPredefines))
26480b57cec5SDimitry Andric         Result = ConfigurationMismatch;
26490b57cec5SDimitry Andric       break;
26500b57cec5SDimitry Andric     }
26510b57cec5SDimitry Andric   }
26520b57cec5SDimitry Andric }
26530b57cec5SDimitry Andric 
26540b57cec5SDimitry Andric ASTReader::ASTReadResult
26550b57cec5SDimitry Andric ASTReader::ReadControlBlock(ModuleFile &F,
26560b57cec5SDimitry Andric                             SmallVectorImpl<ImportedModule> &Loaded,
26570b57cec5SDimitry Andric                             const ModuleFile *ImportedBy,
26580b57cec5SDimitry Andric                             unsigned ClientLoadCapabilities) {
26590b57cec5SDimitry Andric   BitstreamCursor &Stream = F.Stream;
26600b57cec5SDimitry Andric 
26610b57cec5SDimitry Andric   if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
26620b57cec5SDimitry Andric     Error(std::move(Err));
26630b57cec5SDimitry Andric     return Failure;
26640b57cec5SDimitry Andric   }
26650b57cec5SDimitry Andric 
26660b57cec5SDimitry Andric   // Lambda to read the unhashed control block the first time it's called.
26670b57cec5SDimitry Andric   //
26680b57cec5SDimitry Andric   // For PCM files, the unhashed control block cannot be read until after the
26690b57cec5SDimitry Andric   // MODULE_NAME record.  However, PCH files have no MODULE_NAME, and yet still
26700b57cec5SDimitry Andric   // need to look ahead before reading the IMPORTS record.  For consistency,
26710b57cec5SDimitry Andric   // this block is always read somehow (see BitstreamEntry::EndBlock).
26720b57cec5SDimitry Andric   bool HasReadUnhashedControlBlock = false;
26730b57cec5SDimitry Andric   auto readUnhashedControlBlockOnce = [&]() {
26740b57cec5SDimitry Andric     if (!HasReadUnhashedControlBlock) {
26750b57cec5SDimitry Andric       HasReadUnhashedControlBlock = true;
26760b57cec5SDimitry Andric       if (ASTReadResult Result =
26770b57cec5SDimitry Andric               readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
26780b57cec5SDimitry Andric         return Result;
26790b57cec5SDimitry Andric     }
26800b57cec5SDimitry Andric     return Success;
26810b57cec5SDimitry Andric   };
26820b57cec5SDimitry Andric 
2683e8d8bef9SDimitry Andric   bool DisableValidation = shouldDisableValidationForFile(F);
2684e8d8bef9SDimitry Andric 
26850b57cec5SDimitry Andric   // Read all of the records and blocks in the control block.
26860b57cec5SDimitry Andric   RecordData Record;
26870b57cec5SDimitry Andric   unsigned NumInputs = 0;
26880b57cec5SDimitry Andric   unsigned NumUserInputs = 0;
26890b57cec5SDimitry Andric   StringRef BaseDirectoryAsWritten;
26900b57cec5SDimitry Andric   while (true) {
26910b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
26920b57cec5SDimitry Andric     if (!MaybeEntry) {
26930b57cec5SDimitry Andric       Error(MaybeEntry.takeError());
26940b57cec5SDimitry Andric       return Failure;
26950b57cec5SDimitry Andric     }
26960b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
26970b57cec5SDimitry Andric 
26980b57cec5SDimitry Andric     switch (Entry.Kind) {
26990b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
27000b57cec5SDimitry Andric       Error("malformed block record in AST file");
27010b57cec5SDimitry Andric       return Failure;
27020b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock: {
27030b57cec5SDimitry Andric       // Validate the module before returning.  This call catches an AST with
27040b57cec5SDimitry Andric       // no module name and no imports.
27050b57cec5SDimitry Andric       if (ASTReadResult Result = readUnhashedControlBlockOnce())
27060b57cec5SDimitry Andric         return Result;
27070b57cec5SDimitry Andric 
27080b57cec5SDimitry Andric       // Validate input files.
27090b57cec5SDimitry Andric       const HeaderSearchOptions &HSOpts =
27100b57cec5SDimitry Andric           PP.getHeaderSearchInfo().getHeaderSearchOpts();
27110b57cec5SDimitry Andric 
27120b57cec5SDimitry Andric       // All user input files reside at the index range [0, NumUserInputs), and
27130b57cec5SDimitry Andric       // system input files reside at [NumUserInputs, NumInputs). For explicitly
27140b57cec5SDimitry Andric       // loaded module files, ignore missing inputs.
27150b57cec5SDimitry Andric       if (!DisableValidation && F.Kind != MK_ExplicitModule &&
27160b57cec5SDimitry Andric           F.Kind != MK_PrebuiltModule) {
27170b57cec5SDimitry Andric         bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
27180b57cec5SDimitry Andric 
27190b57cec5SDimitry Andric         // If we are reading a module, we will create a verification timestamp,
27200b57cec5SDimitry Andric         // so we verify all input files.  Otherwise, verify only user input
27210b57cec5SDimitry Andric         // files.
27220b57cec5SDimitry Andric 
2723bdd1243dSDimitry Andric         unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
2724bdd1243dSDimitry Andric         if (HSOpts.ModulesValidateOncePerBuildSession &&
2725bdd1243dSDimitry Andric             F.InputFilesValidationTimestamp > HSOpts.BuildSessionTimestamp &&
2726bdd1243dSDimitry Andric             F.Kind == MK_ImplicitModule)
2727bdd1243dSDimitry Andric           N = NumUserInputs;
27280b57cec5SDimitry Andric 
27290b57cec5SDimitry Andric         for (unsigned I = 0; I < N; ++I) {
27300b57cec5SDimitry Andric           InputFile IF = getInputFile(F, I+1, Complain);
27310b57cec5SDimitry Andric           if (!IF.getFile() || IF.isOutOfDate())
27320b57cec5SDimitry Andric             return OutOfDate;
27330b57cec5SDimitry Andric         }
27340b57cec5SDimitry Andric       }
27350b57cec5SDimitry Andric 
27360b57cec5SDimitry Andric       if (Listener)
27370b57cec5SDimitry Andric         Listener->visitModuleFile(F.FileName, F.Kind);
27380b57cec5SDimitry Andric 
27390b57cec5SDimitry Andric       if (Listener && Listener->needsInputFileVisitation()) {
27400b57cec5SDimitry Andric         unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
27410b57cec5SDimitry Andric                                                                 : NumUserInputs;
27420b57cec5SDimitry Andric         for (unsigned I = 0; I < N; ++I) {
27430b57cec5SDimitry Andric           bool IsSystem = I >= NumUserInputs;
2744bdd1243dSDimitry Andric           InputFileInfo FI = getInputFileInfo(F, I + 1);
27450b57cec5SDimitry Andric           Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
27460b57cec5SDimitry Andric                                    F.Kind == MK_ExplicitModule ||
27470b57cec5SDimitry Andric                                    F.Kind == MK_PrebuiltModule);
27480b57cec5SDimitry Andric         }
27490b57cec5SDimitry Andric       }
27500b57cec5SDimitry Andric 
2751480093f4SDimitry Andric       return Success;
27520b57cec5SDimitry Andric     }
27530b57cec5SDimitry Andric 
27540b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock:
27550b57cec5SDimitry Andric       switch (Entry.ID) {
27560b57cec5SDimitry Andric       case INPUT_FILES_BLOCK_ID:
27570b57cec5SDimitry Andric         F.InputFilesCursor = Stream;
27580b57cec5SDimitry Andric         if (llvm::Error Err = Stream.SkipBlock()) {
27590b57cec5SDimitry Andric           Error(std::move(Err));
27600b57cec5SDimitry Andric           return Failure;
27610b57cec5SDimitry Andric         }
27620b57cec5SDimitry Andric         if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
27630b57cec5SDimitry Andric           Error("malformed block record in AST file");
27640b57cec5SDimitry Andric           return Failure;
27650b57cec5SDimitry Andric         }
27660b57cec5SDimitry Andric         continue;
27670b57cec5SDimitry Andric 
27680b57cec5SDimitry Andric       case OPTIONS_BLOCK_ID:
27690b57cec5SDimitry Andric         // If we're reading the first module for this group, check its options
27700b57cec5SDimitry Andric         // are compatible with ours. For modules it imports, no further checking
27710b57cec5SDimitry Andric         // is required, because we checked them when we built it.
27720b57cec5SDimitry Andric         if (Listener && !ImportedBy) {
27730b57cec5SDimitry Andric           // Should we allow the configuration of the module file to differ from
27740b57cec5SDimitry Andric           // the configuration of the current translation unit in a compatible
27750b57cec5SDimitry Andric           // way?
27760b57cec5SDimitry Andric           //
27770b57cec5SDimitry Andric           // FIXME: Allow this for files explicitly specified with -include-pch.
27780b57cec5SDimitry Andric           bool AllowCompatibleConfigurationMismatch =
27790b57cec5SDimitry Andric               F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
27800b57cec5SDimitry Andric 
2781480093f4SDimitry Andric           ASTReadResult Result =
2782480093f4SDimitry Andric               ReadOptionsBlock(Stream, ClientLoadCapabilities,
2783480093f4SDimitry Andric                                AllowCompatibleConfigurationMismatch, *Listener,
2784480093f4SDimitry Andric                                SuggestedPredefines);
27850b57cec5SDimitry Andric           if (Result == Failure) {
27860b57cec5SDimitry Andric             Error("malformed block record in AST file");
27870b57cec5SDimitry Andric             return Result;
27880b57cec5SDimitry Andric           }
27890b57cec5SDimitry Andric 
27900b57cec5SDimitry Andric           if (DisableValidation ||
27910b57cec5SDimitry Andric               (AllowConfigurationMismatch && Result == ConfigurationMismatch))
27920b57cec5SDimitry Andric             Result = Success;
27930b57cec5SDimitry Andric 
27940b57cec5SDimitry Andric           // If we can't load the module, exit early since we likely
27950b57cec5SDimitry Andric           // will rebuild the module anyway. The stream may be in the
27960b57cec5SDimitry Andric           // middle of a block.
27970b57cec5SDimitry Andric           if (Result != Success)
27980b57cec5SDimitry Andric             return Result;
27990b57cec5SDimitry Andric         } else if (llvm::Error Err = Stream.SkipBlock()) {
28000b57cec5SDimitry Andric           Error(std::move(Err));
28010b57cec5SDimitry Andric           return Failure;
28020b57cec5SDimitry Andric         }
28030b57cec5SDimitry Andric         continue;
28040b57cec5SDimitry Andric 
28050b57cec5SDimitry Andric       default:
28060b57cec5SDimitry Andric         if (llvm::Error Err = Stream.SkipBlock()) {
28070b57cec5SDimitry Andric           Error(std::move(Err));
28080b57cec5SDimitry Andric           return Failure;
28090b57cec5SDimitry Andric         }
28100b57cec5SDimitry Andric         continue;
28110b57cec5SDimitry Andric       }
28120b57cec5SDimitry Andric 
28130b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
28140b57cec5SDimitry Andric       // The interesting case.
28150b57cec5SDimitry Andric       break;
28160b57cec5SDimitry Andric     }
28170b57cec5SDimitry Andric 
28180b57cec5SDimitry Andric     // Read and process a record.
28190b57cec5SDimitry Andric     Record.clear();
28200b57cec5SDimitry Andric     StringRef Blob;
28210b57cec5SDimitry Andric     Expected<unsigned> MaybeRecordType =
28220b57cec5SDimitry Andric         Stream.readRecord(Entry.ID, Record, &Blob);
28230b57cec5SDimitry Andric     if (!MaybeRecordType) {
28240b57cec5SDimitry Andric       Error(MaybeRecordType.takeError());
28250b57cec5SDimitry Andric       return Failure;
28260b57cec5SDimitry Andric     }
28270b57cec5SDimitry Andric     switch ((ControlRecordTypes)MaybeRecordType.get()) {
28280b57cec5SDimitry Andric     case METADATA: {
28290b57cec5SDimitry Andric       if (Record[0] != VERSION_MAJOR && !DisableValidation) {
28300b57cec5SDimitry Andric         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
28310b57cec5SDimitry Andric           Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
28320b57cec5SDimitry Andric                                         : diag::err_pch_version_too_new);
28330b57cec5SDimitry Andric         return VersionMismatch;
28340b57cec5SDimitry Andric       }
28350b57cec5SDimitry Andric 
2836*06c3fb27SDimitry Andric       bool hasErrors = Record[7];
2837fe6060f1SDimitry Andric       if (hasErrors && !DisableValidation) {
2838fe6060f1SDimitry Andric         // If requested by the caller and the module hasn't already been read
2839fe6060f1SDimitry Andric         // or compiled, mark modules on error as out-of-date.
2840fe6060f1SDimitry Andric         if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
2841fe6060f1SDimitry Andric             canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
2842fe6060f1SDimitry Andric           return OutOfDate;
2843fe6060f1SDimitry Andric 
2844fe6060f1SDimitry Andric         if (!AllowASTWithCompilerErrors) {
28450b57cec5SDimitry Andric           Diag(diag::err_pch_with_compiler_errors);
28460b57cec5SDimitry Andric           return HadErrors;
28470b57cec5SDimitry Andric         }
2848fe6060f1SDimitry Andric       }
28490b57cec5SDimitry Andric       if (hasErrors) {
28500b57cec5SDimitry Andric         Diags.ErrorOccurred = true;
28510b57cec5SDimitry Andric         Diags.UncompilableErrorOccurred = true;
28520b57cec5SDimitry Andric         Diags.UnrecoverableErrorOccurred = true;
28530b57cec5SDimitry Andric       }
28540b57cec5SDimitry Andric 
28550b57cec5SDimitry Andric       F.RelocatablePCH = Record[4];
28560b57cec5SDimitry Andric       // Relative paths in a relocatable PCH are relative to our sysroot.
28570b57cec5SDimitry Andric       if (F.RelocatablePCH)
28580b57cec5SDimitry Andric         F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
28590b57cec5SDimitry Andric 
2860*06c3fb27SDimitry Andric       F.StandardCXXModule = Record[5];
2861*06c3fb27SDimitry Andric 
2862*06c3fb27SDimitry Andric       F.HasTimestamps = Record[6];
28630b57cec5SDimitry Andric 
28640b57cec5SDimitry Andric       const std::string &CurBranch = getClangFullRepositoryVersion();
28650b57cec5SDimitry Andric       StringRef ASTBranch = Blob;
28660b57cec5SDimitry Andric       if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
28670b57cec5SDimitry Andric         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
28680b57cec5SDimitry Andric           Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
28690b57cec5SDimitry Andric         return VersionMismatch;
28700b57cec5SDimitry Andric       }
28710b57cec5SDimitry Andric       break;
28720b57cec5SDimitry Andric     }
28730b57cec5SDimitry Andric 
28740b57cec5SDimitry Andric     case IMPORTS: {
28750b57cec5SDimitry Andric       // Validate the AST before processing any imports (otherwise, untangling
28760b57cec5SDimitry Andric       // them can be error-prone and expensive).  A module will have a name and
28770b57cec5SDimitry Andric       // will already have been validated, but this catches the PCH case.
28780b57cec5SDimitry Andric       if (ASTReadResult Result = readUnhashedControlBlockOnce())
28790b57cec5SDimitry Andric         return Result;
28800b57cec5SDimitry Andric 
28810b57cec5SDimitry Andric       // Load each of the imported PCH files.
28820b57cec5SDimitry Andric       unsigned Idx = 0, N = Record.size();
28830b57cec5SDimitry Andric       while (Idx < N) {
28840b57cec5SDimitry Andric         // Read information about the AST file.
28850b57cec5SDimitry Andric         ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2886*06c3fb27SDimitry Andric         // Whether we're importing a standard c++ module.
2887*06c3fb27SDimitry Andric         bool IsImportingStdCXXModule = Record[Idx++];
28880b57cec5SDimitry Andric         // The import location will be the local one for now; we will adjust
28890b57cec5SDimitry Andric         // all import locations of module imports after the global source
28900b57cec5SDimitry Andric         // location info are setup, in ReadAST.
28910b57cec5SDimitry Andric         SourceLocation ImportLoc =
28920b57cec5SDimitry Andric             ReadUntranslatedSourceLocation(Record[Idx++]);
28930b57cec5SDimitry Andric         off_t StoredSize = (off_t)Record[Idx++];
28940b57cec5SDimitry Andric         time_t StoredModTime = (time_t)Record[Idx++];
28955ffd83dbSDimitry Andric         auto FirstSignatureByte = Record.begin() + Idx;
28965ffd83dbSDimitry Andric         ASTFileSignature StoredSignature = ASTFileSignature::create(
28975ffd83dbSDimitry Andric             FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size);
28985ffd83dbSDimitry Andric         Idx += ASTFileSignature::size;
28990b57cec5SDimitry Andric 
29000b57cec5SDimitry Andric         std::string ImportedName = ReadString(Record, Idx);
29010b57cec5SDimitry Andric         std::string ImportedFile;
29020b57cec5SDimitry Andric 
29030b57cec5SDimitry Andric         // For prebuilt and explicit modules first consult the file map for
29040b57cec5SDimitry Andric         // an override. Note that here we don't search prebuilt module
2905*06c3fb27SDimitry Andric         // directories if we're not importing standard c++ module, only the
2906*06c3fb27SDimitry Andric         // explicit name to file mappings. Also, we will still verify the
2907*06c3fb27SDimitry Andric         // size/signature making sure it is essentially the same file but
2908*06c3fb27SDimitry Andric         // perhaps in a different location.
29090b57cec5SDimitry Andric         if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule)
29100b57cec5SDimitry Andric           ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
2911*06c3fb27SDimitry Andric               ImportedName, /*FileMapOnly*/ !IsImportingStdCXXModule);
29120b57cec5SDimitry Andric 
2913*06c3fb27SDimitry Andric         if (ImportedFile.empty()) {
2914*06c3fb27SDimitry Andric           // It is deprecated for C++20 Named modules to use the implicitly
2915*06c3fb27SDimitry Andric           // paths.
2916*06c3fb27SDimitry Andric           if (IsImportingStdCXXModule)
2917*06c3fb27SDimitry Andric             Diag(clang::diag::warn_reading_std_cxx_module_by_implicit_paths)
2918*06c3fb27SDimitry Andric                 << ImportedName;
2919*06c3fb27SDimitry Andric 
29200b57cec5SDimitry Andric           // Use BaseDirectoryAsWritten to ensure we use the same path in the
29210b57cec5SDimitry Andric           // ModuleCache as when writing.
29220b57cec5SDimitry Andric           ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx);
2923*06c3fb27SDimitry Andric         } else
29240b57cec5SDimitry Andric           SkipPath(Record, Idx);
29250b57cec5SDimitry Andric 
29260b57cec5SDimitry Andric         // If our client can't cope with us being out of date, we can't cope with
29270b57cec5SDimitry Andric         // our dependency being missing.
29280b57cec5SDimitry Andric         unsigned Capabilities = ClientLoadCapabilities;
29290b57cec5SDimitry Andric         if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
29300b57cec5SDimitry Andric           Capabilities &= ~ARR_Missing;
29310b57cec5SDimitry Andric 
29320b57cec5SDimitry Andric         // Load the AST file.
29330b57cec5SDimitry Andric         auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
29340b57cec5SDimitry Andric                                   Loaded, StoredSize, StoredModTime,
29350b57cec5SDimitry Andric                                   StoredSignature, Capabilities);
29360b57cec5SDimitry Andric 
29370b57cec5SDimitry Andric         // If we diagnosed a problem, produce a backtrace.
2938fe6060f1SDimitry Andric         bool recompilingFinalized =
2939fe6060f1SDimitry Andric             Result == OutOfDate && (Capabilities & ARR_OutOfDate) &&
2940fe6060f1SDimitry Andric             getModuleManager().getModuleCache().isPCMFinal(F.FileName);
2941fe6060f1SDimitry Andric         if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized)
29420b57cec5SDimitry Andric           Diag(diag::note_module_file_imported_by)
29430b57cec5SDimitry Andric               << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2944fe6060f1SDimitry Andric         if (recompilingFinalized)
2945fe6060f1SDimitry Andric           Diag(diag::note_module_file_conflict);
29460b57cec5SDimitry Andric 
29470b57cec5SDimitry Andric         switch (Result) {
29480b57cec5SDimitry Andric         case Failure: return Failure;
29490b57cec5SDimitry Andric           // If we have to ignore the dependency, we'll have to ignore this too.
29500b57cec5SDimitry Andric         case Missing:
29510b57cec5SDimitry Andric         case OutOfDate: return OutOfDate;
29520b57cec5SDimitry Andric         case VersionMismatch: return VersionMismatch;
29530b57cec5SDimitry Andric         case ConfigurationMismatch: return ConfigurationMismatch;
29540b57cec5SDimitry Andric         case HadErrors: return HadErrors;
29550b57cec5SDimitry Andric         case Success: break;
29560b57cec5SDimitry Andric         }
29570b57cec5SDimitry Andric       }
29580b57cec5SDimitry Andric       break;
29590b57cec5SDimitry Andric     }
29600b57cec5SDimitry Andric 
29610b57cec5SDimitry Andric     case ORIGINAL_FILE:
29620b57cec5SDimitry Andric       F.OriginalSourceFileID = FileID::get(Record[0]);
29635ffd83dbSDimitry Andric       F.ActualOriginalSourceFileName = std::string(Blob);
29640b57cec5SDimitry Andric       F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
29650b57cec5SDimitry Andric       ResolveImportedPath(F, F.OriginalSourceFileName);
29660b57cec5SDimitry Andric       break;
29670b57cec5SDimitry Andric 
29680b57cec5SDimitry Andric     case ORIGINAL_FILE_ID:
29690b57cec5SDimitry Andric       F.OriginalSourceFileID = FileID::get(Record[0]);
29700b57cec5SDimitry Andric       break;
29710b57cec5SDimitry Andric 
29720b57cec5SDimitry Andric     case MODULE_NAME:
29735ffd83dbSDimitry Andric       F.ModuleName = std::string(Blob);
29740b57cec5SDimitry Andric       Diag(diag::remark_module_import)
29750b57cec5SDimitry Andric           << F.ModuleName << F.FileName << (ImportedBy ? true : false)
29760b57cec5SDimitry Andric           << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
29770b57cec5SDimitry Andric       if (Listener)
29780b57cec5SDimitry Andric         Listener->ReadModuleName(F.ModuleName);
29790b57cec5SDimitry Andric 
29800b57cec5SDimitry Andric       // Validate the AST as soon as we have a name so we can exit early on
29810b57cec5SDimitry Andric       // failure.
29820b57cec5SDimitry Andric       if (ASTReadResult Result = readUnhashedControlBlockOnce())
29830b57cec5SDimitry Andric         return Result;
29840b57cec5SDimitry Andric 
29850b57cec5SDimitry Andric       break;
29860b57cec5SDimitry Andric 
29870b57cec5SDimitry Andric     case MODULE_DIRECTORY: {
29880b57cec5SDimitry Andric       // Save the BaseDirectory as written in the PCM for computing the module
29890b57cec5SDimitry Andric       // filename for the ModuleCache.
29900b57cec5SDimitry Andric       BaseDirectoryAsWritten = Blob;
29910b57cec5SDimitry Andric       assert(!F.ModuleName.empty() &&
29920b57cec5SDimitry Andric              "MODULE_DIRECTORY found before MODULE_NAME");
2993*06c3fb27SDimitry Andric       F.BaseDirectory = std::string(Blob);
2994*06c3fb27SDimitry Andric       if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
2995*06c3fb27SDimitry Andric         break;
29960b57cec5SDimitry Andric       // If we've already loaded a module map file covering this module, we may
29970b57cec5SDimitry Andric       // have a better path for it (relative to the current build).
29980b57cec5SDimitry Andric       Module *M = PP.getHeaderSearchInfo().lookupModule(
2999349cc55cSDimitry Andric           F.ModuleName, SourceLocation(), /*AllowSearch*/ true,
30000b57cec5SDimitry Andric           /*AllowExtraModuleMapSearch*/ true);
30010b57cec5SDimitry Andric       if (M && M->Directory) {
30020b57cec5SDimitry Andric         // If we're implicitly loading a module, the base directory can't
30030b57cec5SDimitry Andric         // change between the build and use.
30040b57cec5SDimitry Andric         // Don't emit module relocation error if we have -fno-validate-pch
3005e8d8bef9SDimitry Andric         if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3006e8d8bef9SDimitry Andric                   DisableValidationForModuleKind::Module) &&
30070b57cec5SDimitry Andric             F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
3008a7dea167SDimitry Andric           auto BuildDir = PP.getFileManager().getDirectory(Blob);
3009a7dea167SDimitry Andric           if (!BuildDir || *BuildDir != M->Directory) {
3010fe6060f1SDimitry Andric             if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
30110b57cec5SDimitry Andric               Diag(diag::err_imported_module_relocated)
30120b57cec5SDimitry Andric                   << F.ModuleName << Blob << M->Directory->getName();
30130b57cec5SDimitry Andric             return OutOfDate;
30140b57cec5SDimitry Andric           }
30150b57cec5SDimitry Andric         }
30165ffd83dbSDimitry Andric         F.BaseDirectory = std::string(M->Directory->getName());
30170b57cec5SDimitry Andric       }
30180b57cec5SDimitry Andric       break;
30190b57cec5SDimitry Andric     }
30200b57cec5SDimitry Andric 
30210b57cec5SDimitry Andric     case MODULE_MAP_FILE:
30220b57cec5SDimitry Andric       if (ASTReadResult Result =
30230b57cec5SDimitry Andric               ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
30240b57cec5SDimitry Andric         return Result;
30250b57cec5SDimitry Andric       break;
30260b57cec5SDimitry Andric 
30270b57cec5SDimitry Andric     case INPUT_FILE_OFFSETS:
30280b57cec5SDimitry Andric       NumInputs = Record[0];
30290b57cec5SDimitry Andric       NumUserInputs = Record[1];
30300b57cec5SDimitry Andric       F.InputFileOffsets =
30310b57cec5SDimitry Andric           (const llvm::support::unaligned_uint64_t *)Blob.data();
30320b57cec5SDimitry Andric       F.InputFilesLoaded.resize(NumInputs);
3033bdd1243dSDimitry Andric       F.InputFileInfosLoaded.resize(NumInputs);
30340b57cec5SDimitry Andric       F.NumUserInputFiles = NumUserInputs;
30350b57cec5SDimitry Andric       break;
30360b57cec5SDimitry Andric     }
30370b57cec5SDimitry Andric   }
30380b57cec5SDimitry Andric }
30390b57cec5SDimitry Andric 
3040349cc55cSDimitry Andric llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
3041349cc55cSDimitry Andric                                     unsigned ClientLoadCapabilities) {
30420b57cec5SDimitry Andric   BitstreamCursor &Stream = F.Stream;
30430b57cec5SDimitry Andric 
3044349cc55cSDimitry Andric   if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID))
3045349cc55cSDimitry Andric     return Err;
30465ffd83dbSDimitry Andric   F.ASTBlockStartOffset = Stream.GetCurrentBitNo();
30470b57cec5SDimitry Andric 
30480b57cec5SDimitry Andric   // Read all of the records and blocks for the AST file.
30490b57cec5SDimitry Andric   RecordData Record;
30500b57cec5SDimitry Andric   while (true) {
30510b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3052349cc55cSDimitry Andric     if (!MaybeEntry)
3053349cc55cSDimitry Andric       return MaybeEntry.takeError();
30540b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
30550b57cec5SDimitry Andric 
30560b57cec5SDimitry Andric     switch (Entry.Kind) {
30570b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
3058349cc55cSDimitry Andric       return llvm::createStringError(
3059349cc55cSDimitry Andric           std::errc::illegal_byte_sequence,
3060349cc55cSDimitry Andric           "error at end of module block in AST file");
30610b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
30620b57cec5SDimitry Andric       // Outside of C++, we do not store a lookup map for the translation unit.
30630b57cec5SDimitry Andric       // Instead, mark it as needing a lookup map to be built if this module
30640b57cec5SDimitry Andric       // contains any declarations lexically within it (which it always does!).
30650b57cec5SDimitry Andric       // This usually has no cost, since we very rarely need the lookup map for
30660b57cec5SDimitry Andric       // the translation unit outside C++.
30670b57cec5SDimitry Andric       if (ASTContext *Ctx = ContextObj) {
30680b57cec5SDimitry Andric         DeclContext *DC = Ctx->getTranslationUnitDecl();
30690b57cec5SDimitry Andric         if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus)
30700b57cec5SDimitry Andric           DC->setMustBuildLookupTable();
30710b57cec5SDimitry Andric       }
30720b57cec5SDimitry Andric 
3073349cc55cSDimitry Andric       return llvm::Error::success();
30740b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock:
30750b57cec5SDimitry Andric       switch (Entry.ID) {
30760b57cec5SDimitry Andric       case DECLTYPES_BLOCK_ID:
30770b57cec5SDimitry Andric         // We lazily load the decls block, but we want to set up the
30780b57cec5SDimitry Andric         // DeclsCursor cursor to point into it.  Clone our current bitcode
30790b57cec5SDimitry Andric         // cursor to it, enter the block and read the abbrevs in that block.
30800b57cec5SDimitry Andric         // With the main cursor, we just skip over it.
30810b57cec5SDimitry Andric         F.DeclsCursor = Stream;
3082349cc55cSDimitry Andric         if (llvm::Error Err = Stream.SkipBlock())
3083349cc55cSDimitry Andric           return Err;
3084349cc55cSDimitry Andric         if (llvm::Error Err = ReadBlockAbbrevs(
3085349cc55cSDimitry Andric                 F.DeclsCursor, DECLTYPES_BLOCK_ID, &F.DeclsBlockStartOffset))
3086349cc55cSDimitry Andric           return Err;
30870b57cec5SDimitry Andric         break;
30880b57cec5SDimitry Andric 
30890b57cec5SDimitry Andric       case PREPROCESSOR_BLOCK_ID:
30900b57cec5SDimitry Andric         F.MacroCursor = Stream;
30910b57cec5SDimitry Andric         if (!PP.getExternalSource())
30920b57cec5SDimitry Andric           PP.setExternalSource(this);
30930b57cec5SDimitry Andric 
3094349cc55cSDimitry Andric         if (llvm::Error Err = Stream.SkipBlock())
3095349cc55cSDimitry Andric           return Err;
3096349cc55cSDimitry Andric         if (llvm::Error Err =
3097349cc55cSDimitry Andric                 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID))
3098349cc55cSDimitry Andric           return Err;
30990b57cec5SDimitry Andric         F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
31000b57cec5SDimitry Andric         break;
31010b57cec5SDimitry Andric 
31020b57cec5SDimitry Andric       case PREPROCESSOR_DETAIL_BLOCK_ID:
31030b57cec5SDimitry Andric         F.PreprocessorDetailCursor = Stream;
31040b57cec5SDimitry Andric 
31050b57cec5SDimitry Andric         if (llvm::Error Err = Stream.SkipBlock()) {
3106349cc55cSDimitry Andric           return Err;
31070b57cec5SDimitry Andric         }
3108349cc55cSDimitry Andric         if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor,
3109349cc55cSDimitry Andric                                                PREPROCESSOR_DETAIL_BLOCK_ID))
3110349cc55cSDimitry Andric           return Err;
31110b57cec5SDimitry Andric         F.PreprocessorDetailStartOffset
31120b57cec5SDimitry Andric         = F.PreprocessorDetailCursor.GetCurrentBitNo();
31130b57cec5SDimitry Andric 
31140b57cec5SDimitry Andric         if (!PP.getPreprocessingRecord())
31150b57cec5SDimitry Andric           PP.createPreprocessingRecord();
31160b57cec5SDimitry Andric         if (!PP.getPreprocessingRecord()->getExternalSource())
31170b57cec5SDimitry Andric           PP.getPreprocessingRecord()->SetExternalSource(*this);
31180b57cec5SDimitry Andric         break;
31190b57cec5SDimitry Andric 
31200b57cec5SDimitry Andric       case SOURCE_MANAGER_BLOCK_ID:
3121349cc55cSDimitry Andric         if (llvm::Error Err = ReadSourceManagerBlock(F))
3122349cc55cSDimitry Andric           return Err;
31230b57cec5SDimitry Andric         break;
31240b57cec5SDimitry Andric 
31250b57cec5SDimitry Andric       case SUBMODULE_BLOCK_ID:
3126349cc55cSDimitry Andric         if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3127349cc55cSDimitry Andric           return Err;
31280b57cec5SDimitry Andric         break;
31290b57cec5SDimitry Andric 
31300b57cec5SDimitry Andric       case COMMENTS_BLOCK_ID: {
31310b57cec5SDimitry Andric         BitstreamCursor C = Stream;
31320b57cec5SDimitry Andric 
3133349cc55cSDimitry Andric         if (llvm::Error Err = Stream.SkipBlock())
3134349cc55cSDimitry Andric           return Err;
3135349cc55cSDimitry Andric         if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID))
3136349cc55cSDimitry Andric           return Err;
31370b57cec5SDimitry Andric         CommentsCursors.push_back(std::make_pair(C, &F));
31380b57cec5SDimitry Andric         break;
31390b57cec5SDimitry Andric       }
31400b57cec5SDimitry Andric 
31410b57cec5SDimitry Andric       default:
3142349cc55cSDimitry Andric         if (llvm::Error Err = Stream.SkipBlock())
3143349cc55cSDimitry Andric           return Err;
31440b57cec5SDimitry Andric         break;
31450b57cec5SDimitry Andric       }
31460b57cec5SDimitry Andric       continue;
31470b57cec5SDimitry Andric 
31480b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
31490b57cec5SDimitry Andric       // The interesting case.
31500b57cec5SDimitry Andric       break;
31510b57cec5SDimitry Andric     }
31520b57cec5SDimitry Andric 
31530b57cec5SDimitry Andric     // Read and process a record.
31540b57cec5SDimitry Andric     Record.clear();
31550b57cec5SDimitry Andric     StringRef Blob;
31560b57cec5SDimitry Andric     Expected<unsigned> MaybeRecordType =
31570b57cec5SDimitry Andric         Stream.readRecord(Entry.ID, Record, &Blob);
3158349cc55cSDimitry Andric     if (!MaybeRecordType)
3159349cc55cSDimitry Andric       return MaybeRecordType.takeError();
31600b57cec5SDimitry Andric     ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get();
31610b57cec5SDimitry Andric 
31620b57cec5SDimitry Andric     // If we're not loading an AST context, we don't care about most records.
31630b57cec5SDimitry Andric     if (!ContextObj) {
31640b57cec5SDimitry Andric       switch (RecordType) {
31650b57cec5SDimitry Andric       case IDENTIFIER_TABLE:
31660b57cec5SDimitry Andric       case IDENTIFIER_OFFSET:
31670b57cec5SDimitry Andric       case INTERESTING_IDENTIFIERS:
31680b57cec5SDimitry Andric       case STATISTICS:
316981ad6265SDimitry Andric       case PP_ASSUME_NONNULL_LOC:
31700b57cec5SDimitry Andric       case PP_CONDITIONAL_STACK:
31710b57cec5SDimitry Andric       case PP_COUNTER_VALUE:
31720b57cec5SDimitry Andric       case SOURCE_LOCATION_OFFSETS:
31730b57cec5SDimitry Andric       case MODULE_OFFSET_MAP:
31740b57cec5SDimitry Andric       case SOURCE_MANAGER_LINE_TABLE:
31750b57cec5SDimitry Andric       case SOURCE_LOCATION_PRELOADS:
31760b57cec5SDimitry Andric       case PPD_ENTITIES_OFFSETS:
31770b57cec5SDimitry Andric       case HEADER_SEARCH_TABLE:
31780b57cec5SDimitry Andric       case IMPORTED_MODULES:
31790b57cec5SDimitry Andric       case MACRO_OFFSET:
31800b57cec5SDimitry Andric         break;
31810b57cec5SDimitry Andric       default:
31820b57cec5SDimitry Andric         continue;
31830b57cec5SDimitry Andric       }
31840b57cec5SDimitry Andric     }
31850b57cec5SDimitry Andric 
31860b57cec5SDimitry Andric     switch (RecordType) {
31870b57cec5SDimitry Andric     default:  // Default behavior: ignore.
31880b57cec5SDimitry Andric       break;
31890b57cec5SDimitry Andric 
31900b57cec5SDimitry Andric     case TYPE_OFFSET: {
3191349cc55cSDimitry Andric       if (F.LocalNumTypes != 0)
3192349cc55cSDimitry Andric         return llvm::createStringError(
3193349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3194349cc55cSDimitry Andric             "duplicate TYPE_OFFSET record in AST file");
31955ffd83dbSDimitry Andric       F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data());
31960b57cec5SDimitry Andric       F.LocalNumTypes = Record[0];
31970b57cec5SDimitry Andric       unsigned LocalBaseTypeIndex = Record[1];
31980b57cec5SDimitry Andric       F.BaseTypeIndex = getTotalNumTypes();
31990b57cec5SDimitry Andric 
32000b57cec5SDimitry Andric       if (F.LocalNumTypes > 0) {
32010b57cec5SDimitry Andric         // Introduce the global -> local mapping for types within this module.
32020b57cec5SDimitry Andric         GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
32030b57cec5SDimitry Andric 
32040b57cec5SDimitry Andric         // Introduce the local -> global mapping for types within this module.
32050b57cec5SDimitry Andric         F.TypeRemap.insertOrReplace(
32060b57cec5SDimitry Andric           std::make_pair(LocalBaseTypeIndex,
32070b57cec5SDimitry Andric                          F.BaseTypeIndex - LocalBaseTypeIndex));
32080b57cec5SDimitry Andric 
32090b57cec5SDimitry Andric         TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
32100b57cec5SDimitry Andric       }
32110b57cec5SDimitry Andric       break;
32120b57cec5SDimitry Andric     }
32130b57cec5SDimitry Andric 
32140b57cec5SDimitry Andric     case DECL_OFFSET: {
3215349cc55cSDimitry Andric       if (F.LocalNumDecls != 0)
3216349cc55cSDimitry Andric         return llvm::createStringError(
3217349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3218349cc55cSDimitry Andric             "duplicate DECL_OFFSET record in AST file");
32190b57cec5SDimitry Andric       F.DeclOffsets = (const DeclOffset *)Blob.data();
32200b57cec5SDimitry Andric       F.LocalNumDecls = Record[0];
32210b57cec5SDimitry Andric       unsigned LocalBaseDeclID = Record[1];
32220b57cec5SDimitry Andric       F.BaseDeclID = getTotalNumDecls();
32230b57cec5SDimitry Andric 
32240b57cec5SDimitry Andric       if (F.LocalNumDecls > 0) {
32250b57cec5SDimitry Andric         // Introduce the global -> local mapping for declarations within this
32260b57cec5SDimitry Andric         // module.
32270b57cec5SDimitry Andric         GlobalDeclMap.insert(
32280b57cec5SDimitry Andric           std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
32290b57cec5SDimitry Andric 
32300b57cec5SDimitry Andric         // Introduce the local -> global mapping for declarations within this
32310b57cec5SDimitry Andric         // module.
32320b57cec5SDimitry Andric         F.DeclRemap.insertOrReplace(
32330b57cec5SDimitry Andric           std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
32340b57cec5SDimitry Andric 
32350b57cec5SDimitry Andric         // Introduce the global -> local mapping for declarations within this
32360b57cec5SDimitry Andric         // module.
32370b57cec5SDimitry Andric         F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
32380b57cec5SDimitry Andric 
32390b57cec5SDimitry Andric         DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
32400b57cec5SDimitry Andric       }
32410b57cec5SDimitry Andric       break;
32420b57cec5SDimitry Andric     }
32430b57cec5SDimitry Andric 
32440b57cec5SDimitry Andric     case TU_UPDATE_LEXICAL: {
32450b57cec5SDimitry Andric       DeclContext *TU = ContextObj->getTranslationUnitDecl();
32460b57cec5SDimitry Andric       LexicalContents Contents(
32470b57cec5SDimitry Andric           reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
32480b57cec5SDimitry Andric               Blob.data()),
32490b57cec5SDimitry Andric           static_cast<unsigned int>(Blob.size() / 4));
32500b57cec5SDimitry Andric       TULexicalDecls.push_back(std::make_pair(&F, Contents));
32510b57cec5SDimitry Andric       TU->setHasExternalLexicalStorage(true);
32520b57cec5SDimitry Andric       break;
32530b57cec5SDimitry Andric     }
32540b57cec5SDimitry Andric 
32550b57cec5SDimitry Andric     case UPDATE_VISIBLE: {
32560b57cec5SDimitry Andric       unsigned Idx = 0;
32570b57cec5SDimitry Andric       serialization::DeclID ID = ReadDeclID(F, Record, Idx);
32580b57cec5SDimitry Andric       auto *Data = (const unsigned char*)Blob.data();
32590b57cec5SDimitry Andric       PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
32600b57cec5SDimitry Andric       // If we've already loaded the decl, perform the updates when we finish
32610b57cec5SDimitry Andric       // loading this block.
32620b57cec5SDimitry Andric       if (Decl *D = GetExistingDecl(ID))
32630b57cec5SDimitry Andric         PendingUpdateRecords.push_back(
32640b57cec5SDimitry Andric             PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
32650b57cec5SDimitry Andric       break;
32660b57cec5SDimitry Andric     }
32670b57cec5SDimitry Andric 
32680b57cec5SDimitry Andric     case IDENTIFIER_TABLE:
3269fe6060f1SDimitry Andric       F.IdentifierTableData =
3270fe6060f1SDimitry Andric           reinterpret_cast<const unsigned char *>(Blob.data());
32710b57cec5SDimitry Andric       if (Record[0]) {
32720b57cec5SDimitry Andric         F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
3273fe6060f1SDimitry Andric             F.IdentifierTableData + Record[0],
3274fe6060f1SDimitry Andric             F.IdentifierTableData + sizeof(uint32_t),
3275fe6060f1SDimitry Andric             F.IdentifierTableData,
32760b57cec5SDimitry Andric             ASTIdentifierLookupTrait(*this, F));
32770b57cec5SDimitry Andric 
32780b57cec5SDimitry Andric         PP.getIdentifierTable().setExternalIdentifierLookup(this);
32790b57cec5SDimitry Andric       }
32800b57cec5SDimitry Andric       break;
32810b57cec5SDimitry Andric 
32820b57cec5SDimitry Andric     case IDENTIFIER_OFFSET: {
3283349cc55cSDimitry Andric       if (F.LocalNumIdentifiers != 0)
3284349cc55cSDimitry Andric         return llvm::createStringError(
3285349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3286349cc55cSDimitry Andric             "duplicate IDENTIFIER_OFFSET record in AST file");
32870b57cec5SDimitry Andric       F.IdentifierOffsets = (const uint32_t *)Blob.data();
32880b57cec5SDimitry Andric       F.LocalNumIdentifiers = Record[0];
32890b57cec5SDimitry Andric       unsigned LocalBaseIdentifierID = Record[1];
32900b57cec5SDimitry Andric       F.BaseIdentifierID = getTotalNumIdentifiers();
32910b57cec5SDimitry Andric 
32920b57cec5SDimitry Andric       if (F.LocalNumIdentifiers > 0) {
32930b57cec5SDimitry Andric         // Introduce the global -> local mapping for identifiers within this
32940b57cec5SDimitry Andric         // module.
32950b57cec5SDimitry Andric         GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
32960b57cec5SDimitry Andric                                                   &F));
32970b57cec5SDimitry Andric 
32980b57cec5SDimitry Andric         // Introduce the local -> global mapping for identifiers within this
32990b57cec5SDimitry Andric         // module.
33000b57cec5SDimitry Andric         F.IdentifierRemap.insertOrReplace(
33010b57cec5SDimitry Andric           std::make_pair(LocalBaseIdentifierID,
33020b57cec5SDimitry Andric                          F.BaseIdentifierID - LocalBaseIdentifierID));
33030b57cec5SDimitry Andric 
33040b57cec5SDimitry Andric         IdentifiersLoaded.resize(IdentifiersLoaded.size()
33050b57cec5SDimitry Andric                                  + F.LocalNumIdentifiers);
33060b57cec5SDimitry Andric       }
33070b57cec5SDimitry Andric       break;
33080b57cec5SDimitry Andric     }
33090b57cec5SDimitry Andric 
33100b57cec5SDimitry Andric     case INTERESTING_IDENTIFIERS:
33110b57cec5SDimitry Andric       F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
33120b57cec5SDimitry Andric       break;
33130b57cec5SDimitry Andric 
33140b57cec5SDimitry Andric     case EAGERLY_DESERIALIZED_DECLS:
33150b57cec5SDimitry Andric       // FIXME: Skip reading this record if our ASTConsumer doesn't care
33160b57cec5SDimitry Andric       // about "interesting" decls (for instance, if we're building a module).
33170b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
33180b57cec5SDimitry Andric         EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
33190b57cec5SDimitry Andric       break;
33200b57cec5SDimitry Andric 
33210b57cec5SDimitry Andric     case MODULAR_CODEGEN_DECLS:
33220b57cec5SDimitry Andric       // FIXME: Skip reading this record if our ASTConsumer doesn't care about
33230b57cec5SDimitry Andric       // them (ie: if we're not codegenerating this module).
33245ffd83dbSDimitry Andric       if (F.Kind == MK_MainFile ||
33255ffd83dbSDimitry Andric           getContext().getLangOpts().BuildingPCHWithObjectFile)
33260b57cec5SDimitry Andric         for (unsigned I = 0, N = Record.size(); I != N; ++I)
33270b57cec5SDimitry Andric           EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
33280b57cec5SDimitry Andric       break;
33290b57cec5SDimitry Andric 
33300b57cec5SDimitry Andric     case SPECIAL_TYPES:
33310b57cec5SDimitry Andric       if (SpecialTypes.empty()) {
33320b57cec5SDimitry Andric         for (unsigned I = 0, N = Record.size(); I != N; ++I)
33330b57cec5SDimitry Andric           SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
33340b57cec5SDimitry Andric         break;
33350b57cec5SDimitry Andric       }
33360b57cec5SDimitry Andric 
3337349cc55cSDimitry Andric       if (SpecialTypes.size() != Record.size())
3338349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3339349cc55cSDimitry Andric                                        "invalid special-types record");
33400b57cec5SDimitry Andric 
33410b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I) {
33420b57cec5SDimitry Andric         serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
33430b57cec5SDimitry Andric         if (!SpecialTypes[I])
33440b57cec5SDimitry Andric           SpecialTypes[I] = ID;
33450b57cec5SDimitry Andric         // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
33460b57cec5SDimitry Andric         // merge step?
33470b57cec5SDimitry Andric       }
33480b57cec5SDimitry Andric       break;
33490b57cec5SDimitry Andric 
33500b57cec5SDimitry Andric     case STATISTICS:
33510b57cec5SDimitry Andric       TotalNumStatements += Record[0];
33520b57cec5SDimitry Andric       TotalNumMacros += Record[1];
33530b57cec5SDimitry Andric       TotalLexicalDeclContexts += Record[2];
33540b57cec5SDimitry Andric       TotalVisibleDeclContexts += Record[3];
33550b57cec5SDimitry Andric       break;
33560b57cec5SDimitry Andric 
33570b57cec5SDimitry Andric     case UNUSED_FILESCOPED_DECLS:
33580b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
33590b57cec5SDimitry Andric         UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
33600b57cec5SDimitry Andric       break;
33610b57cec5SDimitry Andric 
33620b57cec5SDimitry Andric     case DELEGATING_CTORS:
33630b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
33640b57cec5SDimitry Andric         DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
33650b57cec5SDimitry Andric       break;
33660b57cec5SDimitry Andric 
33670b57cec5SDimitry Andric     case WEAK_UNDECLARED_IDENTIFIERS:
336881ad6265SDimitry Andric       if (Record.size() % 3 != 0)
3369349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3370349cc55cSDimitry Andric                                        "invalid weak identifiers record");
33710b57cec5SDimitry Andric 
33720b57cec5SDimitry Andric       // FIXME: Ignore weak undeclared identifiers from non-original PCH
33730b57cec5SDimitry Andric       // files. This isn't the way to do it :)
33740b57cec5SDimitry Andric       WeakUndeclaredIdentifiers.clear();
33750b57cec5SDimitry Andric 
33760b57cec5SDimitry Andric       // Translate the weak, undeclared identifiers into global IDs.
33770b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
33780b57cec5SDimitry Andric         WeakUndeclaredIdentifiers.push_back(
33790b57cec5SDimitry Andric           getGlobalIdentifierID(F, Record[I++]));
33800b57cec5SDimitry Andric         WeakUndeclaredIdentifiers.push_back(
33810b57cec5SDimitry Andric           getGlobalIdentifierID(F, Record[I++]));
33820b57cec5SDimitry Andric         WeakUndeclaredIdentifiers.push_back(
33830b57cec5SDimitry Andric             ReadSourceLocation(F, Record, I).getRawEncoding());
33840b57cec5SDimitry Andric       }
33850b57cec5SDimitry Andric       break;
33860b57cec5SDimitry Andric 
33870b57cec5SDimitry Andric     case SELECTOR_OFFSETS: {
33880b57cec5SDimitry Andric       F.SelectorOffsets = (const uint32_t *)Blob.data();
33890b57cec5SDimitry Andric       F.LocalNumSelectors = Record[0];
33900b57cec5SDimitry Andric       unsigned LocalBaseSelectorID = Record[1];
33910b57cec5SDimitry Andric       F.BaseSelectorID = getTotalNumSelectors();
33920b57cec5SDimitry Andric 
33930b57cec5SDimitry Andric       if (F.LocalNumSelectors > 0) {
33940b57cec5SDimitry Andric         // Introduce the global -> local mapping for selectors within this
33950b57cec5SDimitry Andric         // module.
33960b57cec5SDimitry Andric         GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
33970b57cec5SDimitry Andric 
33980b57cec5SDimitry Andric         // Introduce the local -> global mapping for selectors within this
33990b57cec5SDimitry Andric         // module.
34000b57cec5SDimitry Andric         F.SelectorRemap.insertOrReplace(
34010b57cec5SDimitry Andric           std::make_pair(LocalBaseSelectorID,
34020b57cec5SDimitry Andric                          F.BaseSelectorID - LocalBaseSelectorID));
34030b57cec5SDimitry Andric 
34040b57cec5SDimitry Andric         SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
34050b57cec5SDimitry Andric       }
34060b57cec5SDimitry Andric       break;
34070b57cec5SDimitry Andric     }
34080b57cec5SDimitry Andric 
34090b57cec5SDimitry Andric     case METHOD_POOL:
34100b57cec5SDimitry Andric       F.SelectorLookupTableData = (const unsigned char *)Blob.data();
34110b57cec5SDimitry Andric       if (Record[0])
34120b57cec5SDimitry Andric         F.SelectorLookupTable
34130b57cec5SDimitry Andric           = ASTSelectorLookupTable::Create(
34140b57cec5SDimitry Andric                         F.SelectorLookupTableData + Record[0],
34150b57cec5SDimitry Andric                         F.SelectorLookupTableData,
34160b57cec5SDimitry Andric                         ASTSelectorLookupTrait(*this, F));
34170b57cec5SDimitry Andric       TotalNumMethodPoolEntries += Record[1];
34180b57cec5SDimitry Andric       break;
34190b57cec5SDimitry Andric 
34200b57cec5SDimitry Andric     case REFERENCED_SELECTOR_POOL:
34210b57cec5SDimitry Andric       if (!Record.empty()) {
34220b57cec5SDimitry Andric         for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
34230b57cec5SDimitry Andric           ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
34240b57cec5SDimitry Andric                                                                 Record[Idx++]));
34250b57cec5SDimitry Andric           ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
34260b57cec5SDimitry Andric                                               getRawEncoding());
34270b57cec5SDimitry Andric         }
34280b57cec5SDimitry Andric       }
34290b57cec5SDimitry Andric       break;
34300b57cec5SDimitry Andric 
343181ad6265SDimitry Andric     case PP_ASSUME_NONNULL_LOC: {
343281ad6265SDimitry Andric       unsigned Idx = 0;
343381ad6265SDimitry Andric       if (!Record.empty())
343481ad6265SDimitry Andric         PP.setPreambleRecordedPragmaAssumeNonNullLoc(
343581ad6265SDimitry Andric             ReadSourceLocation(F, Record, Idx));
343681ad6265SDimitry Andric       break;
343781ad6265SDimitry Andric     }
343881ad6265SDimitry Andric 
34390b57cec5SDimitry Andric     case PP_CONDITIONAL_STACK:
34400b57cec5SDimitry Andric       if (!Record.empty()) {
34410b57cec5SDimitry Andric         unsigned Idx = 0, End = Record.size() - 1;
34420b57cec5SDimitry Andric         bool ReachedEOFWhileSkipping = Record[Idx++];
3443bdd1243dSDimitry Andric         std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
34440b57cec5SDimitry Andric         if (ReachedEOFWhileSkipping) {
34450b57cec5SDimitry Andric           SourceLocation HashToken = ReadSourceLocation(F, Record, Idx);
34460b57cec5SDimitry Andric           SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx);
34470b57cec5SDimitry Andric           bool FoundNonSkipPortion = Record[Idx++];
34480b57cec5SDimitry Andric           bool FoundElse = Record[Idx++];
34490b57cec5SDimitry Andric           SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx);
34500b57cec5SDimitry Andric           SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
34510b57cec5SDimitry Andric                            FoundElse, ElseLoc);
34520b57cec5SDimitry Andric         }
34530b57cec5SDimitry Andric         SmallVector<PPConditionalInfo, 4> ConditionalStack;
34540b57cec5SDimitry Andric         while (Idx < End) {
34550b57cec5SDimitry Andric           auto Loc = ReadSourceLocation(F, Record, Idx);
34560b57cec5SDimitry Andric           bool WasSkipping = Record[Idx++];
34570b57cec5SDimitry Andric           bool FoundNonSkip = Record[Idx++];
34580b57cec5SDimitry Andric           bool FoundElse = Record[Idx++];
34590b57cec5SDimitry Andric           ConditionalStack.push_back(
34600b57cec5SDimitry Andric               {Loc, WasSkipping, FoundNonSkip, FoundElse});
34610b57cec5SDimitry Andric         }
34620b57cec5SDimitry Andric         PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
34630b57cec5SDimitry Andric       }
34640b57cec5SDimitry Andric       break;
34650b57cec5SDimitry Andric 
34660b57cec5SDimitry Andric     case PP_COUNTER_VALUE:
34670b57cec5SDimitry Andric       if (!Record.empty() && Listener)
34680b57cec5SDimitry Andric         Listener->ReadCounter(F, Record[0]);
34690b57cec5SDimitry Andric       break;
34700b57cec5SDimitry Andric 
34710b57cec5SDimitry Andric     case FILE_SORTED_DECLS:
34720b57cec5SDimitry Andric       F.FileSortedDecls = (const DeclID *)Blob.data();
34730b57cec5SDimitry Andric       F.NumFileSortedDecls = Record[0];
34740b57cec5SDimitry Andric       break;
34750b57cec5SDimitry Andric 
34760b57cec5SDimitry Andric     case SOURCE_LOCATION_OFFSETS: {
34770b57cec5SDimitry Andric       F.SLocEntryOffsets = (const uint32_t *)Blob.data();
34780b57cec5SDimitry Andric       F.LocalNumSLocEntries = Record[0];
3479fe6060f1SDimitry Andric       SourceLocation::UIntTy SLocSpaceSize = Record[1];
34805ffd83dbSDimitry Andric       F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset;
34810b57cec5SDimitry Andric       std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
34820b57cec5SDimitry Andric           SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
34830b57cec5SDimitry Andric                                               SLocSpaceSize);
3484bdd1243dSDimitry Andric       if (!F.SLocEntryBaseID) {
3485bdd1243dSDimitry Andric         if (!Diags.isDiagnosticInFlight()) {
3486bdd1243dSDimitry Andric           Diags.Report(SourceLocation(), diag::remark_sloc_usage);
3487bdd1243dSDimitry Andric           SourceMgr.noteSLocAddressSpaceUsage(Diags);
3488bdd1243dSDimitry Andric         }
3489349cc55cSDimitry Andric         return llvm::createStringError(std::errc::invalid_argument,
3490349cc55cSDimitry Andric                                        "ran out of source locations");
3491bdd1243dSDimitry Andric       }
34920b57cec5SDimitry Andric       // Make our entry in the range map. BaseID is negative and growing, so
34930b57cec5SDimitry Andric       // we invert it. Because we invert it, though, we need the other end of
34940b57cec5SDimitry Andric       // the range.
34950b57cec5SDimitry Andric       unsigned RangeStart =
34960b57cec5SDimitry Andric           unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
34970b57cec5SDimitry Andric       GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
34980b57cec5SDimitry Andric       F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
34990b57cec5SDimitry Andric 
35000b57cec5SDimitry Andric       // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
3501fe6060f1SDimitry Andric       assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0);
35020b57cec5SDimitry Andric       GlobalSLocOffsetMap.insert(
35030b57cec5SDimitry Andric           std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
35040b57cec5SDimitry Andric                            - SLocSpaceSize,&F));
35050b57cec5SDimitry Andric 
35060b57cec5SDimitry Andric       // Initialize the remapping table.
35070b57cec5SDimitry Andric       // Invalid stays invalid.
35080b57cec5SDimitry Andric       F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
35090b57cec5SDimitry Andric       // This module. Base was 2 when being compiled.
3510fe6060f1SDimitry Andric       F.SLocRemap.insertOrReplace(std::make_pair(
3511fe6060f1SDimitry Andric           2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2)));
35120b57cec5SDimitry Andric 
35130b57cec5SDimitry Andric       TotalNumSLocEntries += F.LocalNumSLocEntries;
35140b57cec5SDimitry Andric       break;
35150b57cec5SDimitry Andric     }
35160b57cec5SDimitry Andric 
35170b57cec5SDimitry Andric     case MODULE_OFFSET_MAP:
35180b57cec5SDimitry Andric       F.ModuleOffsetMap = Blob;
35190b57cec5SDimitry Andric       break;
35200b57cec5SDimitry Andric 
35210b57cec5SDimitry Andric     case SOURCE_MANAGER_LINE_TABLE:
3522349cc55cSDimitry Andric       ParseLineTable(F, Record);
35230b57cec5SDimitry Andric       break;
35240b57cec5SDimitry Andric 
35250b57cec5SDimitry Andric     case SOURCE_LOCATION_PRELOADS: {
35260b57cec5SDimitry Andric       // Need to transform from the local view (1-based IDs) to the global view,
35270b57cec5SDimitry Andric       // which is based off F.SLocEntryBaseID.
3528349cc55cSDimitry Andric       if (!F.PreloadSLocEntries.empty())
3529349cc55cSDimitry Andric         return llvm::createStringError(
3530349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3531349cc55cSDimitry Andric             "Multiple SOURCE_LOCATION_PRELOADS records in AST file");
35320b57cec5SDimitry Andric 
35330b57cec5SDimitry Andric       F.PreloadSLocEntries.swap(Record);
35340b57cec5SDimitry Andric       break;
35350b57cec5SDimitry Andric     }
35360b57cec5SDimitry Andric 
35370b57cec5SDimitry Andric     case EXT_VECTOR_DECLS:
35380b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
35390b57cec5SDimitry Andric         ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
35400b57cec5SDimitry Andric       break;
35410b57cec5SDimitry Andric 
35420b57cec5SDimitry Andric     case VTABLE_USES:
3543349cc55cSDimitry Andric       if (Record.size() % 3 != 0)
3544349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3545349cc55cSDimitry Andric                                        "Invalid VTABLE_USES record");
35460b57cec5SDimitry Andric 
35470b57cec5SDimitry Andric       // Later tables overwrite earlier ones.
35480b57cec5SDimitry Andric       // FIXME: Modules will have some trouble with this. This is clearly not
35490b57cec5SDimitry Andric       // the right way to do this.
35500b57cec5SDimitry Andric       VTableUses.clear();
35510b57cec5SDimitry Andric 
35520b57cec5SDimitry Andric       for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
35530b57cec5SDimitry Andric         VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
35540b57cec5SDimitry Andric         VTableUses.push_back(
35550b57cec5SDimitry Andric           ReadSourceLocation(F, Record, Idx).getRawEncoding());
35560b57cec5SDimitry Andric         VTableUses.push_back(Record[Idx++]);
35570b57cec5SDimitry Andric       }
35580b57cec5SDimitry Andric       break;
35590b57cec5SDimitry Andric 
35600b57cec5SDimitry Andric     case PENDING_IMPLICIT_INSTANTIATIONS:
3561349cc55cSDimitry Andric       if (PendingInstantiations.size() % 2 != 0)
3562349cc55cSDimitry Andric         return llvm::createStringError(
3563349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3564349cc55cSDimitry Andric             "Invalid existing PendingInstantiations");
35650b57cec5SDimitry Andric 
3566349cc55cSDimitry Andric       if (Record.size() % 2 != 0)
3567349cc55cSDimitry Andric         return llvm::createStringError(
3568349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3569349cc55cSDimitry Andric             "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
35700b57cec5SDimitry Andric 
35710b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
35720b57cec5SDimitry Andric         PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
35730b57cec5SDimitry Andric         PendingInstantiations.push_back(
35740b57cec5SDimitry Andric           ReadSourceLocation(F, Record, I).getRawEncoding());
35750b57cec5SDimitry Andric       }
35760b57cec5SDimitry Andric       break;
35770b57cec5SDimitry Andric 
35780b57cec5SDimitry Andric     case SEMA_DECL_REFS:
3579349cc55cSDimitry Andric       if (Record.size() != 3)
3580349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3581349cc55cSDimitry Andric                                        "Invalid SEMA_DECL_REFS block");
35820b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
35830b57cec5SDimitry Andric         SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
35840b57cec5SDimitry Andric       break;
35850b57cec5SDimitry Andric 
35860b57cec5SDimitry Andric     case PPD_ENTITIES_OFFSETS: {
35870b57cec5SDimitry Andric       F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
35880b57cec5SDimitry Andric       assert(Blob.size() % sizeof(PPEntityOffset) == 0);
35890b57cec5SDimitry Andric       F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
35900b57cec5SDimitry Andric 
35910b57cec5SDimitry Andric       unsigned LocalBasePreprocessedEntityID = Record[0];
35920b57cec5SDimitry Andric 
35930b57cec5SDimitry Andric       unsigned StartingID;
35940b57cec5SDimitry Andric       if (!PP.getPreprocessingRecord())
35950b57cec5SDimitry Andric         PP.createPreprocessingRecord();
35960b57cec5SDimitry Andric       if (!PP.getPreprocessingRecord()->getExternalSource())
35970b57cec5SDimitry Andric         PP.getPreprocessingRecord()->SetExternalSource(*this);
35980b57cec5SDimitry Andric       StartingID
35990b57cec5SDimitry Andric         = PP.getPreprocessingRecord()
36000b57cec5SDimitry Andric             ->allocateLoadedEntities(F.NumPreprocessedEntities);
36010b57cec5SDimitry Andric       F.BasePreprocessedEntityID = StartingID;
36020b57cec5SDimitry Andric 
36030b57cec5SDimitry Andric       if (F.NumPreprocessedEntities > 0) {
36040b57cec5SDimitry Andric         // Introduce the global -> local mapping for preprocessed entities in
36050b57cec5SDimitry Andric         // this module.
36060b57cec5SDimitry Andric         GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
36070b57cec5SDimitry Andric 
36080b57cec5SDimitry Andric         // Introduce the local -> global mapping for preprocessed entities in
36090b57cec5SDimitry Andric         // this module.
36100b57cec5SDimitry Andric         F.PreprocessedEntityRemap.insertOrReplace(
36110b57cec5SDimitry Andric           std::make_pair(LocalBasePreprocessedEntityID,
36120b57cec5SDimitry Andric             F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
36130b57cec5SDimitry Andric       }
36140b57cec5SDimitry Andric 
36150b57cec5SDimitry Andric       break;
36160b57cec5SDimitry Andric     }
36170b57cec5SDimitry Andric 
36180b57cec5SDimitry Andric     case PPD_SKIPPED_RANGES: {
36190b57cec5SDimitry Andric       F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data();
36200b57cec5SDimitry Andric       assert(Blob.size() % sizeof(PPSkippedRange) == 0);
36210b57cec5SDimitry Andric       F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange);
36220b57cec5SDimitry Andric 
36230b57cec5SDimitry Andric       if (!PP.getPreprocessingRecord())
36240b57cec5SDimitry Andric         PP.createPreprocessingRecord();
36250b57cec5SDimitry Andric       if (!PP.getPreprocessingRecord()->getExternalSource())
36260b57cec5SDimitry Andric         PP.getPreprocessingRecord()->SetExternalSource(*this);
36270b57cec5SDimitry Andric       F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord()
36280b57cec5SDimitry Andric           ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges);
36290b57cec5SDimitry Andric 
36300b57cec5SDimitry Andric       if (F.NumPreprocessedSkippedRanges > 0)
36310b57cec5SDimitry Andric         GlobalSkippedRangeMap.insert(
36320b57cec5SDimitry Andric             std::make_pair(F.BasePreprocessedSkippedRangeID, &F));
36330b57cec5SDimitry Andric       break;
36340b57cec5SDimitry Andric     }
36350b57cec5SDimitry Andric 
36360b57cec5SDimitry Andric     case DECL_UPDATE_OFFSETS:
3637349cc55cSDimitry Andric       if (Record.size() % 2 != 0)
3638349cc55cSDimitry Andric         return llvm::createStringError(
3639349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3640349cc55cSDimitry Andric             "invalid DECL_UPDATE_OFFSETS block in AST file");
36410b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
36420b57cec5SDimitry Andric         GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
36430b57cec5SDimitry Andric         DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
36440b57cec5SDimitry Andric 
36450b57cec5SDimitry Andric         // If we've already loaded the decl, perform the updates when we finish
36460b57cec5SDimitry Andric         // loading this block.
36470b57cec5SDimitry Andric         if (Decl *D = GetExistingDecl(ID))
36480b57cec5SDimitry Andric           PendingUpdateRecords.push_back(
36490b57cec5SDimitry Andric               PendingUpdateRecord(ID, D, /*JustLoaded=*/false));
36500b57cec5SDimitry Andric       }
36510b57cec5SDimitry Andric       break;
36520b57cec5SDimitry Andric 
36530b57cec5SDimitry Andric     case OBJC_CATEGORIES_MAP:
3654349cc55cSDimitry Andric       if (F.LocalNumObjCCategoriesInMap != 0)
3655349cc55cSDimitry Andric         return llvm::createStringError(
3656349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3657349cc55cSDimitry Andric             "duplicate OBJC_CATEGORIES_MAP record in AST file");
36580b57cec5SDimitry Andric 
36590b57cec5SDimitry Andric       F.LocalNumObjCCategoriesInMap = Record[0];
36600b57cec5SDimitry Andric       F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
36610b57cec5SDimitry Andric       break;
36620b57cec5SDimitry Andric 
36630b57cec5SDimitry Andric     case OBJC_CATEGORIES:
36640b57cec5SDimitry Andric       F.ObjCCategories.swap(Record);
36650b57cec5SDimitry Andric       break;
36660b57cec5SDimitry Andric 
36670b57cec5SDimitry Andric     case CUDA_SPECIAL_DECL_REFS:
36680b57cec5SDimitry Andric       // Later tables overwrite earlier ones.
36690b57cec5SDimitry Andric       // FIXME: Modules will have trouble with this.
36700b57cec5SDimitry Andric       CUDASpecialDeclRefs.clear();
36710b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
36720b57cec5SDimitry Andric         CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
36730b57cec5SDimitry Andric       break;
36740b57cec5SDimitry Andric 
36750b57cec5SDimitry Andric     case HEADER_SEARCH_TABLE:
36760b57cec5SDimitry Andric       F.HeaderFileInfoTableData = Blob.data();
36770b57cec5SDimitry Andric       F.LocalNumHeaderFileInfos = Record[1];
36780b57cec5SDimitry Andric       if (Record[0]) {
36790b57cec5SDimitry Andric         F.HeaderFileInfoTable
36800b57cec5SDimitry Andric           = HeaderFileInfoLookupTable::Create(
36810b57cec5SDimitry Andric                    (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
36820b57cec5SDimitry Andric                    (const unsigned char *)F.HeaderFileInfoTableData,
36830b57cec5SDimitry Andric                    HeaderFileInfoTrait(*this, F,
36840b57cec5SDimitry Andric                                        &PP.getHeaderSearchInfo(),
36850b57cec5SDimitry Andric                                        Blob.data() + Record[2]));
36860b57cec5SDimitry Andric 
36870b57cec5SDimitry Andric         PP.getHeaderSearchInfo().SetExternalSource(this);
36880b57cec5SDimitry Andric         if (!PP.getHeaderSearchInfo().getExternalLookup())
36890b57cec5SDimitry Andric           PP.getHeaderSearchInfo().SetExternalLookup(this);
36900b57cec5SDimitry Andric       }
36910b57cec5SDimitry Andric       break;
36920b57cec5SDimitry Andric 
36930b57cec5SDimitry Andric     case FP_PRAGMA_OPTIONS:
36940b57cec5SDimitry Andric       // Later tables overwrite earlier ones.
36950b57cec5SDimitry Andric       FPPragmaOptions.swap(Record);
36960b57cec5SDimitry Andric       break;
36970b57cec5SDimitry Andric 
36980b57cec5SDimitry Andric     case OPENCL_EXTENSIONS:
36990b57cec5SDimitry Andric       for (unsigned I = 0, E = Record.size(); I != E; ) {
37000b57cec5SDimitry Andric         auto Name = ReadString(Record, I);
3701e8d8bef9SDimitry Andric         auto &OptInfo = OpenCLExtensions.OptMap[Name];
3702e8d8bef9SDimitry Andric         OptInfo.Supported = Record[I++] != 0;
3703e8d8bef9SDimitry Andric         OptInfo.Enabled = Record[I++] != 0;
3704fe6060f1SDimitry Andric         OptInfo.WithPragma = Record[I++] != 0;
3705e8d8bef9SDimitry Andric         OptInfo.Avail = Record[I++];
3706e8d8bef9SDimitry Andric         OptInfo.Core = Record[I++];
3707e8d8bef9SDimitry Andric         OptInfo.Opt = Record[I++];
37080b57cec5SDimitry Andric       }
37090b57cec5SDimitry Andric       break;
37100b57cec5SDimitry Andric 
37110b57cec5SDimitry Andric     case TENTATIVE_DEFINITIONS:
37120b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
37130b57cec5SDimitry Andric         TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
37140b57cec5SDimitry Andric       break;
37150b57cec5SDimitry Andric 
37160b57cec5SDimitry Andric     case KNOWN_NAMESPACES:
37170b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
37180b57cec5SDimitry Andric         KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
37190b57cec5SDimitry Andric       break;
37200b57cec5SDimitry Andric 
37210b57cec5SDimitry Andric     case UNDEFINED_BUT_USED:
3722349cc55cSDimitry Andric       if (UndefinedButUsed.size() % 2 != 0)
3723349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3724349cc55cSDimitry Andric                                        "Invalid existing UndefinedButUsed");
37250b57cec5SDimitry Andric 
3726349cc55cSDimitry Andric       if (Record.size() % 2 != 0)
3727349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3728349cc55cSDimitry Andric                                        "invalid undefined-but-used record");
37290b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
37300b57cec5SDimitry Andric         UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
37310b57cec5SDimitry Andric         UndefinedButUsed.push_back(
37320b57cec5SDimitry Andric             ReadSourceLocation(F, Record, I).getRawEncoding());
37330b57cec5SDimitry Andric       }
37340b57cec5SDimitry Andric       break;
37350b57cec5SDimitry Andric 
37360b57cec5SDimitry Andric     case DELETE_EXPRS_TO_ANALYZE:
37370b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N;) {
37380b57cec5SDimitry Andric         DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
37390b57cec5SDimitry Andric         const uint64_t Count = Record[I++];
37400b57cec5SDimitry Andric         DelayedDeleteExprs.push_back(Count);
37410b57cec5SDimitry Andric         for (uint64_t C = 0; C < Count; ++C) {
37420b57cec5SDimitry Andric           DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
37430b57cec5SDimitry Andric           bool IsArrayForm = Record[I++] == 1;
37440b57cec5SDimitry Andric           DelayedDeleteExprs.push_back(IsArrayForm);
37450b57cec5SDimitry Andric         }
37460b57cec5SDimitry Andric       }
37470b57cec5SDimitry Andric       break;
37480b57cec5SDimitry Andric 
37490b57cec5SDimitry Andric     case IMPORTED_MODULES:
37500b57cec5SDimitry Andric       if (!F.isModule()) {
37510b57cec5SDimitry Andric         // If we aren't loading a module (which has its own exports), make
37520b57cec5SDimitry Andric         // all of the imported modules visible.
37530b57cec5SDimitry Andric         // FIXME: Deal with macros-only imports.
37540b57cec5SDimitry Andric         for (unsigned I = 0, N = Record.size(); I != N; /**/) {
37550b57cec5SDimitry Andric           unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
37560b57cec5SDimitry Andric           SourceLocation Loc = ReadSourceLocation(F, Record, I);
37570b57cec5SDimitry Andric           if (GlobalID) {
3758*06c3fb27SDimitry Andric             PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
37590b57cec5SDimitry Andric             if (DeserializationListener)
37600b57cec5SDimitry Andric               DeserializationListener->ModuleImportRead(GlobalID, Loc);
37610b57cec5SDimitry Andric           }
37620b57cec5SDimitry Andric         }
37630b57cec5SDimitry Andric       }
37640b57cec5SDimitry Andric       break;
37650b57cec5SDimitry Andric 
37660b57cec5SDimitry Andric     case MACRO_OFFSET: {
3767349cc55cSDimitry Andric       if (F.LocalNumMacros != 0)
3768349cc55cSDimitry Andric         return llvm::createStringError(
3769349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3770349cc55cSDimitry Andric             "duplicate MACRO_OFFSET record in AST file");
37710b57cec5SDimitry Andric       F.MacroOffsets = (const uint32_t *)Blob.data();
37720b57cec5SDimitry Andric       F.LocalNumMacros = Record[0];
37730b57cec5SDimitry Andric       unsigned LocalBaseMacroID = Record[1];
37745ffd83dbSDimitry Andric       F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset;
37750b57cec5SDimitry Andric       F.BaseMacroID = getTotalNumMacros();
37760b57cec5SDimitry Andric 
37770b57cec5SDimitry Andric       if (F.LocalNumMacros > 0) {
37780b57cec5SDimitry Andric         // Introduce the global -> local mapping for macros within this module.
37790b57cec5SDimitry Andric         GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
37800b57cec5SDimitry Andric 
37810b57cec5SDimitry Andric         // Introduce the local -> global mapping for macros within this module.
37820b57cec5SDimitry Andric         F.MacroRemap.insertOrReplace(
37830b57cec5SDimitry Andric           std::make_pair(LocalBaseMacroID,
37840b57cec5SDimitry Andric                          F.BaseMacroID - LocalBaseMacroID));
37850b57cec5SDimitry Andric 
37860b57cec5SDimitry Andric         MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
37870b57cec5SDimitry Andric       }
37880b57cec5SDimitry Andric       break;
37890b57cec5SDimitry Andric     }
37900b57cec5SDimitry Andric 
37910b57cec5SDimitry Andric     case LATE_PARSED_TEMPLATE:
3792e8d8bef9SDimitry Andric       LateParsedTemplates.emplace_back(
3793e8d8bef9SDimitry Andric           std::piecewise_construct, std::forward_as_tuple(&F),
3794e8d8bef9SDimitry Andric           std::forward_as_tuple(Record.begin(), Record.end()));
37950b57cec5SDimitry Andric       break;
37960b57cec5SDimitry Andric 
37970b57cec5SDimitry Andric     case OPTIMIZE_PRAGMA_OPTIONS:
3798349cc55cSDimitry Andric       if (Record.size() != 1)
3799349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3800349cc55cSDimitry Andric                                        "invalid pragma optimize record");
38010b57cec5SDimitry Andric       OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
38020b57cec5SDimitry Andric       break;
38030b57cec5SDimitry Andric 
38040b57cec5SDimitry Andric     case MSSTRUCT_PRAGMA_OPTIONS:
3805349cc55cSDimitry Andric       if (Record.size() != 1)
3806349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3807349cc55cSDimitry Andric                                        "invalid pragma ms_struct record");
38080b57cec5SDimitry Andric       PragmaMSStructState = Record[0];
38090b57cec5SDimitry Andric       break;
38100b57cec5SDimitry Andric 
38110b57cec5SDimitry Andric     case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3812349cc55cSDimitry Andric       if (Record.size() != 2)
3813349cc55cSDimitry Andric         return llvm::createStringError(
3814349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
3815349cc55cSDimitry Andric             "invalid pragma pointers to members record");
38160b57cec5SDimitry Andric       PragmaMSPointersToMembersState = Record[0];
38170b57cec5SDimitry Andric       PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
38180b57cec5SDimitry Andric       break;
38190b57cec5SDimitry Andric 
38200b57cec5SDimitry Andric     case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
38210b57cec5SDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
38220b57cec5SDimitry Andric         UnusedLocalTypedefNameCandidates.push_back(
38230b57cec5SDimitry Andric             getGlobalDeclID(F, Record[I]));
38240b57cec5SDimitry Andric       break;
38250b57cec5SDimitry Andric 
38260b57cec5SDimitry Andric     case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3827349cc55cSDimitry Andric       if (Record.size() != 1)
3828349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3829349cc55cSDimitry Andric                                        "invalid cuda pragma options record");
38300b57cec5SDimitry Andric       ForceCUDAHostDeviceDepth = Record[0];
38310b57cec5SDimitry Andric       break;
38320b57cec5SDimitry Andric 
3833e8d8bef9SDimitry Andric     case ALIGN_PACK_PRAGMA_OPTIONS: {
3834349cc55cSDimitry Andric       if (Record.size() < 3)
3835349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3836349cc55cSDimitry Andric                                        "invalid pragma pack record");
3837e8d8bef9SDimitry Andric       PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]);
3838e8d8bef9SDimitry Andric       PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]);
38390b57cec5SDimitry Andric       unsigned NumStackEntries = Record[2];
38400b57cec5SDimitry Andric       unsigned Idx = 3;
38410b57cec5SDimitry Andric       // Reset the stack when importing a new module.
3842e8d8bef9SDimitry Andric       PragmaAlignPackStack.clear();
38430b57cec5SDimitry Andric       for (unsigned I = 0; I < NumStackEntries; ++I) {
3844e8d8bef9SDimitry Andric         PragmaAlignPackStackEntry Entry;
3845e8d8bef9SDimitry Andric         Entry.Value = ReadAlignPackInfo(Record[Idx++]);
38460b57cec5SDimitry Andric         Entry.Location = ReadSourceLocation(F, Record[Idx++]);
38470b57cec5SDimitry Andric         Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
3848e8d8bef9SDimitry Andric         PragmaAlignPackStrings.push_back(ReadString(Record, Idx));
3849e8d8bef9SDimitry Andric         Entry.SlotLabel = PragmaAlignPackStrings.back();
3850e8d8bef9SDimitry Andric         PragmaAlignPackStack.push_back(Entry);
38510b57cec5SDimitry Andric       }
38520b57cec5SDimitry Andric       break;
38530b57cec5SDimitry Andric     }
38545ffd83dbSDimitry Andric 
38555ffd83dbSDimitry Andric     case FLOAT_CONTROL_PRAGMA_OPTIONS: {
3856349cc55cSDimitry Andric       if (Record.size() < 3)
3857349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
3858349cc55cSDimitry Andric                                        "invalid pragma float control record");
3859e8d8bef9SDimitry Andric       FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]);
38605ffd83dbSDimitry Andric       FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]);
38615ffd83dbSDimitry Andric       unsigned NumStackEntries = Record[2];
38625ffd83dbSDimitry Andric       unsigned Idx = 3;
38635ffd83dbSDimitry Andric       // Reset the stack when importing a new module.
38645ffd83dbSDimitry Andric       FpPragmaStack.clear();
38655ffd83dbSDimitry Andric       for (unsigned I = 0; I < NumStackEntries; ++I) {
38665ffd83dbSDimitry Andric         FpPragmaStackEntry Entry;
3867e8d8bef9SDimitry Andric         Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]);
38685ffd83dbSDimitry Andric         Entry.Location = ReadSourceLocation(F, Record[Idx++]);
38695ffd83dbSDimitry Andric         Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]);
38705ffd83dbSDimitry Andric         FpPragmaStrings.push_back(ReadString(Record, Idx));
38715ffd83dbSDimitry Andric         Entry.SlotLabel = FpPragmaStrings.back();
38725ffd83dbSDimitry Andric         FpPragmaStack.push_back(Entry);
38735ffd83dbSDimitry Andric       }
38745ffd83dbSDimitry Andric       break;
38755ffd83dbSDimitry Andric     }
38765ffd83dbSDimitry Andric 
38775ffd83dbSDimitry Andric     case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS:
38785ffd83dbSDimitry Andric       for (unsigned I = 0, N = Record.size(); I != N; ++I)
3879fe6060f1SDimitry Andric         DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I]));
38805ffd83dbSDimitry Andric       break;
38810b57cec5SDimitry Andric     }
38820b57cec5SDimitry Andric   }
38830b57cec5SDimitry Andric }
38840b57cec5SDimitry Andric 
38850b57cec5SDimitry Andric void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const {
38860b57cec5SDimitry Andric   assert(!F.ModuleOffsetMap.empty() && "no module offset map to read");
38870b57cec5SDimitry Andric 
38880b57cec5SDimitry Andric   // Additional remapping information.
38890b57cec5SDimitry Andric   const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data();
38900b57cec5SDimitry Andric   const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size();
38910b57cec5SDimitry Andric   F.ModuleOffsetMap = StringRef();
38920b57cec5SDimitry Andric 
38930b57cec5SDimitry Andric   // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
38940b57cec5SDimitry Andric   if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
38950b57cec5SDimitry Andric     F.SLocRemap.insert(std::make_pair(0U, 0));
38960b57cec5SDimitry Andric     F.SLocRemap.insert(std::make_pair(2U, 1));
38970b57cec5SDimitry Andric   }
38980b57cec5SDimitry Andric 
38990b57cec5SDimitry Andric   // Continuous range maps we may be updating in our module.
3900fe6060f1SDimitry Andric   using SLocRemapBuilder =
3901fe6060f1SDimitry Andric       ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy,
3902fe6060f1SDimitry Andric                          2>::Builder;
39030b57cec5SDimitry Andric   using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder;
3904fe6060f1SDimitry Andric   SLocRemapBuilder SLocRemap(F.SLocRemap);
39050b57cec5SDimitry Andric   RemapBuilder IdentifierRemap(F.IdentifierRemap);
39060b57cec5SDimitry Andric   RemapBuilder MacroRemap(F.MacroRemap);
39070b57cec5SDimitry Andric   RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
39080b57cec5SDimitry Andric   RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
39090b57cec5SDimitry Andric   RemapBuilder SelectorRemap(F.SelectorRemap);
39100b57cec5SDimitry Andric   RemapBuilder DeclRemap(F.DeclRemap);
39110b57cec5SDimitry Andric   RemapBuilder TypeRemap(F.TypeRemap);
39120b57cec5SDimitry Andric 
39130b57cec5SDimitry Andric   while (Data < DataEnd) {
39140b57cec5SDimitry Andric     // FIXME: Looking up dependency modules by filename is horrible. Let's
39155ffd83dbSDimitry Andric     // start fixing this with prebuilt, explicit and implicit modules and see
39165ffd83dbSDimitry Andric     // how it goes...
39170b57cec5SDimitry Andric     using namespace llvm::support;
39180b57cec5SDimitry Andric     ModuleKind Kind = static_cast<ModuleKind>(
39190b57cec5SDimitry Andric       endian::readNext<uint8_t, little, unaligned>(Data));
39200b57cec5SDimitry Andric     uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
39210b57cec5SDimitry Andric     StringRef Name = StringRef((const char*)Data, Len);
39220b57cec5SDimitry Andric     Data += Len;
39235ffd83dbSDimitry Andric     ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule ||
39245ffd83dbSDimitry Andric                               Kind == MK_ImplicitModule
39250b57cec5SDimitry Andric                           ? ModuleMgr.lookupByModuleName(Name)
39260b57cec5SDimitry Andric                           : ModuleMgr.lookupByFileName(Name));
39270b57cec5SDimitry Andric     if (!OM) {
39280b57cec5SDimitry Andric       std::string Msg =
39290b57cec5SDimitry Andric           "SourceLocation remap refers to unknown module, cannot find ";
39305ffd83dbSDimitry Andric       Msg.append(std::string(Name));
39310b57cec5SDimitry Andric       Error(Msg);
39320b57cec5SDimitry Andric       return;
39330b57cec5SDimitry Andric     }
39340b57cec5SDimitry Andric 
3935fe6060f1SDimitry Andric     SourceLocation::UIntTy SLocOffset =
39360b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39370b57cec5SDimitry Andric     uint32_t IdentifierIDOffset =
39380b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39390b57cec5SDimitry Andric     uint32_t MacroIDOffset =
39400b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39410b57cec5SDimitry Andric     uint32_t PreprocessedEntityIDOffset =
39420b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39430b57cec5SDimitry Andric     uint32_t SubmoduleIDOffset =
39440b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39450b57cec5SDimitry Andric     uint32_t SelectorIDOffset =
39460b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39470b57cec5SDimitry Andric     uint32_t DeclIDOffset =
39480b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39490b57cec5SDimitry Andric     uint32_t TypeIndexOffset =
39500b57cec5SDimitry Andric         endian::readNext<uint32_t, little, unaligned>(Data);
39510b57cec5SDimitry Andric 
39520b57cec5SDimitry Andric     auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
39530b57cec5SDimitry Andric                          RemapBuilder &Remap) {
3954fe6060f1SDimitry Andric       constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
39550b57cec5SDimitry Andric       if (Offset != None)
39560b57cec5SDimitry Andric         Remap.insert(std::make_pair(Offset,
39570b57cec5SDimitry Andric                                     static_cast<int>(BaseOffset - Offset)));
39580b57cec5SDimitry Andric     };
3959fe6060f1SDimitry Andric 
3960fe6060f1SDimitry Andric     constexpr SourceLocation::UIntTy SLocNone =
3961fe6060f1SDimitry Andric         std::numeric_limits<SourceLocation::UIntTy>::max();
3962fe6060f1SDimitry Andric     if (SLocOffset != SLocNone)
3963fe6060f1SDimitry Andric       SLocRemap.insert(std::make_pair(
3964fe6060f1SDimitry Andric           SLocOffset, static_cast<SourceLocation::IntTy>(
3965fe6060f1SDimitry Andric                           OM->SLocEntryBaseOffset - SLocOffset)));
3966fe6060f1SDimitry Andric 
39670b57cec5SDimitry Andric     mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
39680b57cec5SDimitry Andric     mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
39690b57cec5SDimitry Andric     mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
39700b57cec5SDimitry Andric               PreprocessedEntityRemap);
39710b57cec5SDimitry Andric     mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
39720b57cec5SDimitry Andric     mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
39730b57cec5SDimitry Andric     mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
39740b57cec5SDimitry Andric     mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
39750b57cec5SDimitry Andric 
39760b57cec5SDimitry Andric     // Global -> local mappings.
39770b57cec5SDimitry Andric     F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
39780b57cec5SDimitry Andric   }
39790b57cec5SDimitry Andric }
39800b57cec5SDimitry Andric 
39810b57cec5SDimitry Andric ASTReader::ASTReadResult
39820b57cec5SDimitry Andric ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
39830b57cec5SDimitry Andric                                   const ModuleFile *ImportedBy,
39840b57cec5SDimitry Andric                                   unsigned ClientLoadCapabilities) {
39850b57cec5SDimitry Andric   unsigned Idx = 0;
39860b57cec5SDimitry Andric   F.ModuleMapPath = ReadPath(F, Record, Idx);
39870b57cec5SDimitry Andric 
39880b57cec5SDimitry Andric   // Try to resolve ModuleName in the current header search context and
39890b57cec5SDimitry Andric   // verify that it is found in the same module map file as we saved. If the
39900b57cec5SDimitry Andric   // top-level AST file is a main file, skip this check because there is no
39910b57cec5SDimitry Andric   // usable header search context.
39920b57cec5SDimitry Andric   assert(!F.ModuleName.empty() &&
39930b57cec5SDimitry Andric          "MODULE_NAME should come before MODULE_MAP_FILE");
3994*06c3fb27SDimitry Andric   if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
3995*06c3fb27SDimitry Andric       F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) {
39960b57cec5SDimitry Andric     // An implicitly-loaded module file should have its module listed in some
39970b57cec5SDimitry Andric     // module map file that we've already loaded.
3998349cc55cSDimitry Andric     Module *M =
3999349cc55cSDimitry Andric         PP.getHeaderSearchInfo().lookupModule(F.ModuleName, F.ImportLoc);
40000b57cec5SDimitry Andric     auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4001bdd1243dSDimitry Andric     OptionalFileEntryRef ModMap =
4002bdd1243dSDimitry Andric         M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
40030b57cec5SDimitry Andric     // Don't emit module relocation error if we have -fno-validate-pch
4004e8d8bef9SDimitry Andric     if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4005e8d8bef9SDimitry Andric               DisableValidationForModuleKind::Module) &&
4006e8d8bef9SDimitry Andric         !ModMap) {
4007fe6060f1SDimitry Andric       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) {
4008bdd1243dSDimitry Andric         if (auto ASTFE = M ? M->getASTFile() : std::nullopt) {
40090b57cec5SDimitry Andric           // This module was defined by an imported (explicit) module.
40100b57cec5SDimitry Andric           Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
40110b57cec5SDimitry Andric                                                << ASTFE->getName();
40120b57cec5SDimitry Andric         } else {
40130b57cec5SDimitry Andric           // This module was built with a different module map.
40140b57cec5SDimitry Andric           Diag(diag::err_imported_module_not_found)
4015a7dea167SDimitry Andric               << F.ModuleName << F.FileName
4016a7dea167SDimitry Andric               << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath
4017a7dea167SDimitry Andric               << !ImportedBy;
40180b57cec5SDimitry Andric           // In case it was imported by a PCH, there's a chance the user is
40190b57cec5SDimitry Andric           // just missing to include the search path to the directory containing
40200b57cec5SDimitry Andric           // the modulemap.
4021a7dea167SDimitry Andric           if (ImportedBy && ImportedBy->Kind == MK_PCH)
40220b57cec5SDimitry Andric             Diag(diag::note_imported_by_pch_module_not_found)
40230b57cec5SDimitry Andric                 << llvm::sys::path::parent_path(F.ModuleMapPath);
40240b57cec5SDimitry Andric         }
40250b57cec5SDimitry Andric       }
40260b57cec5SDimitry Andric       return OutOfDate;
40270b57cec5SDimitry Andric     }
40280b57cec5SDimitry Andric 
4029e8d8bef9SDimitry Andric     assert(M && M->Name == F.ModuleName && "found module with different name");
40300b57cec5SDimitry Andric 
40310b57cec5SDimitry Andric     // Check the primary module map file.
4032a7dea167SDimitry Andric     auto StoredModMap = FileMgr.getFile(F.ModuleMapPath);
4033a7dea167SDimitry Andric     if (!StoredModMap || *StoredModMap != ModMap) {
40340b57cec5SDimitry Andric       assert(ModMap && "found module is missing module map file");
4035a7dea167SDimitry Andric       assert((ImportedBy || F.Kind == MK_ImplicitModule) &&
4036a7dea167SDimitry Andric              "top-level import should be verified");
4037a7dea167SDimitry Andric       bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy;
4038fe6060f1SDimitry Andric       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
40390b57cec5SDimitry Andric         Diag(diag::err_imported_module_modmap_changed)
4040a7dea167SDimitry Andric             << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName)
4041a7dea167SDimitry Andric             << ModMap->getName() << F.ModuleMapPath << NotImported;
40420b57cec5SDimitry Andric       return OutOfDate;
40430b57cec5SDimitry Andric     }
40440b57cec5SDimitry Andric 
40450b57cec5SDimitry Andric     llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
40460b57cec5SDimitry Andric     for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
40470b57cec5SDimitry Andric       // FIXME: we should use input files rather than storing names.
40480b57cec5SDimitry Andric       std::string Filename = ReadPath(F, Record, Idx);
4049fe6060f1SDimitry Andric       auto SF = FileMgr.getFile(Filename, false, false);
4050fe6060f1SDimitry Andric       if (!SF) {
4051fe6060f1SDimitry Andric         if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
40520b57cec5SDimitry Andric           Error("could not find file '" + Filename +"' referenced by AST file");
40530b57cec5SDimitry Andric         return OutOfDate;
40540b57cec5SDimitry Andric       }
4055fe6060f1SDimitry Andric       AdditionalStoredMaps.insert(*SF);
40560b57cec5SDimitry Andric     }
40570b57cec5SDimitry Andric 
40580b57cec5SDimitry Andric     // Check any additional module map files (e.g. module.private.modulemap)
40590b57cec5SDimitry Andric     // that are not in the pcm.
40600b57cec5SDimitry Andric     if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
40610b57cec5SDimitry Andric       for (const FileEntry *ModMap : *AdditionalModuleMaps) {
40620b57cec5SDimitry Andric         // Remove files that match
40630b57cec5SDimitry Andric         // Note: SmallPtrSet::erase is really remove
40640b57cec5SDimitry Andric         if (!AdditionalStoredMaps.erase(ModMap)) {
4065fe6060f1SDimitry Andric           if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
40660b57cec5SDimitry Andric             Diag(diag::err_module_different_modmap)
40670b57cec5SDimitry Andric               << F.ModuleName << /*new*/0 << ModMap->getName();
40680b57cec5SDimitry Andric           return OutOfDate;
40690b57cec5SDimitry Andric         }
40700b57cec5SDimitry Andric       }
40710b57cec5SDimitry Andric     }
40720b57cec5SDimitry Andric 
40730b57cec5SDimitry Andric     // Check any additional module map files that are in the pcm, but not
40740b57cec5SDimitry Andric     // found in header search. Cases that match are already removed.
40750b57cec5SDimitry Andric     for (const FileEntry *ModMap : AdditionalStoredMaps) {
4076fe6060f1SDimitry Andric       if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities))
40770b57cec5SDimitry Andric         Diag(diag::err_module_different_modmap)
40780b57cec5SDimitry Andric           << F.ModuleName << /*not new*/1 << ModMap->getName();
40790b57cec5SDimitry Andric       return OutOfDate;
40800b57cec5SDimitry Andric     }
40810b57cec5SDimitry Andric   }
40820b57cec5SDimitry Andric 
40830b57cec5SDimitry Andric   if (Listener)
40840b57cec5SDimitry Andric     Listener->ReadModuleMapFile(F.ModuleMapPath);
40850b57cec5SDimitry Andric   return Success;
40860b57cec5SDimitry Andric }
40870b57cec5SDimitry Andric 
40880b57cec5SDimitry Andric /// Move the given method to the back of the global list of methods.
40890b57cec5SDimitry Andric static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
40900b57cec5SDimitry Andric   // Find the entry for this selector in the method pool.
40910b57cec5SDimitry Andric   Sema::GlobalMethodPool::iterator Known
40920b57cec5SDimitry Andric     = S.MethodPool.find(Method->getSelector());
40930b57cec5SDimitry Andric   if (Known == S.MethodPool.end())
40940b57cec5SDimitry Andric     return;
40950b57cec5SDimitry Andric 
40960b57cec5SDimitry Andric   // Retrieve the appropriate method list.
40970b57cec5SDimitry Andric   ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
40980b57cec5SDimitry Andric                                                     : Known->second.second;
40990b57cec5SDimitry Andric   bool Found = false;
41000b57cec5SDimitry Andric   for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
41010b57cec5SDimitry Andric     if (!Found) {
41020b57cec5SDimitry Andric       if (List->getMethod() == Method) {
41030b57cec5SDimitry Andric         Found = true;
41040b57cec5SDimitry Andric       } else {
41050b57cec5SDimitry Andric         // Keep searching.
41060b57cec5SDimitry Andric         continue;
41070b57cec5SDimitry Andric       }
41080b57cec5SDimitry Andric     }
41090b57cec5SDimitry Andric 
41100b57cec5SDimitry Andric     if (List->getNext())
41110b57cec5SDimitry Andric       List->setMethod(List->getNext()->getMethod());
41120b57cec5SDimitry Andric     else
41130b57cec5SDimitry Andric       List->setMethod(Method);
41140b57cec5SDimitry Andric   }
41150b57cec5SDimitry Andric }
41160b57cec5SDimitry Andric 
41170b57cec5SDimitry Andric void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
41180b57cec5SDimitry Andric   assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
41190b57cec5SDimitry Andric   for (Decl *D : Names) {
41205ffd83dbSDimitry Andric     bool wasHidden = !D->isUnconditionallyVisible();
41210b57cec5SDimitry Andric     D->setVisibleDespiteOwningModule();
41220b57cec5SDimitry Andric 
41230b57cec5SDimitry Andric     if (wasHidden && SemaObj) {
41240b57cec5SDimitry Andric       if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
41250b57cec5SDimitry Andric         moveMethodToBackOfGlobalList(*SemaObj, Method);
41260b57cec5SDimitry Andric       }
41270b57cec5SDimitry Andric     }
41280b57cec5SDimitry Andric   }
41290b57cec5SDimitry Andric }
41300b57cec5SDimitry Andric 
41310b57cec5SDimitry Andric void ASTReader::makeModuleVisible(Module *Mod,
41320b57cec5SDimitry Andric                                   Module::NameVisibilityKind NameVisibility,
41330b57cec5SDimitry Andric                                   SourceLocation ImportLoc) {
41340b57cec5SDimitry Andric   llvm::SmallPtrSet<Module *, 4> Visited;
41350b57cec5SDimitry Andric   SmallVector<Module *, 4> Stack;
41360b57cec5SDimitry Andric   Stack.push_back(Mod);
41370b57cec5SDimitry Andric   while (!Stack.empty()) {
41380b57cec5SDimitry Andric     Mod = Stack.pop_back_val();
41390b57cec5SDimitry Andric 
41400b57cec5SDimitry Andric     if (NameVisibility <= Mod->NameVisibility) {
41410b57cec5SDimitry Andric       // This module already has this level of visibility (or greater), so
41420b57cec5SDimitry Andric       // there is nothing more to do.
41430b57cec5SDimitry Andric       continue;
41440b57cec5SDimitry Andric     }
41450b57cec5SDimitry Andric 
41465ffd83dbSDimitry Andric     if (Mod->isUnimportable()) {
41475ffd83dbSDimitry Andric       // Modules that aren't importable cannot be made visible.
41480b57cec5SDimitry Andric       continue;
41490b57cec5SDimitry Andric     }
41500b57cec5SDimitry Andric 
41510b57cec5SDimitry Andric     // Update the module's name visibility.
41520b57cec5SDimitry Andric     Mod->NameVisibility = NameVisibility;
41530b57cec5SDimitry Andric 
41540b57cec5SDimitry Andric     // If we've already deserialized any names from this module,
41550b57cec5SDimitry Andric     // mark them as visible.
41560b57cec5SDimitry Andric     HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
41570b57cec5SDimitry Andric     if (Hidden != HiddenNamesMap.end()) {
41580b57cec5SDimitry Andric       auto HiddenNames = std::move(*Hidden);
41590b57cec5SDimitry Andric       HiddenNamesMap.erase(Hidden);
41600b57cec5SDimitry Andric       makeNamesVisible(HiddenNames.second, HiddenNames.first);
4161*06c3fb27SDimitry Andric       assert(!HiddenNamesMap.contains(Mod) &&
41620b57cec5SDimitry Andric              "making names visible added hidden names");
41630b57cec5SDimitry Andric     }
41640b57cec5SDimitry Andric 
41650b57cec5SDimitry Andric     // Push any exported modules onto the stack to be marked as visible.
41660b57cec5SDimitry Andric     SmallVector<Module *, 16> Exports;
41670b57cec5SDimitry Andric     Mod->getExportedModules(Exports);
41680b57cec5SDimitry Andric     for (SmallVectorImpl<Module *>::iterator
41690b57cec5SDimitry Andric            I = Exports.begin(), E = Exports.end(); I != E; ++I) {
41700b57cec5SDimitry Andric       Module *Exported = *I;
41710b57cec5SDimitry Andric       if (Visited.insert(Exported).second)
41720b57cec5SDimitry Andric         Stack.push_back(Exported);
41730b57cec5SDimitry Andric     }
41740b57cec5SDimitry Andric   }
41750b57cec5SDimitry Andric }
41760b57cec5SDimitry Andric 
41770b57cec5SDimitry Andric /// We've merged the definition \p MergedDef into the existing definition
41780b57cec5SDimitry Andric /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
41790b57cec5SDimitry Andric /// visible.
41800b57cec5SDimitry Andric void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
41810b57cec5SDimitry Andric                                           NamedDecl *MergedDef) {
41825ffd83dbSDimitry Andric   if (!Def->isUnconditionallyVisible()) {
41830b57cec5SDimitry Andric     // If MergedDef is visible or becomes visible, make the definition visible.
41845ffd83dbSDimitry Andric     if (MergedDef->isUnconditionallyVisible())
41850b57cec5SDimitry Andric       Def->setVisibleDespiteOwningModule();
41860b57cec5SDimitry Andric     else {
41870b57cec5SDimitry Andric       getContext().mergeDefinitionIntoModule(
41880b57cec5SDimitry Andric           Def, MergedDef->getImportedOwningModule(),
41890b57cec5SDimitry Andric           /*NotifyListeners*/ false);
41900b57cec5SDimitry Andric       PendingMergedDefinitionsToDeduplicate.insert(Def);
41910b57cec5SDimitry Andric     }
41920b57cec5SDimitry Andric   }
41930b57cec5SDimitry Andric }
41940b57cec5SDimitry Andric 
41950b57cec5SDimitry Andric bool ASTReader::loadGlobalIndex() {
41960b57cec5SDimitry Andric   if (GlobalIndex)
41970b57cec5SDimitry Andric     return false;
41980b57cec5SDimitry Andric 
41990b57cec5SDimitry Andric   if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
42000b57cec5SDimitry Andric       !PP.getLangOpts().Modules)
42010b57cec5SDimitry Andric     return true;
42020b57cec5SDimitry Andric 
42030b57cec5SDimitry Andric   // Try to load the global index.
42040b57cec5SDimitry Andric   TriedLoadingGlobalIndex = true;
42050b57cec5SDimitry Andric   StringRef ModuleCachePath
42060b57cec5SDimitry Andric     = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
42070b57cec5SDimitry Andric   std::pair<GlobalModuleIndex *, llvm::Error> Result =
42080b57cec5SDimitry Andric       GlobalModuleIndex::readIndex(ModuleCachePath);
42090b57cec5SDimitry Andric   if (llvm::Error Err = std::move(Result.second)) {
42100b57cec5SDimitry Andric     assert(!Result.first);
42110b57cec5SDimitry Andric     consumeError(std::move(Err)); // FIXME this drops errors on the floor.
42120b57cec5SDimitry Andric     return true;
42130b57cec5SDimitry Andric   }
42140b57cec5SDimitry Andric 
42150b57cec5SDimitry Andric   GlobalIndex.reset(Result.first);
42160b57cec5SDimitry Andric   ModuleMgr.setGlobalIndex(GlobalIndex.get());
42170b57cec5SDimitry Andric   return false;
42180b57cec5SDimitry Andric }
42190b57cec5SDimitry Andric 
42200b57cec5SDimitry Andric bool ASTReader::isGlobalIndexUnavailable() const {
42210b57cec5SDimitry Andric   return PP.getLangOpts().Modules && UseGlobalIndex &&
42220b57cec5SDimitry Andric          !hasGlobalIndex() && TriedLoadingGlobalIndex;
42230b57cec5SDimitry Andric }
42240b57cec5SDimitry Andric 
42250b57cec5SDimitry Andric static void updateModuleTimestamp(ModuleFile &MF) {
42260b57cec5SDimitry Andric   // Overwrite the timestamp file contents so that file's mtime changes.
42270b57cec5SDimitry Andric   std::string TimestampFilename = MF.getTimestampFilename();
42280b57cec5SDimitry Andric   std::error_code EC;
4229fe6060f1SDimitry Andric   llvm::raw_fd_ostream OS(TimestampFilename, EC,
4230fe6060f1SDimitry Andric                           llvm::sys::fs::OF_TextWithCRLF);
42310b57cec5SDimitry Andric   if (EC)
42320b57cec5SDimitry Andric     return;
42330b57cec5SDimitry Andric   OS << "Timestamp file\n";
42340b57cec5SDimitry Andric   OS.close();
42350b57cec5SDimitry Andric   OS.clear_error(); // Avoid triggering a fatal error.
42360b57cec5SDimitry Andric }
42370b57cec5SDimitry Andric 
42380b57cec5SDimitry Andric /// Given a cursor at the start of an AST file, scan ahead and drop the
42390b57cec5SDimitry Andric /// cursor into the start of the given block ID, returning false on success and
42400b57cec5SDimitry Andric /// true on failure.
42410b57cec5SDimitry Andric static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
42420b57cec5SDimitry Andric   while (true) {
42430b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance();
42440b57cec5SDimitry Andric     if (!MaybeEntry) {
42450b57cec5SDimitry Andric       // FIXME this drops errors on the floor.
42460b57cec5SDimitry Andric       consumeError(MaybeEntry.takeError());
42470b57cec5SDimitry Andric       return true;
42480b57cec5SDimitry Andric     }
42490b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
42500b57cec5SDimitry Andric 
42510b57cec5SDimitry Andric     switch (Entry.Kind) {
42520b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
42530b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
42540b57cec5SDimitry Andric       return true;
42550b57cec5SDimitry Andric 
42560b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
42570b57cec5SDimitry Andric       // Ignore top-level records.
42580b57cec5SDimitry Andric       if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID))
42590b57cec5SDimitry Andric         break;
42600b57cec5SDimitry Andric       else {
42610b57cec5SDimitry Andric         // FIXME this drops errors on the floor.
42620b57cec5SDimitry Andric         consumeError(Skipped.takeError());
42630b57cec5SDimitry Andric         return true;
42640b57cec5SDimitry Andric       }
42650b57cec5SDimitry Andric 
42660b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock:
42670b57cec5SDimitry Andric       if (Entry.ID == BlockID) {
42680b57cec5SDimitry Andric         if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
42690b57cec5SDimitry Andric           // FIXME this drops the error on the floor.
42700b57cec5SDimitry Andric           consumeError(std::move(Err));
42710b57cec5SDimitry Andric           return true;
42720b57cec5SDimitry Andric         }
42730b57cec5SDimitry Andric         // Found it!
42740b57cec5SDimitry Andric         return false;
42750b57cec5SDimitry Andric       }
42760b57cec5SDimitry Andric 
42770b57cec5SDimitry Andric       if (llvm::Error Err = Cursor.SkipBlock()) {
42780b57cec5SDimitry Andric         // FIXME this drops the error on the floor.
42790b57cec5SDimitry Andric         consumeError(std::move(Err));
42800b57cec5SDimitry Andric         return true;
42810b57cec5SDimitry Andric       }
42820b57cec5SDimitry Andric     }
42830b57cec5SDimitry Andric   }
42840b57cec5SDimitry Andric }
42850b57cec5SDimitry Andric 
42860b57cec5SDimitry Andric ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
42870b57cec5SDimitry Andric                                             ModuleKind Type,
42880b57cec5SDimitry Andric                                             SourceLocation ImportLoc,
42890b57cec5SDimitry Andric                                             unsigned ClientLoadCapabilities,
42900b57cec5SDimitry Andric                                             SmallVectorImpl<ImportedSubmodule> *Imported) {
4291bdd1243dSDimitry Andric   llvm::TimeTraceScope scope("ReadAST", FileName);
4292bdd1243dSDimitry Andric 
4293bdd1243dSDimitry Andric   llvm::SaveAndRestore SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4294bdd1243dSDimitry Andric   llvm::SaveAndRestore<std::optional<ModuleKind>> SetCurModuleKindRAII(
4295e8d8bef9SDimitry Andric       CurrentDeserializingModuleKind, Type);
42960b57cec5SDimitry Andric 
42970b57cec5SDimitry Andric   // Defer any pending actions until we get to the end of reading the AST file.
42980b57cec5SDimitry Andric   Deserializing AnASTFile(this);
42990b57cec5SDimitry Andric 
43000b57cec5SDimitry Andric   // Bump the generation number.
43010b57cec5SDimitry Andric   unsigned PreviousGeneration = 0;
43020b57cec5SDimitry Andric   if (ContextObj)
43030b57cec5SDimitry Andric     PreviousGeneration = incrementGeneration(*ContextObj);
43040b57cec5SDimitry Andric 
43050b57cec5SDimitry Andric   unsigned NumModules = ModuleMgr.size();
4306349cc55cSDimitry Andric   SmallVector<ImportedModule, 4> Loaded;
4307349cc55cSDimitry Andric   if (ASTReadResult ReadResult =
4308349cc55cSDimitry Andric           ReadASTCore(FileName, Type, ImportLoc,
4309349cc55cSDimitry Andric                       /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(),
4310349cc55cSDimitry Andric                       ClientLoadCapabilities)) {
4311bdd1243dSDimitry Andric     ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4312480093f4SDimitry Andric 
4313480093f4SDimitry Andric     // If we find that any modules are unusable, the global index is going
4314480093f4SDimitry Andric     // to be out-of-date. Just remove it.
4315480093f4SDimitry Andric     GlobalIndex.reset();
4316480093f4SDimitry Andric     ModuleMgr.setGlobalIndex(nullptr);
4317480093f4SDimitry Andric     return ReadResult;
43180b57cec5SDimitry Andric   }
43190b57cec5SDimitry Andric 
4320349cc55cSDimitry Andric   // Here comes stuff that we only do once the entire chain is loaded. Do *not*
4321349cc55cSDimitry Andric   // remove modules from this point. Various fields are updated during reading
4322349cc55cSDimitry Andric   // the AST block and removing the modules would result in dangling pointers.
4323349cc55cSDimitry Andric   // They are generally only incidentally dereferenced, ie. a binary search
4324349cc55cSDimitry Andric   // runs over `GlobalSLocEntryMap`, which could cause an invalid module to
4325349cc55cSDimitry Andric   // be dereferenced but it wouldn't actually be used.
43260b57cec5SDimitry Andric 
4327480093f4SDimitry Andric   // Load the AST blocks of all of the modules that we loaded. We can still
4328480093f4SDimitry Andric   // hit errors parsing the ASTs at this point.
4329480093f4SDimitry Andric   for (ImportedModule &M : Loaded) {
4330480093f4SDimitry Andric     ModuleFile &F = *M.Mod;
4331bdd1243dSDimitry Andric     llvm::TimeTraceScope Scope2("Read Loaded AST", F.ModuleName);
43320b57cec5SDimitry Andric 
43330b57cec5SDimitry Andric     // Read the AST block.
4334349cc55cSDimitry Andric     if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4335349cc55cSDimitry Andric       Error(std::move(Err));
4336349cc55cSDimitry Andric       return Failure;
4337349cc55cSDimitry Andric     }
4338480093f4SDimitry Andric 
4339480093f4SDimitry Andric     // The AST block should always have a definition for the main module.
4340480093f4SDimitry Andric     if (F.isModule() && !F.DidReadTopLevelSubmodule) {
4341480093f4SDimitry Andric       Error(diag::err_module_file_missing_top_level_submodule, F.FileName);
4342349cc55cSDimitry Andric       return Failure;
4343480093f4SDimitry Andric     }
43440b57cec5SDimitry Andric 
43450b57cec5SDimitry Andric     // Read the extension blocks.
43460b57cec5SDimitry Andric     while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
4347349cc55cSDimitry Andric       if (llvm::Error Err = ReadExtensionBlock(F)) {
4348349cc55cSDimitry Andric         Error(std::move(Err));
4349349cc55cSDimitry Andric         return Failure;
4350349cc55cSDimitry Andric       }
43510b57cec5SDimitry Andric     }
43520b57cec5SDimitry Andric 
43530b57cec5SDimitry Andric     // Once read, set the ModuleFile bit base offset and update the size in
43540b57cec5SDimitry Andric     // bits of all files we've seen.
43550b57cec5SDimitry Andric     F.GlobalBitOffset = TotalModulesSizeInBits;
43560b57cec5SDimitry Andric     TotalModulesSizeInBits += F.SizeInBits;
43570b57cec5SDimitry Andric     GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
4358480093f4SDimitry Andric   }
4359480093f4SDimitry Andric 
4360480093f4SDimitry Andric   // Preload source locations and interesting indentifiers.
4361480093f4SDimitry Andric   for (ImportedModule &M : Loaded) {
4362480093f4SDimitry Andric     ModuleFile &F = *M.Mod;
43630b57cec5SDimitry Andric 
43640b57cec5SDimitry Andric     // Preload SLocEntries.
43650b57cec5SDimitry Andric     for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
43660b57cec5SDimitry Andric       int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
43670b57cec5SDimitry Andric       // Load it through the SourceManager and don't call ReadSLocEntry()
43680b57cec5SDimitry Andric       // directly because the entry may have already been loaded in which case
43690b57cec5SDimitry Andric       // calling ReadSLocEntry() directly would trigger an assertion in
43700b57cec5SDimitry Andric       // SourceManager.
43710b57cec5SDimitry Andric       SourceMgr.getLoadedSLocEntryByID(Index);
43720b57cec5SDimitry Andric     }
43730b57cec5SDimitry Andric 
43740b57cec5SDimitry Andric     // Map the original source file ID into the ID space of the current
43750b57cec5SDimitry Andric     // compilation.
4376bdd1243dSDimitry Andric     if (F.OriginalSourceFileID.isValid())
4377bdd1243dSDimitry Andric       F.OriginalSourceFileID = TranslateFileID(F, F.OriginalSourceFileID);
43780b57cec5SDimitry Andric 
43790b57cec5SDimitry Andric     for (auto Offset : F.PreloadIdentifierOffsets) {
4380fe6060f1SDimitry Andric       const unsigned char *Data = F.IdentifierTableData + Offset;
43810b57cec5SDimitry Andric 
43820b57cec5SDimitry Andric       ASTIdentifierLookupTrait Trait(*this, F);
43830b57cec5SDimitry Andric       auto KeyDataLen = Trait.ReadKeyDataLength(Data);
43840b57cec5SDimitry Andric       auto Key = Trait.ReadKey(Data, KeyDataLen.first);
4385*06c3fb27SDimitry Andric 
4386*06c3fb27SDimitry Andric       IdentifierInfo *II;
4387*06c3fb27SDimitry Andric       if (!PP.getLangOpts().CPlusPlus) {
4388*06c3fb27SDimitry Andric         // Identifiers present in both the module file and the importing
4389*06c3fb27SDimitry Andric         // instance are marked out-of-date so that they can be deserialized
4390*06c3fb27SDimitry Andric         // on next use via ASTReader::updateOutOfDateIdentifier().
4391*06c3fb27SDimitry Andric         // Identifiers present in the module file but not in the importing
4392*06c3fb27SDimitry Andric         // instance are ignored for now, preventing growth of the identifier
4393*06c3fb27SDimitry Andric         // table. They will be deserialized on first use via ASTReader::get().
4394*06c3fb27SDimitry Andric         auto It = PP.getIdentifierTable().find(Key);
4395*06c3fb27SDimitry Andric         if (It == PP.getIdentifierTable().end())
4396*06c3fb27SDimitry Andric           continue;
4397*06c3fb27SDimitry Andric         II = It->second;
4398*06c3fb27SDimitry Andric       } else {
4399*06c3fb27SDimitry Andric         // With C++ modules, not many identifiers are considered interesting.
4400*06c3fb27SDimitry Andric         // All identifiers in the module file can be placed into the identifier
4401*06c3fb27SDimitry Andric         // table of the importing instance and marked as out-of-date. This makes
4402*06c3fb27SDimitry Andric         // ASTReader::get() a no-op, and deserialization will take place on
4403*06c3fb27SDimitry Andric         // first/next use via ASTReader::updateOutOfDateIdentifier().
4404*06c3fb27SDimitry Andric         II = &PP.getIdentifierTable().getOwn(Key);
4405*06c3fb27SDimitry Andric       }
4406*06c3fb27SDimitry Andric 
4407*06c3fb27SDimitry Andric       II->setOutOfDate(true);
44080b57cec5SDimitry Andric 
44090b57cec5SDimitry Andric       // Mark this identifier as being from an AST file so that we can track
44100b57cec5SDimitry Andric       // whether we need to serialize it.
4411*06c3fb27SDimitry Andric       markIdentifierFromAST(*this, *II);
44120b57cec5SDimitry Andric 
44130b57cec5SDimitry Andric       // Associate the ID with the identifier so that the writer can reuse it.
44140b57cec5SDimitry Andric       auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
4415*06c3fb27SDimitry Andric       SetIdentifierInfo(ID, II);
44160b57cec5SDimitry Andric     }
44170b57cec5SDimitry Andric   }
44180b57cec5SDimitry Andric 
4419*06c3fb27SDimitry Andric   // Builtins and library builtins have already been initialized. Mark all
4420*06c3fb27SDimitry Andric   // identifiers as out-of-date, so that they are deserialized on first use.
4421*06c3fb27SDimitry Andric   if (Type == MK_PCH || Type == MK_Preamble || Type == MK_MainFile)
4422*06c3fb27SDimitry Andric     for (auto &Id : PP.getIdentifierTable())
4423*06c3fb27SDimitry Andric       Id.second->setOutOfDate(true);
4424*06c3fb27SDimitry Andric 
4425*06c3fb27SDimitry Andric   // Mark selectors as out of date.
4426*06c3fb27SDimitry Andric   for (const auto &Sel : SelectorGeneration)
4427*06c3fb27SDimitry Andric     SelectorOutOfDate[Sel.first] = true;
4428*06c3fb27SDimitry Andric 
44290b57cec5SDimitry Andric   // Setup the import locations and notify the module manager that we've
44300b57cec5SDimitry Andric   // committed to these module files.
4431480093f4SDimitry Andric   for (ImportedModule &M : Loaded) {
4432480093f4SDimitry Andric     ModuleFile &F = *M.Mod;
44330b57cec5SDimitry Andric 
44340b57cec5SDimitry Andric     ModuleMgr.moduleFileAccepted(&F);
44350b57cec5SDimitry Andric 
44360b57cec5SDimitry Andric     // Set the import location.
44370b57cec5SDimitry Andric     F.DirectImportLoc = ImportLoc;
44380b57cec5SDimitry Andric     // FIXME: We assume that locations from PCH / preamble do not need
44390b57cec5SDimitry Andric     // any translation.
4440480093f4SDimitry Andric     if (!M.ImportedBy)
4441480093f4SDimitry Andric       F.ImportLoc = M.ImportLoc;
44420b57cec5SDimitry Andric     else
4443480093f4SDimitry Andric       F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc);
44440b57cec5SDimitry Andric   }
44450b57cec5SDimitry Andric 
44460b57cec5SDimitry Andric   // Resolve any unresolved module exports.
44470b57cec5SDimitry Andric   for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
44480b57cec5SDimitry Andric     UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
44490b57cec5SDimitry Andric     SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
44500b57cec5SDimitry Andric     Module *ResolvedMod = getSubmodule(GlobalID);
44510b57cec5SDimitry Andric 
44520b57cec5SDimitry Andric     switch (Unresolved.Kind) {
44530b57cec5SDimitry Andric     case UnresolvedModuleRef::Conflict:
44540b57cec5SDimitry Andric       if (ResolvedMod) {
44550b57cec5SDimitry Andric         Module::Conflict Conflict;
44560b57cec5SDimitry Andric         Conflict.Other = ResolvedMod;
44570b57cec5SDimitry Andric         Conflict.Message = Unresolved.String.str();
44580b57cec5SDimitry Andric         Unresolved.Mod->Conflicts.push_back(Conflict);
44590b57cec5SDimitry Andric       }
44600b57cec5SDimitry Andric       continue;
44610b57cec5SDimitry Andric 
44620b57cec5SDimitry Andric     case UnresolvedModuleRef::Import:
44630b57cec5SDimitry Andric       if (ResolvedMod)
44640b57cec5SDimitry Andric         Unresolved.Mod->Imports.insert(ResolvedMod);
44650b57cec5SDimitry Andric       continue;
44660b57cec5SDimitry Andric 
4467bdd1243dSDimitry Andric     case UnresolvedModuleRef::Affecting:
4468bdd1243dSDimitry Andric       if (ResolvedMod)
4469bdd1243dSDimitry Andric         Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
4470bdd1243dSDimitry Andric       continue;
4471bdd1243dSDimitry Andric 
44720b57cec5SDimitry Andric     case UnresolvedModuleRef::Export:
44730b57cec5SDimitry Andric       if (ResolvedMod || Unresolved.IsWildcard)
44740b57cec5SDimitry Andric         Unresolved.Mod->Exports.push_back(
44750b57cec5SDimitry Andric           Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
44760b57cec5SDimitry Andric       continue;
44770b57cec5SDimitry Andric     }
44780b57cec5SDimitry Andric   }
44790b57cec5SDimitry Andric   UnresolvedModuleRefs.clear();
44800b57cec5SDimitry Andric 
44810b57cec5SDimitry Andric   if (Imported)
4482*06c3fb27SDimitry Andric     Imported->append(PendingImportedModules.begin(),
4483*06c3fb27SDimitry Andric                      PendingImportedModules.end());
44840b57cec5SDimitry Andric 
44850b57cec5SDimitry Andric   // FIXME: How do we load the 'use'd modules? They may not be submodules.
44860b57cec5SDimitry Andric   // Might be unnecessary as use declarations are only used to build the
44870b57cec5SDimitry Andric   // module itself.
44880b57cec5SDimitry Andric 
44890b57cec5SDimitry Andric   if (ContextObj)
44900b57cec5SDimitry Andric     InitializeContext();
44910b57cec5SDimitry Andric 
44920b57cec5SDimitry Andric   if (SemaObj)
44930b57cec5SDimitry Andric     UpdateSema();
44940b57cec5SDimitry Andric 
44950b57cec5SDimitry Andric   if (DeserializationListener)
44960b57cec5SDimitry Andric     DeserializationListener->ReaderInitialized(this);
44970b57cec5SDimitry Andric 
44980b57cec5SDimitry Andric   ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
44990b57cec5SDimitry Andric   if (PrimaryModule.OriginalSourceFileID.isValid()) {
45000b57cec5SDimitry Andric     // If this AST file is a precompiled preamble, then set the
45010b57cec5SDimitry Andric     // preamble file ID of the source manager to the file source file
45020b57cec5SDimitry Andric     // from which the preamble was built.
45030b57cec5SDimitry Andric     if (Type == MK_Preamble) {
45040b57cec5SDimitry Andric       SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
45050b57cec5SDimitry Andric     } else if (Type == MK_MainFile) {
45060b57cec5SDimitry Andric       SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
45070b57cec5SDimitry Andric     }
45080b57cec5SDimitry Andric   }
45090b57cec5SDimitry Andric 
45100b57cec5SDimitry Andric   // For any Objective-C class definitions we have already loaded, make sure
45110b57cec5SDimitry Andric   // that we load any additional categories.
45120b57cec5SDimitry Andric   if (ContextObj) {
45130b57cec5SDimitry Andric     for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
45140b57cec5SDimitry Andric       loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
45150b57cec5SDimitry Andric                          ObjCClassesLoaded[I],
45160b57cec5SDimitry Andric                          PreviousGeneration);
45170b57cec5SDimitry Andric     }
45180b57cec5SDimitry Andric   }
45190b57cec5SDimitry Andric 
4520*06c3fb27SDimitry Andric   HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts();
4521*06c3fb27SDimitry Andric   if (HSOpts.ModulesValidateOncePerBuildSession) {
45220b57cec5SDimitry Andric     // Now we are certain that the module and all modules it depends on are
4523*06c3fb27SDimitry Andric     // up-to-date. For implicitly-built module files, ensure the corresponding
4524*06c3fb27SDimitry Andric     // timestamp files are up-to-date in this build session.
45250b57cec5SDimitry Andric     for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
45260b57cec5SDimitry Andric       ImportedModule &M = Loaded[I];
4527*06c3fb27SDimitry Andric       if (M.Mod->Kind == MK_ImplicitModule &&
4528*06c3fb27SDimitry Andric           M.Mod->InputFilesValidationTimestamp < HSOpts.BuildSessionTimestamp)
45290b57cec5SDimitry Andric         updateModuleTimestamp(*M.Mod);
45300b57cec5SDimitry Andric     }
45310b57cec5SDimitry Andric   }
45320b57cec5SDimitry Andric 
45330b57cec5SDimitry Andric   return Success;
45340b57cec5SDimitry Andric }
45350b57cec5SDimitry Andric 
45360b57cec5SDimitry Andric static ASTFileSignature readASTFileSignature(StringRef PCH);
45370b57cec5SDimitry Andric 
45380b57cec5SDimitry Andric /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'.
45390b57cec5SDimitry Andric static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) {
45400b57cec5SDimitry Andric   // FIXME checking magic headers is done in other places such as
45410b57cec5SDimitry Andric   // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't
45420b57cec5SDimitry Andric   // always done the same. Unify it all with a helper.
45430b57cec5SDimitry Andric   if (!Stream.canSkipToPos(4))
45440b57cec5SDimitry Andric     return llvm::createStringError(std::errc::illegal_byte_sequence,
45450b57cec5SDimitry Andric                                    "file too small to contain AST file magic");
45460b57cec5SDimitry Andric   for (unsigned C : {'C', 'P', 'C', 'H'})
45470b57cec5SDimitry Andric     if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
45480b57cec5SDimitry Andric       if (Res.get() != C)
45490b57cec5SDimitry Andric         return llvm::createStringError(
45500b57cec5SDimitry Andric             std::errc::illegal_byte_sequence,
45510b57cec5SDimitry Andric             "file doesn't start with AST file magic");
45520b57cec5SDimitry Andric     } else
45530b57cec5SDimitry Andric       return Res.takeError();
45540b57cec5SDimitry Andric   return llvm::Error::success();
45550b57cec5SDimitry Andric }
45560b57cec5SDimitry Andric 
45570b57cec5SDimitry Andric static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
45580b57cec5SDimitry Andric   switch (Kind) {
45590b57cec5SDimitry Andric   case MK_PCH:
45600b57cec5SDimitry Andric     return 0; // PCH
45610b57cec5SDimitry Andric   case MK_ImplicitModule:
45620b57cec5SDimitry Andric   case MK_ExplicitModule:
45630b57cec5SDimitry Andric   case MK_PrebuiltModule:
45640b57cec5SDimitry Andric     return 1; // module
45650b57cec5SDimitry Andric   case MK_MainFile:
45660b57cec5SDimitry Andric   case MK_Preamble:
45670b57cec5SDimitry Andric     return 2; // main source file
45680b57cec5SDimitry Andric   }
45690b57cec5SDimitry Andric   llvm_unreachable("unknown module kind");
45700b57cec5SDimitry Andric }
45710b57cec5SDimitry Andric 
45720b57cec5SDimitry Andric ASTReader::ASTReadResult
45730b57cec5SDimitry Andric ASTReader::ReadASTCore(StringRef FileName,
45740b57cec5SDimitry Andric                        ModuleKind Type,
45750b57cec5SDimitry Andric                        SourceLocation ImportLoc,
45760b57cec5SDimitry Andric                        ModuleFile *ImportedBy,
45770b57cec5SDimitry Andric                        SmallVectorImpl<ImportedModule> &Loaded,
45780b57cec5SDimitry Andric                        off_t ExpectedSize, time_t ExpectedModTime,
45790b57cec5SDimitry Andric                        ASTFileSignature ExpectedSignature,
45800b57cec5SDimitry Andric                        unsigned ClientLoadCapabilities) {
45810b57cec5SDimitry Andric   ModuleFile *M;
45820b57cec5SDimitry Andric   std::string ErrorStr;
45830b57cec5SDimitry Andric   ModuleManager::AddModuleResult AddResult
45840b57cec5SDimitry Andric     = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
45850b57cec5SDimitry Andric                           getGeneration(), ExpectedSize, ExpectedModTime,
45860b57cec5SDimitry Andric                           ExpectedSignature, readASTFileSignature,
45870b57cec5SDimitry Andric                           M, ErrorStr);
45880b57cec5SDimitry Andric 
45890b57cec5SDimitry Andric   switch (AddResult) {
45900b57cec5SDimitry Andric   case ModuleManager::AlreadyLoaded:
45910b57cec5SDimitry Andric     Diag(diag::remark_module_import)
45920b57cec5SDimitry Andric         << M->ModuleName << M->FileName << (ImportedBy ? true : false)
45930b57cec5SDimitry Andric         << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef());
45940b57cec5SDimitry Andric     return Success;
45950b57cec5SDimitry Andric 
45960b57cec5SDimitry Andric   case ModuleManager::NewlyLoaded:
45970b57cec5SDimitry Andric     // Load module file below.
45980b57cec5SDimitry Andric     break;
45990b57cec5SDimitry Andric 
46000b57cec5SDimitry Andric   case ModuleManager::Missing:
46010b57cec5SDimitry Andric     // The module file was missing; if the client can handle that, return
46020b57cec5SDimitry Andric     // it.
46030b57cec5SDimitry Andric     if (ClientLoadCapabilities & ARR_Missing)
46040b57cec5SDimitry Andric       return Missing;
46050b57cec5SDimitry Andric 
46060b57cec5SDimitry Andric     // Otherwise, return an error.
4607e8d8bef9SDimitry Andric     Diag(diag::err_ast_file_not_found)
4608e8d8bef9SDimitry Andric         << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
46090b57cec5SDimitry Andric         << ErrorStr;
46100b57cec5SDimitry Andric     return Failure;
46110b57cec5SDimitry Andric 
46120b57cec5SDimitry Andric   case ModuleManager::OutOfDate:
46130b57cec5SDimitry Andric     // We couldn't load the module file because it is out-of-date. If the
46140b57cec5SDimitry Andric     // client can handle out-of-date, return it.
46150b57cec5SDimitry Andric     if (ClientLoadCapabilities & ARR_OutOfDate)
46160b57cec5SDimitry Andric       return OutOfDate;
46170b57cec5SDimitry Andric 
46180b57cec5SDimitry Andric     // Otherwise, return an error.
4619e8d8bef9SDimitry Andric     Diag(diag::err_ast_file_out_of_date)
4620e8d8bef9SDimitry Andric         << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty()
46210b57cec5SDimitry Andric         << ErrorStr;
46220b57cec5SDimitry Andric     return Failure;
46230b57cec5SDimitry Andric   }
46240b57cec5SDimitry Andric 
46250b57cec5SDimitry Andric   assert(M && "Missing module file");
46260b57cec5SDimitry Andric 
46270b57cec5SDimitry Andric   bool ShouldFinalizePCM = false;
46280b57cec5SDimitry Andric   auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
46290b57cec5SDimitry Andric     auto &MC = getModuleManager().getModuleCache();
46300b57cec5SDimitry Andric     if (ShouldFinalizePCM)
46310b57cec5SDimitry Andric       MC.finalizePCM(FileName);
46320b57cec5SDimitry Andric     else
46330b57cec5SDimitry Andric       MC.tryToDropPCM(FileName);
46340b57cec5SDimitry Andric   });
46350b57cec5SDimitry Andric   ModuleFile &F = *M;
46360b57cec5SDimitry Andric   BitstreamCursor &Stream = F.Stream;
46370b57cec5SDimitry Andric   Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
46380b57cec5SDimitry Andric   F.SizeInBits = F.Buffer->getBufferSize() * 8;
46390b57cec5SDimitry Andric 
46400b57cec5SDimitry Andric   // Sniff for the signature.
46410b57cec5SDimitry Andric   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
4642e8d8bef9SDimitry Andric     Diag(diag::err_ast_file_invalid)
46430b57cec5SDimitry Andric         << moduleKindForDiagnostic(Type) << FileName << std::move(Err);
46440b57cec5SDimitry Andric     return Failure;
46450b57cec5SDimitry Andric   }
46460b57cec5SDimitry Andric 
46470b57cec5SDimitry Andric   // This is used for compatibility with older PCH formats.
46480b57cec5SDimitry Andric   bool HaveReadControlBlock = false;
46490b57cec5SDimitry Andric   while (true) {
46500b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
46510b57cec5SDimitry Andric     if (!MaybeEntry) {
46520b57cec5SDimitry Andric       Error(MaybeEntry.takeError());
46530b57cec5SDimitry Andric       return Failure;
46540b57cec5SDimitry Andric     }
46550b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
46560b57cec5SDimitry Andric 
46570b57cec5SDimitry Andric     switch (Entry.Kind) {
46580b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
46590b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
46600b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
46610b57cec5SDimitry Andric       Error("invalid record at top-level of AST file");
46620b57cec5SDimitry Andric       return Failure;
46630b57cec5SDimitry Andric 
46640b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock:
46650b57cec5SDimitry Andric       break;
46660b57cec5SDimitry Andric     }
46670b57cec5SDimitry Andric 
46680b57cec5SDimitry Andric     switch (Entry.ID) {
46690b57cec5SDimitry Andric     case CONTROL_BLOCK_ID:
46700b57cec5SDimitry Andric       HaveReadControlBlock = true;
46710b57cec5SDimitry Andric       switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
46720b57cec5SDimitry Andric       case Success:
46730b57cec5SDimitry Andric         // Check that we didn't try to load a non-module AST file as a module.
46740b57cec5SDimitry Andric         //
46750b57cec5SDimitry Andric         // FIXME: Should we also perform the converse check? Loading a module as
46760b57cec5SDimitry Andric         // a PCH file sort of works, but it's a bit wonky.
46770b57cec5SDimitry Andric         if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
46780b57cec5SDimitry Andric              Type == MK_PrebuiltModule) &&
46790b57cec5SDimitry Andric             F.ModuleName.empty()) {
46800b57cec5SDimitry Andric           auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
46810b57cec5SDimitry Andric           if (Result != OutOfDate ||
46820b57cec5SDimitry Andric               (ClientLoadCapabilities & ARR_OutOfDate) == 0)
46830b57cec5SDimitry Andric             Diag(diag::err_module_file_not_module) << FileName;
46840b57cec5SDimitry Andric           return Result;
46850b57cec5SDimitry Andric         }
46860b57cec5SDimitry Andric         break;
46870b57cec5SDimitry Andric 
46880b57cec5SDimitry Andric       case Failure: return Failure;
46890b57cec5SDimitry Andric       case Missing: return Missing;
46900b57cec5SDimitry Andric       case OutOfDate: return OutOfDate;
46910b57cec5SDimitry Andric       case VersionMismatch: return VersionMismatch;
46920b57cec5SDimitry Andric       case ConfigurationMismatch: return ConfigurationMismatch;
46930b57cec5SDimitry Andric       case HadErrors: return HadErrors;
46940b57cec5SDimitry Andric       }
46950b57cec5SDimitry Andric       break;
46960b57cec5SDimitry Andric 
46970b57cec5SDimitry Andric     case AST_BLOCK_ID:
46980b57cec5SDimitry Andric       if (!HaveReadControlBlock) {
46990b57cec5SDimitry Andric         if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
47000b57cec5SDimitry Andric           Diag(diag::err_pch_version_too_old);
47010b57cec5SDimitry Andric         return VersionMismatch;
47020b57cec5SDimitry Andric       }
47030b57cec5SDimitry Andric 
47040b57cec5SDimitry Andric       // Record that we've loaded this module.
47050b57cec5SDimitry Andric       Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
47060b57cec5SDimitry Andric       ShouldFinalizePCM = true;
47070b57cec5SDimitry Andric       return Success;
47080b57cec5SDimitry Andric 
47090b57cec5SDimitry Andric     case UNHASHED_CONTROL_BLOCK_ID:
47100b57cec5SDimitry Andric       // This block is handled using look-ahead during ReadControlBlock.  We
47110b57cec5SDimitry Andric       // shouldn't get here!
47120b57cec5SDimitry Andric       Error("malformed block record in AST file");
47130b57cec5SDimitry Andric       return Failure;
47140b57cec5SDimitry Andric 
47150b57cec5SDimitry Andric     default:
47160b57cec5SDimitry Andric       if (llvm::Error Err = Stream.SkipBlock()) {
47170b57cec5SDimitry Andric         Error(std::move(Err));
47180b57cec5SDimitry Andric         return Failure;
47190b57cec5SDimitry Andric       }
47200b57cec5SDimitry Andric       break;
47210b57cec5SDimitry Andric     }
47220b57cec5SDimitry Andric   }
47230b57cec5SDimitry Andric 
47240b57cec5SDimitry Andric   llvm_unreachable("unexpected break; expected return");
47250b57cec5SDimitry Andric }
47260b57cec5SDimitry Andric 
47270b57cec5SDimitry Andric ASTReader::ASTReadResult
47280b57cec5SDimitry Andric ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
47290b57cec5SDimitry Andric                                     unsigned ClientLoadCapabilities) {
47300b57cec5SDimitry Andric   const HeaderSearchOptions &HSOpts =
47310b57cec5SDimitry Andric       PP.getHeaderSearchInfo().getHeaderSearchOpts();
47320b57cec5SDimitry Andric   bool AllowCompatibleConfigurationMismatch =
47330b57cec5SDimitry Andric       F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4734e8d8bef9SDimitry Andric   bool DisableValidation = shouldDisableValidationForFile(F);
47350b57cec5SDimitry Andric 
47360b57cec5SDimitry Andric   ASTReadResult Result = readUnhashedControlBlockImpl(
47370b57cec5SDimitry Andric       &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
47380b57cec5SDimitry Andric       Listener.get(),
47390b57cec5SDimitry Andric       WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions);
47400b57cec5SDimitry Andric 
47410b57cec5SDimitry Andric   // If F was directly imported by another module, it's implicitly validated by
47420b57cec5SDimitry Andric   // the importing module.
47430b57cec5SDimitry Andric   if (DisableValidation || WasImportedBy ||
47440b57cec5SDimitry Andric       (AllowConfigurationMismatch && Result == ConfigurationMismatch))
47450b57cec5SDimitry Andric     return Success;
47460b57cec5SDimitry Andric 
47470b57cec5SDimitry Andric   if (Result == Failure) {
47480b57cec5SDimitry Andric     Error("malformed block record in AST file");
47490b57cec5SDimitry Andric     return Failure;
47500b57cec5SDimitry Andric   }
47510b57cec5SDimitry Andric 
47520b57cec5SDimitry Andric   if (Result == OutOfDate && F.Kind == MK_ImplicitModule) {
47530b57cec5SDimitry Andric     // If this module has already been finalized in the ModuleCache, we're stuck
47540b57cec5SDimitry Andric     // with it; we can only load a single version of each module.
47550b57cec5SDimitry Andric     //
47560b57cec5SDimitry Andric     // This can happen when a module is imported in two contexts: in one, as a
47570b57cec5SDimitry Andric     // user module; in another, as a system module (due to an import from
47580b57cec5SDimitry Andric     // another module marked with the [system] flag).  It usually indicates a
47590b57cec5SDimitry Andric     // bug in the module map: this module should also be marked with [system].
47600b57cec5SDimitry Andric     //
47610b57cec5SDimitry Andric     // If -Wno-system-headers (the default), and the first import is as a
47620b57cec5SDimitry Andric     // system module, then validation will fail during the as-user import,
47630b57cec5SDimitry Andric     // since -Werror flags won't have been validated.  However, it's reasonable
47640b57cec5SDimitry Andric     // to treat this consistently as a system module.
47650b57cec5SDimitry Andric     //
47660b57cec5SDimitry Andric     // If -Wsystem-headers, the PCM on disk was built with
47670b57cec5SDimitry Andric     // -Wno-system-headers, and the first import is as a user module, then
47680b57cec5SDimitry Andric     // validation will fail during the as-system import since the PCM on disk
47690b57cec5SDimitry Andric     // doesn't guarantee that -Werror was respected.  However, the -Werror
47700b57cec5SDimitry Andric     // flags were checked during the initial as-user import.
47710b57cec5SDimitry Andric     if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) {
47720b57cec5SDimitry Andric       Diag(diag::warn_module_system_bit_conflict) << F.FileName;
47730b57cec5SDimitry Andric       return Success;
47740b57cec5SDimitry Andric     }
47750b57cec5SDimitry Andric   }
47760b57cec5SDimitry Andric 
47770b57cec5SDimitry Andric   return Result;
47780b57cec5SDimitry Andric }
47790b57cec5SDimitry Andric 
47800b57cec5SDimitry Andric ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl(
47810b57cec5SDimitry Andric     ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities,
47820b57cec5SDimitry Andric     bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
47830b57cec5SDimitry Andric     bool ValidateDiagnosticOptions) {
47840b57cec5SDimitry Andric   // Initialize a stream.
47850b57cec5SDimitry Andric   BitstreamCursor Stream(StreamData);
47860b57cec5SDimitry Andric 
47870b57cec5SDimitry Andric   // Sniff for the signature.
47880b57cec5SDimitry Andric   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
47890b57cec5SDimitry Andric     // FIXME this drops the error on the floor.
47900b57cec5SDimitry Andric     consumeError(std::move(Err));
47910b57cec5SDimitry Andric     return Failure;
47920b57cec5SDimitry Andric   }
47930b57cec5SDimitry Andric 
47940b57cec5SDimitry Andric   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
47950b57cec5SDimitry Andric   if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
47960b57cec5SDimitry Andric     return Failure;
47970b57cec5SDimitry Andric 
47980b57cec5SDimitry Andric   // Read all of the records in the options block.
47990b57cec5SDimitry Andric   RecordData Record;
48000b57cec5SDimitry Andric   ASTReadResult Result = Success;
48010b57cec5SDimitry Andric   while (true) {
48020b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
48030b57cec5SDimitry Andric     if (!MaybeEntry) {
48040b57cec5SDimitry Andric       // FIXME this drops the error on the floor.
48050b57cec5SDimitry Andric       consumeError(MaybeEntry.takeError());
48060b57cec5SDimitry Andric       return Failure;
48070b57cec5SDimitry Andric     }
48080b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
48090b57cec5SDimitry Andric 
48100b57cec5SDimitry Andric     switch (Entry.Kind) {
48110b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
48120b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock:
48130b57cec5SDimitry Andric       return Failure;
48140b57cec5SDimitry Andric 
48150b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
48160b57cec5SDimitry Andric       return Result;
48170b57cec5SDimitry Andric 
48180b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
48190b57cec5SDimitry Andric       // The interesting case.
48200b57cec5SDimitry Andric       break;
48210b57cec5SDimitry Andric     }
48220b57cec5SDimitry Andric 
48230b57cec5SDimitry Andric     // Read and process a record.
48240b57cec5SDimitry Andric     Record.clear();
4825349cc55cSDimitry Andric     StringRef Blob;
4826349cc55cSDimitry Andric     Expected<unsigned> MaybeRecordType =
4827349cc55cSDimitry Andric         Stream.readRecord(Entry.ID, Record, &Blob);
48280b57cec5SDimitry Andric     if (!MaybeRecordType) {
48290b57cec5SDimitry Andric       // FIXME this drops the error.
48300b57cec5SDimitry Andric       return Failure;
48310b57cec5SDimitry Andric     }
48320b57cec5SDimitry Andric     switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) {
48330b57cec5SDimitry Andric     case SIGNATURE:
48340b57cec5SDimitry Andric       if (F)
48355ffd83dbSDimitry Andric         F->Signature = ASTFileSignature::create(Record.begin(), Record.end());
48365ffd83dbSDimitry Andric       break;
48375ffd83dbSDimitry Andric     case AST_BLOCK_HASH:
48385ffd83dbSDimitry Andric       if (F)
48395ffd83dbSDimitry Andric         F->ASTBlockHash =
48405ffd83dbSDimitry Andric             ASTFileSignature::create(Record.begin(), Record.end());
48410b57cec5SDimitry Andric       break;
48420b57cec5SDimitry Andric     case DIAGNOSTIC_OPTIONS: {
48430b57cec5SDimitry Andric       bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
48440b57cec5SDimitry Andric       if (Listener && ValidateDiagnosticOptions &&
48450b57cec5SDimitry Andric           !AllowCompatibleConfigurationMismatch &&
48460b57cec5SDimitry Andric           ParseDiagnosticOptions(Record, Complain, *Listener))
48470b57cec5SDimitry Andric         Result = OutOfDate; // Don't return early.  Read the signature.
48480b57cec5SDimitry Andric       break;
48490b57cec5SDimitry Andric     }
4850bdd1243dSDimitry Andric     case HEADER_SEARCH_PATHS: {
4851bdd1243dSDimitry Andric       bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
4852bdd1243dSDimitry Andric       if (!AllowCompatibleConfigurationMismatch &&
4853bdd1243dSDimitry Andric           ParseHeaderSearchPaths(Record, Complain, *Listener))
4854bdd1243dSDimitry Andric         Result = ConfigurationMismatch;
4855bdd1243dSDimitry Andric       break;
4856bdd1243dSDimitry Andric     }
48570b57cec5SDimitry Andric     case DIAG_PRAGMA_MAPPINGS:
48580b57cec5SDimitry Andric       if (!F)
48590b57cec5SDimitry Andric         break;
48600b57cec5SDimitry Andric       if (F->PragmaDiagMappings.empty())
48610b57cec5SDimitry Andric         F->PragmaDiagMappings.swap(Record);
48620b57cec5SDimitry Andric       else
48630b57cec5SDimitry Andric         F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(),
48640b57cec5SDimitry Andric                                      Record.begin(), Record.end());
48650b57cec5SDimitry Andric       break;
4866349cc55cSDimitry Andric     case HEADER_SEARCH_ENTRY_USAGE:
4867349cc55cSDimitry Andric       if (!F)
4868349cc55cSDimitry Andric         break;
4869349cc55cSDimitry Andric       unsigned Count = Record[0];
4870349cc55cSDimitry Andric       const char *Byte = Blob.data();
487104eeddc0SDimitry Andric       F->SearchPathUsage = llvm::BitVector(Count, false);
4872349cc55cSDimitry Andric       for (unsigned I = 0; I < Count; ++Byte)
4873349cc55cSDimitry Andric         for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
4874349cc55cSDimitry Andric           if (*Byte & (1 << Bit))
487504eeddc0SDimitry Andric             F->SearchPathUsage[I] = true;
4876349cc55cSDimitry Andric       break;
48770b57cec5SDimitry Andric     }
48780b57cec5SDimitry Andric   }
48790b57cec5SDimitry Andric }
48800b57cec5SDimitry Andric 
48810b57cec5SDimitry Andric /// Parse a record and blob containing module file extension metadata.
48820b57cec5SDimitry Andric static bool parseModuleFileExtensionMetadata(
48830b57cec5SDimitry Andric               const SmallVectorImpl<uint64_t> &Record,
48840b57cec5SDimitry Andric               StringRef Blob,
48850b57cec5SDimitry Andric               ModuleFileExtensionMetadata &Metadata) {
48860b57cec5SDimitry Andric   if (Record.size() < 4) return true;
48870b57cec5SDimitry Andric 
48880b57cec5SDimitry Andric   Metadata.MajorVersion = Record[0];
48890b57cec5SDimitry Andric   Metadata.MinorVersion = Record[1];
48900b57cec5SDimitry Andric 
48910b57cec5SDimitry Andric   unsigned BlockNameLen = Record[2];
48920b57cec5SDimitry Andric   unsigned UserInfoLen = Record[3];
48930b57cec5SDimitry Andric 
48940b57cec5SDimitry Andric   if (BlockNameLen + UserInfoLen > Blob.size()) return true;
48950b57cec5SDimitry Andric 
48960b57cec5SDimitry Andric   Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
48970b57cec5SDimitry Andric   Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
48980b57cec5SDimitry Andric                                   Blob.data() + BlockNameLen + UserInfoLen);
48990b57cec5SDimitry Andric   return false;
49000b57cec5SDimitry Andric }
49010b57cec5SDimitry Andric 
4902349cc55cSDimitry Andric llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) {
49030b57cec5SDimitry Andric   BitstreamCursor &Stream = F.Stream;
49040b57cec5SDimitry Andric 
49050b57cec5SDimitry Andric   RecordData Record;
49060b57cec5SDimitry Andric   while (true) {
49070b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4908349cc55cSDimitry Andric     if (!MaybeEntry)
4909349cc55cSDimitry Andric       return MaybeEntry.takeError();
49100b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
49110b57cec5SDimitry Andric 
49120b57cec5SDimitry Andric     switch (Entry.Kind) {
49130b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock:
4914349cc55cSDimitry Andric       if (llvm::Error Err = Stream.SkipBlock())
4915349cc55cSDimitry Andric         return Err;
49160b57cec5SDimitry Andric       continue;
49170b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
4918349cc55cSDimitry Andric       return llvm::Error::success();
49190b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
4920349cc55cSDimitry Andric       return llvm::createStringError(std::errc::illegal_byte_sequence,
4921349cc55cSDimitry Andric                                      "malformed block record in AST file");
49220b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
49230b57cec5SDimitry Andric       break;
49240b57cec5SDimitry Andric     }
49250b57cec5SDimitry Andric 
49260b57cec5SDimitry Andric     Record.clear();
49270b57cec5SDimitry Andric     StringRef Blob;
49280b57cec5SDimitry Andric     Expected<unsigned> MaybeRecCode =
49290b57cec5SDimitry Andric         Stream.readRecord(Entry.ID, Record, &Blob);
4930349cc55cSDimitry Andric     if (!MaybeRecCode)
4931349cc55cSDimitry Andric       return MaybeRecCode.takeError();
49320b57cec5SDimitry Andric     switch (MaybeRecCode.get()) {
49330b57cec5SDimitry Andric     case EXTENSION_METADATA: {
49340b57cec5SDimitry Andric       ModuleFileExtensionMetadata Metadata;
4935349cc55cSDimitry Andric       if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4936349cc55cSDimitry Andric         return llvm::createStringError(
4937349cc55cSDimitry Andric             std::errc::illegal_byte_sequence,
4938349cc55cSDimitry Andric             "malformed EXTENSION_METADATA in AST file");
49390b57cec5SDimitry Andric 
49400b57cec5SDimitry Andric       // Find a module file extension with this block name.
49410b57cec5SDimitry Andric       auto Known = ModuleFileExtensions.find(Metadata.BlockName);
49420b57cec5SDimitry Andric       if (Known == ModuleFileExtensions.end()) break;
49430b57cec5SDimitry Andric 
49440b57cec5SDimitry Andric       // Form a reader.
49450b57cec5SDimitry Andric       if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
49460b57cec5SDimitry Andric                                                              F, Stream)) {
49470b57cec5SDimitry Andric         F.ExtensionReaders.push_back(std::move(Reader));
49480b57cec5SDimitry Andric       }
49490b57cec5SDimitry Andric 
49500b57cec5SDimitry Andric       break;
49510b57cec5SDimitry Andric     }
49520b57cec5SDimitry Andric     }
49530b57cec5SDimitry Andric   }
49540b57cec5SDimitry Andric 
4955349cc55cSDimitry Andric   return llvm::Error::success();
49560b57cec5SDimitry Andric }
49570b57cec5SDimitry Andric 
49580b57cec5SDimitry Andric void ASTReader::InitializeContext() {
49590b57cec5SDimitry Andric   assert(ContextObj && "no context to initialize");
49600b57cec5SDimitry Andric   ASTContext &Context = *ContextObj;
49610b57cec5SDimitry Andric 
49620b57cec5SDimitry Andric   // If there's a listener, notify them that we "read" the translation unit.
49630b57cec5SDimitry Andric   if (DeserializationListener)
49640b57cec5SDimitry Andric     DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
49650b57cec5SDimitry Andric                                       Context.getTranslationUnitDecl());
49660b57cec5SDimitry Andric 
49670b57cec5SDimitry Andric   // FIXME: Find a better way to deal with collisions between these
49680b57cec5SDimitry Andric   // built-in types. Right now, we just ignore the problem.
49690b57cec5SDimitry Andric 
49700b57cec5SDimitry Andric   // Load the special types.
49710b57cec5SDimitry Andric   if (SpecialTypes.size() >= NumSpecialTypeIDs) {
49720b57cec5SDimitry Andric     if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
49730b57cec5SDimitry Andric       if (!Context.CFConstantStringTypeDecl)
49740b57cec5SDimitry Andric         Context.setCFConstantStringType(GetType(String));
49750b57cec5SDimitry Andric     }
49760b57cec5SDimitry Andric 
49770b57cec5SDimitry Andric     if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
49780b57cec5SDimitry Andric       QualType FileType = GetType(File);
49790b57cec5SDimitry Andric       if (FileType.isNull()) {
49800b57cec5SDimitry Andric         Error("FILE type is NULL");
49810b57cec5SDimitry Andric         return;
49820b57cec5SDimitry Andric       }
49830b57cec5SDimitry Andric 
49840b57cec5SDimitry Andric       if (!Context.FILEDecl) {
49850b57cec5SDimitry Andric         if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
49860b57cec5SDimitry Andric           Context.setFILEDecl(Typedef->getDecl());
49870b57cec5SDimitry Andric         else {
49880b57cec5SDimitry Andric           const TagType *Tag = FileType->getAs<TagType>();
49890b57cec5SDimitry Andric           if (!Tag) {
49900b57cec5SDimitry Andric             Error("Invalid FILE type in AST file");
49910b57cec5SDimitry Andric             return;
49920b57cec5SDimitry Andric           }
49930b57cec5SDimitry Andric           Context.setFILEDecl(Tag->getDecl());
49940b57cec5SDimitry Andric         }
49950b57cec5SDimitry Andric       }
49960b57cec5SDimitry Andric     }
49970b57cec5SDimitry Andric 
49980b57cec5SDimitry Andric     if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
49990b57cec5SDimitry Andric       QualType Jmp_bufType = GetType(Jmp_buf);
50000b57cec5SDimitry Andric       if (Jmp_bufType.isNull()) {
50010b57cec5SDimitry Andric         Error("jmp_buf type is NULL");
50020b57cec5SDimitry Andric         return;
50030b57cec5SDimitry Andric       }
50040b57cec5SDimitry Andric 
50050b57cec5SDimitry Andric       if (!Context.jmp_bufDecl) {
50060b57cec5SDimitry Andric         if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
50070b57cec5SDimitry Andric           Context.setjmp_bufDecl(Typedef->getDecl());
50080b57cec5SDimitry Andric         else {
50090b57cec5SDimitry Andric           const TagType *Tag = Jmp_bufType->getAs<TagType>();
50100b57cec5SDimitry Andric           if (!Tag) {
50110b57cec5SDimitry Andric             Error("Invalid jmp_buf type in AST file");
50120b57cec5SDimitry Andric             return;
50130b57cec5SDimitry Andric           }
50140b57cec5SDimitry Andric           Context.setjmp_bufDecl(Tag->getDecl());
50150b57cec5SDimitry Andric         }
50160b57cec5SDimitry Andric       }
50170b57cec5SDimitry Andric     }
50180b57cec5SDimitry Andric 
50190b57cec5SDimitry Andric     if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
50200b57cec5SDimitry Andric       QualType Sigjmp_bufType = GetType(Sigjmp_buf);
50210b57cec5SDimitry Andric       if (Sigjmp_bufType.isNull()) {
50220b57cec5SDimitry Andric         Error("sigjmp_buf type is NULL");
50230b57cec5SDimitry Andric         return;
50240b57cec5SDimitry Andric       }
50250b57cec5SDimitry Andric 
50260b57cec5SDimitry Andric       if (!Context.sigjmp_bufDecl) {
50270b57cec5SDimitry Andric         if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
50280b57cec5SDimitry Andric           Context.setsigjmp_bufDecl(Typedef->getDecl());
50290b57cec5SDimitry Andric         else {
50300b57cec5SDimitry Andric           const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
50310b57cec5SDimitry Andric           assert(Tag && "Invalid sigjmp_buf type in AST file");
50320b57cec5SDimitry Andric           Context.setsigjmp_bufDecl(Tag->getDecl());
50330b57cec5SDimitry Andric         }
50340b57cec5SDimitry Andric       }
50350b57cec5SDimitry Andric     }
50360b57cec5SDimitry Andric 
50370b57cec5SDimitry Andric     if (unsigned ObjCIdRedef
50380b57cec5SDimitry Andric           = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
50390b57cec5SDimitry Andric       if (Context.ObjCIdRedefinitionType.isNull())
50400b57cec5SDimitry Andric         Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
50410b57cec5SDimitry Andric     }
50420b57cec5SDimitry Andric 
50430b57cec5SDimitry Andric     if (unsigned ObjCClassRedef
50440b57cec5SDimitry Andric           = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
50450b57cec5SDimitry Andric       if (Context.ObjCClassRedefinitionType.isNull())
50460b57cec5SDimitry Andric         Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
50470b57cec5SDimitry Andric     }
50480b57cec5SDimitry Andric 
50490b57cec5SDimitry Andric     if (unsigned ObjCSelRedef
50500b57cec5SDimitry Andric           = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
50510b57cec5SDimitry Andric       if (Context.ObjCSelRedefinitionType.isNull())
50520b57cec5SDimitry Andric         Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
50530b57cec5SDimitry Andric     }
50540b57cec5SDimitry Andric 
50550b57cec5SDimitry Andric     if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
50560b57cec5SDimitry Andric       QualType Ucontext_tType = GetType(Ucontext_t);
50570b57cec5SDimitry Andric       if (Ucontext_tType.isNull()) {
50580b57cec5SDimitry Andric         Error("ucontext_t type is NULL");
50590b57cec5SDimitry Andric         return;
50600b57cec5SDimitry Andric       }
50610b57cec5SDimitry Andric 
50620b57cec5SDimitry Andric       if (!Context.ucontext_tDecl) {
50630b57cec5SDimitry Andric         if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
50640b57cec5SDimitry Andric           Context.setucontext_tDecl(Typedef->getDecl());
50650b57cec5SDimitry Andric         else {
50660b57cec5SDimitry Andric           const TagType *Tag = Ucontext_tType->getAs<TagType>();
50670b57cec5SDimitry Andric           assert(Tag && "Invalid ucontext_t type in AST file");
50680b57cec5SDimitry Andric           Context.setucontext_tDecl(Tag->getDecl());
50690b57cec5SDimitry Andric         }
50700b57cec5SDimitry Andric       }
50710b57cec5SDimitry Andric     }
50720b57cec5SDimitry Andric   }
50730b57cec5SDimitry Andric 
50740b57cec5SDimitry Andric   ReadPragmaDiagnosticMappings(Context.getDiagnostics());
50750b57cec5SDimitry Andric 
50760b57cec5SDimitry Andric   // If there were any CUDA special declarations, deserialize them.
50770b57cec5SDimitry Andric   if (!CUDASpecialDeclRefs.empty()) {
50780b57cec5SDimitry Andric     assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
50790b57cec5SDimitry Andric     Context.setcudaConfigureCallDecl(
50800b57cec5SDimitry Andric                            cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
50810b57cec5SDimitry Andric   }
50820b57cec5SDimitry Andric 
50830b57cec5SDimitry Andric   // Re-export any modules that were imported by a non-module AST file.
50840b57cec5SDimitry Andric   // FIXME: This does not make macro-only imports visible again.
5085*06c3fb27SDimitry Andric   for (auto &Import : PendingImportedModules) {
50860b57cec5SDimitry Andric     if (Module *Imported = getSubmodule(Import.ID)) {
50870b57cec5SDimitry Andric       makeModuleVisible(Imported, Module::AllVisible,
50880b57cec5SDimitry Andric                         /*ImportLoc=*/Import.ImportLoc);
50890b57cec5SDimitry Andric       if (Import.ImportLoc.isValid())
50900b57cec5SDimitry Andric         PP.makeModuleVisible(Imported, Import.ImportLoc);
5091e8d8bef9SDimitry Andric       // This updates visibility for Preprocessor only. For Sema, which can be
5092e8d8bef9SDimitry Andric       // nullptr here, we do the same later, in UpdateSema().
50930b57cec5SDimitry Andric     }
50940b57cec5SDimitry Andric   }
5095*06c3fb27SDimitry Andric 
5096*06c3fb27SDimitry Andric   // Hand off these modules to Sema.
5097*06c3fb27SDimitry Andric   PendingImportedModulesSema.append(PendingImportedModules);
5098*06c3fb27SDimitry Andric   PendingImportedModules.clear();
50990b57cec5SDimitry Andric }
51000b57cec5SDimitry Andric 
51010b57cec5SDimitry Andric void ASTReader::finalizeForWriting() {
51020b57cec5SDimitry Andric   // Nothing to do for now.
51030b57cec5SDimitry Andric }
51040b57cec5SDimitry Andric 
51050b57cec5SDimitry Andric /// Reads and return the signature record from \p PCH's control block, or
51060b57cec5SDimitry Andric /// else returns 0.
51070b57cec5SDimitry Andric static ASTFileSignature readASTFileSignature(StringRef PCH) {
51080b57cec5SDimitry Andric   BitstreamCursor Stream(PCH);
51090b57cec5SDimitry Andric   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
51100b57cec5SDimitry Andric     // FIXME this drops the error on the floor.
51110b57cec5SDimitry Andric     consumeError(std::move(Err));
51120b57cec5SDimitry Andric     return ASTFileSignature();
51130b57cec5SDimitry Andric   }
51140b57cec5SDimitry Andric 
51150b57cec5SDimitry Andric   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
51160b57cec5SDimitry Andric   if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID))
51170b57cec5SDimitry Andric     return ASTFileSignature();
51180b57cec5SDimitry Andric 
51190b57cec5SDimitry Andric   // Scan for SIGNATURE inside the diagnostic options block.
51200b57cec5SDimitry Andric   ASTReader::RecordData Record;
51210b57cec5SDimitry Andric   while (true) {
51220b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry =
51230b57cec5SDimitry Andric         Stream.advanceSkippingSubblocks();
51240b57cec5SDimitry Andric     if (!MaybeEntry) {
51250b57cec5SDimitry Andric       // FIXME this drops the error on the floor.
51260b57cec5SDimitry Andric       consumeError(MaybeEntry.takeError());
51270b57cec5SDimitry Andric       return ASTFileSignature();
51280b57cec5SDimitry Andric     }
51290b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
51300b57cec5SDimitry Andric 
51310b57cec5SDimitry Andric     if (Entry.Kind != llvm::BitstreamEntry::Record)
51320b57cec5SDimitry Andric       return ASTFileSignature();
51330b57cec5SDimitry Andric 
51340b57cec5SDimitry Andric     Record.clear();
51350b57cec5SDimitry Andric     StringRef Blob;
51360b57cec5SDimitry Andric     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
51370b57cec5SDimitry Andric     if (!MaybeRecord) {
51380b57cec5SDimitry Andric       // FIXME this drops the error on the floor.
51390b57cec5SDimitry Andric       consumeError(MaybeRecord.takeError());
51400b57cec5SDimitry Andric       return ASTFileSignature();
51410b57cec5SDimitry Andric     }
51420b57cec5SDimitry Andric     if (SIGNATURE == MaybeRecord.get())
51435ffd83dbSDimitry Andric       return ASTFileSignature::create(Record.begin(),
51445ffd83dbSDimitry Andric                                       Record.begin() + ASTFileSignature::size);
51450b57cec5SDimitry Andric   }
51460b57cec5SDimitry Andric }
51470b57cec5SDimitry Andric 
51480b57cec5SDimitry Andric /// Retrieve the name of the original source file name
51490b57cec5SDimitry Andric /// directly from the AST file, without actually loading the AST
51500b57cec5SDimitry Andric /// file.
51510b57cec5SDimitry Andric std::string ASTReader::getOriginalSourceFile(
51520b57cec5SDimitry Andric     const std::string &ASTFileName, FileManager &FileMgr,
51530b57cec5SDimitry Andric     const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
51540b57cec5SDimitry Andric   // Open the AST file.
515581ad6265SDimitry Andric   auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false,
515681ad6265SDimitry Andric                                          /*RequiresNullTerminator=*/false);
51570b57cec5SDimitry Andric   if (!Buffer) {
51580b57cec5SDimitry Andric     Diags.Report(diag::err_fe_unable_to_read_pch_file)
51590b57cec5SDimitry Andric         << ASTFileName << Buffer.getError().message();
51600b57cec5SDimitry Andric     return std::string();
51610b57cec5SDimitry Andric   }
51620b57cec5SDimitry Andric 
51630b57cec5SDimitry Andric   // Initialize the stream
51640b57cec5SDimitry Andric   BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
51650b57cec5SDimitry Andric 
51660b57cec5SDimitry Andric   // Sniff for the signature.
51670b57cec5SDimitry Andric   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
51680b57cec5SDimitry Andric     Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
51690b57cec5SDimitry Andric     return std::string();
51700b57cec5SDimitry Andric   }
51710b57cec5SDimitry Andric 
51720b57cec5SDimitry Andric   // Scan for the CONTROL_BLOCK_ID block.
51730b57cec5SDimitry Andric   if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
51740b57cec5SDimitry Andric     Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
51750b57cec5SDimitry Andric     return std::string();
51760b57cec5SDimitry Andric   }
51770b57cec5SDimitry Andric 
51780b57cec5SDimitry Andric   // Scan for ORIGINAL_FILE inside the control block.
51790b57cec5SDimitry Andric   RecordData Record;
51800b57cec5SDimitry Andric   while (true) {
51810b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry =
51820b57cec5SDimitry Andric         Stream.advanceSkippingSubblocks();
51830b57cec5SDimitry Andric     if (!MaybeEntry) {
51840b57cec5SDimitry Andric       // FIXME this drops errors on the floor.
51850b57cec5SDimitry Andric       consumeError(MaybeEntry.takeError());
51860b57cec5SDimitry Andric       return std::string();
51870b57cec5SDimitry Andric     }
51880b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
51890b57cec5SDimitry Andric 
51900b57cec5SDimitry Andric     if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
51910b57cec5SDimitry Andric       return std::string();
51920b57cec5SDimitry Andric 
51930b57cec5SDimitry Andric     if (Entry.Kind != llvm::BitstreamEntry::Record) {
51940b57cec5SDimitry Andric       Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
51950b57cec5SDimitry Andric       return std::string();
51960b57cec5SDimitry Andric     }
51970b57cec5SDimitry Andric 
51980b57cec5SDimitry Andric     Record.clear();
51990b57cec5SDimitry Andric     StringRef Blob;
52000b57cec5SDimitry Andric     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob);
52010b57cec5SDimitry Andric     if (!MaybeRecord) {
52020b57cec5SDimitry Andric       // FIXME this drops the errors on the floor.
52030b57cec5SDimitry Andric       consumeError(MaybeRecord.takeError());
52040b57cec5SDimitry Andric       return std::string();
52050b57cec5SDimitry Andric     }
52060b57cec5SDimitry Andric     if (ORIGINAL_FILE == MaybeRecord.get())
52070b57cec5SDimitry Andric       return Blob.str();
52080b57cec5SDimitry Andric   }
52090b57cec5SDimitry Andric }
52100b57cec5SDimitry Andric 
52110b57cec5SDimitry Andric namespace {
52120b57cec5SDimitry Andric 
52130b57cec5SDimitry Andric   class SimplePCHValidator : public ASTReaderListener {
52140b57cec5SDimitry Andric     const LangOptions &ExistingLangOpts;
52150b57cec5SDimitry Andric     const TargetOptions &ExistingTargetOpts;
52160b57cec5SDimitry Andric     const PreprocessorOptions &ExistingPPOpts;
52170b57cec5SDimitry Andric     std::string ExistingModuleCachePath;
52180b57cec5SDimitry Andric     FileManager &FileMgr;
521961cfbce3SDimitry Andric     bool StrictOptionMatches;
52200b57cec5SDimitry Andric 
52210b57cec5SDimitry Andric   public:
52220b57cec5SDimitry Andric     SimplePCHValidator(const LangOptions &ExistingLangOpts,
52230b57cec5SDimitry Andric                        const TargetOptions &ExistingTargetOpts,
52240b57cec5SDimitry Andric                        const PreprocessorOptions &ExistingPPOpts,
522561cfbce3SDimitry Andric                        StringRef ExistingModuleCachePath, FileManager &FileMgr,
522661cfbce3SDimitry Andric                        bool StrictOptionMatches)
52270b57cec5SDimitry Andric         : ExistingLangOpts(ExistingLangOpts),
52280b57cec5SDimitry Andric           ExistingTargetOpts(ExistingTargetOpts),
52290b57cec5SDimitry Andric           ExistingPPOpts(ExistingPPOpts),
523061cfbce3SDimitry Andric           ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr),
523161cfbce3SDimitry Andric           StrictOptionMatches(StrictOptionMatches) {}
52320b57cec5SDimitry Andric 
52330b57cec5SDimitry Andric     bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
52340b57cec5SDimitry Andric                              bool AllowCompatibleDifferences) override {
52350b57cec5SDimitry Andric       return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
52360b57cec5SDimitry Andric                                   AllowCompatibleDifferences);
52370b57cec5SDimitry Andric     }
52380b57cec5SDimitry Andric 
52390b57cec5SDimitry Andric     bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
52400b57cec5SDimitry Andric                            bool AllowCompatibleDifferences) override {
52410b57cec5SDimitry Andric       return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
52420b57cec5SDimitry Andric                                 AllowCompatibleDifferences);
52430b57cec5SDimitry Andric     }
52440b57cec5SDimitry Andric 
52450b57cec5SDimitry Andric     bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
52460b57cec5SDimitry Andric                                  StringRef SpecificModuleCachePath,
52470b57cec5SDimitry Andric                                  bool Complain) override {
52480b57cec5SDimitry Andric       return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5249fe6060f1SDimitry Andric                                       ExistingModuleCachePath, nullptr,
5250fe6060f1SDimitry Andric                                       ExistingLangOpts, ExistingPPOpts);
52510b57cec5SDimitry Andric     }
52520b57cec5SDimitry Andric 
52530b57cec5SDimitry Andric     bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
52540b57cec5SDimitry Andric                                  bool Complain,
52550b57cec5SDimitry Andric                                  std::string &SuggestedPredefines) override {
525661cfbce3SDimitry Andric       return checkPreprocessorOptions(
525761cfbce3SDimitry Andric           PPOpts, ExistingPPOpts, /*Diags=*/nullptr, FileMgr,
525861cfbce3SDimitry Andric           SuggestedPredefines, ExistingLangOpts,
525961cfbce3SDimitry Andric           StrictOptionMatches ? OptionValidateStrictMatches
526061cfbce3SDimitry Andric                               : OptionValidateContradictions);
52610b57cec5SDimitry Andric     }
52620b57cec5SDimitry Andric   };
52630b57cec5SDimitry Andric 
52640b57cec5SDimitry Andric } // namespace
52650b57cec5SDimitry Andric 
52660b57cec5SDimitry Andric bool ASTReader::readASTFileControlBlock(
52670b57cec5SDimitry Andric     StringRef Filename, FileManager &FileMgr,
5268bdd1243dSDimitry Andric     const InMemoryModuleCache &ModuleCache,
5269bdd1243dSDimitry Andric     const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
52700b57cec5SDimitry Andric     ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
52710b57cec5SDimitry Andric   // Open the AST file.
5272bdd1243dSDimitry Andric   std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5273bdd1243dSDimitry Andric   llvm::MemoryBuffer *Buffer = ModuleCache.lookupPCM(Filename);
5274bdd1243dSDimitry Andric   if (!Buffer) {
5275bdd1243dSDimitry Andric     // FIXME: We should add the pcm to the InMemoryModuleCache if it could be
5276bdd1243dSDimitry Andric     // read again later, but we do not have the context here to determine if it
5277bdd1243dSDimitry Andric     // is safe to change the result of InMemoryModuleCache::getPCMState().
5278bdd1243dSDimitry Andric 
52790b57cec5SDimitry Andric     // FIXME: This allows use of the VFS; we do not allow use of the
52800b57cec5SDimitry Andric     // VFS when actually loading a module.
5281bdd1243dSDimitry Andric     auto BufferOrErr = FileMgr.getBufferForFile(Filename);
5282bdd1243dSDimitry Andric     if (!BufferOrErr)
52830b57cec5SDimitry Andric       return true;
5284bdd1243dSDimitry Andric     OwnedBuffer = std::move(*BufferOrErr);
5285bdd1243dSDimitry Andric     Buffer = OwnedBuffer.get();
52860b57cec5SDimitry Andric   }
52870b57cec5SDimitry Andric 
52880b57cec5SDimitry Andric   // Initialize the stream
5289bdd1243dSDimitry Andric   StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
52900b57cec5SDimitry Andric   BitstreamCursor Stream(Bytes);
52910b57cec5SDimitry Andric 
52920b57cec5SDimitry Andric   // Sniff for the signature.
52930b57cec5SDimitry Andric   if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) {
52940b57cec5SDimitry Andric     consumeError(std::move(Err)); // FIXME this drops errors on the floor.
52950b57cec5SDimitry Andric     return true;
52960b57cec5SDimitry Andric   }
52970b57cec5SDimitry Andric 
52980b57cec5SDimitry Andric   // Scan for the CONTROL_BLOCK_ID block.
52990b57cec5SDimitry Andric   if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
53000b57cec5SDimitry Andric     return true;
53010b57cec5SDimitry Andric 
53020b57cec5SDimitry Andric   bool NeedsInputFiles = Listener.needsInputFileVisitation();
53030b57cec5SDimitry Andric   bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
53040b57cec5SDimitry Andric   bool NeedsImports = Listener.needsImportVisitation();
53050b57cec5SDimitry Andric   BitstreamCursor InputFilesCursor;
53060b57cec5SDimitry Andric 
53070b57cec5SDimitry Andric   RecordData Record;
53080b57cec5SDimitry Andric   std::string ModuleDir;
53090b57cec5SDimitry Andric   bool DoneWithControlBlock = false;
53100b57cec5SDimitry Andric   while (!DoneWithControlBlock) {
53110b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
53120b57cec5SDimitry Andric     if (!MaybeEntry) {
53130b57cec5SDimitry Andric       // FIXME this drops the error on the floor.
53140b57cec5SDimitry Andric       consumeError(MaybeEntry.takeError());
53150b57cec5SDimitry Andric       return true;
53160b57cec5SDimitry Andric     }
53170b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
53180b57cec5SDimitry Andric 
53190b57cec5SDimitry Andric     switch (Entry.Kind) {
53200b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock: {
53210b57cec5SDimitry Andric       switch (Entry.ID) {
53220b57cec5SDimitry Andric       case OPTIONS_BLOCK_ID: {
53230b57cec5SDimitry Andric         std::string IgnoredSuggestedPredefines;
53240b57cec5SDimitry Andric         if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
53250b57cec5SDimitry Andric                              /*AllowCompatibleConfigurationMismatch*/ false,
53260b57cec5SDimitry Andric                              Listener, IgnoredSuggestedPredefines) != Success)
53270b57cec5SDimitry Andric           return true;
53280b57cec5SDimitry Andric         break;
53290b57cec5SDimitry Andric       }
53300b57cec5SDimitry Andric 
53310b57cec5SDimitry Andric       case INPUT_FILES_BLOCK_ID:
53320b57cec5SDimitry Andric         InputFilesCursor = Stream;
53330b57cec5SDimitry Andric         if (llvm::Error Err = Stream.SkipBlock()) {
53340b57cec5SDimitry Andric           // FIXME this drops the error on the floor.
53350b57cec5SDimitry Andric           consumeError(std::move(Err));
53360b57cec5SDimitry Andric           return true;
53370b57cec5SDimitry Andric         }
53380b57cec5SDimitry Andric         if (NeedsInputFiles &&
53390b57cec5SDimitry Andric             ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))
53400b57cec5SDimitry Andric           return true;
53410b57cec5SDimitry Andric         break;
53420b57cec5SDimitry Andric 
53430b57cec5SDimitry Andric       default:
53440b57cec5SDimitry Andric         if (llvm::Error Err = Stream.SkipBlock()) {
53450b57cec5SDimitry Andric           // FIXME this drops the error on the floor.
53460b57cec5SDimitry Andric           consumeError(std::move(Err));
53470b57cec5SDimitry Andric           return true;
53480b57cec5SDimitry Andric         }
53490b57cec5SDimitry Andric         break;
53500b57cec5SDimitry Andric       }
53510b57cec5SDimitry Andric 
53520b57cec5SDimitry Andric       continue;
53530b57cec5SDimitry Andric     }
53540b57cec5SDimitry Andric 
53550b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
53560b57cec5SDimitry Andric       DoneWithControlBlock = true;
53570b57cec5SDimitry Andric       break;
53580b57cec5SDimitry Andric 
53590b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
53600b57cec5SDimitry Andric       return true;
53610b57cec5SDimitry Andric 
53620b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
53630b57cec5SDimitry Andric       break;
53640b57cec5SDimitry Andric     }
53650b57cec5SDimitry Andric 
53660b57cec5SDimitry Andric     if (DoneWithControlBlock) break;
53670b57cec5SDimitry Andric 
53680b57cec5SDimitry Andric     Record.clear();
53690b57cec5SDimitry Andric     StringRef Blob;
53700b57cec5SDimitry Andric     Expected<unsigned> MaybeRecCode =
53710b57cec5SDimitry Andric         Stream.readRecord(Entry.ID, Record, &Blob);
53720b57cec5SDimitry Andric     if (!MaybeRecCode) {
53730b57cec5SDimitry Andric       // FIXME this drops the error.
53740b57cec5SDimitry Andric       return Failure;
53750b57cec5SDimitry Andric     }
53760b57cec5SDimitry Andric     switch ((ControlRecordTypes)MaybeRecCode.get()) {
53770b57cec5SDimitry Andric     case METADATA:
53780b57cec5SDimitry Andric       if (Record[0] != VERSION_MAJOR)
53790b57cec5SDimitry Andric         return true;
53800b57cec5SDimitry Andric       if (Listener.ReadFullVersionInformation(Blob))
53810b57cec5SDimitry Andric         return true;
53820b57cec5SDimitry Andric       break;
53830b57cec5SDimitry Andric     case MODULE_NAME:
53840b57cec5SDimitry Andric       Listener.ReadModuleName(Blob);
53850b57cec5SDimitry Andric       break;
53860b57cec5SDimitry Andric     case MODULE_DIRECTORY:
53875ffd83dbSDimitry Andric       ModuleDir = std::string(Blob);
53880b57cec5SDimitry Andric       break;
53890b57cec5SDimitry Andric     case MODULE_MAP_FILE: {
53900b57cec5SDimitry Andric       unsigned Idx = 0;
53910b57cec5SDimitry Andric       auto Path = ReadString(Record, Idx);
53920b57cec5SDimitry Andric       ResolveImportedPath(Path, ModuleDir);
53930b57cec5SDimitry Andric       Listener.ReadModuleMapFile(Path);
53940b57cec5SDimitry Andric       break;
53950b57cec5SDimitry Andric     }
53960b57cec5SDimitry Andric     case INPUT_FILE_OFFSETS: {
53970b57cec5SDimitry Andric       if (!NeedsInputFiles)
53980b57cec5SDimitry Andric         break;
53990b57cec5SDimitry Andric 
54000b57cec5SDimitry Andric       unsigned NumInputFiles = Record[0];
54010b57cec5SDimitry Andric       unsigned NumUserFiles = Record[1];
54020b57cec5SDimitry Andric       const llvm::support::unaligned_uint64_t *InputFileOffs =
54030b57cec5SDimitry Andric           (const llvm::support::unaligned_uint64_t *)Blob.data();
54040b57cec5SDimitry Andric       for (unsigned I = 0; I != NumInputFiles; ++I) {
54050b57cec5SDimitry Andric         // Go find this input file.
54060b57cec5SDimitry Andric         bool isSystemFile = I >= NumUserFiles;
54070b57cec5SDimitry Andric 
54080b57cec5SDimitry Andric         if (isSystemFile && !NeedsSystemInputFiles)
54090b57cec5SDimitry Andric           break; // the rest are system input files
54100b57cec5SDimitry Andric 
54110b57cec5SDimitry Andric         BitstreamCursor &Cursor = InputFilesCursor;
54120b57cec5SDimitry Andric         SavedStreamPosition SavedPosition(Cursor);
54130b57cec5SDimitry Andric         if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) {
54140b57cec5SDimitry Andric           // FIXME this drops errors on the floor.
54150b57cec5SDimitry Andric           consumeError(std::move(Err));
54160b57cec5SDimitry Andric         }
54170b57cec5SDimitry Andric 
54180b57cec5SDimitry Andric         Expected<unsigned> MaybeCode = Cursor.ReadCode();
54190b57cec5SDimitry Andric         if (!MaybeCode) {
54200b57cec5SDimitry Andric           // FIXME this drops errors on the floor.
54210b57cec5SDimitry Andric           consumeError(MaybeCode.takeError());
54220b57cec5SDimitry Andric         }
54230b57cec5SDimitry Andric         unsigned Code = MaybeCode.get();
54240b57cec5SDimitry Andric 
54250b57cec5SDimitry Andric         RecordData Record;
54260b57cec5SDimitry Andric         StringRef Blob;
54270b57cec5SDimitry Andric         bool shouldContinue = false;
54280b57cec5SDimitry Andric         Expected<unsigned> MaybeRecordType =
54290b57cec5SDimitry Andric             Cursor.readRecord(Code, Record, &Blob);
54300b57cec5SDimitry Andric         if (!MaybeRecordType) {
54310b57cec5SDimitry Andric           // FIXME this drops errors on the floor.
54320b57cec5SDimitry Andric           consumeError(MaybeRecordType.takeError());
54330b57cec5SDimitry Andric         }
54340b57cec5SDimitry Andric         switch ((InputFileRecordTypes)MaybeRecordType.get()) {
5435a7dea167SDimitry Andric         case INPUT_FILE_HASH:
5436a7dea167SDimitry Andric           break;
54370b57cec5SDimitry Andric         case INPUT_FILE:
54380b57cec5SDimitry Andric           bool Overridden = static_cast<bool>(Record[3]);
54395ffd83dbSDimitry Andric           std::string Filename = std::string(Blob);
54400b57cec5SDimitry Andric           ResolveImportedPath(Filename, ModuleDir);
54410b57cec5SDimitry Andric           shouldContinue = Listener.visitInputFile(
54420b57cec5SDimitry Andric               Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
54430b57cec5SDimitry Andric           break;
54440b57cec5SDimitry Andric         }
54450b57cec5SDimitry Andric         if (!shouldContinue)
54460b57cec5SDimitry Andric           break;
54470b57cec5SDimitry Andric       }
54480b57cec5SDimitry Andric       break;
54490b57cec5SDimitry Andric     }
54500b57cec5SDimitry Andric 
54510b57cec5SDimitry Andric     case IMPORTS: {
54520b57cec5SDimitry Andric       if (!NeedsImports)
54530b57cec5SDimitry Andric         break;
54540b57cec5SDimitry Andric 
54550b57cec5SDimitry Andric       unsigned Idx = 0, N = Record.size();
54560b57cec5SDimitry Andric       while (Idx < N) {
54570b57cec5SDimitry Andric         // Read information about the AST file.
5458*06c3fb27SDimitry Andric 
5459*06c3fb27SDimitry Andric         // Kind, StandardCXXModule, ImportLoc, Size, ModTime, Signature
5460*06c3fb27SDimitry Andric         Idx += 1 + 1 + 1 + 1 + 1 + ASTFileSignature::size;
54610b57cec5SDimitry Andric         std::string ModuleName = ReadString(Record, Idx);
54620b57cec5SDimitry Andric         std::string Filename = ReadString(Record, Idx);
54630b57cec5SDimitry Andric         ResolveImportedPath(Filename, ModuleDir);
54640b57cec5SDimitry Andric         Listener.visitImport(ModuleName, Filename);
54650b57cec5SDimitry Andric       }
54660b57cec5SDimitry Andric       break;
54670b57cec5SDimitry Andric     }
54680b57cec5SDimitry Andric 
54690b57cec5SDimitry Andric     default:
54700b57cec5SDimitry Andric       // No other validation to perform.
54710b57cec5SDimitry Andric       break;
54720b57cec5SDimitry Andric     }
54730b57cec5SDimitry Andric   }
54740b57cec5SDimitry Andric 
54750b57cec5SDimitry Andric   // Look for module file extension blocks, if requested.
54760b57cec5SDimitry Andric   if (FindModuleFileExtensions) {
54770b57cec5SDimitry Andric     BitstreamCursor SavedStream = Stream;
54780b57cec5SDimitry Andric     while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
54790b57cec5SDimitry Andric       bool DoneWithExtensionBlock = false;
54800b57cec5SDimitry Andric       while (!DoneWithExtensionBlock) {
54810b57cec5SDimitry Andric         Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
54820b57cec5SDimitry Andric         if (!MaybeEntry) {
54830b57cec5SDimitry Andric           // FIXME this drops the error.
54840b57cec5SDimitry Andric           return true;
54850b57cec5SDimitry Andric         }
54860b57cec5SDimitry Andric         llvm::BitstreamEntry Entry = MaybeEntry.get();
54870b57cec5SDimitry Andric 
54880b57cec5SDimitry Andric         switch (Entry.Kind) {
54890b57cec5SDimitry Andric         case llvm::BitstreamEntry::SubBlock:
54900b57cec5SDimitry Andric           if (llvm::Error Err = Stream.SkipBlock()) {
54910b57cec5SDimitry Andric             // FIXME this drops the error on the floor.
54920b57cec5SDimitry Andric             consumeError(std::move(Err));
54930b57cec5SDimitry Andric             return true;
54940b57cec5SDimitry Andric           }
54950b57cec5SDimitry Andric           continue;
54960b57cec5SDimitry Andric 
54970b57cec5SDimitry Andric         case llvm::BitstreamEntry::EndBlock:
54980b57cec5SDimitry Andric           DoneWithExtensionBlock = true;
54990b57cec5SDimitry Andric           continue;
55000b57cec5SDimitry Andric 
55010b57cec5SDimitry Andric         case llvm::BitstreamEntry::Error:
55020b57cec5SDimitry Andric           return true;
55030b57cec5SDimitry Andric 
55040b57cec5SDimitry Andric         case llvm::BitstreamEntry::Record:
55050b57cec5SDimitry Andric           break;
55060b57cec5SDimitry Andric         }
55070b57cec5SDimitry Andric 
55080b57cec5SDimitry Andric        Record.clear();
55090b57cec5SDimitry Andric        StringRef Blob;
55100b57cec5SDimitry Andric        Expected<unsigned> MaybeRecCode =
55110b57cec5SDimitry Andric            Stream.readRecord(Entry.ID, Record, &Blob);
55120b57cec5SDimitry Andric        if (!MaybeRecCode) {
55130b57cec5SDimitry Andric          // FIXME this drops the error.
55140b57cec5SDimitry Andric          return true;
55150b57cec5SDimitry Andric        }
55160b57cec5SDimitry Andric        switch (MaybeRecCode.get()) {
55170b57cec5SDimitry Andric        case EXTENSION_METADATA: {
55180b57cec5SDimitry Andric          ModuleFileExtensionMetadata Metadata;
55190b57cec5SDimitry Andric          if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
55200b57cec5SDimitry Andric            return true;
55210b57cec5SDimitry Andric 
55220b57cec5SDimitry Andric          Listener.readModuleFileExtension(Metadata);
55230b57cec5SDimitry Andric          break;
55240b57cec5SDimitry Andric        }
55250b57cec5SDimitry Andric        }
55260b57cec5SDimitry Andric       }
55270b57cec5SDimitry Andric     }
55280b57cec5SDimitry Andric     Stream = SavedStream;
55290b57cec5SDimitry Andric   }
55300b57cec5SDimitry Andric 
55310b57cec5SDimitry Andric   // Scan for the UNHASHED_CONTROL_BLOCK_ID block.
55320b57cec5SDimitry Andric   if (readUnhashedControlBlockImpl(
55330b57cec5SDimitry Andric           nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate,
55340b57cec5SDimitry Andric           /*AllowCompatibleConfigurationMismatch*/ false, &Listener,
55350b57cec5SDimitry Andric           ValidateDiagnosticOptions) != Success)
55360b57cec5SDimitry Andric     return true;
55370b57cec5SDimitry Andric 
55380b57cec5SDimitry Andric   return false;
55390b57cec5SDimitry Andric }
55400b57cec5SDimitry Andric 
55410b57cec5SDimitry Andric bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
5542bdd1243dSDimitry Andric                                     const InMemoryModuleCache &ModuleCache,
55430b57cec5SDimitry Andric                                     const PCHContainerReader &PCHContainerRdr,
55440b57cec5SDimitry Andric                                     const LangOptions &LangOpts,
55450b57cec5SDimitry Andric                                     const TargetOptions &TargetOpts,
55460b57cec5SDimitry Andric                                     const PreprocessorOptions &PPOpts,
554761cfbce3SDimitry Andric                                     StringRef ExistingModuleCachePath,
554861cfbce3SDimitry Andric                                     bool RequireStrictOptionMatches) {
55490b57cec5SDimitry Andric   SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
555061cfbce3SDimitry Andric                                ExistingModuleCachePath, FileMgr,
555161cfbce3SDimitry Andric                                RequireStrictOptionMatches);
5552bdd1243dSDimitry Andric   return !readASTFileControlBlock(Filename, FileMgr, ModuleCache,
5553bdd1243dSDimitry Andric                                   PCHContainerRdr,
5554bdd1243dSDimitry Andric                                   /*FindModuleFileExtensions=*/false, validator,
55550b57cec5SDimitry Andric                                   /*ValidateDiagnosticOptions=*/true);
55560b57cec5SDimitry Andric }
55570b57cec5SDimitry Andric 
5558349cc55cSDimitry Andric llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,
5559349cc55cSDimitry Andric                                           unsigned ClientLoadCapabilities) {
55600b57cec5SDimitry Andric   // Enter the submodule block.
5561349cc55cSDimitry Andric   if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID))
5562349cc55cSDimitry Andric     return Err;
55630b57cec5SDimitry Andric 
55640b57cec5SDimitry Andric   ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
55650b57cec5SDimitry Andric   bool First = true;
55660b57cec5SDimitry Andric   Module *CurrentModule = nullptr;
55670b57cec5SDimitry Andric   RecordData Record;
55680b57cec5SDimitry Andric   while (true) {
55690b57cec5SDimitry Andric     Expected<llvm::BitstreamEntry> MaybeEntry =
55700b57cec5SDimitry Andric         F.Stream.advanceSkippingSubblocks();
5571349cc55cSDimitry Andric     if (!MaybeEntry)
5572349cc55cSDimitry Andric       return MaybeEntry.takeError();
55730b57cec5SDimitry Andric     llvm::BitstreamEntry Entry = MaybeEntry.get();
55740b57cec5SDimitry Andric 
55750b57cec5SDimitry Andric     switch (Entry.Kind) {
55760b57cec5SDimitry Andric     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
55770b57cec5SDimitry Andric     case llvm::BitstreamEntry::Error:
5578349cc55cSDimitry Andric       return llvm::createStringError(std::errc::illegal_byte_sequence,
5579349cc55cSDimitry Andric                                      "malformed block record in AST file");
55800b57cec5SDimitry Andric     case llvm::BitstreamEntry::EndBlock:
5581349cc55cSDimitry Andric       return llvm::Error::success();
55820b57cec5SDimitry Andric     case llvm::BitstreamEntry::Record:
55830b57cec5SDimitry Andric       // The interesting case.
55840b57cec5SDimitry Andric       break;
55850b57cec5SDimitry Andric     }
55860b57cec5SDimitry Andric 
55870b57cec5SDimitry Andric     // Read a record.
55880b57cec5SDimitry Andric     StringRef Blob;
55890b57cec5SDimitry Andric     Record.clear();
55900b57cec5SDimitry Andric     Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob);
5591349cc55cSDimitry Andric     if (!MaybeKind)
5592349cc55cSDimitry Andric       return MaybeKind.takeError();
55930b57cec5SDimitry Andric     unsigned Kind = MaybeKind.get();
55940b57cec5SDimitry Andric 
5595349cc55cSDimitry Andric     if ((Kind == SUBMODULE_METADATA) != First)
5596349cc55cSDimitry Andric       return llvm::createStringError(
5597349cc55cSDimitry Andric           std::errc::illegal_byte_sequence,
5598349cc55cSDimitry Andric           "submodule metadata record should be at beginning of block");
55990b57cec5SDimitry Andric     First = false;
56000b57cec5SDimitry Andric 
56010b57cec5SDimitry Andric     // Submodule information is only valid if we have a current module.
56020b57cec5SDimitry Andric     // FIXME: Should we error on these cases?
56030b57cec5SDimitry Andric     if (!CurrentModule && Kind != SUBMODULE_METADATA &&
56040b57cec5SDimitry Andric         Kind != SUBMODULE_DEFINITION)
56050b57cec5SDimitry Andric       continue;
56060b57cec5SDimitry Andric 
56070b57cec5SDimitry Andric     switch (Kind) {
56080b57cec5SDimitry Andric     default:  // Default behavior: ignore.
56090b57cec5SDimitry Andric       break;
56100b57cec5SDimitry Andric 
56110b57cec5SDimitry Andric     case SUBMODULE_DEFINITION: {
5612*06c3fb27SDimitry Andric       if (Record.size() < 13)
5613349cc55cSDimitry Andric         return llvm::createStringError(std::errc::illegal_byte_sequence,
5614349cc55cSDimitry Andric                                        "malformed module definition");
56150b57cec5SDimitry Andric 
56160b57cec5SDimitry Andric       StringRef Name = Blob;
56170b57cec5SDimitry Andric       unsigned Idx = 0;
56180b57cec5SDimitry Andric       SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
56190b57cec5SDimitry Andric       SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
56200b57cec5SDimitry Andric       Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++];
5621*06c3fb27SDimitry Andric       SourceLocation DefinitionLoc = ReadSourceLocation(F, Record[Idx++]);
56220b57cec5SDimitry Andric       bool IsFramework = Record[Idx++];
56230b57cec5SDimitry Andric       bool IsExplicit = Record[Idx++];
56240b57cec5SDimitry Andric       bool IsSystem = Record[Idx++];
56250b57cec5SDimitry Andric       bool IsExternC = Record[Idx++];
56260b57cec5SDimitry Andric       bool InferSubmodules = Record[Idx++];
56270b57cec5SDimitry Andric       bool InferExplicitSubmodules = Record[Idx++];
56280b57cec5SDimitry Andric       bool InferExportWildcard = Record[Idx++];
56290b57cec5SDimitry Andric       bool ConfigMacrosExhaustive = Record[Idx++];
56300b57cec5SDimitry Andric       bool ModuleMapIsPrivate = Record[Idx++];
56310b57cec5SDimitry Andric 
56320b57cec5SDimitry Andric       Module *ParentModule = nullptr;
56330b57cec5SDimitry Andric       if (Parent)
56340b57cec5SDimitry Andric         ParentModule = getSubmodule(Parent);
56350b57cec5SDimitry Andric 
56360b57cec5SDimitry Andric       // Retrieve this (sub)module from the module map, creating it if
56370b57cec5SDimitry Andric       // necessary.
56380b57cec5SDimitry Andric       CurrentModule =
56390b57cec5SDimitry Andric           ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit)
56400b57cec5SDimitry Andric               .first;
56410b57cec5SDimitry Andric 
5642*06c3fb27SDimitry Andric       // FIXME: Call ModMap.setInferredModuleAllowedBy()
56430b57cec5SDimitry Andric 
56440b57cec5SDimitry Andric       SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
56450b57cec5SDimitry Andric       if (GlobalIndex >= SubmodulesLoaded.size() ||
5646349cc55cSDimitry Andric           SubmodulesLoaded[GlobalIndex])
5647349cc55cSDimitry Andric         return llvm::createStringError(std::errc::invalid_argument,
5648349cc55cSDimitry Andric                                        "too many submodules");
56490b57cec5SDimitry Andric 
56500b57cec5SDimitry Andric       if (!ParentModule) {
56510b57cec5SDimitry Andric         if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
56520b57cec5SDimitry Andric           // Don't emit module relocation error if we have -fno-validate-pch
5653e8d8bef9SDimitry Andric           if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
5654e8d8bef9SDimitry Andric                     DisableValidationForModuleKind::Module) &&
56550b57cec5SDimitry Andric               CurFile != F.File) {
5656349cc55cSDimitry Andric             auto ConflictError =
5657349cc55cSDimitry Andric                 PartialDiagnostic(diag::err_module_file_conflict,
5658349cc55cSDimitry Andric                                   ContextObj->DiagAllocator)
5659349cc55cSDimitry Andric                 << CurrentModule->getTopLevelModuleName() << CurFile->getName()
5660349cc55cSDimitry Andric                 << F.File->getName();
5661349cc55cSDimitry Andric             return DiagnosticError::create(CurrentImportLoc, ConflictError);
56620b57cec5SDimitry Andric           }
56630b57cec5SDimitry Andric         }
56640b57cec5SDimitry Andric 
5665480093f4SDimitry Andric         F.DidReadTopLevelSubmodule = true;
56660b57cec5SDimitry Andric         CurrentModule->setASTFile(F.File);
56670b57cec5SDimitry Andric         CurrentModule->PresumedModuleMapFile = F.ModuleMapPath;
56680b57cec5SDimitry Andric       }
56690b57cec5SDimitry Andric 
56700b57cec5SDimitry Andric       CurrentModule->Kind = Kind;
5671*06c3fb27SDimitry Andric       CurrentModule->DefinitionLoc = DefinitionLoc;
56720b57cec5SDimitry Andric       CurrentModule->Signature = F.Signature;
56730b57cec5SDimitry Andric       CurrentModule->IsFromModuleFile = true;
56740b57cec5SDimitry Andric       CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
56750b57cec5SDimitry Andric       CurrentModule->IsExternC = IsExternC;
56760b57cec5SDimitry Andric       CurrentModule->InferSubmodules = InferSubmodules;
56770b57cec5SDimitry Andric       CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
56780b57cec5SDimitry Andric       CurrentModule->InferExportWildcard = InferExportWildcard;
56790b57cec5SDimitry Andric       CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
56800b57cec5SDimitry Andric       CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate;
56810b57cec5SDimitry Andric       if (DeserializationListener)
56820b57cec5SDimitry Andric         DeserializationListener->ModuleRead(GlobalID, CurrentModule);
56830b57cec5SDimitry Andric 
5684*06c3fb27SDimitry Andric       // If we're loading a module before we initialize the sema, it implies
5685*06c3fb27SDimitry Andric       // we're performing eagerly loading.
5686*06c3fb27SDimitry Andric       if (!getSema() && CurrentModule->isModulePurview() &&
5687*06c3fb27SDimitry Andric           !getContext().getLangOpts().isCompilingModule())
5688*06c3fb27SDimitry Andric         Diag(clang::diag::warn_eagerly_load_for_standard_cplusplus_modules);
5689*06c3fb27SDimitry Andric 
56900b57cec5SDimitry Andric       SubmodulesLoaded[GlobalIndex] = CurrentModule;
56910b57cec5SDimitry Andric 
56920b57cec5SDimitry Andric       // Clear out data that will be replaced by what is in the module file.
56930b57cec5SDimitry Andric       CurrentModule->LinkLibraries.clear();
56940b57cec5SDimitry Andric       CurrentModule->ConfigMacros.clear();
56950b57cec5SDimitry Andric       CurrentModule->UnresolvedConflicts.clear();
56960b57cec5SDimitry Andric       CurrentModule->Conflicts.clear();
56970b57cec5SDimitry Andric 
56980b57cec5SDimitry Andric       // The module is available unless it's missing a requirement; relevant
56990b57cec5SDimitry Andric       // requirements will be (re-)added by SUBMODULE_REQUIRES records.
57000b57cec5SDimitry Andric       // Missing headers that were present when the module was built do not
57010b57cec5SDimitry Andric       // make it unavailable -- if we got this far, this must be an explicitly
57020b57cec5SDimitry Andric       // imported module file.
57030b57cec5SDimitry Andric       CurrentModule->Requirements.clear();
57040b57cec5SDimitry Andric       CurrentModule->MissingHeaders.clear();
57055ffd83dbSDimitry Andric       CurrentModule->IsUnimportable =
57065ffd83dbSDimitry Andric           ParentModule && ParentModule->IsUnimportable;
57075ffd83dbSDimitry Andric       CurrentModule->IsAvailable = !CurrentModule->IsUnimportable;
57080b57cec5SDimitry Andric       break;
57090b57cec5SDimitry Andric     }
57100b57cec5SDimitry Andric 
57110b57cec5SDimitry Andric     case SUBMODULE_UMBRELLA_HEADER: {
5712349cc55cSDimitry Andric       // FIXME: This doesn't work for framework modules as `Filename` is the
5713349cc55cSDimitry Andric       //        name as written in the module file and does not include
5714349cc55cSDimitry Andric       //        `Headers/`, so this path will never exist.
57155ffd83dbSDimitry Andric       std::string Filename = std::string(Blob);
57160b57cec5SDimitry Andric       ResolveImportedPath(F, Filename);
5717bdd1243dSDimitry Andric       if (auto Umbrella = PP.getFileManager().getOptionalFileRef(Filename)) {
5718*06c3fb27SDimitry Andric         if (!CurrentModule->getUmbrellaHeaderAsWritten()) {
5719fe6060f1SDimitry Andric           // FIXME: NameAsWritten
5720*06c3fb27SDimitry Andric           ModMap.setUmbrellaHeaderAsWritten(CurrentModule, *Umbrella, Blob, "");
57210b57cec5SDimitry Andric         }
5722349cc55cSDimitry Andric         // Note that it's too late at this point to return out of date if the
5723349cc55cSDimitry Andric         // name from the PCM doesn't match up with the one in the module map,
5724349cc55cSDimitry Andric         // but also quite unlikely since we will have already checked the
5725349cc55cSDimitry Andric         // modification time and size of the module map file itself.
57260b57cec5SDimitry Andric       }
57270b57cec5SDimitry Andric       break;
57280b57cec5SDimitry Andric     }
57290b57cec5SDimitry Andric 
57300b57cec5SDimitry Andric     case SUBMODULE_HEADER:
57310b57cec5SDimitry Andric     case SUBMODULE_EXCLUDED_HEADER:
57320b57cec5SDimitry Andric     case SUBMODULE_PRIVATE_HEADER:
57330b57cec5SDimitry Andric       // We lazily associate headers with their modules via the HeaderInfo table.
57340b57cec5SDimitry Andric       // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
57350b57cec5SDimitry Andric       // of complete filenames or remove it entirely.
57360b57cec5SDimitry Andric       break;
57370b57cec5SDimitry Andric 
57380b57cec5SDimitry Andric     case SUBMODULE_TEXTUAL_HEADER:
57390b57cec5SDimitry Andric     case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
57400b57cec5SDimitry Andric       // FIXME: Textual headers are not marked in the HeaderInfo table. Load
57410b57cec5SDimitry Andric       // them here.
57420b57cec5SDimitry Andric       break;
57430b57cec5SDimitry Andric 
574481ad6265SDimitry Andric     case SUBMODULE_TOPHEADER: {
574581ad6265SDimitry Andric       std::string HeaderName(Blob);
574681ad6265SDimitry Andric       ResolveImportedPath(F, HeaderName);
574781ad6265SDimitry Andric       CurrentModule->addTopHeaderFilename(HeaderName);
57480b57cec5SDimitry Andric       break;
574981ad6265SDimitry Andric     }
57500b57cec5SDimitry Andric 
57510b57cec5SDimitry Andric     case SUBMODULE_UMBRELLA_DIR: {
5752349cc55cSDimitry Andric       // See comments in SUBMODULE_UMBRELLA_HEADER
57535ffd83dbSDimitry Andric       std::string Dirname = std::string(Blob);
57540b57cec5SDimitry Andric       ResolveImportedPath(F, Dirname);
5755*06c3fb27SDimitry Andric       if (auto Umbrella =
5756*06c3fb27SDimitry Andric               PP.getFileManager().getOptionalDirectoryRef(Dirname)) {
5757*06c3fb27SDimitry Andric         if (!CurrentModule->getUmbrellaDirAsWritten()) {
5758fe6060f1SDimitry Andric           // FIXME: NameAsWritten
5759*06c3fb27SDimitry Andric           ModMap.setUmbrellaDirAsWritten(CurrentModule, *Umbrella, Blob, "");
57600b57cec5SDimitry Andric         }
57610b57cec5SDimitry Andric       }
57620b57cec5SDimitry Andric       break;
57630b57cec5SDimitry Andric     }
57640b57cec5SDimitry Andric 
57650b57cec5SDimitry Andric     case SUBMODULE_METADATA: {
57660b57cec5SDimitry Andric       F.BaseSubmoduleID = getTotalNumSubmodules();
57670b57cec5SDimitry Andric       F.LocalNumSubmodules = Record[0];
57680b57cec5SDimitry Andric       unsigned LocalBaseSubmoduleID = Record[1];
57690b57cec5SDimitry Andric       if (F.LocalNumSubmodules > 0) {
57700b57cec5SDimitry Andric         // Introduce the global -> local mapping for submodules within this
57710b57cec5SDimitry Andric         // module.
57720b57cec5SDimitry Andric         GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
57730b57cec5SDimitry Andric 
57740b57cec5SDimitry Andric         // Introduce the local -> global mapping for submodules within this
57750b57cec5SDimitry Andric         // module.
57760b57cec5SDimitry Andric         F.SubmoduleRemap.insertOrReplace(
57770b57cec5SDimitry Andric           std::make_pair(LocalBaseSubmoduleID,
57780b57cec5SDimitry Andric                          F.BaseSubmoduleID - LocalBaseSubmoduleID));
57790b57cec5SDimitry Andric 
57800b57cec5SDimitry Andric         SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
57810b57cec5SDimitry Andric       }
57820b57cec5SDimitry Andric       break;
57830b57cec5SDimitry Andric     }
57840b57cec5SDimitry Andric 
57850b57cec5SDimitry Andric     case SUBMODULE_IMPORTS:
57860b57cec5SDimitry Andric       for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
57870b57cec5SDimitry Andric         UnresolvedModuleRef Unresolved;
57880b57cec5SDimitry Andric         Unresolved.File = &F;
57890b57cec5SDimitry Andric         Unresolved.Mod = CurrentModule;
57900b57cec5SDimitry Andric         Unresolved.ID = Record[Idx];
57910b57cec5SDimitry Andric         Unresolved.Kind = UnresolvedModuleRef::Import;
57920b57cec5SDimitry Andric         Unresolved.IsWildcard = false;
57930b57cec5SDimitry Andric         UnresolvedModuleRefs.push_back(Unresolved);
57940b57cec5SDimitry Andric       }
57950b57cec5SDimitry Andric       break;
57960b57cec5SDimitry Andric 
5797bdd1243dSDimitry Andric     case SUBMODULE_AFFECTING_MODULES:
5798bdd1243dSDimitry Andric       for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
5799bdd1243dSDimitry Andric         UnresolvedModuleRef Unresolved;
5800bdd1243dSDimitry Andric         Unresolved.File = &F;
5801bdd1243dSDimitry Andric         Unresolved.Mod = CurrentModule;
5802bdd1243dSDimitry Andric         Unresolved.ID = Record[Idx];
5803bdd1243dSDimitry Andric         Unresolved.Kind = UnresolvedModuleRef::Affecting;
5804bdd1243dSDimitry Andric         Unresolved.IsWildcard = false;
5805bdd1243dSDimitry Andric         UnresolvedModuleRefs.push_back(Unresolved);
5806bdd1243dSDimitry Andric       }
5807bdd1243dSDimitry Andric       break;
5808bdd1243dSDimitry Andric 
58090b57cec5SDimitry Andric     case SUBMODULE_EXPORTS:
58100b57cec5SDimitry Andric       for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
58110b57cec5SDimitry Andric         UnresolvedModuleRef Unresolved;
58120b57cec5SDimitry Andric         Unresolved.File = &F;
58130b57cec5SDimitry Andric         Unresolved.Mod = CurrentModule;
58140b57cec5SDimitry Andric         Unresolved.ID = Record[Idx];
58150b57cec5SDimitry Andric         Unresolved.Kind = UnresolvedModuleRef::Export;
58160b57cec5SDimitry Andric         Unresolved.IsWildcard = Record[Idx + 1];
58170b57cec5SDimitry Andric         UnresolvedModuleRefs.push_back(Unresolved);
58180b57cec5SDimitry Andric       }
58190b57cec5SDimitry Andric 
58200b57cec5SDimitry Andric       // Once we've loaded the set of exports, there's no reason to keep
58210b57cec5SDimitry Andric       // the parsed, unresolved exports around.
58220b57cec5SDimitry Andric       CurrentModule->UnresolvedExports.clear();
58230b57cec5SDimitry Andric       break;
58240b57cec5SDimitry Andric 
58250b57cec5SDimitry Andric     case SUBMODULE_REQUIRES:
58260b57cec5SDimitry Andric       CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(),
58270b57cec5SDimitry Andric                                     PP.getTargetInfo());
58280b57cec5SDimitry Andric       break;
58290b57cec5SDimitry Andric 
58300b57cec5SDimitry Andric     case SUBMODULE_LINK_LIBRARY:
58310b57cec5SDimitry Andric       ModMap.resolveLinkAsDependencies(CurrentModule);
58320b57cec5SDimitry Andric       CurrentModule->LinkLibraries.push_back(
58335ffd83dbSDimitry Andric           Module::LinkLibrary(std::string(Blob), Record[0]));
58340b57cec5SDimitry Andric       break;
58350b57cec5SDimitry Andric 
58360b57cec5SDimitry Andric     case SUBMODULE_CONFIG_MACRO:
58370b57cec5SDimitry Andric       CurrentModule->ConfigMacros.push_back(Blob.str());
58380b57cec5SDimitry Andric       break;
58390b57cec5SDimitry Andric 
58400b57cec5SDimitry Andric     case SUBMODULE_CONFLICT: {
58410b57cec5SDimitry Andric       UnresolvedModuleRef Unresolved;
58420b57cec5SDimitry Andric       Unresolved.File = &F;
58430b57cec5SDimitry Andric       Unresolved.Mod = CurrentModule;
58440b57cec5SDimitry Andric       Unresolved.ID = Record[0];
58450b57cec5SDimitry Andric       Unresolved.Kind = UnresolvedModuleRef::Conflict;
58460b57cec5SDimitry Andric       Unresolved.IsWildcard = false;
58470b57cec5SDimitry Andric       Unresolved.String = Blob;
58480b57cec5SDimitry Andric       UnresolvedModuleRefs.push_back(Unresolved);
58490b57cec5SDimitry Andric       break;
58500b57cec5SDimitry Andric     }
58510b57cec5SDimitry Andric 
58520b57cec5SDimitry Andric     case SUBMODULE_INITIALIZERS: {
58530b57cec5SDimitry Andric       if (!ContextObj)
58540b57cec5SDimitry Andric         break;
58550b57cec5SDimitry Andric       SmallVector<uint32_t, 16> Inits;
58560b57cec5SDimitry Andric       for (auto &ID : Record)
58570b57cec5SDimitry Andric         Inits.push_back(getGlobalDeclID(F, ID));
58580b57cec5SDimitry Andric       ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
58590b57cec5SDimitry Andric       break;
58600b57cec5SDimitry Andric     }
58610b57cec5SDimitry Andric 
58620b57cec5SDimitry Andric     case SUBMODULE_EXPORT_AS:
58630b57cec5SDimitry Andric       CurrentModule->ExportAsModule = Blob.str();
58640b57cec5SDimitry Andric       ModMap.addLinkAsDependency(CurrentModule);
58650b57cec5SDimitry Andric       break;
58660b57cec5SDimitry Andric     }
58670b57cec5SDimitry Andric   }
58680b57cec5SDimitry Andric }
58690b57cec5SDimitry Andric 
58700b57cec5SDimitry Andric /// Parse the record that corresponds to a LangOptions data
58710b57cec5SDimitry Andric /// structure.
58720b57cec5SDimitry Andric ///
58730b57cec5SDimitry Andric /// This routine parses the language options from the AST file and then gives
58740b57cec5SDimitry Andric /// them to the AST listener if one is set.
58750b57cec5SDimitry Andric ///
58760b57cec5SDimitry Andric /// \returns true if the listener deems the file unacceptable, false otherwise.
58770b57cec5SDimitry Andric bool ASTReader::ParseLanguageOptions(const RecordData &Record,
58780b57cec5SDimitry Andric                                      bool Complain,
58790b57cec5SDimitry Andric                                      ASTReaderListener &Listener,
58800b57cec5SDimitry Andric                                      bool AllowCompatibleDifferences) {
58810b57cec5SDimitry Andric   LangOptions LangOpts;
58820b57cec5SDimitry Andric   unsigned Idx = 0;
58830b57cec5SDimitry Andric #define LANGOPT(Name, Bits, Default, Description) \
58840b57cec5SDimitry Andric   LangOpts.Name = Record[Idx++];
58850b57cec5SDimitry Andric #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
58860b57cec5SDimitry Andric   LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
58870b57cec5SDimitry Andric #include "clang/Basic/LangOptions.def"
58880b57cec5SDimitry Andric #define SANITIZER(NAME, ID)                                                    \
58890b57cec5SDimitry Andric   LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
58900b57cec5SDimitry Andric #include "clang/Basic/Sanitizers.def"
58910b57cec5SDimitry Andric 
58920b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N)
58930b57cec5SDimitry Andric     LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
58940b57cec5SDimitry Andric 
58950b57cec5SDimitry Andric   ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
58960b57cec5SDimitry Andric   VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
58970b57cec5SDimitry Andric   LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
58980b57cec5SDimitry Andric 
58990b57cec5SDimitry Andric   LangOpts.CurrentModule = ReadString(Record, Idx);
59000b57cec5SDimitry Andric 
59010b57cec5SDimitry Andric   // Comment options.
59020b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
59030b57cec5SDimitry Andric     LangOpts.CommentOpts.BlockCommandNames.push_back(
59040b57cec5SDimitry Andric       ReadString(Record, Idx));
59050b57cec5SDimitry Andric   }
59060b57cec5SDimitry Andric   LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
59070b57cec5SDimitry Andric 
59080b57cec5SDimitry Andric   // OpenMP offloading options.
59090b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
59100b57cec5SDimitry Andric     LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
59110b57cec5SDimitry Andric   }
59120b57cec5SDimitry Andric 
59130b57cec5SDimitry Andric   LangOpts.OMPHostIRFile = ReadString(Record, Idx);
59140b57cec5SDimitry Andric 
59150b57cec5SDimitry Andric   return Listener.ReadLanguageOptions(LangOpts, Complain,
59160b57cec5SDimitry Andric                                       AllowCompatibleDifferences);
59170b57cec5SDimitry Andric }
59180b57cec5SDimitry Andric 
59190b57cec5SDimitry Andric bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
59200b57cec5SDimitry Andric                                    ASTReaderListener &Listener,
59210b57cec5SDimitry Andric                                    bool AllowCompatibleDifferences) {
59220b57cec5SDimitry Andric   unsigned Idx = 0;
59230b57cec5SDimitry Andric   TargetOptions TargetOpts;
59240b57cec5SDimitry Andric   TargetOpts.Triple = ReadString(Record, Idx);
59250b57cec5SDimitry Andric   TargetOpts.CPU = ReadString(Record, Idx);
5926e8d8bef9SDimitry Andric   TargetOpts.TuneCPU = ReadString(Record, Idx);
59270b57cec5SDimitry Andric   TargetOpts.ABI = ReadString(Record, Idx);
59280b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
59290b57cec5SDimitry Andric     TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
59300b57cec5SDimitry Andric   }
59310b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
59320b57cec5SDimitry Andric     TargetOpts.Features.push_back(ReadString(Record, Idx));
59330b57cec5SDimitry Andric   }
59340b57cec5SDimitry Andric 
59350b57cec5SDimitry Andric   return Listener.ReadTargetOptions(TargetOpts, Complain,
59360b57cec5SDimitry Andric                                     AllowCompatibleDifferences);
59370b57cec5SDimitry Andric }
59380b57cec5SDimitry Andric 
59390b57cec5SDimitry Andric bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
59400b57cec5SDimitry Andric                                        ASTReaderListener &Listener) {
59410b57cec5SDimitry Andric   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
59420b57cec5SDimitry Andric   unsigned Idx = 0;
59430b57cec5SDimitry Andric #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
59440b57cec5SDimitry Andric #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
59450b57cec5SDimitry Andric   DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
59460b57cec5SDimitry Andric #include "clang/Basic/DiagnosticOptions.def"
59470b57cec5SDimitry Andric 
59480b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N)
59490b57cec5SDimitry Andric     DiagOpts->Warnings.push_back(ReadString(Record, Idx));
59500b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N)
59510b57cec5SDimitry Andric     DiagOpts->Remarks.push_back(ReadString(Record, Idx));
59520b57cec5SDimitry Andric 
59530b57cec5SDimitry Andric   return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
59540b57cec5SDimitry Andric }
59550b57cec5SDimitry Andric 
59560b57cec5SDimitry Andric bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
59570b57cec5SDimitry Andric                                        ASTReaderListener &Listener) {
59580b57cec5SDimitry Andric   FileSystemOptions FSOpts;
59590b57cec5SDimitry Andric   unsigned Idx = 0;
59600b57cec5SDimitry Andric   FSOpts.WorkingDir = ReadString(Record, Idx);
59610b57cec5SDimitry Andric   return Listener.ReadFileSystemOptions(FSOpts, Complain);
59620b57cec5SDimitry Andric }
59630b57cec5SDimitry Andric 
59640b57cec5SDimitry Andric bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
59650b57cec5SDimitry Andric                                          bool Complain,
59660b57cec5SDimitry Andric                                          ASTReaderListener &Listener) {
59670b57cec5SDimitry Andric   HeaderSearchOptions HSOpts;
59680b57cec5SDimitry Andric   unsigned Idx = 0;
59690b57cec5SDimitry Andric   HSOpts.Sysroot = ReadString(Record, Idx);
59700b57cec5SDimitry Andric 
5971bdd1243dSDimitry Andric   HSOpts.ResourceDir = ReadString(Record, Idx);
5972bdd1243dSDimitry Andric   HSOpts.ModuleCachePath = ReadString(Record, Idx);
5973bdd1243dSDimitry Andric   HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
5974bdd1243dSDimitry Andric   HSOpts.DisableModuleHash = Record[Idx++];
5975bdd1243dSDimitry Andric   HSOpts.ImplicitModuleMaps = Record[Idx++];
5976bdd1243dSDimitry Andric   HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++];
5977bdd1243dSDimitry Andric   HSOpts.EnablePrebuiltImplicitModules = Record[Idx++];
5978bdd1243dSDimitry Andric   HSOpts.UseBuiltinIncludes = Record[Idx++];
5979bdd1243dSDimitry Andric   HSOpts.UseStandardSystemIncludes = Record[Idx++];
5980bdd1243dSDimitry Andric   HSOpts.UseStandardCXXIncludes = Record[Idx++];
5981bdd1243dSDimitry Andric   HSOpts.UseLibcxx = Record[Idx++];
5982bdd1243dSDimitry Andric   std::string SpecificModuleCachePath = ReadString(Record, Idx);
5983bdd1243dSDimitry Andric 
5984bdd1243dSDimitry Andric   return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
5985bdd1243dSDimitry Andric                                           Complain);
5986bdd1243dSDimitry Andric }
5987bdd1243dSDimitry Andric 
5988bdd1243dSDimitry Andric bool ASTReader::ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
5989bdd1243dSDimitry Andric                                        ASTReaderListener &Listener) {
5990bdd1243dSDimitry Andric   HeaderSearchOptions HSOpts;
5991bdd1243dSDimitry Andric   unsigned Idx = 0;
5992bdd1243dSDimitry Andric 
59930b57cec5SDimitry Andric   // Include entries.
59940b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
59950b57cec5SDimitry Andric     std::string Path = ReadString(Record, Idx);
59960b57cec5SDimitry Andric     frontend::IncludeDirGroup Group
59970b57cec5SDimitry Andric       = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
59980b57cec5SDimitry Andric     bool IsFramework = Record[Idx++];
59990b57cec5SDimitry Andric     bool IgnoreSysRoot = Record[Idx++];
60000b57cec5SDimitry Andric     HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
60010b57cec5SDimitry Andric                                     IgnoreSysRoot);
60020b57cec5SDimitry Andric   }
60030b57cec5SDimitry Andric 
60040b57cec5SDimitry Andric   // System header prefixes.
60050b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
60060b57cec5SDimitry Andric     std::string Prefix = ReadString(Record, Idx);
60070b57cec5SDimitry Andric     bool IsSystemHeader = Record[Idx++];
60080b57cec5SDimitry Andric     HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
60090b57cec5SDimitry Andric   }
60100b57cec5SDimitry Andric 
6011bdd1243dSDimitry Andric   // VFS overlay files.
6012bdd1243dSDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
6013bdd1243dSDimitry Andric     std::string VFSOverlayFile = ReadString(Record, Idx);
6014bdd1243dSDimitry Andric     HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile));
6015bdd1243dSDimitry Andric   }
60160b57cec5SDimitry Andric 
6017bdd1243dSDimitry Andric   return Listener.ReadHeaderSearchPaths(HSOpts, Complain);
60180b57cec5SDimitry Andric }
60190b57cec5SDimitry Andric 
60200b57cec5SDimitry Andric bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
60210b57cec5SDimitry Andric                                          bool Complain,
60220b57cec5SDimitry Andric                                          ASTReaderListener &Listener,
60230b57cec5SDimitry Andric                                          std::string &SuggestedPredefines) {
60240b57cec5SDimitry Andric   PreprocessorOptions PPOpts;
60250b57cec5SDimitry Andric   unsigned Idx = 0;
60260b57cec5SDimitry Andric 
60270b57cec5SDimitry Andric   // Macro definitions/undefs
60280b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
60290b57cec5SDimitry Andric     std::string Macro = ReadString(Record, Idx);
60300b57cec5SDimitry Andric     bool IsUndef = Record[Idx++];
60310b57cec5SDimitry Andric     PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
60320b57cec5SDimitry Andric   }
60330b57cec5SDimitry Andric 
60340b57cec5SDimitry Andric   // Includes
60350b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
60360b57cec5SDimitry Andric     PPOpts.Includes.push_back(ReadString(Record, Idx));
60370b57cec5SDimitry Andric   }
60380b57cec5SDimitry Andric 
60390b57cec5SDimitry Andric   // Macro Includes
60400b57cec5SDimitry Andric   for (unsigned N = Record[Idx++]; N; --N) {
60410b57cec5SDimitry Andric     PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
60420b57cec5SDimitry Andric   }
60430b57cec5SDimitry Andric 
60440b57cec5SDimitry Andric   PPOpts.UsePredefines = Record[Idx++];
60450b57cec5SDimitry Andric   PPOpts.DetailedRecord = Record[Idx++];
60460b57cec5SDimitry Andric   PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
60470b57cec5SDimitry Andric   PPOpts.ObjCXXARCStandardLibrary =
60480b57cec5SDimitry Andric     static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
60490b57cec5SDimitry Andric   SuggestedPredefines.clear();
60500b57cec5SDimitry Andric   return Listener.ReadPreprocessorOptions(PPOpts, Complain,
60510b57cec5SDimitry Andric                                           SuggestedPredefines);
60520b57cec5SDimitry Andric }
60530b57cec5SDimitry Andric 
60540b57cec5SDimitry Andric std::pair<ModuleFile *, unsigned>
60550b57cec5SDimitry Andric ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
60560b57cec5SDimitry Andric   GlobalPreprocessedEntityMapType::iterator
60570b57cec5SDimitry Andric   I = GlobalPreprocessedEntityMap.find(GlobalIndex);
60580b57cec5SDimitry Andric   assert(I != GlobalPreprocessedEntityMap.end() &&
60590b57cec5SDimitry Andric          "Corrupted global preprocessed entity map");
60600b57cec5SDimitry Andric   ModuleFile *M = I->second;
60610b57cec5SDimitry Andric   unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
60620b57cec5SDimitry Andric   return std::make_pair(M, LocalIndex);
60630b57cec5SDimitry Andric }
60640b57cec5SDimitry Andric 
60650b57cec5SDimitry Andric llvm::iterator_range<PreprocessingRecord::iterator>
60660b57cec5SDimitry Andric ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
60670b57cec5SDimitry Andric   if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
60680b57cec5SDimitry Andric     return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
60690b57cec5SDimitry Andric                                              Mod.NumPreprocessedEntities);
60700b57cec5SDimitry Andric 
60710b57cec5SDimitry Andric   return llvm::make_range(PreprocessingRecord::iterator(),
60720b57cec5SDimitry Andric                           PreprocessingRecord::iterator());
60730b57cec5SDimitry Andric }
60740b57cec5SDimitry Andric 
6075fe6060f1SDimitry Andric bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6076fe6060f1SDimitry Andric                                         unsigned int ClientLoadCapabilities) {
6077fe6060f1SDimitry Andric   return ClientLoadCapabilities & ARR_OutOfDate &&
6078fe6060f1SDimitry Andric          !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName);
6079fe6060f1SDimitry Andric }
6080fe6060f1SDimitry Andric 
60810b57cec5SDimitry Andric llvm::iterator_range<ASTReader::ModuleDeclIterator>
60820b57cec5SDimitry Andric ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
60830b57cec5SDimitry Andric   return llvm::make_range(
60840b57cec5SDimitry Andric       ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
60850b57cec5SDimitry Andric       ModuleDeclIterator(this, &Mod,
60860b57cec5SDimitry Andric                          Mod.FileSortedDecls + Mod.NumFileSortedDecls));
60870b57cec5SDimitry Andric }
60880b57cec5SDimitry Andric 
60890b57cec5SDimitry Andric SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) {
60900b57cec5SDimitry Andric   auto I = GlobalSkippedRangeMap.find(GlobalIndex);
60910b57cec5SDimitry Andric   assert(I != GlobalSkippedRangeMap.end() &&
60920b57cec5SDimitry Andric     "Corrupted global skipped range map");
60930b57cec5SDimitry Andric   ModuleFile *M = I->second;
60940b57cec5SDimitry Andric   unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID;
60950b57cec5SDimitry Andric   assert(LocalIndex < M->NumPreprocessedSkippedRanges);
60960b57cec5SDimitry Andric   PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex];
60970b57cec5SDimitry Andric   SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()),
60980b57cec5SDimitry Andric                     TranslateSourceLocation(*M, RawRange.getEnd()));
60990b57cec5SDimitry Andric   assert(Range.isValid());
61000b57cec5SDimitry Andric   return Range;
61010b57cec5SDimitry Andric }
61020b57cec5SDimitry Andric 
61030b57cec5SDimitry Andric PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
61040b57cec5SDimitry Andric   PreprocessedEntityID PPID = Index+1;
61050b57cec5SDimitry Andric   std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
61060b57cec5SDimitry Andric   ModuleFile &M = *PPInfo.first;
61070b57cec5SDimitry Andric   unsigned LocalIndex = PPInfo.second;
61080b57cec5SDimitry Andric   const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
61090b57cec5SDimitry Andric 
61100b57cec5SDimitry Andric   if (!PP.getPreprocessingRecord()) {
61110b57cec5SDimitry Andric     Error("no preprocessing record");
61120b57cec5SDimitry Andric     return nullptr;
61130b57cec5SDimitry Andric   }
61140b57cec5SDimitry Andric 
61150b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
61165ffd83dbSDimitry Andric   if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit(
61175ffd83dbSDimitry Andric           M.MacroOffsetsBase + PPOffs.BitOffset)) {
61180b57cec5SDimitry Andric     Error(std::move(Err));
61190b57cec5SDimitry Andric     return nullptr;
61200b57cec5SDimitry Andric   }
61210b57cec5SDimitry Andric 
61220b57cec5SDimitry Andric   Expected<llvm::BitstreamEntry> MaybeEntry =
61230b57cec5SDimitry Andric       M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
61240b57cec5SDimitry Andric   if (!MaybeEntry) {
61250b57cec5SDimitry Andric     Error(MaybeEntry.takeError());
61260b57cec5SDimitry Andric     return nullptr;
61270b57cec5SDimitry Andric   }
61280b57cec5SDimitry Andric   llvm::BitstreamEntry Entry = MaybeEntry.get();
61290b57cec5SDimitry Andric 
61300b57cec5SDimitry Andric   if (Entry.Kind != llvm::BitstreamEntry::Record)
61310b57cec5SDimitry Andric     return nullptr;
61320b57cec5SDimitry Andric 
61330b57cec5SDimitry Andric   // Read the record.
61340b57cec5SDimitry Andric   SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
61350b57cec5SDimitry Andric                     TranslateSourceLocation(M, PPOffs.getEnd()));
61360b57cec5SDimitry Andric   PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
61370b57cec5SDimitry Andric   StringRef Blob;
61380b57cec5SDimitry Andric   RecordData Record;
61390b57cec5SDimitry Andric   Expected<unsigned> MaybeRecType =
61400b57cec5SDimitry Andric       M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob);
61410b57cec5SDimitry Andric   if (!MaybeRecType) {
61420b57cec5SDimitry Andric     Error(MaybeRecType.takeError());
61430b57cec5SDimitry Andric     return nullptr;
61440b57cec5SDimitry Andric   }
61450b57cec5SDimitry Andric   switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) {
61460b57cec5SDimitry Andric   case PPD_MACRO_EXPANSION: {
61470b57cec5SDimitry Andric     bool isBuiltin = Record[0];
61480b57cec5SDimitry Andric     IdentifierInfo *Name = nullptr;
61490b57cec5SDimitry Andric     MacroDefinitionRecord *Def = nullptr;
61500b57cec5SDimitry Andric     if (isBuiltin)
61510b57cec5SDimitry Andric       Name = getLocalIdentifier(M, Record[1]);
61520b57cec5SDimitry Andric     else {
61530b57cec5SDimitry Andric       PreprocessedEntityID GlobalID =
61540b57cec5SDimitry Andric           getGlobalPreprocessedEntityID(M, Record[1]);
61550b57cec5SDimitry Andric       Def = cast<MacroDefinitionRecord>(
61560b57cec5SDimitry Andric           PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
61570b57cec5SDimitry Andric     }
61580b57cec5SDimitry Andric 
61590b57cec5SDimitry Andric     MacroExpansion *ME;
61600b57cec5SDimitry Andric     if (isBuiltin)
61610b57cec5SDimitry Andric       ME = new (PPRec) MacroExpansion(Name, Range);
61620b57cec5SDimitry Andric     else
61630b57cec5SDimitry Andric       ME = new (PPRec) MacroExpansion(Def, Range);
61640b57cec5SDimitry Andric 
61650b57cec5SDimitry Andric     return ME;
61660b57cec5SDimitry Andric   }
61670b57cec5SDimitry Andric 
61680b57cec5SDimitry Andric   case PPD_MACRO_DEFINITION: {
61690b57cec5SDimitry Andric     // Decode the identifier info and then check again; if the macro is
61700b57cec5SDimitry Andric     // still defined and associated with the identifier,
61710b57cec5SDimitry Andric     IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
61720b57cec5SDimitry Andric     MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
61730b57cec5SDimitry Andric 
61740b57cec5SDimitry Andric     if (DeserializationListener)
61750b57cec5SDimitry Andric       DeserializationListener->MacroDefinitionRead(PPID, MD);
61760b57cec5SDimitry Andric 
61770b57cec5SDimitry Andric     return MD;
61780b57cec5SDimitry Andric   }
61790b57cec5SDimitry Andric 
61800b57cec5SDimitry Andric   case PPD_INCLUSION_DIRECTIVE: {
61810b57cec5SDimitry Andric     const char *FullFileNameStart = Blob.data() + Record[0];
61820b57cec5SDimitry Andric     StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
6183bdd1243dSDimitry Andric     OptionalFileEntryRef File;
61840b57cec5SDimitry Andric     if (!FullFileName.empty())
618581ad6265SDimitry Andric       File = PP.getFileManager().getOptionalFileRef(FullFileName);
61860b57cec5SDimitry Andric 
61870b57cec5SDimitry Andric     // FIXME: Stable encoding
61880b57cec5SDimitry Andric     InclusionDirective::InclusionKind Kind
61890b57cec5SDimitry Andric       = static_cast<InclusionDirective::InclusionKind>(Record[2]);
61900b57cec5SDimitry Andric     InclusionDirective *ID
61910b57cec5SDimitry Andric       = new (PPRec) InclusionDirective(PPRec, Kind,
61920b57cec5SDimitry Andric                                        StringRef(Blob.data(), Record[0]),
61930b57cec5SDimitry Andric                                        Record[1], Record[3],
61940b57cec5SDimitry Andric                                        File,
61950b57cec5SDimitry Andric                                        Range);
61960b57cec5SDimitry Andric     return ID;
61970b57cec5SDimitry Andric   }
61980b57cec5SDimitry Andric   }
61990b57cec5SDimitry Andric 
62000b57cec5SDimitry Andric   llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
62010b57cec5SDimitry Andric }
62020b57cec5SDimitry Andric 
62030b57cec5SDimitry Andric /// Find the next module that contains entities and return the ID
62040b57cec5SDimitry Andric /// of the first entry.
62050b57cec5SDimitry Andric ///
62060b57cec5SDimitry Andric /// \param SLocMapI points at a chunk of a module that contains no
62070b57cec5SDimitry Andric /// preprocessed entities or the entities it contains are not the ones we are
62080b57cec5SDimitry Andric /// looking for.
62090b57cec5SDimitry Andric PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
62100b57cec5SDimitry Andric                        GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
62110b57cec5SDimitry Andric   ++SLocMapI;
62120b57cec5SDimitry Andric   for (GlobalSLocOffsetMapType::const_iterator
62130b57cec5SDimitry Andric          EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
62140b57cec5SDimitry Andric     ModuleFile &M = *SLocMapI->second;
62150b57cec5SDimitry Andric     if (M.NumPreprocessedEntities)
62160b57cec5SDimitry Andric       return M.BasePreprocessedEntityID;
62170b57cec5SDimitry Andric   }
62180b57cec5SDimitry Andric 
62190b57cec5SDimitry Andric   return getTotalNumPreprocessedEntities();
62200b57cec5SDimitry Andric }
62210b57cec5SDimitry Andric 
62220b57cec5SDimitry Andric namespace {
62230b57cec5SDimitry Andric 
62240b57cec5SDimitry Andric struct PPEntityComp {
62250b57cec5SDimitry Andric   const ASTReader &Reader;
62260b57cec5SDimitry Andric   ModuleFile &M;
62270b57cec5SDimitry Andric 
62280b57cec5SDimitry Andric   PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
62290b57cec5SDimitry Andric 
62300b57cec5SDimitry Andric   bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
62310b57cec5SDimitry Andric     SourceLocation LHS = getLoc(L);
62320b57cec5SDimitry Andric     SourceLocation RHS = getLoc(R);
62330b57cec5SDimitry Andric     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
62340b57cec5SDimitry Andric   }
62350b57cec5SDimitry Andric 
62360b57cec5SDimitry Andric   bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
62370b57cec5SDimitry Andric     SourceLocation LHS = getLoc(L);
62380b57cec5SDimitry Andric     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
62390b57cec5SDimitry Andric   }
62400b57cec5SDimitry Andric 
62410b57cec5SDimitry Andric   bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
62420b57cec5SDimitry Andric     SourceLocation RHS = getLoc(R);
62430b57cec5SDimitry Andric     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
62440b57cec5SDimitry Andric   }
62450b57cec5SDimitry Andric 
62460b57cec5SDimitry Andric   SourceLocation getLoc(const PPEntityOffset &PPE) const {
62470b57cec5SDimitry Andric     return Reader.TranslateSourceLocation(M, PPE.getBegin());
62480b57cec5SDimitry Andric   }
62490b57cec5SDimitry Andric };
62500b57cec5SDimitry Andric 
62510b57cec5SDimitry Andric } // namespace
62520b57cec5SDimitry Andric 
62530b57cec5SDimitry Andric PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
62540b57cec5SDimitry Andric                                                        bool EndsAfter) const {
62550b57cec5SDimitry Andric   if (SourceMgr.isLocalSourceLocation(Loc))
62560b57cec5SDimitry Andric     return getTotalNumPreprocessedEntities();
62570b57cec5SDimitry Andric 
62580b57cec5SDimitry Andric   GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
62590b57cec5SDimitry Andric       SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
62600b57cec5SDimitry Andric   assert(SLocMapI != GlobalSLocOffsetMap.end() &&
62610b57cec5SDimitry Andric          "Corrupted global sloc offset map");
62620b57cec5SDimitry Andric 
62630b57cec5SDimitry Andric   if (SLocMapI->second->NumPreprocessedEntities == 0)
62640b57cec5SDimitry Andric     return findNextPreprocessedEntity(SLocMapI);
62650b57cec5SDimitry Andric 
62660b57cec5SDimitry Andric   ModuleFile &M = *SLocMapI->second;
62670b57cec5SDimitry Andric 
62680b57cec5SDimitry Andric   using pp_iterator = const PPEntityOffset *;
62690b57cec5SDimitry Andric 
62700b57cec5SDimitry Andric   pp_iterator pp_begin = M.PreprocessedEntityOffsets;
62710b57cec5SDimitry Andric   pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
62720b57cec5SDimitry Andric 
62730b57cec5SDimitry Andric   size_t Count = M.NumPreprocessedEntities;
62740b57cec5SDimitry Andric   size_t Half;
62750b57cec5SDimitry Andric   pp_iterator First = pp_begin;
62760b57cec5SDimitry Andric   pp_iterator PPI;
62770b57cec5SDimitry Andric 
62780b57cec5SDimitry Andric   if (EndsAfter) {
62790b57cec5SDimitry Andric     PPI = std::upper_bound(pp_begin, pp_end, Loc,
62800b57cec5SDimitry Andric                            PPEntityComp(*this, M));
62810b57cec5SDimitry Andric   } else {
62820b57cec5SDimitry Andric     // Do a binary search manually instead of using std::lower_bound because
62830b57cec5SDimitry Andric     // The end locations of entities may be unordered (when a macro expansion
62840b57cec5SDimitry Andric     // is inside another macro argument), but for this case it is not important
62850b57cec5SDimitry Andric     // whether we get the first macro expansion or its containing macro.
62860b57cec5SDimitry Andric     while (Count > 0) {
62870b57cec5SDimitry Andric       Half = Count / 2;
62880b57cec5SDimitry Andric       PPI = First;
62890b57cec5SDimitry Andric       std::advance(PPI, Half);
62900b57cec5SDimitry Andric       if (SourceMgr.isBeforeInTranslationUnit(
62910b57cec5SDimitry Andric               TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
62920b57cec5SDimitry Andric         First = PPI;
62930b57cec5SDimitry Andric         ++First;
62940b57cec5SDimitry Andric         Count = Count - Half - 1;
62950b57cec5SDimitry Andric       } else
62960b57cec5SDimitry Andric         Count = Half;
62970b57cec5SDimitry Andric     }
62980b57cec5SDimitry Andric   }
62990b57cec5SDimitry Andric 
63000b57cec5SDimitry Andric   if (PPI == pp_end)
63010b57cec5SDimitry Andric     return findNextPreprocessedEntity(SLocMapI);
63020b57cec5SDimitry Andric 
63030b57cec5SDimitry Andric   return M.BasePreprocessedEntityID + (PPI - pp_begin);
63040b57cec5SDimitry Andric }
63050b57cec5SDimitry Andric 
63060b57cec5SDimitry Andric /// Returns a pair of [Begin, End) indices of preallocated
63070b57cec5SDimitry Andric /// preprocessed entities that \arg Range encompasses.
63080b57cec5SDimitry Andric std::pair<unsigned, unsigned>
63090b57cec5SDimitry Andric     ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
63100b57cec5SDimitry Andric   if (Range.isInvalid())
63110b57cec5SDimitry Andric     return std::make_pair(0,0);
63120b57cec5SDimitry Andric   assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
63130b57cec5SDimitry Andric 
63140b57cec5SDimitry Andric   PreprocessedEntityID BeginID =
63150b57cec5SDimitry Andric       findPreprocessedEntity(Range.getBegin(), false);
63160b57cec5SDimitry Andric   PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
63170b57cec5SDimitry Andric   return std::make_pair(BeginID, EndID);
63180b57cec5SDimitry Andric }
63190b57cec5SDimitry Andric 
63200b57cec5SDimitry Andric /// Optionally returns true or false if the preallocated preprocessed
63210b57cec5SDimitry Andric /// entity with index \arg Index came from file \arg FID.
6322bdd1243dSDimitry Andric std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
63230b57cec5SDimitry Andric                                                             FileID FID) {
63240b57cec5SDimitry Andric   if (FID.isInvalid())
63250b57cec5SDimitry Andric     return false;
63260b57cec5SDimitry Andric 
63270b57cec5SDimitry Andric   std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
63280b57cec5SDimitry Andric   ModuleFile &M = *PPInfo.first;
63290b57cec5SDimitry Andric   unsigned LocalIndex = PPInfo.second;
63300b57cec5SDimitry Andric   const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
63310b57cec5SDimitry Andric 
63320b57cec5SDimitry Andric   SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
63330b57cec5SDimitry Andric   if (Loc.isInvalid())
63340b57cec5SDimitry Andric     return false;
63350b57cec5SDimitry Andric 
63360b57cec5SDimitry Andric   if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
63370b57cec5SDimitry Andric     return true;
63380b57cec5SDimitry Andric   else
63390b57cec5SDimitry Andric     return false;
63400b57cec5SDimitry Andric }
63410b57cec5SDimitry Andric 
63420b57cec5SDimitry Andric namespace {
63430b57cec5SDimitry Andric 
63440b57cec5SDimitry Andric   /// Visitor used to search for information about a header file.
63450b57cec5SDimitry Andric   class HeaderFileInfoVisitor {
63460b57cec5SDimitry Andric     const FileEntry *FE;
6347bdd1243dSDimitry Andric     std::optional<HeaderFileInfo> HFI;
63480b57cec5SDimitry Andric 
63490b57cec5SDimitry Andric   public:
63500b57cec5SDimitry Andric     explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {}
63510b57cec5SDimitry Andric 
63520b57cec5SDimitry Andric     bool operator()(ModuleFile &M) {
63530b57cec5SDimitry Andric       HeaderFileInfoLookupTable *Table
63540b57cec5SDimitry Andric         = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
63550b57cec5SDimitry Andric       if (!Table)
63560b57cec5SDimitry Andric         return false;
63570b57cec5SDimitry Andric 
63580b57cec5SDimitry Andric       // Look in the on-disk hash table for an entry for this file name.
63590b57cec5SDimitry Andric       HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
63600b57cec5SDimitry Andric       if (Pos == Table->end())
63610b57cec5SDimitry Andric         return false;
63620b57cec5SDimitry Andric 
63630b57cec5SDimitry Andric       HFI = *Pos;
63640b57cec5SDimitry Andric       return true;
63650b57cec5SDimitry Andric     }
63660b57cec5SDimitry Andric 
6367bdd1243dSDimitry Andric     std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
63680b57cec5SDimitry Andric   };
63690b57cec5SDimitry Andric 
63700b57cec5SDimitry Andric } // namespace
63710b57cec5SDimitry Andric 
63720b57cec5SDimitry Andric HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
63730b57cec5SDimitry Andric   HeaderFileInfoVisitor Visitor(FE);
63740b57cec5SDimitry Andric   ModuleMgr.visit(Visitor);
6375bdd1243dSDimitry Andric   if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
63760b57cec5SDimitry Andric       return *HFI;
63770b57cec5SDimitry Andric 
63780b57cec5SDimitry Andric   return HeaderFileInfo();
63790b57cec5SDimitry Andric }
63800b57cec5SDimitry Andric 
63810b57cec5SDimitry Andric void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
63820b57cec5SDimitry Andric   using DiagState = DiagnosticsEngine::DiagState;
63830b57cec5SDimitry Andric   SmallVector<DiagState *, 32> DiagStates;
63840b57cec5SDimitry Andric 
63850b57cec5SDimitry Andric   for (ModuleFile &F : ModuleMgr) {
63860b57cec5SDimitry Andric     unsigned Idx = 0;
63870b57cec5SDimitry Andric     auto &Record = F.PragmaDiagMappings;
63880b57cec5SDimitry Andric     if (Record.empty())
63890b57cec5SDimitry Andric       continue;
63900b57cec5SDimitry Andric 
63910b57cec5SDimitry Andric     DiagStates.clear();
63920b57cec5SDimitry Andric 
6393bdd1243dSDimitry Andric     auto ReadDiagState = [&](const DiagState &BasedOn,
6394bdd1243dSDimitry Andric                              bool IncludeNonPragmaStates) {
63950b57cec5SDimitry Andric       unsigned BackrefID = Record[Idx++];
63960b57cec5SDimitry Andric       if (BackrefID != 0)
63970b57cec5SDimitry Andric         return DiagStates[BackrefID - 1];
63980b57cec5SDimitry Andric 
63990b57cec5SDimitry Andric       // A new DiagState was created here.
64000b57cec5SDimitry Andric       Diag.DiagStates.push_back(BasedOn);
64010b57cec5SDimitry Andric       DiagState *NewState = &Diag.DiagStates.back();
64020b57cec5SDimitry Andric       DiagStates.push_back(NewState);
64030b57cec5SDimitry Andric       unsigned Size = Record[Idx++];
64040b57cec5SDimitry Andric       assert(Idx + Size * 2 <= Record.size() &&
64050b57cec5SDimitry Andric              "Invalid data, not enough diag/map pairs");
64060b57cec5SDimitry Andric       while (Size--) {
64070b57cec5SDimitry Andric         unsigned DiagID = Record[Idx++];
64080b57cec5SDimitry Andric         DiagnosticMapping NewMapping =
64090b57cec5SDimitry Andric             DiagnosticMapping::deserialize(Record[Idx++]);
64100b57cec5SDimitry Andric         if (!NewMapping.isPragma() && !IncludeNonPragmaStates)
64110b57cec5SDimitry Andric           continue;
64120b57cec5SDimitry Andric 
64130b57cec5SDimitry Andric         DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID);
64140b57cec5SDimitry Andric 
64150b57cec5SDimitry Andric         // If this mapping was specified as a warning but the severity was
64160b57cec5SDimitry Andric         // upgraded due to diagnostic settings, simulate the current diagnostic
64170b57cec5SDimitry Andric         // settings (and use a warning).
64180b57cec5SDimitry Andric         if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) {
64190b57cec5SDimitry Andric           NewMapping.setSeverity(diag::Severity::Warning);
64200b57cec5SDimitry Andric           NewMapping.setUpgradedFromWarning(false);
64210b57cec5SDimitry Andric         }
64220b57cec5SDimitry Andric 
64230b57cec5SDimitry Andric         Mapping = NewMapping;
64240b57cec5SDimitry Andric       }
64250b57cec5SDimitry Andric       return NewState;
64260b57cec5SDimitry Andric     };
64270b57cec5SDimitry Andric 
64280b57cec5SDimitry Andric     // Read the first state.
64290b57cec5SDimitry Andric     DiagState *FirstState;
64300b57cec5SDimitry Andric     if (F.Kind == MK_ImplicitModule) {
64310b57cec5SDimitry Andric       // Implicitly-built modules are reused with different diagnostic
64320b57cec5SDimitry Andric       // settings.  Use the initial diagnostic state from Diag to simulate this
64330b57cec5SDimitry Andric       // compilation's diagnostic settings.
64340b57cec5SDimitry Andric       FirstState = Diag.DiagStatesByLoc.FirstDiagState;
64350b57cec5SDimitry Andric       DiagStates.push_back(FirstState);
64360b57cec5SDimitry Andric 
64370b57cec5SDimitry Andric       // Skip the initial diagnostic state from the serialized module.
64380b57cec5SDimitry Andric       assert(Record[1] == 0 &&
64390b57cec5SDimitry Andric              "Invalid data, unexpected backref in initial state");
64400b57cec5SDimitry Andric       Idx = 3 + Record[2] * 2;
64410b57cec5SDimitry Andric       assert(Idx < Record.size() &&
64420b57cec5SDimitry Andric              "Invalid data, not enough state change pairs in initial state");
64430b57cec5SDimitry Andric     } else if (F.isModule()) {
64440b57cec5SDimitry Andric       // For an explicit module, preserve the flags from the module build
64450b57cec5SDimitry Andric       // command line (-w, -Weverything, -Werror, ...) along with any explicit
64460b57cec5SDimitry Andric       // -Wblah flags.
64470b57cec5SDimitry Andric       unsigned Flags = Record[Idx++];
64480b57cec5SDimitry Andric       DiagState Initial;
64490b57cec5SDimitry Andric       Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
64500b57cec5SDimitry Andric       Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
64510b57cec5SDimitry Andric       Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
64520b57cec5SDimitry Andric       Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
64530b57cec5SDimitry Andric       Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
64540b57cec5SDimitry Andric       Initial.ExtBehavior = (diag::Severity)Flags;
6455bdd1243dSDimitry Andric       FirstState = ReadDiagState(Initial, true);
64560b57cec5SDimitry Andric 
64570b57cec5SDimitry Andric       assert(F.OriginalSourceFileID.isValid());
64580b57cec5SDimitry Andric 
64590b57cec5SDimitry Andric       // Set up the root buffer of the module to start with the initial
64600b57cec5SDimitry Andric       // diagnostic state of the module itself, to cover files that contain no
64610b57cec5SDimitry Andric       // explicit transitions (for which we did not serialize anything).
64620b57cec5SDimitry Andric       Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID]
64630b57cec5SDimitry Andric           .StateTransitions.push_back({FirstState, 0});
64640b57cec5SDimitry Andric     } else {
64650b57cec5SDimitry Andric       // For prefix ASTs, start with whatever the user configured on the
64660b57cec5SDimitry Andric       // command line.
64670b57cec5SDimitry Andric       Idx++; // Skip flags.
6468bdd1243dSDimitry Andric       FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, false);
64690b57cec5SDimitry Andric     }
64700b57cec5SDimitry Andric 
64710b57cec5SDimitry Andric     // Read the state transitions.
64720b57cec5SDimitry Andric     unsigned NumLocations = Record[Idx++];
64730b57cec5SDimitry Andric     while (NumLocations--) {
64740b57cec5SDimitry Andric       assert(Idx < Record.size() &&
64750b57cec5SDimitry Andric              "Invalid data, missing pragma diagnostic states");
64760b57cec5SDimitry Andric       SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]);
64770b57cec5SDimitry Andric       auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc);
64780b57cec5SDimitry Andric       assert(IDAndOffset.first.isValid() && "invalid FileID for transition");
64790b57cec5SDimitry Andric       assert(IDAndOffset.second == 0 && "not a start location for a FileID");
64800b57cec5SDimitry Andric       unsigned Transitions = Record[Idx++];
64810b57cec5SDimitry Andric 
64820b57cec5SDimitry Andric       // Note that we don't need to set up Parent/ParentOffset here, because
64830b57cec5SDimitry Andric       // we won't be changing the diagnostic state within imported FileIDs
64840b57cec5SDimitry Andric       // (other than perhaps appending to the main source file, which has no
64850b57cec5SDimitry Andric       // parent).
64860b57cec5SDimitry Andric       auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first];
64870b57cec5SDimitry Andric       F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
64880b57cec5SDimitry Andric       for (unsigned I = 0; I != Transitions; ++I) {
64890b57cec5SDimitry Andric         unsigned Offset = Record[Idx++];
6490bdd1243dSDimitry Andric         auto *State = ReadDiagState(*FirstState, false);
64910b57cec5SDimitry Andric         F.StateTransitions.push_back({State, Offset});
64920b57cec5SDimitry Andric       }
64930b57cec5SDimitry Andric     }
64940b57cec5SDimitry Andric 
64950b57cec5SDimitry Andric     // Read the final state.
64960b57cec5SDimitry Andric     assert(Idx < Record.size() &&
64970b57cec5SDimitry Andric            "Invalid data, missing final pragma diagnostic state");
64980b57cec5SDimitry Andric     SourceLocation CurStateLoc =
64990b57cec5SDimitry Andric         ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
6500bdd1243dSDimitry Andric     auto *CurState = ReadDiagState(*FirstState, false);
65010b57cec5SDimitry Andric 
65020b57cec5SDimitry Andric     if (!F.isModule()) {
65030b57cec5SDimitry Andric       Diag.DiagStatesByLoc.CurDiagState = CurState;
65040b57cec5SDimitry Andric       Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
65050b57cec5SDimitry Andric 
65060b57cec5SDimitry Andric       // Preserve the property that the imaginary root file describes the
65070b57cec5SDimitry Andric       // current state.
65080b57cec5SDimitry Andric       FileID NullFile;
65090b57cec5SDimitry Andric       auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
65100b57cec5SDimitry Andric       if (T.empty())
65110b57cec5SDimitry Andric         T.push_back({CurState, 0});
65120b57cec5SDimitry Andric       else
65130b57cec5SDimitry Andric         T[0].State = CurState;
65140b57cec5SDimitry Andric     }
65150b57cec5SDimitry Andric 
65160b57cec5SDimitry Andric     // Don't try to read these mappings again.
65170b57cec5SDimitry Andric     Record.clear();
65180b57cec5SDimitry Andric   }
65190b57cec5SDimitry Andric }
65200b57cec5SDimitry Andric 
65210b57cec5SDimitry Andric /// Get the correct cursor and offset for loading a type.
65220b57cec5SDimitry Andric ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
65230b57cec5SDimitry Andric   GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
65240b57cec5SDimitry Andric   assert(I != GlobalTypeMap.end() && "Corrupted global type map");
65250b57cec5SDimitry Andric   ModuleFile *M = I->second;
65265ffd83dbSDimitry Andric   return RecordLocation(
65275ffd83dbSDimitry Andric       M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() +
65285ffd83dbSDimitry Andric              M->DeclsBlockStartOffset);
65290b57cec5SDimitry Andric }
65300b57cec5SDimitry Andric 
6531bdd1243dSDimitry Andric static std::optional<Type::TypeClass> getTypeClassForCode(TypeCode code) {
6532480093f4SDimitry Andric   switch (code) {
6533480093f4SDimitry Andric #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
6534480093f4SDimitry Andric   case TYPE_##CODE_ID: return Type::CLASS_ID;
6535480093f4SDimitry Andric #include "clang/Serialization/TypeBitCodes.def"
6536bdd1243dSDimitry Andric   default:
6537bdd1243dSDimitry Andric     return std::nullopt;
6538480093f4SDimitry Andric   }
6539480093f4SDimitry Andric }
6540480093f4SDimitry Andric 
65410b57cec5SDimitry Andric /// Read and return the type with the given index..
65420b57cec5SDimitry Andric ///
65430b57cec5SDimitry Andric /// The index is the type ID, shifted and minus the number of predefs. This
65440b57cec5SDimitry Andric /// routine actually reads the record corresponding to the type at the given
65450b57cec5SDimitry Andric /// location. It is a helper routine for GetType, which deals with reading type
65460b57cec5SDimitry Andric /// IDs.
65470b57cec5SDimitry Andric QualType ASTReader::readTypeRecord(unsigned Index) {
65480b57cec5SDimitry Andric   assert(ContextObj && "reading type with no AST context");
65490b57cec5SDimitry Andric   ASTContext &Context = *ContextObj;
65500b57cec5SDimitry Andric   RecordLocation Loc = TypeCursorForIndex(Index);
65510b57cec5SDimitry Andric   BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
65520b57cec5SDimitry Andric 
65530b57cec5SDimitry Andric   // Keep track of where we are in the stream, then jump back there
65540b57cec5SDimitry Andric   // after reading this type.
65550b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(DeclsCursor);
65560b57cec5SDimitry Andric 
65570b57cec5SDimitry Andric   ReadingKindTracker ReadingKind(Read_Type, *this);
65580b57cec5SDimitry Andric 
65590b57cec5SDimitry Andric   // Note that we are loading a type record.
65600b57cec5SDimitry Andric   Deserializing AType(this);
65610b57cec5SDimitry Andric 
65620b57cec5SDimitry Andric   if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
65630b57cec5SDimitry Andric     Error(std::move(Err));
65640b57cec5SDimitry Andric     return QualType();
65650b57cec5SDimitry Andric   }
6566480093f4SDimitry Andric   Expected<unsigned> RawCode = DeclsCursor.ReadCode();
6567480093f4SDimitry Andric   if (!RawCode) {
6568480093f4SDimitry Andric     Error(RawCode.takeError());
65690b57cec5SDimitry Andric     return QualType();
65700b57cec5SDimitry Andric   }
65710b57cec5SDimitry Andric 
6572480093f4SDimitry Andric   ASTRecordReader Record(*this, *Loc.F);
6573480093f4SDimitry Andric   Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get());
6574480093f4SDimitry Andric   if (!Code) {
6575480093f4SDimitry Andric     Error(Code.takeError());
6576480093f4SDimitry Andric     return QualType();
6577480093f4SDimitry Andric   }
6578480093f4SDimitry Andric   if (Code.get() == TYPE_EXT_QUAL) {
6579480093f4SDimitry Andric     QualType baseType = Record.readQualType();
6580480093f4SDimitry Andric     Qualifiers quals = Record.readQualifiers();
6581480093f4SDimitry Andric     return Context.getQualifiedType(baseType, quals);
65820b57cec5SDimitry Andric   }
65830b57cec5SDimitry Andric 
6584480093f4SDimitry Andric   auto maybeClass = getTypeClassForCode((TypeCode) Code.get());
6585480093f4SDimitry Andric   if (!maybeClass) {
6586480093f4SDimitry Andric     Error("Unexpected code for type");
65870b57cec5SDimitry Andric     return QualType();
65880b57cec5SDimitry Andric   }
65890b57cec5SDimitry Andric 
6590480093f4SDimitry Andric   serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record);
6591480093f4SDimitry Andric   return TypeReader.read(*maybeClass);
65920b57cec5SDimitry Andric }
65930b57cec5SDimitry Andric 
65940b57cec5SDimitry Andric namespace clang {
65950b57cec5SDimitry Andric 
65960b57cec5SDimitry Andric class TypeLocReader : public TypeLocVisitor<TypeLocReader> {
659781ad6265SDimitry Andric   using LocSeq = SourceLocationSequence;
65980b57cec5SDimitry Andric 
659981ad6265SDimitry Andric   ASTRecordReader &Reader;
660081ad6265SDimitry Andric   LocSeq *Seq;
660181ad6265SDimitry Andric 
660281ad6265SDimitry Andric   SourceLocation readSourceLocation() { return Reader.readSourceLocation(Seq); }
660381ad6265SDimitry Andric   SourceRange readSourceRange() { return Reader.readSourceRange(Seq); }
66040b57cec5SDimitry Andric 
66050b57cec5SDimitry Andric   TypeSourceInfo *GetTypeSourceInfo() {
6606480093f4SDimitry Andric     return Reader.readTypeSourceInfo();
66070b57cec5SDimitry Andric   }
66080b57cec5SDimitry Andric 
66090b57cec5SDimitry Andric   NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() {
6610480093f4SDimitry Andric     return Reader.readNestedNameSpecifierLoc();
66110b57cec5SDimitry Andric   }
66120b57cec5SDimitry Andric 
66130b57cec5SDimitry Andric   Attr *ReadAttr() {
6614480093f4SDimitry Andric     return Reader.readAttr();
66150b57cec5SDimitry Andric   }
66160b57cec5SDimitry Andric 
66170b57cec5SDimitry Andric public:
661881ad6265SDimitry Andric   TypeLocReader(ASTRecordReader &Reader, LocSeq *Seq)
661981ad6265SDimitry Andric       : Reader(Reader), Seq(Seq) {}
66200b57cec5SDimitry Andric 
66210b57cec5SDimitry Andric   // We want compile-time assurance that we've enumerated all of
66220b57cec5SDimitry Andric   // these, so unfortunately we have to declare them first, then
66230b57cec5SDimitry Andric   // define them out-of-line.
66240b57cec5SDimitry Andric #define ABSTRACT_TYPELOC(CLASS, PARENT)
66250b57cec5SDimitry Andric #define TYPELOC(CLASS, PARENT) \
66260b57cec5SDimitry Andric   void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
66270b57cec5SDimitry Andric #include "clang/AST/TypeLocNodes.def"
66280b57cec5SDimitry Andric 
66290b57cec5SDimitry Andric   void VisitFunctionTypeLoc(FunctionTypeLoc);
66300b57cec5SDimitry Andric   void VisitArrayTypeLoc(ArrayTypeLoc);
66310b57cec5SDimitry Andric };
66320b57cec5SDimitry Andric 
66330b57cec5SDimitry Andric } // namespace clang
66340b57cec5SDimitry Andric 
66350b57cec5SDimitry Andric void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
66360b57cec5SDimitry Andric   // nothing to do
66370b57cec5SDimitry Andric }
66380b57cec5SDimitry Andric 
66390b57cec5SDimitry Andric void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
6640480093f4SDimitry Andric   TL.setBuiltinLoc(readSourceLocation());
66410b57cec5SDimitry Andric   if (TL.needsExtraLocalData()) {
6642480093f4SDimitry Andric     TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt()));
6643e8d8bef9SDimitry Andric     TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt()));
6644e8d8bef9SDimitry Andric     TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt()));
6645480093f4SDimitry Andric     TL.setModeAttr(Reader.readInt());
66460b57cec5SDimitry Andric   }
66470b57cec5SDimitry Andric }
66480b57cec5SDimitry Andric 
66490b57cec5SDimitry Andric void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
6650480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
66510b57cec5SDimitry Andric }
66520b57cec5SDimitry Andric 
66530b57cec5SDimitry Andric void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
6654480093f4SDimitry Andric   TL.setStarLoc(readSourceLocation());
66550b57cec5SDimitry Andric }
66560b57cec5SDimitry Andric 
66570b57cec5SDimitry Andric void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
66580b57cec5SDimitry Andric   // nothing to do
66590b57cec5SDimitry Andric }
66600b57cec5SDimitry Andric 
66610b57cec5SDimitry Andric void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
66620b57cec5SDimitry Andric   // nothing to do
66630b57cec5SDimitry Andric }
66640b57cec5SDimitry Andric 
66650b57cec5SDimitry Andric void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
6666480093f4SDimitry Andric   TL.setExpansionLoc(readSourceLocation());
66670b57cec5SDimitry Andric }
66680b57cec5SDimitry Andric 
66690b57cec5SDimitry Andric void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
6670480093f4SDimitry Andric   TL.setCaretLoc(readSourceLocation());
66710b57cec5SDimitry Andric }
66720b57cec5SDimitry Andric 
66730b57cec5SDimitry Andric void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
6674480093f4SDimitry Andric   TL.setAmpLoc(readSourceLocation());
66750b57cec5SDimitry Andric }
66760b57cec5SDimitry Andric 
66770b57cec5SDimitry Andric void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
6678480093f4SDimitry Andric   TL.setAmpAmpLoc(readSourceLocation());
66790b57cec5SDimitry Andric }
66800b57cec5SDimitry Andric 
66810b57cec5SDimitry Andric void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
6682480093f4SDimitry Andric   TL.setStarLoc(readSourceLocation());
66830b57cec5SDimitry Andric   TL.setClassTInfo(GetTypeSourceInfo());
66840b57cec5SDimitry Andric }
66850b57cec5SDimitry Andric 
66860b57cec5SDimitry Andric void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
6687480093f4SDimitry Andric   TL.setLBracketLoc(readSourceLocation());
6688480093f4SDimitry Andric   TL.setRBracketLoc(readSourceLocation());
6689480093f4SDimitry Andric   if (Reader.readBool())
6690480093f4SDimitry Andric     TL.setSizeExpr(Reader.readExpr());
66910b57cec5SDimitry Andric   else
66920b57cec5SDimitry Andric     TL.setSizeExpr(nullptr);
66930b57cec5SDimitry Andric }
66940b57cec5SDimitry Andric 
66950b57cec5SDimitry Andric void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
66960b57cec5SDimitry Andric   VisitArrayTypeLoc(TL);
66970b57cec5SDimitry Andric }
66980b57cec5SDimitry Andric 
66990b57cec5SDimitry Andric void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
67000b57cec5SDimitry Andric   VisitArrayTypeLoc(TL);
67010b57cec5SDimitry Andric }
67020b57cec5SDimitry Andric 
67030b57cec5SDimitry Andric void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
67040b57cec5SDimitry Andric   VisitArrayTypeLoc(TL);
67050b57cec5SDimitry Andric }
67060b57cec5SDimitry Andric 
67070b57cec5SDimitry Andric void TypeLocReader::VisitDependentSizedArrayTypeLoc(
67080b57cec5SDimitry Andric                                             DependentSizedArrayTypeLoc TL) {
67090b57cec5SDimitry Andric   VisitArrayTypeLoc(TL);
67100b57cec5SDimitry Andric }
67110b57cec5SDimitry Andric 
67120b57cec5SDimitry Andric void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
67130b57cec5SDimitry Andric     DependentAddressSpaceTypeLoc TL) {
67140b57cec5SDimitry Andric 
6715480093f4SDimitry Andric     TL.setAttrNameLoc(readSourceLocation());
671681ad6265SDimitry Andric     TL.setAttrOperandParensRange(readSourceRange());
6717480093f4SDimitry Andric     TL.setAttrExprOperand(Reader.readExpr());
67180b57cec5SDimitry Andric }
67190b57cec5SDimitry Andric 
67200b57cec5SDimitry Andric void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
67210b57cec5SDimitry Andric                                         DependentSizedExtVectorTypeLoc TL) {
6722480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
67230b57cec5SDimitry Andric }
67240b57cec5SDimitry Andric 
67250b57cec5SDimitry Andric void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
6726480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
67270b57cec5SDimitry Andric }
67280b57cec5SDimitry Andric 
67290b57cec5SDimitry Andric void TypeLocReader::VisitDependentVectorTypeLoc(
67300b57cec5SDimitry Andric     DependentVectorTypeLoc TL) {
6731480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
67320b57cec5SDimitry Andric }
67330b57cec5SDimitry Andric 
67340b57cec5SDimitry Andric void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
6735480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
67360b57cec5SDimitry Andric }
67370b57cec5SDimitry Andric 
67385ffd83dbSDimitry Andric void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
67395ffd83dbSDimitry Andric   TL.setAttrNameLoc(readSourceLocation());
674081ad6265SDimitry Andric   TL.setAttrOperandParensRange(readSourceRange());
67415ffd83dbSDimitry Andric   TL.setAttrRowOperand(Reader.readExpr());
67425ffd83dbSDimitry Andric   TL.setAttrColumnOperand(Reader.readExpr());
67435ffd83dbSDimitry Andric }
67445ffd83dbSDimitry Andric 
67455ffd83dbSDimitry Andric void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
67465ffd83dbSDimitry Andric     DependentSizedMatrixTypeLoc TL) {
67475ffd83dbSDimitry Andric   TL.setAttrNameLoc(readSourceLocation());
674881ad6265SDimitry Andric   TL.setAttrOperandParensRange(readSourceRange());
67495ffd83dbSDimitry Andric   TL.setAttrRowOperand(Reader.readExpr());
67505ffd83dbSDimitry Andric   TL.setAttrColumnOperand(Reader.readExpr());
67515ffd83dbSDimitry Andric }
67525ffd83dbSDimitry Andric 
67530b57cec5SDimitry Andric void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
6754480093f4SDimitry Andric   TL.setLocalRangeBegin(readSourceLocation());
6755480093f4SDimitry Andric   TL.setLParenLoc(readSourceLocation());
6756480093f4SDimitry Andric   TL.setRParenLoc(readSourceLocation());
675781ad6265SDimitry Andric   TL.setExceptionSpecRange(readSourceRange());
6758480093f4SDimitry Andric   TL.setLocalRangeEnd(readSourceLocation());
67590b57cec5SDimitry Andric   for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
6760480093f4SDimitry Andric     TL.setParam(i, Reader.readDeclAs<ParmVarDecl>());
67610b57cec5SDimitry Andric   }
67620b57cec5SDimitry Andric }
67630b57cec5SDimitry Andric 
67640b57cec5SDimitry Andric void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
67650b57cec5SDimitry Andric   VisitFunctionTypeLoc(TL);
67660b57cec5SDimitry Andric }
67670b57cec5SDimitry Andric 
67680b57cec5SDimitry Andric void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
67690b57cec5SDimitry Andric   VisitFunctionTypeLoc(TL);
67700b57cec5SDimitry Andric }
67710b57cec5SDimitry Andric 
67720b57cec5SDimitry Andric void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
6773480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
67740b57cec5SDimitry Andric }
67750b57cec5SDimitry Andric 
67760eae32dcSDimitry Andric void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
67770eae32dcSDimitry Andric   TL.setNameLoc(readSourceLocation());
67780eae32dcSDimitry Andric }
67790eae32dcSDimitry Andric 
67800b57cec5SDimitry Andric void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
6781480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
67820b57cec5SDimitry Andric }
67830b57cec5SDimitry Andric 
67840b57cec5SDimitry Andric void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
6785480093f4SDimitry Andric   TL.setTypeofLoc(readSourceLocation());
6786480093f4SDimitry Andric   TL.setLParenLoc(readSourceLocation());
6787480093f4SDimitry Andric   TL.setRParenLoc(readSourceLocation());
67880b57cec5SDimitry Andric }
67890b57cec5SDimitry Andric 
67900b57cec5SDimitry Andric void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
6791480093f4SDimitry Andric   TL.setTypeofLoc(readSourceLocation());
6792480093f4SDimitry Andric   TL.setLParenLoc(readSourceLocation());
6793480093f4SDimitry Andric   TL.setRParenLoc(readSourceLocation());
6794bdd1243dSDimitry Andric   TL.setUnmodifiedTInfo(GetTypeSourceInfo());
67950b57cec5SDimitry Andric }
67960b57cec5SDimitry Andric 
67970b57cec5SDimitry Andric void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
679804eeddc0SDimitry Andric   TL.setDecltypeLoc(readSourceLocation());
679904eeddc0SDimitry Andric   TL.setRParenLoc(readSourceLocation());
68000b57cec5SDimitry Andric }
68010b57cec5SDimitry Andric 
68020b57cec5SDimitry Andric void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
6803480093f4SDimitry Andric   TL.setKWLoc(readSourceLocation());
6804480093f4SDimitry Andric   TL.setLParenLoc(readSourceLocation());
6805480093f4SDimitry Andric   TL.setRParenLoc(readSourceLocation());
68060b57cec5SDimitry Andric   TL.setUnderlyingTInfo(GetTypeSourceInfo());
68070b57cec5SDimitry Andric }
68080b57cec5SDimitry Andric 
68090b57cec5SDimitry Andric void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
6810480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
681155e4f9d5SDimitry Andric   if (Reader.readBool()) {
681255e4f9d5SDimitry Andric     TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc());
681355e4f9d5SDimitry Andric     TL.setTemplateKWLoc(readSourceLocation());
681455e4f9d5SDimitry Andric     TL.setConceptNameLoc(readSourceLocation());
681555e4f9d5SDimitry Andric     TL.setFoundDecl(Reader.readDeclAs<NamedDecl>());
681655e4f9d5SDimitry Andric     TL.setLAngleLoc(readSourceLocation());
681755e4f9d5SDimitry Andric     TL.setRAngleLoc(readSourceLocation());
681855e4f9d5SDimitry Andric     for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6819bdd1243dSDimitry Andric       TL.setArgLocInfo(
6820bdd1243dSDimitry Andric           i, Reader.readTemplateArgumentLocInfo(
6821bdd1243dSDimitry Andric                  TL.getTypePtr()->getTypeConstraintArguments()[i].getKind()));
682255e4f9d5SDimitry Andric   }
682304eeddc0SDimitry Andric   if (Reader.readBool())
682404eeddc0SDimitry Andric     TL.setRParenLoc(readSourceLocation());
68250b57cec5SDimitry Andric }
68260b57cec5SDimitry Andric 
68270b57cec5SDimitry Andric void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
68280b57cec5SDimitry Andric     DeducedTemplateSpecializationTypeLoc TL) {
6829480093f4SDimitry Andric   TL.setTemplateNameLoc(readSourceLocation());
68300b57cec5SDimitry Andric }
68310b57cec5SDimitry Andric 
68320b57cec5SDimitry Andric void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6833480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
68340b57cec5SDimitry Andric }
68350b57cec5SDimitry Andric 
68360b57cec5SDimitry Andric void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6837480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
68380b57cec5SDimitry Andric }
68390b57cec5SDimitry Andric 
68400b57cec5SDimitry Andric void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
68410b57cec5SDimitry Andric   TL.setAttr(ReadAttr());
68420b57cec5SDimitry Andric }
68430b57cec5SDimitry Andric 
684481ad6265SDimitry Andric void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
684581ad6265SDimitry Andric   // Nothing to do.
684681ad6265SDimitry Andric }
684781ad6265SDimitry Andric 
68480b57cec5SDimitry Andric void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
6849480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
68500b57cec5SDimitry Andric }
68510b57cec5SDimitry Andric 
68520b57cec5SDimitry Andric void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
68530b57cec5SDimitry Andric                                             SubstTemplateTypeParmTypeLoc TL) {
6854480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
68550b57cec5SDimitry Andric }
68560b57cec5SDimitry Andric 
68570b57cec5SDimitry Andric void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
68580b57cec5SDimitry Andric                                           SubstTemplateTypeParmPackTypeLoc TL) {
6859480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
68600b57cec5SDimitry Andric }
68610b57cec5SDimitry Andric 
68620b57cec5SDimitry Andric void TypeLocReader::VisitTemplateSpecializationTypeLoc(
68630b57cec5SDimitry Andric                                            TemplateSpecializationTypeLoc TL) {
6864480093f4SDimitry Andric   TL.setTemplateKeywordLoc(readSourceLocation());
6865480093f4SDimitry Andric   TL.setTemplateNameLoc(readSourceLocation());
6866480093f4SDimitry Andric   TL.setLAngleLoc(readSourceLocation());
6867480093f4SDimitry Andric   TL.setRAngleLoc(readSourceLocation());
68680b57cec5SDimitry Andric   for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6869bdd1243dSDimitry Andric     TL.setArgLocInfo(i,
6870480093f4SDimitry Andric                      Reader.readTemplateArgumentLocInfo(
6871bdd1243dSDimitry Andric                          TL.getTypePtr()->template_arguments()[i].getKind()));
68720b57cec5SDimitry Andric }
68730b57cec5SDimitry Andric 
68740b57cec5SDimitry Andric void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
6875480093f4SDimitry Andric   TL.setLParenLoc(readSourceLocation());
6876480093f4SDimitry Andric   TL.setRParenLoc(readSourceLocation());
68770b57cec5SDimitry Andric }
68780b57cec5SDimitry Andric 
68790b57cec5SDimitry Andric void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
6880480093f4SDimitry Andric   TL.setElaboratedKeywordLoc(readSourceLocation());
68810b57cec5SDimitry Andric   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
68820b57cec5SDimitry Andric }
68830b57cec5SDimitry Andric 
68840b57cec5SDimitry Andric void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
6885480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
68860b57cec5SDimitry Andric }
68870b57cec5SDimitry Andric 
68880b57cec5SDimitry Andric void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6889480093f4SDimitry Andric   TL.setElaboratedKeywordLoc(readSourceLocation());
68900b57cec5SDimitry Andric   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6891480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
68920b57cec5SDimitry Andric }
68930b57cec5SDimitry Andric 
68940b57cec5SDimitry Andric void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
68950b57cec5SDimitry Andric        DependentTemplateSpecializationTypeLoc TL) {
6896480093f4SDimitry Andric   TL.setElaboratedKeywordLoc(readSourceLocation());
68970b57cec5SDimitry Andric   TL.setQualifierLoc(ReadNestedNameSpecifierLoc());
6898480093f4SDimitry Andric   TL.setTemplateKeywordLoc(readSourceLocation());
6899480093f4SDimitry Andric   TL.setTemplateNameLoc(readSourceLocation());
6900480093f4SDimitry Andric   TL.setLAngleLoc(readSourceLocation());
6901480093f4SDimitry Andric   TL.setRAngleLoc(readSourceLocation());
69020b57cec5SDimitry Andric   for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
6903bdd1243dSDimitry Andric     TL.setArgLocInfo(I,
6904480093f4SDimitry Andric                      Reader.readTemplateArgumentLocInfo(
6905bdd1243dSDimitry Andric                          TL.getTypePtr()->template_arguments()[I].getKind()));
69060b57cec5SDimitry Andric }
69070b57cec5SDimitry Andric 
69080b57cec5SDimitry Andric void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
6909480093f4SDimitry Andric   TL.setEllipsisLoc(readSourceLocation());
69100b57cec5SDimitry Andric }
69110b57cec5SDimitry Andric 
69120b57cec5SDimitry Andric void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6913480093f4SDimitry Andric   TL.setNameLoc(readSourceLocation());
6914bdd1243dSDimitry Andric   TL.setNameEndLoc(readSourceLocation());
69150b57cec5SDimitry Andric }
69160b57cec5SDimitry Andric 
69170b57cec5SDimitry Andric void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
69180b57cec5SDimitry Andric   if (TL.getNumProtocols()) {
6919480093f4SDimitry Andric     TL.setProtocolLAngleLoc(readSourceLocation());
6920480093f4SDimitry Andric     TL.setProtocolRAngleLoc(readSourceLocation());
69210b57cec5SDimitry Andric   }
69220b57cec5SDimitry Andric   for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6923480093f4SDimitry Andric     TL.setProtocolLoc(i, readSourceLocation());
69240b57cec5SDimitry Andric }
69250b57cec5SDimitry Andric 
69260b57cec5SDimitry Andric void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6927480093f4SDimitry Andric   TL.setHasBaseTypeAsWritten(Reader.readBool());
6928480093f4SDimitry Andric   TL.setTypeArgsLAngleLoc(readSourceLocation());
6929480093f4SDimitry Andric   TL.setTypeArgsRAngleLoc(readSourceLocation());
69300b57cec5SDimitry Andric   for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
69310b57cec5SDimitry Andric     TL.setTypeArgTInfo(i, GetTypeSourceInfo());
6932480093f4SDimitry Andric   TL.setProtocolLAngleLoc(readSourceLocation());
6933480093f4SDimitry Andric   TL.setProtocolRAngleLoc(readSourceLocation());
69340b57cec5SDimitry Andric   for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6935480093f4SDimitry Andric     TL.setProtocolLoc(i, readSourceLocation());
69360b57cec5SDimitry Andric }
69370b57cec5SDimitry Andric 
69380b57cec5SDimitry Andric void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6939480093f4SDimitry Andric   TL.setStarLoc(readSourceLocation());
69400b57cec5SDimitry Andric }
69410b57cec5SDimitry Andric 
69420b57cec5SDimitry Andric void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6943480093f4SDimitry Andric   TL.setKWLoc(readSourceLocation());
6944480093f4SDimitry Andric   TL.setLParenLoc(readSourceLocation());
6945480093f4SDimitry Andric   TL.setRParenLoc(readSourceLocation());
69460b57cec5SDimitry Andric }
69470b57cec5SDimitry Andric 
69480b57cec5SDimitry Andric void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
6949480093f4SDimitry Andric   TL.setKWLoc(readSourceLocation());
69500b57cec5SDimitry Andric }
69510b57cec5SDimitry Andric 
69520eae32dcSDimitry Andric void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
69535ffd83dbSDimitry Andric   TL.setNameLoc(readSourceLocation());
69545ffd83dbSDimitry Andric }
69550eae32dcSDimitry Andric void TypeLocReader::VisitDependentBitIntTypeLoc(
69560eae32dcSDimitry Andric     clang::DependentBitIntTypeLoc TL) {
69575ffd83dbSDimitry Andric   TL.setNameLoc(readSourceLocation());
69585ffd83dbSDimitry Andric }
69595ffd83dbSDimitry Andric 
696081ad6265SDimitry Andric void ASTRecordReader::readTypeLoc(TypeLoc TL, LocSeq *ParentSeq) {
696181ad6265SDimitry Andric   LocSeq::State Seq(ParentSeq);
696281ad6265SDimitry Andric   TypeLocReader TLR(*this, Seq);
69630b57cec5SDimitry Andric   for (; !TL.isNull(); TL = TL.getNextTypeLoc())
69640b57cec5SDimitry Andric     TLR.Visit(TL);
69650b57cec5SDimitry Andric }
69660b57cec5SDimitry Andric 
6967480093f4SDimitry Andric TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() {
6968480093f4SDimitry Andric   QualType InfoTy = readType();
69690b57cec5SDimitry Andric   if (InfoTy.isNull())
69700b57cec5SDimitry Andric     return nullptr;
69710b57cec5SDimitry Andric 
69720b57cec5SDimitry Andric   TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
6973480093f4SDimitry Andric   readTypeLoc(TInfo->getTypeLoc());
69740b57cec5SDimitry Andric   return TInfo;
69750b57cec5SDimitry Andric }
69760b57cec5SDimitry Andric 
69770b57cec5SDimitry Andric QualType ASTReader::GetType(TypeID ID) {
69780b57cec5SDimitry Andric   assert(ContextObj && "reading type with no AST context");
69790b57cec5SDimitry Andric   ASTContext &Context = *ContextObj;
69800b57cec5SDimitry Andric 
69810b57cec5SDimitry Andric   unsigned FastQuals = ID & Qualifiers::FastMask;
69820b57cec5SDimitry Andric   unsigned Index = ID >> Qualifiers::FastWidth;
69830b57cec5SDimitry Andric 
69840b57cec5SDimitry Andric   if (Index < NUM_PREDEF_TYPE_IDS) {
69850b57cec5SDimitry Andric     QualType T;
69860b57cec5SDimitry Andric     switch ((PredefinedTypeIDs)Index) {
6987*06c3fb27SDimitry Andric     case PREDEF_TYPE_LAST_ID:
6988*06c3fb27SDimitry Andric       // We should never use this one.
6989*06c3fb27SDimitry Andric       llvm_unreachable("Invalid predefined type");
6990*06c3fb27SDimitry Andric       break;
69910b57cec5SDimitry Andric     case PREDEF_TYPE_NULL_ID:
69920b57cec5SDimitry Andric       return QualType();
69930b57cec5SDimitry Andric     case PREDEF_TYPE_VOID_ID:
69940b57cec5SDimitry Andric       T = Context.VoidTy;
69950b57cec5SDimitry Andric       break;
69960b57cec5SDimitry Andric     case PREDEF_TYPE_BOOL_ID:
69970b57cec5SDimitry Andric       T = Context.BoolTy;
69980b57cec5SDimitry Andric       break;
69990b57cec5SDimitry Andric     case PREDEF_TYPE_CHAR_U_ID:
70000b57cec5SDimitry Andric     case PREDEF_TYPE_CHAR_S_ID:
70010b57cec5SDimitry Andric       // FIXME: Check that the signedness of CharTy is correct!
70020b57cec5SDimitry Andric       T = Context.CharTy;
70030b57cec5SDimitry Andric       break;
70040b57cec5SDimitry Andric     case PREDEF_TYPE_UCHAR_ID:
70050b57cec5SDimitry Andric       T = Context.UnsignedCharTy;
70060b57cec5SDimitry Andric       break;
70070b57cec5SDimitry Andric     case PREDEF_TYPE_USHORT_ID:
70080b57cec5SDimitry Andric       T = Context.UnsignedShortTy;
70090b57cec5SDimitry Andric       break;
70100b57cec5SDimitry Andric     case PREDEF_TYPE_UINT_ID:
70110b57cec5SDimitry Andric       T = Context.UnsignedIntTy;
70120b57cec5SDimitry Andric       break;
70130b57cec5SDimitry Andric     case PREDEF_TYPE_ULONG_ID:
70140b57cec5SDimitry Andric       T = Context.UnsignedLongTy;
70150b57cec5SDimitry Andric       break;
70160b57cec5SDimitry Andric     case PREDEF_TYPE_ULONGLONG_ID:
70170b57cec5SDimitry Andric       T = Context.UnsignedLongLongTy;
70180b57cec5SDimitry Andric       break;
70190b57cec5SDimitry Andric     case PREDEF_TYPE_UINT128_ID:
70200b57cec5SDimitry Andric       T = Context.UnsignedInt128Ty;
70210b57cec5SDimitry Andric       break;
70220b57cec5SDimitry Andric     case PREDEF_TYPE_SCHAR_ID:
70230b57cec5SDimitry Andric       T = Context.SignedCharTy;
70240b57cec5SDimitry Andric       break;
70250b57cec5SDimitry Andric     case PREDEF_TYPE_WCHAR_ID:
70260b57cec5SDimitry Andric       T = Context.WCharTy;
70270b57cec5SDimitry Andric       break;
70280b57cec5SDimitry Andric     case PREDEF_TYPE_SHORT_ID:
70290b57cec5SDimitry Andric       T = Context.ShortTy;
70300b57cec5SDimitry Andric       break;
70310b57cec5SDimitry Andric     case PREDEF_TYPE_INT_ID:
70320b57cec5SDimitry Andric       T = Context.IntTy;
70330b57cec5SDimitry Andric       break;
70340b57cec5SDimitry Andric     case PREDEF_TYPE_LONG_ID:
70350b57cec5SDimitry Andric       T = Context.LongTy;
70360b57cec5SDimitry Andric       break;
70370b57cec5SDimitry Andric     case PREDEF_TYPE_LONGLONG_ID:
70380b57cec5SDimitry Andric       T = Context.LongLongTy;
70390b57cec5SDimitry Andric       break;
70400b57cec5SDimitry Andric     case PREDEF_TYPE_INT128_ID:
70410b57cec5SDimitry Andric       T = Context.Int128Ty;
70420b57cec5SDimitry Andric       break;
70435ffd83dbSDimitry Andric     case PREDEF_TYPE_BFLOAT16_ID:
70445ffd83dbSDimitry Andric       T = Context.BFloat16Ty;
70455ffd83dbSDimitry Andric       break;
70460b57cec5SDimitry Andric     case PREDEF_TYPE_HALF_ID:
70470b57cec5SDimitry Andric       T = Context.HalfTy;
70480b57cec5SDimitry Andric       break;
70490b57cec5SDimitry Andric     case PREDEF_TYPE_FLOAT_ID:
70500b57cec5SDimitry Andric       T = Context.FloatTy;
70510b57cec5SDimitry Andric       break;
70520b57cec5SDimitry Andric     case PREDEF_TYPE_DOUBLE_ID:
70530b57cec5SDimitry Andric       T = Context.DoubleTy;
70540b57cec5SDimitry Andric       break;
70550b57cec5SDimitry Andric     case PREDEF_TYPE_LONGDOUBLE_ID:
70560b57cec5SDimitry Andric       T = Context.LongDoubleTy;
70570b57cec5SDimitry Andric       break;
70580b57cec5SDimitry Andric     case PREDEF_TYPE_SHORT_ACCUM_ID:
70590b57cec5SDimitry Andric       T = Context.ShortAccumTy;
70600b57cec5SDimitry Andric       break;
70610b57cec5SDimitry Andric     case PREDEF_TYPE_ACCUM_ID:
70620b57cec5SDimitry Andric       T = Context.AccumTy;
70630b57cec5SDimitry Andric       break;
70640b57cec5SDimitry Andric     case PREDEF_TYPE_LONG_ACCUM_ID:
70650b57cec5SDimitry Andric       T = Context.LongAccumTy;
70660b57cec5SDimitry Andric       break;
70670b57cec5SDimitry Andric     case PREDEF_TYPE_USHORT_ACCUM_ID:
70680b57cec5SDimitry Andric       T = Context.UnsignedShortAccumTy;
70690b57cec5SDimitry Andric       break;
70700b57cec5SDimitry Andric     case PREDEF_TYPE_UACCUM_ID:
70710b57cec5SDimitry Andric       T = Context.UnsignedAccumTy;
70720b57cec5SDimitry Andric       break;
70730b57cec5SDimitry Andric     case PREDEF_TYPE_ULONG_ACCUM_ID:
70740b57cec5SDimitry Andric       T = Context.UnsignedLongAccumTy;
70750b57cec5SDimitry Andric       break;
70760b57cec5SDimitry Andric     case PREDEF_TYPE_SHORT_FRACT_ID:
70770b57cec5SDimitry Andric       T = Context.ShortFractTy;
70780b57cec5SDimitry Andric       break;
70790b57cec5SDimitry Andric     case PREDEF_TYPE_FRACT_ID:
70800b57cec5SDimitry Andric       T = Context.FractTy;
70810b57cec5SDimitry Andric       break;
70820b57cec5SDimitry Andric     case PREDEF_TYPE_LONG_FRACT_ID:
70830b57cec5SDimitry Andric       T = Context.LongFractTy;
70840b57cec5SDimitry Andric       break;
70850b57cec5SDimitry Andric     case PREDEF_TYPE_USHORT_FRACT_ID:
70860b57cec5SDimitry Andric       T = Context.UnsignedShortFractTy;
70870b57cec5SDimitry Andric       break;
70880b57cec5SDimitry Andric     case PREDEF_TYPE_UFRACT_ID:
70890b57cec5SDimitry Andric       T = Context.UnsignedFractTy;
70900b57cec5SDimitry Andric       break;
70910b57cec5SDimitry Andric     case PREDEF_TYPE_ULONG_FRACT_ID:
70920b57cec5SDimitry Andric       T = Context.UnsignedLongFractTy;
70930b57cec5SDimitry Andric       break;
70940b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_SHORT_ACCUM_ID:
70950b57cec5SDimitry Andric       T = Context.SatShortAccumTy;
70960b57cec5SDimitry Andric       break;
70970b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_ACCUM_ID:
70980b57cec5SDimitry Andric       T = Context.SatAccumTy;
70990b57cec5SDimitry Andric       break;
71000b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_LONG_ACCUM_ID:
71010b57cec5SDimitry Andric       T = Context.SatLongAccumTy;
71020b57cec5SDimitry Andric       break;
71030b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_USHORT_ACCUM_ID:
71040b57cec5SDimitry Andric       T = Context.SatUnsignedShortAccumTy;
71050b57cec5SDimitry Andric       break;
71060b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_UACCUM_ID:
71070b57cec5SDimitry Andric       T = Context.SatUnsignedAccumTy;
71080b57cec5SDimitry Andric       break;
71090b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_ULONG_ACCUM_ID:
71100b57cec5SDimitry Andric       T = Context.SatUnsignedLongAccumTy;
71110b57cec5SDimitry Andric       break;
71120b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_SHORT_FRACT_ID:
71130b57cec5SDimitry Andric       T = Context.SatShortFractTy;
71140b57cec5SDimitry Andric       break;
71150b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_FRACT_ID:
71160b57cec5SDimitry Andric       T = Context.SatFractTy;
71170b57cec5SDimitry Andric       break;
71180b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_LONG_FRACT_ID:
71190b57cec5SDimitry Andric       T = Context.SatLongFractTy;
71200b57cec5SDimitry Andric       break;
71210b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_USHORT_FRACT_ID:
71220b57cec5SDimitry Andric       T = Context.SatUnsignedShortFractTy;
71230b57cec5SDimitry Andric       break;
71240b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_UFRACT_ID:
71250b57cec5SDimitry Andric       T = Context.SatUnsignedFractTy;
71260b57cec5SDimitry Andric       break;
71270b57cec5SDimitry Andric     case PREDEF_TYPE_SAT_ULONG_FRACT_ID:
71280b57cec5SDimitry Andric       T = Context.SatUnsignedLongFractTy;
71290b57cec5SDimitry Andric       break;
71300b57cec5SDimitry Andric     case PREDEF_TYPE_FLOAT16_ID:
71310b57cec5SDimitry Andric       T = Context.Float16Ty;
71320b57cec5SDimitry Andric       break;
71330b57cec5SDimitry Andric     case PREDEF_TYPE_FLOAT128_ID:
71340b57cec5SDimitry Andric       T = Context.Float128Ty;
71350b57cec5SDimitry Andric       break;
7136349cc55cSDimitry Andric     case PREDEF_TYPE_IBM128_ID:
7137349cc55cSDimitry Andric       T = Context.Ibm128Ty;
7138349cc55cSDimitry Andric       break;
71390b57cec5SDimitry Andric     case PREDEF_TYPE_OVERLOAD_ID:
71400b57cec5SDimitry Andric       T = Context.OverloadTy;
71410b57cec5SDimitry Andric       break;
71420b57cec5SDimitry Andric     case PREDEF_TYPE_BOUND_MEMBER:
71430b57cec5SDimitry Andric       T = Context.BoundMemberTy;
71440b57cec5SDimitry Andric       break;
71450b57cec5SDimitry Andric     case PREDEF_TYPE_PSEUDO_OBJECT:
71460b57cec5SDimitry Andric       T = Context.PseudoObjectTy;
71470b57cec5SDimitry Andric       break;
71480b57cec5SDimitry Andric     case PREDEF_TYPE_DEPENDENT_ID:
71490b57cec5SDimitry Andric       T = Context.DependentTy;
71500b57cec5SDimitry Andric       break;
71510b57cec5SDimitry Andric     case PREDEF_TYPE_UNKNOWN_ANY:
71520b57cec5SDimitry Andric       T = Context.UnknownAnyTy;
71530b57cec5SDimitry Andric       break;
71540b57cec5SDimitry Andric     case PREDEF_TYPE_NULLPTR_ID:
71550b57cec5SDimitry Andric       T = Context.NullPtrTy;
71560b57cec5SDimitry Andric       break;
71570b57cec5SDimitry Andric     case PREDEF_TYPE_CHAR8_ID:
71580b57cec5SDimitry Andric       T = Context.Char8Ty;
71590b57cec5SDimitry Andric       break;
71600b57cec5SDimitry Andric     case PREDEF_TYPE_CHAR16_ID:
71610b57cec5SDimitry Andric       T = Context.Char16Ty;
71620b57cec5SDimitry Andric       break;
71630b57cec5SDimitry Andric     case PREDEF_TYPE_CHAR32_ID:
71640b57cec5SDimitry Andric       T = Context.Char32Ty;
71650b57cec5SDimitry Andric       break;
71660b57cec5SDimitry Andric     case PREDEF_TYPE_OBJC_ID:
71670b57cec5SDimitry Andric       T = Context.ObjCBuiltinIdTy;
71680b57cec5SDimitry Andric       break;
71690b57cec5SDimitry Andric     case PREDEF_TYPE_OBJC_CLASS:
71700b57cec5SDimitry Andric       T = Context.ObjCBuiltinClassTy;
71710b57cec5SDimitry Andric       break;
71720b57cec5SDimitry Andric     case PREDEF_TYPE_OBJC_SEL:
71730b57cec5SDimitry Andric       T = Context.ObjCBuiltinSelTy;
71740b57cec5SDimitry Andric       break;
71750b57cec5SDimitry Andric #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
71760b57cec5SDimitry Andric     case PREDEF_TYPE_##Id##_ID: \
71770b57cec5SDimitry Andric       T = Context.SingletonId; \
71780b57cec5SDimitry Andric       break;
71790b57cec5SDimitry Andric #include "clang/Basic/OpenCLImageTypes.def"
71800b57cec5SDimitry Andric #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
71810b57cec5SDimitry Andric     case PREDEF_TYPE_##Id##_ID: \
71820b57cec5SDimitry Andric       T = Context.Id##Ty; \
71830b57cec5SDimitry Andric       break;
71840b57cec5SDimitry Andric #include "clang/Basic/OpenCLExtensionTypes.def"
71850b57cec5SDimitry Andric     case PREDEF_TYPE_SAMPLER_ID:
71860b57cec5SDimitry Andric       T = Context.OCLSamplerTy;
71870b57cec5SDimitry Andric       break;
71880b57cec5SDimitry Andric     case PREDEF_TYPE_EVENT_ID:
71890b57cec5SDimitry Andric       T = Context.OCLEventTy;
71900b57cec5SDimitry Andric       break;
71910b57cec5SDimitry Andric     case PREDEF_TYPE_CLK_EVENT_ID:
71920b57cec5SDimitry Andric       T = Context.OCLClkEventTy;
71930b57cec5SDimitry Andric       break;
71940b57cec5SDimitry Andric     case PREDEF_TYPE_QUEUE_ID:
71950b57cec5SDimitry Andric       T = Context.OCLQueueTy;
71960b57cec5SDimitry Andric       break;
71970b57cec5SDimitry Andric     case PREDEF_TYPE_RESERVE_ID_ID:
71980b57cec5SDimitry Andric       T = Context.OCLReserveIDTy;
71990b57cec5SDimitry Andric       break;
72000b57cec5SDimitry Andric     case PREDEF_TYPE_AUTO_DEDUCT:
72010b57cec5SDimitry Andric       T = Context.getAutoDeductType();
72020b57cec5SDimitry Andric       break;
72030b57cec5SDimitry Andric     case PREDEF_TYPE_AUTO_RREF_DEDUCT:
72040b57cec5SDimitry Andric       T = Context.getAutoRRefDeductType();
72050b57cec5SDimitry Andric       break;
72060b57cec5SDimitry Andric     case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
72070b57cec5SDimitry Andric       T = Context.ARCUnbridgedCastTy;
72080b57cec5SDimitry Andric       break;
72090b57cec5SDimitry Andric     case PREDEF_TYPE_BUILTIN_FN:
72100b57cec5SDimitry Andric       T = Context.BuiltinFnTy;
72110b57cec5SDimitry Andric       break;
72125ffd83dbSDimitry Andric     case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX:
72135ffd83dbSDimitry Andric       T = Context.IncompleteMatrixIdxTy;
72145ffd83dbSDimitry Andric       break;
72150b57cec5SDimitry Andric     case PREDEF_TYPE_OMP_ARRAY_SECTION:
72160b57cec5SDimitry Andric       T = Context.OMPArraySectionTy;
72170b57cec5SDimitry Andric       break;
72185ffd83dbSDimitry Andric     case PREDEF_TYPE_OMP_ARRAY_SHAPING:
72195ffd83dbSDimitry Andric       T = Context.OMPArraySectionTy;
72205ffd83dbSDimitry Andric       break;
72215ffd83dbSDimitry Andric     case PREDEF_TYPE_OMP_ITERATOR:
72225ffd83dbSDimitry Andric       T = Context.OMPIteratorTy;
72235ffd83dbSDimitry Andric       break;
7224a7dea167SDimitry Andric #define SVE_TYPE(Name, Id, SingletonId) \
7225a7dea167SDimitry Andric     case PREDEF_TYPE_##Id##_ID: \
7226a7dea167SDimitry Andric       T = Context.SingletonId; \
7227a7dea167SDimitry Andric       break;
7228a7dea167SDimitry Andric #include "clang/Basic/AArch64SVEACLETypes.def"
7229e8d8bef9SDimitry Andric #define PPC_VECTOR_TYPE(Name, Id, Size) \
7230e8d8bef9SDimitry Andric     case PREDEF_TYPE_##Id##_ID: \
7231e8d8bef9SDimitry Andric       T = Context.Id##Ty; \
7232e8d8bef9SDimitry Andric       break;
7233e8d8bef9SDimitry Andric #include "clang/Basic/PPCTypes.def"
7234fe6060f1SDimitry Andric #define RVV_TYPE(Name, Id, SingletonId) \
7235fe6060f1SDimitry Andric     case PREDEF_TYPE_##Id##_ID: \
7236fe6060f1SDimitry Andric       T = Context.SingletonId; \
7237fe6060f1SDimitry Andric       break;
7238fe6060f1SDimitry Andric #include "clang/Basic/RISCVVTypes.def"
7239*06c3fb27SDimitry Andric #define WASM_TYPE(Name, Id, SingletonId)                                       \
7240*06c3fb27SDimitry Andric   case PREDEF_TYPE_##Id##_ID:                                                  \
7241*06c3fb27SDimitry Andric     T = Context.SingletonId;                                                   \
7242*06c3fb27SDimitry Andric     break;
7243*06c3fb27SDimitry Andric #include "clang/Basic/WebAssemblyReferenceTypes.def"
72440b57cec5SDimitry Andric     }
72450b57cec5SDimitry Andric 
72460b57cec5SDimitry Andric     assert(!T.isNull() && "Unknown predefined type");
72470b57cec5SDimitry Andric     return T.withFastQualifiers(FastQuals);
72480b57cec5SDimitry Andric   }
72490b57cec5SDimitry Andric 
72500b57cec5SDimitry Andric   Index -= NUM_PREDEF_TYPE_IDS;
72510b57cec5SDimitry Andric   assert(Index < TypesLoaded.size() && "Type index out-of-range");
72520b57cec5SDimitry Andric   if (TypesLoaded[Index].isNull()) {
72530b57cec5SDimitry Andric     TypesLoaded[Index] = readTypeRecord(Index);
72540b57cec5SDimitry Andric     if (TypesLoaded[Index].isNull())
72550b57cec5SDimitry Andric       return QualType();
72560b57cec5SDimitry Andric 
72570b57cec5SDimitry Andric     TypesLoaded[Index]->setFromAST();
72580b57cec5SDimitry Andric     if (DeserializationListener)
72590b57cec5SDimitry Andric       DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
72600b57cec5SDimitry Andric                                         TypesLoaded[Index]);
72610b57cec5SDimitry Andric   }
72620b57cec5SDimitry Andric 
72630b57cec5SDimitry Andric   return TypesLoaded[Index].withFastQualifiers(FastQuals);
72640b57cec5SDimitry Andric }
72650b57cec5SDimitry Andric 
72660b57cec5SDimitry Andric QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
72670b57cec5SDimitry Andric   return GetType(getGlobalTypeID(F, LocalID));
72680b57cec5SDimitry Andric }
72690b57cec5SDimitry Andric 
72700b57cec5SDimitry Andric serialization::TypeID
72710b57cec5SDimitry Andric ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
72720b57cec5SDimitry Andric   unsigned FastQuals = LocalID & Qualifiers::FastMask;
72730b57cec5SDimitry Andric   unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
72740b57cec5SDimitry Andric 
72750b57cec5SDimitry Andric   if (LocalIndex < NUM_PREDEF_TYPE_IDS)
72760b57cec5SDimitry Andric     return LocalID;
72770b57cec5SDimitry Andric 
72780b57cec5SDimitry Andric   if (!F.ModuleOffsetMap.empty())
72790b57cec5SDimitry Andric     ReadModuleOffsetMap(F);
72800b57cec5SDimitry Andric 
72810b57cec5SDimitry Andric   ContinuousRangeMap<uint32_t, int, 2>::iterator I
72820b57cec5SDimitry Andric     = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
72830b57cec5SDimitry Andric   assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
72840b57cec5SDimitry Andric 
72850b57cec5SDimitry Andric   unsigned GlobalIndex = LocalIndex + I->second;
72860b57cec5SDimitry Andric   return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
72870b57cec5SDimitry Andric }
72880b57cec5SDimitry Andric 
72890b57cec5SDimitry Andric TemplateArgumentLocInfo
7290480093f4SDimitry Andric ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) {
72910b57cec5SDimitry Andric   switch (Kind) {
72920b57cec5SDimitry Andric   case TemplateArgument::Expression:
7293480093f4SDimitry Andric     return readExpr();
72940b57cec5SDimitry Andric   case TemplateArgument::Type:
7295480093f4SDimitry Andric     return readTypeSourceInfo();
72960b57cec5SDimitry Andric   case TemplateArgument::Template: {
7297480093f4SDimitry Andric     NestedNameSpecifierLoc QualifierLoc =
7298480093f4SDimitry Andric       readNestedNameSpecifierLoc();
7299480093f4SDimitry Andric     SourceLocation TemplateNameLoc = readSourceLocation();
7300e8d8bef9SDimitry Andric     return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7301e8d8bef9SDimitry Andric                                    TemplateNameLoc, SourceLocation());
73020b57cec5SDimitry Andric   }
73030b57cec5SDimitry Andric   case TemplateArgument::TemplateExpansion: {
7304480093f4SDimitry Andric     NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc();
7305480093f4SDimitry Andric     SourceLocation TemplateNameLoc = readSourceLocation();
7306480093f4SDimitry Andric     SourceLocation EllipsisLoc = readSourceLocation();
7307e8d8bef9SDimitry Andric     return TemplateArgumentLocInfo(getASTContext(), QualifierLoc,
7308e8d8bef9SDimitry Andric                                    TemplateNameLoc, EllipsisLoc);
73090b57cec5SDimitry Andric   }
73100b57cec5SDimitry Andric   case TemplateArgument::Null:
73110b57cec5SDimitry Andric   case TemplateArgument::Integral:
73120b57cec5SDimitry Andric   case TemplateArgument::Declaration:
73130b57cec5SDimitry Andric   case TemplateArgument::NullPtr:
73140b57cec5SDimitry Andric   case TemplateArgument::Pack:
73150b57cec5SDimitry Andric     // FIXME: Is this right?
73160b57cec5SDimitry Andric     return TemplateArgumentLocInfo();
73170b57cec5SDimitry Andric   }
73180b57cec5SDimitry Andric   llvm_unreachable("unexpected template argument loc");
73190b57cec5SDimitry Andric }
73200b57cec5SDimitry Andric 
7321480093f4SDimitry Andric TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() {
7322480093f4SDimitry Andric   TemplateArgument Arg = readTemplateArgument();
73230b57cec5SDimitry Andric 
73240b57cec5SDimitry Andric   if (Arg.getKind() == TemplateArgument::Expression) {
7325480093f4SDimitry Andric     if (readBool()) // bool InfoHasSameExpr.
73260b57cec5SDimitry Andric       return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
73270b57cec5SDimitry Andric   }
7328480093f4SDimitry Andric   return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind()));
73290b57cec5SDimitry Andric }
73300b57cec5SDimitry Andric 
73310b57cec5SDimitry Andric const ASTTemplateArgumentListInfo *
7332480093f4SDimitry Andric ASTRecordReader::readASTTemplateArgumentListInfo() {
7333480093f4SDimitry Andric   SourceLocation LAngleLoc = readSourceLocation();
7334480093f4SDimitry Andric   SourceLocation RAngleLoc = readSourceLocation();
7335480093f4SDimitry Andric   unsigned NumArgsAsWritten = readInt();
73360b57cec5SDimitry Andric   TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
73370b57cec5SDimitry Andric   for (unsigned i = 0; i != NumArgsAsWritten; ++i)
7338480093f4SDimitry Andric     TemplArgsInfo.addArgument(readTemplateArgumentLoc());
73390b57cec5SDimitry Andric   return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
73400b57cec5SDimitry Andric }
73410b57cec5SDimitry Andric 
73420b57cec5SDimitry Andric Decl *ASTReader::GetExternalDecl(uint32_t ID) {
73430b57cec5SDimitry Andric   return GetDecl(ID);
73440b57cec5SDimitry Andric }
73450b57cec5SDimitry Andric 
73460b57cec5SDimitry Andric void ASTReader::CompleteRedeclChain(const Decl *D) {
73470b57cec5SDimitry Andric   if (NumCurrentElementsDeserializing) {
73480b57cec5SDimitry Andric     // We arrange to not care about the complete redeclaration chain while we're
73490b57cec5SDimitry Andric     // deserializing. Just remember that the AST has marked this one as complete
73500b57cec5SDimitry Andric     // but that it's not actually complete yet, so we know we still need to
73510b57cec5SDimitry Andric     // complete it later.
73520b57cec5SDimitry Andric     PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
73530b57cec5SDimitry Andric     return;
73540b57cec5SDimitry Andric   }
73550b57cec5SDimitry Andric 
7356fe6060f1SDimitry Andric   if (!D->getDeclContext()) {
7357fe6060f1SDimitry Andric     assert(isa<TranslationUnitDecl>(D) && "Not a TU?");
7358fe6060f1SDimitry Andric     return;
7359fe6060f1SDimitry Andric   }
7360fe6060f1SDimitry Andric 
73610b57cec5SDimitry Andric   const DeclContext *DC = D->getDeclContext()->getRedeclContext();
73620b57cec5SDimitry Andric 
73630b57cec5SDimitry Andric   // If this is a named declaration, complete it by looking it up
73640b57cec5SDimitry Andric   // within its context.
73650b57cec5SDimitry Andric   //
73660b57cec5SDimitry Andric   // FIXME: Merging a function definition should merge
73670b57cec5SDimitry Andric   // all mergeable entities within it.
7368bdd1243dSDimitry Andric   if (isa<TranslationUnitDecl, NamespaceDecl, RecordDecl, EnumDecl>(DC)) {
73690b57cec5SDimitry Andric     if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
73700b57cec5SDimitry Andric       if (!getContext().getLangOpts().CPlusPlus &&
73710b57cec5SDimitry Andric           isa<TranslationUnitDecl>(DC)) {
73720b57cec5SDimitry Andric         // Outside of C++, we don't have a lookup table for the TU, so update
73730b57cec5SDimitry Andric         // the identifier instead. (For C++ modules, we don't store decls
73740b57cec5SDimitry Andric         // in the serialized identifier table, so we do the lookup in the TU.)
73750b57cec5SDimitry Andric         auto *II = Name.getAsIdentifierInfo();
73760b57cec5SDimitry Andric         assert(II && "non-identifier name in C?");
73770b57cec5SDimitry Andric         if (II->isOutOfDate())
73780b57cec5SDimitry Andric           updateOutOfDateIdentifier(*II);
73790b57cec5SDimitry Andric       } else
73800b57cec5SDimitry Andric         DC->lookup(Name);
73810b57cec5SDimitry Andric     } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
73820b57cec5SDimitry Andric       // Find all declarations of this kind from the relevant context.
73830b57cec5SDimitry Andric       for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
73840b57cec5SDimitry Andric         auto *DC = cast<DeclContext>(DCDecl);
73850b57cec5SDimitry Andric         SmallVector<Decl*, 8> Decls;
73860b57cec5SDimitry Andric         FindExternalLexicalDecls(
73870b57cec5SDimitry Andric             DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
73880b57cec5SDimitry Andric       }
73890b57cec5SDimitry Andric     }
73900b57cec5SDimitry Andric   }
73910b57cec5SDimitry Andric 
73920b57cec5SDimitry Andric   if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
73930b57cec5SDimitry Andric     CTSD->getSpecializedTemplate()->LoadLazySpecializations();
73940b57cec5SDimitry Andric   if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
73950b57cec5SDimitry Andric     VTSD->getSpecializedTemplate()->LoadLazySpecializations();
73960b57cec5SDimitry Andric   if (auto *FD = dyn_cast<FunctionDecl>(D)) {
73970b57cec5SDimitry Andric     if (auto *Template = FD->getPrimaryTemplate())
73980b57cec5SDimitry Andric       Template->LoadLazySpecializations();
73990b57cec5SDimitry Andric   }
74000b57cec5SDimitry Andric }
74010b57cec5SDimitry Andric 
74020b57cec5SDimitry Andric CXXCtorInitializer **
74030b57cec5SDimitry Andric ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
74040b57cec5SDimitry Andric   RecordLocation Loc = getLocalBitOffset(Offset);
74050b57cec5SDimitry Andric   BitstreamCursor &Cursor = Loc.F->DeclsCursor;
74060b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Cursor);
74070b57cec5SDimitry Andric   if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
74080b57cec5SDimitry Andric     Error(std::move(Err));
74090b57cec5SDimitry Andric     return nullptr;
74100b57cec5SDimitry Andric   }
74110b57cec5SDimitry Andric   ReadingKindTracker ReadingKind(Read_Decl, *this);
7412*06c3fb27SDimitry Andric   Deserializing D(this);
74130b57cec5SDimitry Andric 
74140b57cec5SDimitry Andric   Expected<unsigned> MaybeCode = Cursor.ReadCode();
74150b57cec5SDimitry Andric   if (!MaybeCode) {
74160b57cec5SDimitry Andric     Error(MaybeCode.takeError());
74170b57cec5SDimitry Andric     return nullptr;
74180b57cec5SDimitry Andric   }
74190b57cec5SDimitry Andric   unsigned Code = MaybeCode.get();
74200b57cec5SDimitry Andric 
7421480093f4SDimitry Andric   ASTRecordReader Record(*this, *Loc.F);
7422480093f4SDimitry Andric   Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
74230b57cec5SDimitry Andric   if (!MaybeRecCode) {
74240b57cec5SDimitry Andric     Error(MaybeRecCode.takeError());
74250b57cec5SDimitry Andric     return nullptr;
74260b57cec5SDimitry Andric   }
74270b57cec5SDimitry Andric   if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) {
74280b57cec5SDimitry Andric     Error("malformed AST file: missing C++ ctor initializers");
74290b57cec5SDimitry Andric     return nullptr;
74300b57cec5SDimitry Andric   }
74310b57cec5SDimitry Andric 
7432480093f4SDimitry Andric   return Record.readCXXCtorInitializers();
74330b57cec5SDimitry Andric }
74340b57cec5SDimitry Andric 
74350b57cec5SDimitry Andric CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
74360b57cec5SDimitry Andric   assert(ContextObj && "reading base specifiers with no AST context");
74370b57cec5SDimitry Andric   ASTContext &Context = *ContextObj;
74380b57cec5SDimitry Andric 
74390b57cec5SDimitry Andric   RecordLocation Loc = getLocalBitOffset(Offset);
74400b57cec5SDimitry Andric   BitstreamCursor &Cursor = Loc.F->DeclsCursor;
74410b57cec5SDimitry Andric   SavedStreamPosition SavedPosition(Cursor);
74420b57cec5SDimitry Andric   if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
74430b57cec5SDimitry Andric     Error(std::move(Err));
74440b57cec5SDimitry Andric     return nullptr;
74450b57cec5SDimitry Andric   }
74460b57cec5SDimitry Andric   ReadingKindTracker ReadingKind(Read_Decl, *this);
7447*06c3fb27SDimitry Andric   Deserializing D(this);
74480b57cec5SDimitry Andric 
74490b57cec5SDimitry Andric   Expected<unsigned> MaybeCode = Cursor.ReadCode();
74500b57cec5SDimitry Andric   if (!MaybeCode) {
74510b57cec5SDimitry Andric     Error(MaybeCode.takeError());
74520b57cec5SDimitry Andric     return nullptr;
74530b57cec5SDimitry Andric   }
74540b57cec5SDimitry Andric   unsigned Code = MaybeCode.get();
74550b57cec5SDimitry Andric 
7456480093f4SDimitry Andric   ASTRecordReader Record(*this, *Loc.F);
7457480093f4SDimitry Andric   Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code);
74580b57cec5SDimitry Andric   if (!MaybeRecCode) {
74590b57cec5SDimitry Andric     Error(MaybeCode.takeError());
74600b57cec5SDimitry Andric     return nullptr;
74610b57cec5SDimitry Andric   }
74620b57cec5SDimitry Andric   unsigned RecCode = MaybeRecCode.get();
74630b57cec5SDimitry Andric 
74640b57cec5SDimitry Andric   if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
74650b57cec5SDimitry Andric     Error("malformed AST file: missing C++ base specifiers");
74660b57cec5SDimitry Andric     return nullptr;
74670b57cec5SDimitry Andric   }
74680b57cec5SDimitry Andric 
7469480093f4SDimitry Andric   unsigned NumBases = Record.readInt();
74700b57cec5SDimitry Andric   void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
74710b57cec5SDimitry Andric   CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
74720b57cec5SDimitry Andric   for (unsigned I = 0; I != NumBases; ++I)
7473480093f4SDimitry Andric     Bases[I] = Record.readCXXBaseSpecifier();
74740b57cec5SDimitry Andric   return Bases;
74750b57cec5SDimitry Andric }
74760b57cec5SDimitry Andric 
74770b57cec5SDimitry Andric serialization::DeclID
74780b57cec5SDimitry Andric ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
74790b57cec5SDimitry Andric   if (LocalID < NUM_PREDEF_DECL_IDS)
74800b57cec5SDimitry Andric     return LocalID;
74810b57cec5SDimitry Andric 
74820b57cec5SDimitry Andric   if (!F.ModuleOffsetMap.empty())
74830b57cec5SDimitry Andric     ReadModuleOffsetMap(F);
74840b57cec5SDimitry Andric 
74850b57cec5SDimitry Andric   ContinuousRangeMap<uint32_t, int, 2>::iterator I
74860b57cec5SDimitry Andric     = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
74870b57cec5SDimitry Andric   assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
74880b57cec5SDimitry Andric 
74890b57cec5SDimitry Andric   return LocalID + I->second;
74900b57cec5SDimitry Andric }
74910b57cec5SDimitry Andric 
74920b57cec5SDimitry Andric bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
74930b57cec5SDimitry Andric                                    ModuleFile &M) const {
74940b57cec5SDimitry Andric   // Predefined decls aren't from any module.
74950b57cec5SDimitry Andric   if (ID < NUM_PREDEF_DECL_IDS)
74960b57cec5SDimitry Andric     return false;
74970b57cec5SDimitry Andric 
74980b57cec5SDimitry Andric   return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
74990b57cec5SDimitry Andric          ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
75000b57cec5SDimitry Andric }
75010b57cec5SDimitry Andric 
75020b57cec5SDimitry Andric ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
75030b57cec5SDimitry Andric   if (!D->isFromASTFile())
75040b57cec5SDimitry Andric     return nullptr;
75050b57cec5SDimitry Andric   GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
75060b57cec5SDimitry Andric   assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
75070b57cec5SDimitry Andric   return I->second;
75080b57cec5SDimitry Andric }
75090b57cec5SDimitry Andric 
75100b57cec5SDimitry Andric SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
75110b57cec5SDimitry Andric   if (ID < NUM_PREDEF_DECL_IDS)
75120b57cec5SDimitry Andric     return SourceLocation();
75130b57cec5SDimitry Andric 
75140b57cec5SDimitry Andric   unsigned Index = ID - NUM_PREDEF_DECL_IDS;
75150b57cec5SDimitry Andric 
75160b57cec5SDimitry Andric   if (Index > DeclsLoaded.size()) {
75170b57cec5SDimitry Andric     Error("declaration ID out-of-range for AST file");
75180b57cec5SDimitry Andric     return SourceLocation();
75190b57cec5SDimitry Andric   }
75200b57cec5SDimitry Andric 
75210b57cec5SDimitry Andric   if (Decl *D = DeclsLoaded[Index])
75220b57cec5SDimitry Andric     return D->getLocation();
75230b57cec5SDimitry Andric 
75240b57cec5SDimitry Andric   SourceLocation Loc;
75250b57cec5SDimitry Andric   DeclCursorForID(ID, Loc);
75260b57cec5SDimitry Andric   return Loc;
75270b57cec5SDimitry Andric }
75280b57cec5SDimitry Andric 
75290b57cec5SDimitry Andric static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
75300b57cec5SDimitry Andric   switch (ID) {
75310b57cec5SDimitry Andric   case PREDEF_DECL_NULL_ID:
75320b57cec5SDimitry Andric     return nullptr;
75330b57cec5SDimitry Andric 
75340b57cec5SDimitry Andric   case PREDEF_DECL_TRANSLATION_UNIT_ID:
75350b57cec5SDimitry Andric     return Context.getTranslationUnitDecl();
75360b57cec5SDimitry Andric 
75370b57cec5SDimitry Andric   case PREDEF_DECL_OBJC_ID_ID:
75380b57cec5SDimitry Andric     return Context.getObjCIdDecl();
75390b57cec5SDimitry Andric 
75400b57cec5SDimitry Andric   case PREDEF_DECL_OBJC_SEL_ID:
75410b57cec5SDimitry Andric     return Context.getObjCSelDecl();
75420b57cec5SDimitry Andric 
75430b57cec5SDimitry Andric   case PREDEF_DECL_OBJC_CLASS_ID:
75440b57cec5SDimitry Andric     return Context.getObjCClassDecl();
75450b57cec5SDimitry Andric 
75460b57cec5SDimitry Andric   case PREDEF_DECL_OBJC_PROTOCOL_ID:
75470b57cec5SDimitry Andric     return Context.getObjCProtocolDecl();
75480b57cec5SDimitry Andric 
75490b57cec5SDimitry Andric   case PREDEF_DECL_INT_128_ID:
75500b57cec5SDimitry Andric     return Context.getInt128Decl();
75510b57cec5SDimitry Andric 
75520b57cec5SDimitry Andric   case PREDEF_DECL_UNSIGNED_INT_128_ID:
75530b57cec5SDimitry Andric     return Context.getUInt128Decl();
75540b57cec5SDimitry Andric 
75550b57cec5SDimitry Andric   case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
75560b57cec5SDimitry Andric     return Context.getObjCInstanceTypeDecl();
75570b57cec5SDimitry Andric 
75580b57cec5SDimitry Andric   case PREDEF_DECL_BUILTIN_VA_LIST_ID:
75590b57cec5SDimitry Andric     return Context.getBuiltinVaListDecl();
75600b57cec5SDimitry Andric 
75610b57cec5SDimitry Andric   case PREDEF_DECL_VA_LIST_TAG:
75620b57cec5SDimitry Andric     return Context.getVaListTagDecl();
75630b57cec5SDimitry Andric 
75640b57cec5SDimitry Andric   case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
75650b57cec5SDimitry Andric     return Context.getBuiltinMSVaListDecl();
75660b57cec5SDimitry Andric 
75675ffd83dbSDimitry Andric   case PREDEF_DECL_BUILTIN_MS_GUID_ID:
75685ffd83dbSDimitry Andric     return Context.getMSGuidTagDecl();
75695ffd83dbSDimitry Andric 
75700b57cec5SDimitry Andric   case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
75710b57cec5SDimitry Andric     return Context.getExternCContextDecl();
75720b57cec5SDimitry Andric 
75730b57cec5SDimitry Andric   case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
75740b57cec5SDimitry Andric     return Context.getMakeIntegerSeqDecl();
75750b57cec5SDimitry Andric 
75760b57cec5SDimitry Andric   case PREDEF_DECL_CF_CONSTANT_STRING_ID:
75770b57cec5SDimitry Andric     return Context.getCFConstantStringDecl();
75780b57cec5SDimitry Andric 
75790b57cec5SDimitry Andric   case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
75800b57cec5SDimitry Andric     return Context.getCFConstantStringTagDecl();
75810b57cec5SDimitry Andric 
75820b57cec5SDimitry Andric   case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
75830b57cec5SDimitry Andric     return Context.getTypePackElementDecl();
75840b57cec5SDimitry Andric   }
75850b57cec5SDimitry Andric   llvm_unreachable("PredefinedDeclIDs unknown enum value");
75860b57cec5SDimitry Andric }
75870b57cec5SDimitry Andric 
75880b57cec5SDimitry Andric Decl *ASTReader::GetExistingDecl(DeclID ID) {
75890b57cec5SDimitry Andric   assert(ContextObj && "reading decl with no AST context");
75900b57cec5SDimitry Andric   if (ID < NUM_PREDEF_DECL_IDS) {
75910b57cec5SDimitry Andric     Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID);
75920b57cec5SDimitry Andric     if (D) {
75930b57cec5SDimitry Andric       // Track that we have merged the declaration with ID \p ID into the
75940b57cec5SDimitry Andric       // pre-existing predefined declaration \p D.
75950b57cec5SDimitry Andric       auto &Merged = KeyDecls[D->getCanonicalDecl()];
75960b57cec5SDimitry Andric       if (Merged.empty())
75970b57cec5SDimitry Andric         Merged.push_back(ID);
75980b57cec5SDimitry Andric     }
75990b57cec5SDimitry Andric     return D;
76000b57cec5SDimitry Andric   }
76010b57cec5SDimitry Andric 
76020b57cec5SDimitry Andric   unsigned Index = ID - NUM_PREDEF_DECL_IDS;
76030b57cec5SDimitry Andric 
76040b57cec5SDimitry Andric   if (Index >= DeclsLoaded.size()) {
76050b57cec5SDimitry Andric     assert(0 && "declaration ID out-of-range for AST file");
76060b57cec5SDimitry Andric     Error("declaration ID out-of-range for AST file");
76070b57cec5SDimitry Andric     return nullptr;
76080b57cec5SDimitry Andric   }
76090b57cec5SDimitry Andric 
76100b57cec5SDimitry Andric   return DeclsLoaded[Index];
76110b57cec5SDimitry Andric }
76120b57cec5SDimitry Andric 
76130b57cec5SDimitry Andric Decl *ASTReader::GetDecl(DeclID ID) {
76140b57cec5SDimitry Andric   if (ID < NUM_PREDEF_DECL_IDS)
76150b57cec5SDimitry Andric     return GetExistingDecl(ID);
76160b57cec5SDimitry Andric 
76170b57cec5SDimitry Andric   unsigned Index = ID - NUM_PREDEF_DECL_IDS;
76180b57cec5SDimitry Andric 
76190b57cec5SDimitry Andric   if (Index >= DeclsLoaded.size()) {
76200b57cec5SDimitry Andric     assert(0 && "declaration ID out-of-range for AST file");
76210b57cec5SDimitry Andric     Error("declaration ID out-of-range for AST file");
76220b57cec5SDimitry Andric     return nullptr;
76230b57cec5SDimitry Andric   }
76240b57cec5SDimitry Andric 
76250b57cec5SDimitry Andric   if (!DeclsLoaded[Index]) {
76260b57cec5SDimitry Andric     ReadDeclRecord(ID);
76270b57cec5SDimitry Andric     if (DeserializationListener)
76280b57cec5SDimitry Andric       DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
76290b57cec5SDimitry Andric   }
76300b57cec5SDimitry Andric 
76310b57cec5SDimitry Andric   return DeclsLoaded[Index];
76320b57cec5SDimitry Andric }
76330b57cec5SDimitry Andric 
76340b57cec5SDimitry Andric DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
76350b57cec5SDimitry Andric                                                   DeclID GlobalID) {
76360b57cec5SDimitry Andric   if (GlobalID < NUM_PREDEF_DECL_IDS)
76370b57cec5SDimitry Andric     return GlobalID;
76380b57cec5SDimitry Andric 
76390b57cec5SDimitry Andric   GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
76400b57cec5SDimitry Andric   assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
76410b57cec5SDimitry Andric   ModuleFile *Owner = I->second;
76420b57cec5SDimitry Andric 
76430b57cec5SDimitry Andric   llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
76440b57cec5SDimitry Andric     = M.GlobalToLocalDeclIDs.find(Owner);
76450b57cec5SDimitry Andric   if (Pos == M.GlobalToLocalDeclIDs.end())
76460b57cec5SDimitry Andric     return 0;
76470b57cec5SDimitry Andric 
76480b57cec5SDimitry Andric   return GlobalID - Owner->BaseDeclID + Pos->second;
76490b57cec5SDimitry Andric }
76500b57cec5SDimitry Andric 
76510b57cec5SDimitry Andric serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
76520b57cec5SDimitry Andric                                             const RecordData &Record,
76530b57cec5SDimitry Andric                                             unsigned &Idx) {
76540b57cec5SDimitry Andric   if (Idx >= Record.size()) {
76550b57cec5SDimitry Andric     Error("Corrupted AST file");
76560b57cec5SDimitry Andric     return 0;
76570b57cec5SDimitry Andric   }
76580b57cec5SDimitry Andric 
76590b57cec5SDimitry Andric   return getGlobalDeclID(F, Record[Idx++]);
76600b57cec5SDimitry Andric }
76610b57cec5SDimitry Andric 
76620b57cec5SDimitry Andric /// Resolve the offset of a statement into a statement.
76630b57cec5SDimitry Andric ///
76640b57cec5SDimitry Andric /// This operation will read a new statement from the external
76650b57cec5SDimitry Andric /// source each time it is called, and is meant to be used via a
76660b57cec5SDimitry Andric /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
76670b57cec5SDimitry Andric Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
76680b57cec5SDimitry Andric   // Switch case IDs are per Decl.
76690b57cec5SDimitry Andric   ClearSwitchCaseIDs();
76700b57cec5SDimitry Andric 
76710b57cec5SDimitry Andric   // Offset here is a global offset across the entire chain.
76720b57cec5SDimitry Andric   RecordLocation Loc = getLocalBitOffset(Offset);
76730b57cec5SDimitry Andric   if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) {
76740b57cec5SDimitry Andric     Error(std::move(Err));
76750b57cec5SDimitry Andric     return nullptr;
76760b57cec5SDimitry Andric   }
76770b57cec5SDimitry Andric   assert(NumCurrentElementsDeserializing == 0 &&
76780b57cec5SDimitry Andric          "should not be called while already deserializing");
76790b57cec5SDimitry Andric   Deserializing D(this);
76800b57cec5SDimitry Andric   return ReadStmtFromStream(*Loc.F);
76810b57cec5SDimitry Andric }
76820b57cec5SDimitry Andric 
76830b57cec5SDimitry Andric void ASTReader::FindExternalLexicalDecls(
76840b57cec5SDimitry Andric     const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
76850b57cec5SDimitry Andric     SmallVectorImpl<Decl *> &Decls) {
76860b57cec5SDimitry Andric   bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
76870b57cec5SDimitry Andric 
76880b57cec5SDimitry Andric   auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
76890b57cec5SDimitry Andric     assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
76900b57cec5SDimitry Andric     for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
76910b57cec5SDimitry Andric       auto K = (Decl::Kind)+LexicalDecls[I];
76920b57cec5SDimitry Andric       if (!IsKindWeWant(K))
76930b57cec5SDimitry Andric         continue;
76940b57cec5SDimitry Andric 
76950b57cec5SDimitry Andric       auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
76960b57cec5SDimitry Andric 
76970b57cec5SDimitry Andric       // Don't add predefined declarations to the lexical context more
76980b57cec5SDimitry Andric       // than once.
76990b57cec5SDimitry Andric       if (ID < NUM_PREDEF_DECL_IDS) {
77000b57cec5SDimitry Andric         if (PredefsVisited[ID])
77010b57cec5SDimitry Andric           continue;
77020b57cec5SDimitry Andric 
77030b57cec5SDimitry Andric         PredefsVisited[ID] = true;
77040b57cec5SDimitry Andric       }
77050b57cec5SDimitry Andric 
77060b57cec5SDimitry Andric       if (Decl *D = GetLocalDecl(*M, ID)) {
77070b57cec5SDimitry Andric         assert(D->getKind() == K && "wrong kind for lexical decl");
77080b57cec5SDimitry Andric         if (!DC->isDeclInLexicalTraversal(D))
77090b57cec5SDimitry Andric           Decls.push_back(D);
77100b57cec5SDimitry Andric       }
77110b57cec5SDimitry Andric     }
77120b57cec5SDimitry Andric   };
77130b57cec5SDimitry Andric 
77140b57cec5SDimitry Andric   if (isa<TranslationUnitDecl>(DC)) {
7715*06c3fb27SDimitry Andric     for (const auto &Lexical : TULexicalDecls)
77160b57cec5SDimitry Andric       Visit(Lexical.first, Lexical.second);
77170b57cec5SDimitry Andric   } else {
77180b57cec5SDimitry Andric     auto I = LexicalDecls.find(DC);
77190b57cec5SDimitry Andric     if (I != LexicalDecls.end())
77200b57cec5SDimitry Andric       Visit(I->second.first, I->second.second);
77210b57cec5SDimitry Andric   }
77220b57cec5SDimitry Andric 
77230b57cec5SDimitry Andric   ++NumLexicalDeclContextsRead;
77240b57cec5SDimitry Andric }
77250b57cec5SDimitry Andric 
77260b57cec5SDimitry Andric namespace {
77270b57cec5SDimitry Andric 
77280b57cec5SDimitry Andric class DeclIDComp {
77290b57cec5SDimitry Andric   ASTReader &Reader;
77300b57cec5SDimitry Andric   ModuleFile &Mod;
77310b57cec5SDimitry Andric 
77320b57cec5SDimitry Andric public:
77330b57cec5SDimitry Andric   DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
77340b57cec5SDimitry Andric 
77350b57cec5SDimitry Andric   bool operator()(LocalDeclID L, LocalDeclID R) const {
77360b57cec5SDimitry Andric     SourceLocation LHS = getLocation(L);
77370b57cec5SDimitry Andric     SourceLocation RHS = getLocation(R);
77380b57cec5SDimitry Andric     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
77390b57cec5SDimitry Andric   }
77400b57cec5SDimitry Andric 
77410b57cec5SDimitry Andric   bool operator()(SourceLocation LHS, LocalDeclID R) const {
77420b57cec5SDimitry Andric     SourceLocation RHS = getLocation(R);
77430b57cec5SDimitry Andric     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
77440b57cec5SDimitry Andric   }
77450b57cec5SDimitry Andric 
77460b57cec5SDimitry Andric   bool operator()(LocalDeclID L, SourceLocation RHS) const {
77470b57cec5SDimitry Andric     SourceLocation LHS = getLocation(L);
77480b57cec5SDimitry Andric     return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
77490b57cec5SDimitry Andric   }
77500b57cec5SDimitry Andric 
77510b57cec5SDimitry Andric   SourceLocation getLocation(LocalDeclID ID) const {
77520b57cec5SDimitry Andric     return Reader.getSourceManager().getFileLoc(
77530b57cec5SDimitry Andric             Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
77540b57cec5SDimitry Andric   }
77550b57cec5SDimitry Andric };
77560b57cec5SDimitry Andric 
77570b57cec5SDimitry Andric } // namespace
77580b57cec5SDimitry Andric 
77590b57cec5SDimitry Andric void ASTReader::FindFileRegionDecls(FileID File,
77600b57cec5SDimitry Andric                                     unsigned Offset, unsigned Length,
77610b57cec5SDimitry Andric                                     SmallVectorImpl<Decl *> &Decls) {
77620b57cec5SDimitry Andric   SourceManager &SM = getSourceManager();
77630b57cec5SDimitry Andric 
77640b57cec5SDimitry Andric   llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
77650b57cec5SDimitry Andric   if (I == FileDeclIDs.end())
77660b57cec5SDimitry Andric     return;
77670b57cec5SDimitry Andric 
77680b57cec5SDimitry Andric   FileDeclsInfo &DInfo = I->second;
77690b57cec5SDimitry Andric   if (DInfo.Decls.empty())
77700b57cec5SDimitry Andric     return;
77710b57cec5SDimitry Andric 
77720b57cec5SDimitry Andric   SourceLocation
77730b57cec5SDimitry Andric     BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
77740b57cec5SDimitry Andric   SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
77750b57cec5SDimitry Andric 
77760b57cec5SDimitry Andric   DeclIDComp DIDComp(*this, *DInfo.Mod);
77770b57cec5SDimitry Andric   ArrayRef<serialization::LocalDeclID>::iterator BeginIt =
77780b57cec5SDimitry Andric       llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
77790b57cec5SDimitry Andric   if (BeginIt != DInfo.Decls.begin())
77800b57cec5SDimitry Andric     --BeginIt;
77810b57cec5SDimitry Andric 
77820b57cec5SDimitry Andric   // If we are pointing at a top-level decl inside an objc container, we need
77830b57cec5SDimitry Andric   // to backtrack until we find it otherwise we will fail to report that the
77840b57cec5SDimitry Andric   // region overlaps with an objc container.
77850b57cec5SDimitry Andric   while (BeginIt != DInfo.Decls.begin() &&
77860b57cec5SDimitry Andric          GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
77870b57cec5SDimitry Andric              ->isTopLevelDeclInObjCContainer())
77880b57cec5SDimitry Andric     --BeginIt;
77890b57cec5SDimitry Andric 
77900b57cec5SDimitry Andric   ArrayRef<serialization::LocalDeclID>::iterator EndIt =
77910b57cec5SDimitry Andric       llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
77920b57cec5SDimitry Andric   if (EndIt != DInfo.Decls.end())
77930b57cec5SDimitry Andric     ++EndIt;
77940b57cec5SDimitry Andric 
77950b57cec5SDimitry Andric   for (ArrayRef<serialization::LocalDeclID>::iterator
77960b57cec5SDimitry Andric          DIt = BeginIt; DIt != EndIt; ++DIt)
77970b57cec5SDimitry Andric     Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
77980b57cec5SDimitry Andric }
77990b57cec5SDimitry Andric 
78000b57cec5SDimitry Andric bool
78010b57cec5SDimitry Andric ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
78020b57cec5SDimitry Andric                                           DeclarationName Name) {
78030b57cec5SDimitry Andric   assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
78040b57cec5SDimitry Andric          "DeclContext has no visible decls in storage");
78050b57cec5SDimitry Andric   if (!Name)
78060b57cec5SDimitry Andric     return false;
78070b57cec5SDimitry Andric 
78080b57cec5SDimitry Andric   auto It = Lookups.find(DC);
78090b57cec5SDimitry Andric   if (It == Lookups.end())
78100b57cec5SDimitry Andric     return false;
78110b57cec5SDimitry Andric 
78120b57cec5SDimitry Andric   Deserializing LookupResults(this);
78130b57cec5SDimitry Andric 
78140b57cec5SDimitry Andric   // Load the list of declarations.
78150b57cec5SDimitry Andric   SmallVector<NamedDecl *, 64> Decls;
7816fe6060f1SDimitry Andric   llvm::SmallPtrSet<NamedDecl *, 8> Found;
78170b57cec5SDimitry Andric   for (DeclID ID : It->second.Table.find(Name)) {
78180b57cec5SDimitry Andric     NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
7819fe6060f1SDimitry Andric     if (ND->getDeclName() == Name && Found.insert(ND).second)
78200b57cec5SDimitry Andric       Decls.push_back(ND);
78210b57cec5SDimitry Andric   }
78220b57cec5SDimitry Andric 
78230b57cec5SDimitry Andric   ++NumVisibleDeclContextsRead;
78240b57cec5SDimitry Andric   SetExternalVisibleDeclsForName(DC, Name, Decls);
78250b57cec5SDimitry Andric   return !Decls.empty();
78260b57cec5SDimitry Andric }
78270b57cec5SDimitry Andric 
78280b57cec5SDimitry Andric void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
78290b57cec5SDimitry Andric   if (!DC->hasExternalVisibleStorage())
78300b57cec5SDimitry Andric     return;
78310b57cec5SDimitry Andric 
78320b57cec5SDimitry Andric   auto It = Lookups.find(DC);
78330b57cec5SDimitry Andric   assert(It != Lookups.end() &&
78340b57cec5SDimitry Andric          "have external visible storage but no lookup tables");
78350b57cec5SDimitry Andric 
78360b57cec5SDimitry Andric   DeclsMap Decls;
78370b57cec5SDimitry Andric 
78380b57cec5SDimitry Andric   for (DeclID ID : It->second.Table.findAll()) {
78390b57cec5SDimitry Andric     NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
78400b57cec5SDimitry Andric     Decls[ND->getDeclName()].push_back(ND);
78410b57cec5SDimitry Andric   }
78420b57cec5SDimitry Andric 
78430b57cec5SDimitry Andric   ++NumVisibleDeclContextsRead;
78440b57cec5SDimitry Andric 
78450b57cec5SDimitry Andric   for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
78460b57cec5SDimitry Andric     SetExternalVisibleDeclsForName(DC, I->first, I->second);
78470b57cec5SDimitry Andric   }
78480b57cec5SDimitry Andric   const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
78490b57cec5SDimitry Andric }
78500b57cec5SDimitry Andric 
78510b57cec5SDimitry Andric const serialization::reader::DeclContextLookupTable *
78520b57cec5SDimitry Andric ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
78530b57cec5SDimitry Andric   auto I = Lookups.find(Primary);
78540b57cec5SDimitry Andric   return I == Lookups.end() ? nullptr : &I->second;
78550b57cec5SDimitry Andric }
78560b57cec5SDimitry Andric 
78570b57cec5SDimitry Andric /// Under non-PCH compilation the consumer receives the objc methods
78580b57cec5SDimitry Andric /// before receiving the implementation, and codegen depends on this.
78590b57cec5SDimitry Andric /// We simulate this by deserializing and passing to consumer the methods of the
78600b57cec5SDimitry Andric /// implementation before passing the deserialized implementation decl.
78610b57cec5SDimitry Andric static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
78620b57cec5SDimitry Andric                                        ASTConsumer *Consumer) {
78630b57cec5SDimitry Andric   assert(ImplD && Consumer);
78640b57cec5SDimitry Andric 
78650b57cec5SDimitry Andric   for (auto *I : ImplD->methods())
78660b57cec5SDimitry Andric     Consumer->HandleInterestingDecl(DeclGroupRef(I));
78670b57cec5SDimitry Andric 
78680b57cec5SDimitry Andric   Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
78690b57cec5SDimitry Andric }
78700b57cec5SDimitry Andric 
78710b57cec5SDimitry Andric void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
78720b57cec5SDimitry Andric   if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
78730b57cec5SDimitry Andric     PassObjCImplDeclToConsumer(ImplD, Consumer);
78740b57cec5SDimitry Andric   else
78750b57cec5SDimitry Andric     Consumer->HandleInterestingDecl(DeclGroupRef(D));
78760b57cec5SDimitry Andric }
78770b57cec5SDimitry Andric 
78780b57cec5SDimitry Andric void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
78790b57cec5SDimitry Andric   this->Consumer = Consumer;
78800b57cec5SDimitry Andric 
78810b57cec5SDimitry Andric   if (Consumer)
78820b57cec5SDimitry Andric     PassInterestingDeclsToConsumer();
78830b57cec5SDimitry Andric 
78840b57cec5SDimitry Andric   if (DeserializationListener)
78850b57cec5SDimitry Andric     DeserializationListener->ReaderInitialized(this);
78860b57cec5SDimitry Andric }
78870b57cec5SDimitry Andric 
78880b57cec5SDimitry Andric void ASTReader::PrintStats() {
78890b57cec5SDimitry Andric   std::fprintf(stderr, "*** AST File Statistics:\n");
78900b57cec5SDimitry Andric 
7891349cc55cSDimitry Andric   unsigned NumTypesLoaded =
7892349cc55cSDimitry Andric       TypesLoaded.size() - llvm::count(TypesLoaded, QualType());
7893349cc55cSDimitry Andric   unsigned NumDeclsLoaded =
7894349cc55cSDimitry Andric       DeclsLoaded.size() - llvm::count(DeclsLoaded, (Decl *)nullptr);
7895349cc55cSDimitry Andric   unsigned NumIdentifiersLoaded =
7896349cc55cSDimitry Andric       IdentifiersLoaded.size() -
7897349cc55cSDimitry Andric       llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr);
7898349cc55cSDimitry Andric   unsigned NumMacrosLoaded =
7899349cc55cSDimitry Andric       MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr);
7900349cc55cSDimitry Andric   unsigned NumSelectorsLoaded =
7901349cc55cSDimitry Andric       SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector());
79020b57cec5SDimitry Andric 
79030b57cec5SDimitry Andric   if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
79040b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
79050b57cec5SDimitry Andric                  NumSLocEntriesRead, TotalNumSLocEntries,
79060b57cec5SDimitry Andric                  ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
79070b57cec5SDimitry Andric   if (!TypesLoaded.empty())
79080b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
79090b57cec5SDimitry Andric                  NumTypesLoaded, (unsigned)TypesLoaded.size(),
79100b57cec5SDimitry Andric                  ((float)NumTypesLoaded/TypesLoaded.size() * 100));
79110b57cec5SDimitry Andric   if (!DeclsLoaded.empty())
79120b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
79130b57cec5SDimitry Andric                  NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
79140b57cec5SDimitry Andric                  ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
79150b57cec5SDimitry Andric   if (!IdentifiersLoaded.empty())
79160b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
79170b57cec5SDimitry Andric                  NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
79180b57cec5SDimitry Andric                  ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
79190b57cec5SDimitry Andric   if (!MacrosLoaded.empty())
79200b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
79210b57cec5SDimitry Andric                  NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
79220b57cec5SDimitry Andric                  ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
79230b57cec5SDimitry Andric   if (!SelectorsLoaded.empty())
79240b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
79250b57cec5SDimitry Andric                  NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
79260b57cec5SDimitry Andric                  ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
79270b57cec5SDimitry Andric   if (TotalNumStatements)
79280b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
79290b57cec5SDimitry Andric                  NumStatementsRead, TotalNumStatements,
79300b57cec5SDimitry Andric                  ((float)NumStatementsRead/TotalNumStatements * 100));
79310b57cec5SDimitry Andric   if (TotalNumMacros)
79320b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
79330b57cec5SDimitry Andric                  NumMacrosRead, TotalNumMacros,
79340b57cec5SDimitry Andric                  ((float)NumMacrosRead/TotalNumMacros * 100));
79350b57cec5SDimitry Andric   if (TotalLexicalDeclContexts)
79360b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
79370b57cec5SDimitry Andric                  NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
79380b57cec5SDimitry Andric                  ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
79390b57cec5SDimitry Andric                   * 100));
79400b57cec5SDimitry Andric   if (TotalVisibleDeclContexts)
79410b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
79420b57cec5SDimitry Andric                  NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
79430b57cec5SDimitry Andric                  ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
79440b57cec5SDimitry Andric                   * 100));
79450b57cec5SDimitry Andric   if (TotalNumMethodPoolEntries)
79460b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
79470b57cec5SDimitry Andric                  NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
79480b57cec5SDimitry Andric                  ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
79490b57cec5SDimitry Andric                   * 100));
79500b57cec5SDimitry Andric   if (NumMethodPoolLookups)
79510b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u method pool lookups succeeded (%f%%)\n",
79520b57cec5SDimitry Andric                  NumMethodPoolHits, NumMethodPoolLookups,
79530b57cec5SDimitry Andric                  ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
79540b57cec5SDimitry Andric   if (NumMethodPoolTableLookups)
79550b57cec5SDimitry Andric     std::fprintf(stderr, "  %u/%u method pool table lookups succeeded (%f%%)\n",
79560b57cec5SDimitry Andric                  NumMethodPoolTableHits, NumMethodPoolTableLookups,
79570b57cec5SDimitry Andric                  ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
79580b57cec5SDimitry Andric                   * 100.0));
79590b57cec5SDimitry Andric   if (NumIdentifierLookupHits)
79600b57cec5SDimitry Andric     std::fprintf(stderr,
79610b57cec5SDimitry Andric                  "  %u / %u identifier table lookups succeeded (%f%%)\n",
79620b57cec5SDimitry Andric                  NumIdentifierLookupHits, NumIdentifierLookups,
79630b57cec5SDimitry Andric                  (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
79640b57cec5SDimitry Andric 
79650b57cec5SDimitry Andric   if (GlobalIndex) {
79660b57cec5SDimitry Andric     std::fprintf(stderr, "\n");
79670b57cec5SDimitry Andric     GlobalIndex->printStats();
79680b57cec5SDimitry Andric   }
79690b57cec5SDimitry Andric 
79700b57cec5SDimitry Andric   std::fprintf(stderr, "\n");
79710b57cec5SDimitry Andric   dump();
79720b57cec5SDimitry Andric   std::fprintf(stderr, "\n");
79730b57cec5SDimitry Andric }
79740b57cec5SDimitry Andric 
79750b57cec5SDimitry Andric template<typename Key, typename ModuleFile, unsigned InitialCapacity>
79760b57cec5SDimitry Andric LLVM_DUMP_METHOD static void
79770b57cec5SDimitry Andric dumpModuleIDMap(StringRef Name,
79780b57cec5SDimitry Andric                 const ContinuousRangeMap<Key, ModuleFile *,
79790b57cec5SDimitry Andric                                          InitialCapacity> &Map) {
79800b57cec5SDimitry Andric   if (Map.begin() == Map.end())
79810b57cec5SDimitry Andric     return;
79820b57cec5SDimitry Andric 
79830b57cec5SDimitry Andric   using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>;
79840b57cec5SDimitry Andric 
79850b57cec5SDimitry Andric   llvm::errs() << Name << ":\n";
79860b57cec5SDimitry Andric   for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
79870b57cec5SDimitry Andric        I != IEnd; ++I) {
79880b57cec5SDimitry Andric     llvm::errs() << "  " << I->first << " -> " << I->second->FileName
79890b57cec5SDimitry Andric       << "\n";
79900b57cec5SDimitry Andric   }
79910b57cec5SDimitry Andric }
79920b57cec5SDimitry Andric 
79930b57cec5SDimitry Andric LLVM_DUMP_METHOD void ASTReader::dump() {
79940b57cec5SDimitry Andric   llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
79950b57cec5SDimitry Andric   dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
79960b57cec5SDimitry Andric   dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
79970b57cec5SDimitry Andric   dumpModuleIDMap("Global type map", GlobalTypeMap);
79980b57cec5SDimitry Andric   dumpModuleIDMap("Global declaration map", GlobalDeclMap);
79990b57cec5SDimitry Andric   dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
80000b57cec5SDimitry Andric   dumpModuleIDMap("Global macro map", GlobalMacroMap);
80010b57cec5SDimitry Andric   dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
80020b57cec5SDimitry Andric   dumpModuleIDMap("Global selector map", GlobalSelectorMap);
80030b57cec5SDimitry Andric   dumpModuleIDMap("Global preprocessed entity map",
80040b57cec5SDimitry Andric                   GlobalPreprocessedEntityMap);
80050b57cec5SDimitry Andric 
80060b57cec5SDimitry Andric   llvm::errs() << "\n*** PCH/Modules Loaded:";
80070b57cec5SDimitry Andric   for (ModuleFile &M : ModuleMgr)
80080b57cec5SDimitry Andric     M.dump();
80090b57cec5SDimitry Andric }
80100b57cec5SDimitry Andric 
80110b57cec5SDimitry Andric /// Return the amount of memory used by memory buffers, breaking down
80120b57cec5SDimitry Andric /// by heap-backed versus mmap'ed memory.
80130b57cec5SDimitry Andric void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
80140b57cec5SDimitry Andric   for (ModuleFile &I : ModuleMgr) {
80150b57cec5SDimitry Andric     if (llvm::MemoryBuffer *buf = I.Buffer) {
80160b57cec5SDimitry Andric       size_t bytes = buf->getBufferSize();
80170b57cec5SDimitry Andric       switch (buf->getBufferKind()) {
80180b57cec5SDimitry Andric         case llvm::MemoryBuffer::MemoryBuffer_Malloc:
80190b57cec5SDimitry Andric           sizes.malloc_bytes += bytes;
80200b57cec5SDimitry Andric           break;
80210b57cec5SDimitry Andric         case llvm::MemoryBuffer::MemoryBuffer_MMap:
80220b57cec5SDimitry Andric           sizes.mmap_bytes += bytes;
80230b57cec5SDimitry Andric           break;
80240b57cec5SDimitry Andric       }
80250b57cec5SDimitry Andric     }
80260b57cec5SDimitry Andric   }
80270b57cec5SDimitry Andric }
80280b57cec5SDimitry Andric 
80290b57cec5SDimitry Andric void ASTReader::InitializeSema(Sema &S) {
80300b57cec5SDimitry Andric   SemaObj = &S;
80310b57cec5SDimitry Andric   S.addExternalSource(this);
80320b57cec5SDimitry Andric 
80330b57cec5SDimitry Andric   // Makes sure any declarations that were deserialized "too early"
80340b57cec5SDimitry Andric   // still get added to the identifier's declaration chains.
80350b57cec5SDimitry Andric   for (uint64_t ID : PreloadedDeclIDs) {
80360b57cec5SDimitry Andric     NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
80370b57cec5SDimitry Andric     pushExternalDeclIntoScope(D, D->getDeclName());
80380b57cec5SDimitry Andric   }
80390b57cec5SDimitry Andric   PreloadedDeclIDs.clear();
80400b57cec5SDimitry Andric 
80410b57cec5SDimitry Andric   // FIXME: What happens if these are changed by a module import?
80420b57cec5SDimitry Andric   if (!FPPragmaOptions.empty()) {
80430b57cec5SDimitry Andric     assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
8044e8d8bef9SDimitry Andric     FPOptionsOverride NewOverrides =
8045e8d8bef9SDimitry Andric         FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]);
80465ffd83dbSDimitry Andric     SemaObj->CurFPFeatures =
80475ffd83dbSDimitry Andric         NewOverrides.applyOverrides(SemaObj->getLangOpts());
80480b57cec5SDimitry Andric   }
80490b57cec5SDimitry Andric 
8050e8d8bef9SDimitry Andric   SemaObj->OpenCLFeatures = OpenCLExtensions;
80510b57cec5SDimitry Andric 
80520b57cec5SDimitry Andric   UpdateSema();
80530b57cec5SDimitry Andric }
80540b57cec5SDimitry Andric 
80550b57cec5SDimitry Andric void ASTReader::UpdateSema() {
80560b57cec5SDimitry Andric   assert(SemaObj && "no Sema to update");
80570b57cec5SDimitry Andric 
80580b57cec5SDimitry Andric   // Load the offsets of the declarations that Sema references.
80590b57cec5SDimitry Andric   // They will be lazily deserialized when needed.
80600b57cec5SDimitry Andric   if (!SemaDeclRefs.empty()) {
80610b57cec5SDimitry Andric     assert(SemaDeclRefs.size() % 3 == 0);
80620b57cec5SDimitry Andric     for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
80630b57cec5SDimitry Andric       if (!SemaObj->StdNamespace)
80640b57cec5SDimitry Andric         SemaObj->StdNamespace = SemaDeclRefs[I];
80650b57cec5SDimitry Andric       if (!SemaObj->StdBadAlloc)
80660b57cec5SDimitry Andric         SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
80670b57cec5SDimitry Andric       if (!SemaObj->StdAlignValT)
80680b57cec5SDimitry Andric         SemaObj->StdAlignValT = SemaDeclRefs[I+2];
80690b57cec5SDimitry Andric     }
80700b57cec5SDimitry Andric     SemaDeclRefs.clear();
80710b57cec5SDimitry Andric   }
80720b57cec5SDimitry Andric 
80730b57cec5SDimitry Andric   // Update the state of pragmas. Use the same API as if we had encountered the
80740b57cec5SDimitry Andric   // pragma in the source.
80750b57cec5SDimitry Andric   if(OptimizeOffPragmaLocation.isValid())
80760b57cec5SDimitry Andric     SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation);
80770b57cec5SDimitry Andric   if (PragmaMSStructState != -1)
80780b57cec5SDimitry Andric     SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
80790b57cec5SDimitry Andric   if (PointersToMembersPragmaLocation.isValid()) {
80800b57cec5SDimitry Andric     SemaObj->ActOnPragmaMSPointersToMembers(
80810b57cec5SDimitry Andric         (LangOptions::PragmaMSPointersToMembersKind)
80820b57cec5SDimitry Andric             PragmaMSPointersToMembersState,
80830b57cec5SDimitry Andric         PointersToMembersPragmaLocation);
80840b57cec5SDimitry Andric   }
80850b57cec5SDimitry Andric   SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
80860b57cec5SDimitry Andric 
8087e8d8bef9SDimitry Andric   if (PragmaAlignPackCurrentValue) {
80880b57cec5SDimitry Andric     // The bottom of the stack might have a default value. It must be adjusted
80890b57cec5SDimitry Andric     // to the current value to ensure that the packing state is preserved after
80900b57cec5SDimitry Andric     // popping entries that were included/imported from a PCH/module.
80910b57cec5SDimitry Andric     bool DropFirst = false;
8092e8d8bef9SDimitry Andric     if (!PragmaAlignPackStack.empty() &&
8093e8d8bef9SDimitry Andric         PragmaAlignPackStack.front().Location.isInvalid()) {
8094e8d8bef9SDimitry Andric       assert(PragmaAlignPackStack.front().Value ==
8095e8d8bef9SDimitry Andric                  SemaObj->AlignPackStack.DefaultValue &&
80960b57cec5SDimitry Andric              "Expected a default alignment value");
8097e8d8bef9SDimitry Andric       SemaObj->AlignPackStack.Stack.emplace_back(
8098e8d8bef9SDimitry Andric           PragmaAlignPackStack.front().SlotLabel,
8099e8d8bef9SDimitry Andric           SemaObj->AlignPackStack.CurrentValue,
8100e8d8bef9SDimitry Andric           SemaObj->AlignPackStack.CurrentPragmaLocation,
8101e8d8bef9SDimitry Andric           PragmaAlignPackStack.front().PushLocation);
81020b57cec5SDimitry Andric       DropFirst = true;
81030b57cec5SDimitry Andric     }
8104bdd1243dSDimitry Andric     for (const auto &Entry :
8105bdd1243dSDimitry Andric          llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
8106e8d8bef9SDimitry Andric       SemaObj->AlignPackStack.Stack.emplace_back(
8107e8d8bef9SDimitry Andric           Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
8108e8d8bef9SDimitry Andric     }
8109e8d8bef9SDimitry Andric     if (PragmaAlignPackCurrentLocation.isInvalid()) {
8110e8d8bef9SDimitry Andric       assert(*PragmaAlignPackCurrentValue ==
8111e8d8bef9SDimitry Andric                  SemaObj->AlignPackStack.DefaultValue &&
8112e8d8bef9SDimitry Andric              "Expected a default align and pack value");
81130b57cec5SDimitry Andric       // Keep the current values.
81140b57cec5SDimitry Andric     } else {
8115e8d8bef9SDimitry Andric       SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
8116e8d8bef9SDimitry Andric       SemaObj->AlignPackStack.CurrentPragmaLocation =
8117e8d8bef9SDimitry Andric           PragmaAlignPackCurrentLocation;
81180b57cec5SDimitry Andric     }
81190b57cec5SDimitry Andric   }
81205ffd83dbSDimitry Andric   if (FpPragmaCurrentValue) {
81215ffd83dbSDimitry Andric     // The bottom of the stack might have a default value. It must be adjusted
81225ffd83dbSDimitry Andric     // to the current value to ensure that fp-pragma state is preserved after
81235ffd83dbSDimitry Andric     // popping entries that were included/imported from a PCH/module.
81245ffd83dbSDimitry Andric     bool DropFirst = false;
81255ffd83dbSDimitry Andric     if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
81265ffd83dbSDimitry Andric       assert(FpPragmaStack.front().Value ==
81275ffd83dbSDimitry Andric                  SemaObj->FpPragmaStack.DefaultValue &&
81285ffd83dbSDimitry Andric              "Expected a default pragma float_control value");
81295ffd83dbSDimitry Andric       SemaObj->FpPragmaStack.Stack.emplace_back(
81305ffd83dbSDimitry Andric           FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
81315ffd83dbSDimitry Andric           SemaObj->FpPragmaStack.CurrentPragmaLocation,
81325ffd83dbSDimitry Andric           FpPragmaStack.front().PushLocation);
81335ffd83dbSDimitry Andric       DropFirst = true;
81345ffd83dbSDimitry Andric     }
81355ffd83dbSDimitry Andric     for (const auto &Entry :
8136bdd1243dSDimitry Andric          llvm::ArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0))
81375ffd83dbSDimitry Andric       SemaObj->FpPragmaStack.Stack.emplace_back(
81385ffd83dbSDimitry Andric           Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
81395ffd83dbSDimitry Andric     if (FpPragmaCurrentLocation.isInvalid()) {
81405ffd83dbSDimitry Andric       assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
81415ffd83dbSDimitry Andric              "Expected a default pragma float_control value");
81425ffd83dbSDimitry Andric       // Keep the current values.
81435ffd83dbSDimitry Andric     } else {
81445ffd83dbSDimitry Andric       SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
81455ffd83dbSDimitry Andric       SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
81465ffd83dbSDimitry Andric     }
81475ffd83dbSDimitry Andric   }
8148e8d8bef9SDimitry Andric 
8149e8d8bef9SDimitry Andric   // For non-modular AST files, restore visiblity of modules.
8150*06c3fb27SDimitry Andric   for (auto &Import : PendingImportedModulesSema) {
8151e8d8bef9SDimitry Andric     if (Import.ImportLoc.isInvalid())
8152e8d8bef9SDimitry Andric       continue;
8153e8d8bef9SDimitry Andric     if (Module *Imported = getSubmodule(Import.ID)) {
8154e8d8bef9SDimitry Andric       SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
8155e8d8bef9SDimitry Andric     }
8156e8d8bef9SDimitry Andric   }
8157*06c3fb27SDimitry Andric   PendingImportedModulesSema.clear();
81580b57cec5SDimitry Andric }
81590b57cec5SDimitry Andric 
81600b57cec5SDimitry Andric IdentifierInfo *ASTReader::get(StringRef Name) {
81610b57cec5SDimitry Andric   // Note that we are loading an identifier.
81620b57cec5SDimitry Andric   Deserializing AnIdentifier(this);
81630b57cec5SDimitry Andric 
81640b57cec5SDimitry Andric   IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
81650b57cec5SDimitry Andric                                   NumIdentifierLookups,
81660b57cec5SDimitry Andric                                   NumIdentifierLookupHits);
81670b57cec5SDimitry Andric 
81680b57cec5SDimitry Andric   // We don't need to do identifier table lookups in C++ modules (we preload
81690b57cec5SDimitry Andric   // all interesting declarations, and don't need to use the scope for name
81700b57cec5SDimitry Andric   // lookups). Perform the lookup in PCH files, though, since we don't build
81710b57cec5SDimitry Andric   // a complete initial identifier table if we're carrying on from a PCH.
81720b57cec5SDimitry Andric   if (PP.getLangOpts().CPlusPlus) {
8173bdd1243dSDimitry Andric     for (auto *F : ModuleMgr.pch_modules())
81740b57cec5SDimitry Andric       if (Visitor(*F))
81750b57cec5SDimitry Andric         break;
81760b57cec5SDimitry Andric   } else {
81770b57cec5SDimitry Andric     // If there is a global index, look there first to determine which modules
81780b57cec5SDimitry Andric     // provably do not have any results for this identifier.
81790b57cec5SDimitry Andric     GlobalModuleIndex::HitSet Hits;
81800b57cec5SDimitry Andric     GlobalModuleIndex::HitSet *HitsPtr = nullptr;
81810b57cec5SDimitry Andric     if (!loadGlobalIndex()) {
81820b57cec5SDimitry Andric       if (GlobalIndex->lookupIdentifier(Name, Hits)) {
81830b57cec5SDimitry Andric         HitsPtr = &Hits;
81840b57cec5SDimitry Andric       }
81850b57cec5SDimitry Andric     }
81860b57cec5SDimitry Andric 
81870b57cec5SDimitry Andric     ModuleMgr.visit(Visitor, HitsPtr);
81880b57cec5SDimitry Andric   }
81890b57cec5SDimitry Andric 
81900b57cec5SDimitry Andric   IdentifierInfo *II = Visitor.getIdentifierInfo();
81910b57cec5SDimitry Andric   markIdentifierUpToDate(II);
81920b57cec5SDimitry Andric   return II;
81930b57cec5SDimitry Andric }
81940b57cec5SDimitry Andric 
81950b57cec5SDimitry Andric namespace clang {
81960b57cec5SDimitry Andric 
81970b57cec5SDimitry Andric   /// An identifier-lookup iterator that enumerates all of the
81980b57cec5SDimitry Andric   /// identifiers stored within a set of AST files.
81990b57cec5SDimitry Andric   class ASTIdentifierIterator : public IdentifierIterator {
82000b57cec5SDimitry Andric     /// The AST reader whose identifiers are being enumerated.
82010b57cec5SDimitry Andric     const ASTReader &Reader;
82020b57cec5SDimitry Andric 
82030b57cec5SDimitry Andric     /// The current index into the chain of AST files stored in
82040b57cec5SDimitry Andric     /// the AST reader.
82050b57cec5SDimitry Andric     unsigned Index;
82060b57cec5SDimitry Andric 
82070b57cec5SDimitry Andric     /// The current position within the identifier lookup table
82080b57cec5SDimitry Andric     /// of the current AST file.
82090b57cec5SDimitry Andric     ASTIdentifierLookupTable::key_iterator Current;
82100b57cec5SDimitry Andric 
82110b57cec5SDimitry Andric     /// The end position within the identifier lookup table of
82120b57cec5SDimitry Andric     /// the current AST file.
82130b57cec5SDimitry Andric     ASTIdentifierLookupTable::key_iterator End;
82140b57cec5SDimitry Andric 
82150b57cec5SDimitry Andric     /// Whether to skip any modules in the ASTReader.
82160b57cec5SDimitry Andric     bool SkipModules;
82170b57cec5SDimitry Andric 
82180b57cec5SDimitry Andric   public:
82190b57cec5SDimitry Andric     explicit ASTIdentifierIterator(const ASTReader &Reader,
82200b57cec5SDimitry Andric                                    bool SkipModules = false);
82210b57cec5SDimitry Andric 
82220b57cec5SDimitry Andric     StringRef Next() override;
82230b57cec5SDimitry Andric   };
82240b57cec5SDimitry Andric 
82250b57cec5SDimitry Andric } // namespace clang
82260b57cec5SDimitry Andric 
82270b57cec5SDimitry Andric ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
82280b57cec5SDimitry Andric                                              bool SkipModules)
82290b57cec5SDimitry Andric     : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
82300b57cec5SDimitry Andric }
82310b57cec5SDimitry Andric 
82320b57cec5SDimitry Andric StringRef ASTIdentifierIterator::Next() {
82330b57cec5SDimitry Andric   while (Current == End) {
82340b57cec5SDimitry Andric     // If we have exhausted all of our AST files, we're done.
82350b57cec5SDimitry Andric     if (Index == 0)
82360b57cec5SDimitry Andric       return StringRef();
82370b57cec5SDimitry Andric 
82380b57cec5SDimitry Andric     --Index;
82390b57cec5SDimitry Andric     ModuleFile &F = Reader.ModuleMgr[Index];
82400b57cec5SDimitry Andric     if (SkipModules && F.isModule())
82410b57cec5SDimitry Andric       continue;
82420b57cec5SDimitry Andric 
82430b57cec5SDimitry Andric     ASTIdentifierLookupTable *IdTable =
82440b57cec5SDimitry Andric         (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
82450b57cec5SDimitry Andric     Current = IdTable->key_begin();
82460b57cec5SDimitry Andric     End = IdTable->key_end();
82470b57cec5SDimitry Andric   }
82480b57cec5SDimitry Andric 
82490b57cec5SDimitry Andric   // We have any identifiers remaining in the current AST file; return
82500b57cec5SDimitry Andric   // the next one.
82510b57cec5SDimitry Andric   StringRef Result = *Current;
82520b57cec5SDimitry Andric   ++Current;
82530b57cec5SDimitry Andric   return Result;
82540b57cec5SDimitry Andric }
82550b57cec5SDimitry Andric 
82560b57cec5SDimitry Andric namespace {
82570b57cec5SDimitry Andric 
82580b57cec5SDimitry Andric /// A utility for appending two IdentifierIterators.
82590b57cec5SDimitry Andric class ChainedIdentifierIterator : public IdentifierIterator {
82600b57cec5SDimitry Andric   std::unique_ptr<IdentifierIterator> Current;
82610b57cec5SDimitry Andric   std::unique_ptr<IdentifierIterator> Queued;
82620b57cec5SDimitry Andric 
82630b57cec5SDimitry Andric public:
82640b57cec5SDimitry Andric   ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
82650b57cec5SDimitry Andric                             std::unique_ptr<IdentifierIterator> Second)
82660b57cec5SDimitry Andric       : Current(std::move(First)), Queued(std::move(Second)) {}
82670b57cec5SDimitry Andric 
82680b57cec5SDimitry Andric   StringRef Next() override {
82690b57cec5SDimitry Andric     if (!Current)
82700b57cec5SDimitry Andric       return StringRef();
82710b57cec5SDimitry Andric 
82720b57cec5SDimitry Andric     StringRef result = Current->Next();
82730b57cec5SDimitry Andric     if (!result.empty())
82740b57cec5SDimitry Andric       return result;
82750b57cec5SDimitry Andric 
82760b57cec5SDimitry Andric     // Try the queued iterator, which may itself be empty.
82770b57cec5SDimitry Andric     Current.reset();
82780b57cec5SDimitry Andric     std::swap(Current, Queued);
82790b57cec5SDimitry Andric     return Next();
82800b57cec5SDimitry Andric   }
82810b57cec5SDimitry Andric };
82820b57cec5SDimitry Andric 
82830b57cec5SDimitry Andric } // namespace
82840b57cec5SDimitry Andric 
82850b57cec5SDimitry Andric IdentifierIterator *ASTReader::getIdentifiers() {
82860b57cec5SDimitry Andric   if (!loadGlobalIndex()) {
82870b57cec5SDimitry Andric     std::unique_ptr<IdentifierIterator> ReaderIter(
82880b57cec5SDimitry Andric         new ASTIdentifierIterator(*this, /*SkipModules=*/true));
82890b57cec5SDimitry Andric     std::unique_ptr<IdentifierIterator> ModulesIter(
82900b57cec5SDimitry Andric         GlobalIndex->createIdentifierIterator());
82910b57cec5SDimitry Andric     return new ChainedIdentifierIterator(std::move(ReaderIter),
82920b57cec5SDimitry Andric                                          std::move(ModulesIter));
82930b57cec5SDimitry Andric   }
82940b57cec5SDimitry Andric 
82950b57cec5SDimitry Andric   return new ASTIdentifierIterator(*this);
82960b57cec5SDimitry Andric }
82970b57cec5SDimitry Andric 
82980b57cec5SDimitry Andric namespace clang {
82990b57cec5SDimitry Andric namespace serialization {
83000b57cec5SDimitry Andric 
83010b57cec5SDimitry Andric   class ReadMethodPoolVisitor {
83020b57cec5SDimitry Andric     ASTReader &Reader;
83030b57cec5SDimitry Andric     Selector Sel;
83040b57cec5SDimitry Andric     unsigned PriorGeneration;
83050b57cec5SDimitry Andric     unsigned InstanceBits = 0;
83060b57cec5SDimitry Andric     unsigned FactoryBits = 0;
83070b57cec5SDimitry Andric     bool InstanceHasMoreThanOneDecl = false;
83080b57cec5SDimitry Andric     bool FactoryHasMoreThanOneDecl = false;
83090b57cec5SDimitry Andric     SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
83100b57cec5SDimitry Andric     SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
83110b57cec5SDimitry Andric 
83120b57cec5SDimitry Andric   public:
83130b57cec5SDimitry Andric     ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
83140b57cec5SDimitry Andric                           unsigned PriorGeneration)
83150b57cec5SDimitry Andric         : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
83160b57cec5SDimitry Andric 
83170b57cec5SDimitry Andric     bool operator()(ModuleFile &M) {
83180b57cec5SDimitry Andric       if (!M.SelectorLookupTable)
83190b57cec5SDimitry Andric         return false;
83200b57cec5SDimitry Andric 
83210b57cec5SDimitry Andric       // If we've already searched this module file, skip it now.
83220b57cec5SDimitry Andric       if (M.Generation <= PriorGeneration)
83230b57cec5SDimitry Andric         return true;
83240b57cec5SDimitry Andric 
83250b57cec5SDimitry Andric       ++Reader.NumMethodPoolTableLookups;
83260b57cec5SDimitry Andric       ASTSelectorLookupTable *PoolTable
83270b57cec5SDimitry Andric         = (ASTSelectorLookupTable*)M.SelectorLookupTable;
83280b57cec5SDimitry Andric       ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
83290b57cec5SDimitry Andric       if (Pos == PoolTable->end())
83300b57cec5SDimitry Andric         return false;
83310b57cec5SDimitry Andric 
83320b57cec5SDimitry Andric       ++Reader.NumMethodPoolTableHits;
83330b57cec5SDimitry Andric       ++Reader.NumSelectorsRead;
83340b57cec5SDimitry Andric       // FIXME: Not quite happy with the statistics here. We probably should
83350b57cec5SDimitry Andric       // disable this tracking when called via LoadSelector.
83360b57cec5SDimitry Andric       // Also, should entries without methods count as misses?
83370b57cec5SDimitry Andric       ++Reader.NumMethodPoolEntriesRead;
83380b57cec5SDimitry Andric       ASTSelectorLookupTrait::data_type Data = *Pos;
83390b57cec5SDimitry Andric       if (Reader.DeserializationListener)
83400b57cec5SDimitry Andric         Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
83410b57cec5SDimitry Andric 
8342349cc55cSDimitry Andric       // Append methods in the reverse order, so that later we can process them
8343349cc55cSDimitry Andric       // in the order they appear in the source code by iterating through
8344349cc55cSDimitry Andric       // the vector in the reverse order.
8345349cc55cSDimitry Andric       InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend());
8346349cc55cSDimitry Andric       FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend());
83470b57cec5SDimitry Andric       InstanceBits = Data.InstanceBits;
83480b57cec5SDimitry Andric       FactoryBits = Data.FactoryBits;
83490b57cec5SDimitry Andric       InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
83500b57cec5SDimitry Andric       FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
8351349cc55cSDimitry Andric       return false;
83520b57cec5SDimitry Andric     }
83530b57cec5SDimitry Andric 
83540b57cec5SDimitry Andric     /// Retrieve the instance methods found by this visitor.
83550b57cec5SDimitry Andric     ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
83560b57cec5SDimitry Andric       return InstanceMethods;
83570b57cec5SDimitry Andric     }
83580b57cec5SDimitry Andric 
83590b57cec5SDimitry Andric     /// Retrieve the instance methods found by this visitor.
83600b57cec5SDimitry Andric     ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
83610b57cec5SDimitry Andric       return FactoryMethods;
83620b57cec5SDimitry Andric     }
83630b57cec5SDimitry Andric 
83640b57cec5SDimitry Andric     unsigned getInstanceBits() const { return InstanceBits; }
83650b57cec5SDimitry Andric     unsigned getFactoryBits() const { return FactoryBits; }
83660b57cec5SDimitry Andric 
83670b57cec5SDimitry Andric     bool instanceHasMoreThanOneDecl() const {
83680b57cec5SDimitry Andric       return InstanceHasMoreThanOneDecl;
83690b57cec5SDimitry Andric     }
83700b57cec5SDimitry Andric 
83710b57cec5SDimitry Andric     bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
83720b57cec5SDimitry Andric   };
83730b57cec5SDimitry Andric 
83740b57cec5SDimitry Andric } // namespace serialization
83750b57cec5SDimitry Andric } // namespace clang
83760b57cec5SDimitry Andric 
83770b57cec5SDimitry Andric /// Add the given set of methods to the method list.
83780b57cec5SDimitry Andric static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
83790b57cec5SDimitry Andric                              ObjCMethodList &List) {
8380bdd1243dSDimitry Andric   for (ObjCMethodDecl *M : llvm::reverse(Methods))
8381bdd1243dSDimitry Andric     S.addMethodToGlobalList(&List, M);
83820b57cec5SDimitry Andric }
83830b57cec5SDimitry Andric 
83840b57cec5SDimitry Andric void ASTReader::ReadMethodPool(Selector Sel) {
83850b57cec5SDimitry Andric   // Get the selector generation and update it to the current generation.
83860b57cec5SDimitry Andric   unsigned &Generation = SelectorGeneration[Sel];
83870b57cec5SDimitry Andric   unsigned PriorGeneration = Generation;
83880b57cec5SDimitry Andric   Generation = getGeneration();
83890b57cec5SDimitry Andric   SelectorOutOfDate[Sel] = false;
83900b57cec5SDimitry Andric 
83910b57cec5SDimitry Andric   // Search for methods defined with this selector.
83920b57cec5SDimitry Andric   ++NumMethodPoolLookups;
83930b57cec5SDimitry Andric   ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
83940b57cec5SDimitry Andric   ModuleMgr.visit(Visitor);
83950b57cec5SDimitry Andric 
83960b57cec5SDimitry Andric   if (Visitor.getInstanceMethods().empty() &&
83970b57cec5SDimitry Andric       Visitor.getFactoryMethods().empty())
83980b57cec5SDimitry Andric     return;
83990b57cec5SDimitry Andric 
84000b57cec5SDimitry Andric   ++NumMethodPoolHits;
84010b57cec5SDimitry Andric 
84020b57cec5SDimitry Andric   if (!getSema())
84030b57cec5SDimitry Andric     return;
84040b57cec5SDimitry Andric 
84050b57cec5SDimitry Andric   Sema &S = *getSema();
8406349cc55cSDimitry Andric   Sema::GlobalMethodPool::iterator Pos =
8407349cc55cSDimitry Andric       S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethodPool::Lists()))
8408349cc55cSDimitry Andric           .first;
84090b57cec5SDimitry Andric 
84100b57cec5SDimitry Andric   Pos->second.first.setBits(Visitor.getInstanceBits());
84110b57cec5SDimitry Andric   Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
84120b57cec5SDimitry Andric   Pos->second.second.setBits(Visitor.getFactoryBits());
84130b57cec5SDimitry Andric   Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
84140b57cec5SDimitry Andric 
84150b57cec5SDimitry Andric   // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
84160b57cec5SDimitry Andric   // when building a module we keep every method individually and may need to
84170b57cec5SDimitry Andric   // update hasMoreThanOneDecl as we add the methods.
84180b57cec5SDimitry Andric   addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
84190b57cec5SDimitry Andric   addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
84200b57cec5SDimitry Andric }
84210b57cec5SDimitry Andric 
84220b57cec5SDimitry Andric void ASTReader::updateOutOfDateSelector(Selector Sel) {
84230b57cec5SDimitry Andric   if (SelectorOutOfDate[Sel])
84240b57cec5SDimitry Andric     ReadMethodPool(Sel);
84250b57cec5SDimitry Andric }
84260b57cec5SDimitry Andric 
84270b57cec5SDimitry Andric void ASTReader::ReadKnownNamespaces(
84280b57cec5SDimitry Andric                           SmallVectorImpl<NamespaceDecl *> &Namespaces) {
84290b57cec5SDimitry Andric   Namespaces.clear();
84300b57cec5SDimitry Andric 
84310b57cec5SDimitry Andric   for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
84320b57cec5SDimitry Andric     if (NamespaceDecl *Namespace
84330b57cec5SDimitry Andric                 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
84340b57cec5SDimitry Andric       Namespaces.push_back(Namespace);
84350b57cec5SDimitry Andric   }
84360b57cec5SDimitry Andric }
84370b57cec5SDimitry Andric 
84380b57cec5SDimitry Andric void ASTReader::ReadUndefinedButUsed(
84390b57cec5SDimitry Andric     llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
84400b57cec5SDimitry Andric   for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
84410b57cec5SDimitry Andric     NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
84420b57cec5SDimitry Andric     SourceLocation Loc =
84430b57cec5SDimitry Andric         SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
84440b57cec5SDimitry Andric     Undefined.insert(std::make_pair(D, Loc));
84450b57cec5SDimitry Andric   }
84460b57cec5SDimitry Andric }
84470b57cec5SDimitry Andric 
84480b57cec5SDimitry Andric void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
84490b57cec5SDimitry Andric     FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
84500b57cec5SDimitry Andric                                                      Exprs) {
84510b57cec5SDimitry Andric   for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
84520b57cec5SDimitry Andric     FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
84530b57cec5SDimitry Andric     uint64_t Count = DelayedDeleteExprs[Idx++];
84540b57cec5SDimitry Andric     for (uint64_t C = 0; C < Count; ++C) {
84550b57cec5SDimitry Andric       SourceLocation DeleteLoc =
84560b57cec5SDimitry Andric           SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
84570b57cec5SDimitry Andric       const bool IsArrayForm = DelayedDeleteExprs[Idx++];
84580b57cec5SDimitry Andric       Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
84590b57cec5SDimitry Andric     }
84600b57cec5SDimitry Andric   }
84610b57cec5SDimitry Andric }
84620b57cec5SDimitry Andric 
84630b57cec5SDimitry Andric void ASTReader::ReadTentativeDefinitions(
84640b57cec5SDimitry Andric                   SmallVectorImpl<VarDecl *> &TentativeDefs) {
84650b57cec5SDimitry Andric   for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
84660b57cec5SDimitry Andric     VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
84670b57cec5SDimitry Andric     if (Var)
84680b57cec5SDimitry Andric       TentativeDefs.push_back(Var);
84690b57cec5SDimitry Andric   }
84700b57cec5SDimitry Andric   TentativeDefinitions.clear();
84710b57cec5SDimitry Andric }
84720b57cec5SDimitry Andric 
84730b57cec5SDimitry Andric void ASTReader::ReadUnusedFileScopedDecls(
84740b57cec5SDimitry Andric                                SmallVectorImpl<const DeclaratorDecl *> &Decls) {
84750b57cec5SDimitry Andric   for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
84760b57cec5SDimitry Andric     DeclaratorDecl *D
84770b57cec5SDimitry Andric       = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
84780b57cec5SDimitry Andric     if (D)
84790b57cec5SDimitry Andric       Decls.push_back(D);
84800b57cec5SDimitry Andric   }
84810b57cec5SDimitry Andric   UnusedFileScopedDecls.clear();
84820b57cec5SDimitry Andric }
84830b57cec5SDimitry Andric 
84840b57cec5SDimitry Andric void ASTReader::ReadDelegatingConstructors(
84850b57cec5SDimitry Andric                                  SmallVectorImpl<CXXConstructorDecl *> &Decls) {
84860b57cec5SDimitry Andric   for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
84870b57cec5SDimitry Andric     CXXConstructorDecl *D
84880b57cec5SDimitry Andric       = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
84890b57cec5SDimitry Andric     if (D)
84900b57cec5SDimitry Andric       Decls.push_back(D);
84910b57cec5SDimitry Andric   }
84920b57cec5SDimitry Andric   DelegatingCtorDecls.clear();
84930b57cec5SDimitry Andric }
84940b57cec5SDimitry Andric 
84950b57cec5SDimitry Andric void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
84960b57cec5SDimitry Andric   for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
84970b57cec5SDimitry Andric     TypedefNameDecl *D
84980b57cec5SDimitry Andric       = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
84990b57cec5SDimitry Andric     if (D)
85000b57cec5SDimitry Andric       Decls.push_back(D);
85010b57cec5SDimitry Andric   }
85020b57cec5SDimitry Andric   ExtVectorDecls.clear();
85030b57cec5SDimitry Andric }
85040b57cec5SDimitry Andric 
85050b57cec5SDimitry Andric void ASTReader::ReadUnusedLocalTypedefNameCandidates(
85060b57cec5SDimitry Andric     llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
85070b57cec5SDimitry Andric   for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
85080b57cec5SDimitry Andric        ++I) {
85090b57cec5SDimitry Andric     TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
85100b57cec5SDimitry Andric         GetDecl(UnusedLocalTypedefNameCandidates[I]));
85110b57cec5SDimitry Andric     if (D)
85120b57cec5SDimitry Andric       Decls.insert(D);
85130b57cec5SDimitry Andric   }
85140b57cec5SDimitry Andric   UnusedLocalTypedefNameCandidates.clear();
85150b57cec5SDimitry Andric }
85160b57cec5SDimitry Andric 
85175ffd83dbSDimitry Andric void ASTReader::ReadDeclsToCheckForDeferredDiags(
8518fe6060f1SDimitry Andric     llvm::SmallSetVector<Decl *, 4> &Decls) {
8519fe6060f1SDimitry Andric   for (auto I : DeclsToCheckForDeferredDiags) {
8520fe6060f1SDimitry Andric     auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
85215ffd83dbSDimitry Andric     if (D)
8522fe6060f1SDimitry Andric       Decls.insert(D);
85235ffd83dbSDimitry Andric   }
85245ffd83dbSDimitry Andric   DeclsToCheckForDeferredDiags.clear();
85255ffd83dbSDimitry Andric }
85265ffd83dbSDimitry Andric 
85270b57cec5SDimitry Andric void ASTReader::ReadReferencedSelectors(
85280b57cec5SDimitry Andric        SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) {
85290b57cec5SDimitry Andric   if (ReferencedSelectorsData.empty())
85300b57cec5SDimitry Andric     return;
85310b57cec5SDimitry Andric 
85320b57cec5SDimitry Andric   // If there are @selector references added them to its pool. This is for
85330b57cec5SDimitry Andric   // implementation of -Wselector.
85340b57cec5SDimitry Andric   unsigned int DataSize = ReferencedSelectorsData.size()-1;
85350b57cec5SDimitry Andric   unsigned I = 0;
85360b57cec5SDimitry Andric   while (I < DataSize) {
85370b57cec5SDimitry Andric     Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
85380b57cec5SDimitry Andric     SourceLocation SelLoc
85390b57cec5SDimitry Andric       = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
85400b57cec5SDimitry Andric     Sels.push_back(std::make_pair(Sel, SelLoc));
85410b57cec5SDimitry Andric   }
85420b57cec5SDimitry Andric   ReferencedSelectorsData.clear();
85430b57cec5SDimitry Andric }
85440b57cec5SDimitry Andric 
85450b57cec5SDimitry Andric void ASTReader::ReadWeakUndeclaredIdentifiers(
85460b57cec5SDimitry Andric        SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) {
85470b57cec5SDimitry Andric   if (WeakUndeclaredIdentifiers.empty())
85480b57cec5SDimitry Andric     return;
85490b57cec5SDimitry Andric 
85500b57cec5SDimitry Andric   for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
85510b57cec5SDimitry Andric     IdentifierInfo *WeakId
85520b57cec5SDimitry Andric       = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
85530b57cec5SDimitry Andric     IdentifierInfo *AliasId
85540b57cec5SDimitry Andric       = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
855581ad6265SDimitry Andric     SourceLocation Loc =
855681ad6265SDimitry Andric         SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
85570b57cec5SDimitry Andric     WeakInfo WI(AliasId, Loc);
85580b57cec5SDimitry Andric     WeakIDs.push_back(std::make_pair(WeakId, WI));
85590b57cec5SDimitry Andric   }
85600b57cec5SDimitry Andric   WeakUndeclaredIdentifiers.clear();
85610b57cec5SDimitry Andric }
85620b57cec5SDimitry Andric 
85630b57cec5SDimitry Andric void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
85640b57cec5SDimitry Andric   for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
85650b57cec5SDimitry Andric     ExternalVTableUse VT;
85660b57cec5SDimitry Andric     VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
85670b57cec5SDimitry Andric     VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
85680b57cec5SDimitry Andric     VT.DefinitionRequired = VTableUses[Idx++];
85690b57cec5SDimitry Andric     VTables.push_back(VT);
85700b57cec5SDimitry Andric   }
85710b57cec5SDimitry Andric 
85720b57cec5SDimitry Andric   VTableUses.clear();
85730b57cec5SDimitry Andric }
85740b57cec5SDimitry Andric 
85750b57cec5SDimitry Andric void ASTReader::ReadPendingInstantiations(
85760b57cec5SDimitry Andric        SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) {
85770b57cec5SDimitry Andric   for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
85780b57cec5SDimitry Andric     ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
85790b57cec5SDimitry Andric     SourceLocation Loc
85800b57cec5SDimitry Andric       = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
85810b57cec5SDimitry Andric 
85820b57cec5SDimitry Andric     Pending.push_back(std::make_pair(D, Loc));
85830b57cec5SDimitry Andric   }
85840b57cec5SDimitry Andric   PendingInstantiations.clear();
85850b57cec5SDimitry Andric }
85860b57cec5SDimitry Andric 
85870b57cec5SDimitry Andric void ASTReader::ReadLateParsedTemplates(
85880b57cec5SDimitry Andric     llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
85890b57cec5SDimitry Andric         &LPTMap) {
8590e8d8bef9SDimitry Andric   for (auto &LPT : LateParsedTemplates) {
8591e8d8bef9SDimitry Andric     ModuleFile *FMod = LPT.first;
8592e8d8bef9SDimitry Andric     RecordDataImpl &LateParsed = LPT.second;
8593e8d8bef9SDimitry Andric     for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
85940b57cec5SDimitry Andric          /* In loop */) {
8595e8d8bef9SDimitry Andric       FunctionDecl *FD =
8596e8d8bef9SDimitry Andric           cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++]));
85970b57cec5SDimitry Andric 
8598a7dea167SDimitry Andric       auto LT = std::make_unique<LateParsedTemplate>();
8599e8d8bef9SDimitry Andric       LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]);
8600*06c3fb27SDimitry Andric       LT->FPO = FPOptions::getFromOpaqueInt(LateParsed[Idx++]);
86010b57cec5SDimitry Andric 
86020b57cec5SDimitry Andric       ModuleFile *F = getOwningModuleFile(LT->D);
86030b57cec5SDimitry Andric       assert(F && "No module");
86040b57cec5SDimitry Andric 
8605e8d8bef9SDimitry Andric       unsigned TokN = LateParsed[Idx++];
86060b57cec5SDimitry Andric       LT->Toks.reserve(TokN);
86070b57cec5SDimitry Andric       for (unsigned T = 0; T < TokN; ++T)
8608e8d8bef9SDimitry Andric         LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
86090b57cec5SDimitry Andric 
86100b57cec5SDimitry Andric       LPTMap.insert(std::make_pair(FD, std::move(LT)));
86110b57cec5SDimitry Andric     }
8612e8d8bef9SDimitry Andric   }
861369ade1e0SDimitry Andric 
861469ade1e0SDimitry Andric   LateParsedTemplates.clear();
86150b57cec5SDimitry Andric }
86160b57cec5SDimitry Andric 
8617*06c3fb27SDimitry Andric void ASTReader::AssignedLambdaNumbering(const CXXRecordDecl *Lambda) {
8618*06c3fb27SDimitry Andric   if (Lambda->getLambdaContextDecl()) {
8619*06c3fb27SDimitry Andric     // Keep track of this lambda so it can be merged with another lambda that
8620*06c3fb27SDimitry Andric     // is loaded later.
8621*06c3fb27SDimitry Andric     LambdaDeclarationsForMerging.insert(
8622*06c3fb27SDimitry Andric         {{Lambda->getLambdaContextDecl()->getCanonicalDecl(),
8623*06c3fb27SDimitry Andric           Lambda->getLambdaIndexInContext()},
8624*06c3fb27SDimitry Andric          const_cast<CXXRecordDecl *>(Lambda)});
8625*06c3fb27SDimitry Andric   }
8626*06c3fb27SDimitry Andric }
8627*06c3fb27SDimitry Andric 
86280b57cec5SDimitry Andric void ASTReader::LoadSelector(Selector Sel) {
86290b57cec5SDimitry Andric   // It would be complicated to avoid reading the methods anyway. So don't.
86300b57cec5SDimitry Andric   ReadMethodPool(Sel);
86310b57cec5SDimitry Andric }
86320b57cec5SDimitry Andric 
86330b57cec5SDimitry Andric void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
86340b57cec5SDimitry Andric   assert(ID && "Non-zero identifier ID required");
86350b57cec5SDimitry Andric   assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
86360b57cec5SDimitry Andric   IdentifiersLoaded[ID - 1] = II;
86370b57cec5SDimitry Andric   if (DeserializationListener)
86380b57cec5SDimitry Andric     DeserializationListener->IdentifierRead(ID, II);
86390b57cec5SDimitry Andric }
86400b57cec5SDimitry Andric 
86410b57cec5SDimitry Andric /// Set the globally-visible declarations associated with the given
86420b57cec5SDimitry Andric /// identifier.
86430b57cec5SDimitry Andric ///
86440b57cec5SDimitry Andric /// If the AST reader is currently in a state where the given declaration IDs
86450b57cec5SDimitry Andric /// cannot safely be resolved, they are queued until it is safe to resolve
86460b57cec5SDimitry Andric /// them.
86470b57cec5SDimitry Andric ///
86480b57cec5SDimitry Andric /// \param II an IdentifierInfo that refers to one or more globally-visible
86490b57cec5SDimitry Andric /// declarations.
86500b57cec5SDimitry Andric ///
86510b57cec5SDimitry Andric /// \param DeclIDs the set of declaration IDs with the name @p II that are
86520b57cec5SDimitry Andric /// visible at global scope.
86530b57cec5SDimitry Andric ///
86540b57cec5SDimitry Andric /// \param Decls if non-null, this vector will be populated with the set of
86550b57cec5SDimitry Andric /// deserialized declarations. These declarations will not be pushed into
86560b57cec5SDimitry Andric /// scope.
86570b57cec5SDimitry Andric void
86580b57cec5SDimitry Andric ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
86590b57cec5SDimitry Andric                               const SmallVectorImpl<uint32_t> &DeclIDs,
86600b57cec5SDimitry Andric                                    SmallVectorImpl<Decl *> *Decls) {
86610b57cec5SDimitry Andric   if (NumCurrentElementsDeserializing && !Decls) {
86620b57cec5SDimitry Andric     PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
86630b57cec5SDimitry Andric     return;
86640b57cec5SDimitry Andric   }
86650b57cec5SDimitry Andric 
86660b57cec5SDimitry Andric   for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
86670b57cec5SDimitry Andric     if (!SemaObj) {
86680b57cec5SDimitry Andric       // Queue this declaration so that it will be added to the
86690b57cec5SDimitry Andric       // translation unit scope and identifier's declaration chain
86700b57cec5SDimitry Andric       // once a Sema object is known.
86710b57cec5SDimitry Andric       PreloadedDeclIDs.push_back(DeclIDs[I]);
86720b57cec5SDimitry Andric       continue;
86730b57cec5SDimitry Andric     }
86740b57cec5SDimitry Andric 
86750b57cec5SDimitry Andric     NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
86760b57cec5SDimitry Andric 
86770b57cec5SDimitry Andric     // If we're simply supposed to record the declarations, do so now.
86780b57cec5SDimitry Andric     if (Decls) {
86790b57cec5SDimitry Andric       Decls->push_back(D);
86800b57cec5SDimitry Andric       continue;
86810b57cec5SDimitry Andric     }
86820b57cec5SDimitry Andric 
86830b57cec5SDimitry Andric     // Introduce this declaration into the translation-unit scope
86840b57cec5SDimitry Andric     // and add it to the declaration chain for this identifier, so
86850b57cec5SDimitry Andric     // that (unqualified) name lookup will find it.
86860b57cec5SDimitry Andric     pushExternalDeclIntoScope(D, II);
86870b57cec5SDimitry Andric   }
86880b57cec5SDimitry Andric }
86890b57cec5SDimitry Andric 
86900b57cec5SDimitry Andric IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
86910b57cec5SDimitry Andric   if (ID == 0)
86920b57cec5SDimitry Andric     return nullptr;
86930b57cec5SDimitry Andric 
86940b57cec5SDimitry Andric   if (IdentifiersLoaded.empty()) {
86950b57cec5SDimitry Andric     Error("no identifier table in AST file");
86960b57cec5SDimitry Andric     return nullptr;
86970b57cec5SDimitry Andric   }
86980b57cec5SDimitry Andric 
86990b57cec5SDimitry Andric   ID -= 1;
87000b57cec5SDimitry Andric   if (!IdentifiersLoaded[ID]) {
87010b57cec5SDimitry Andric     GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
87020b57cec5SDimitry Andric     assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
87030b57cec5SDimitry Andric     ModuleFile *M = I->second;
87040b57cec5SDimitry Andric     unsigned Index = ID - M->BaseIdentifierID;
8705fe6060f1SDimitry Andric     const unsigned char *Data =
8706fe6060f1SDimitry Andric         M->IdentifierTableData + M->IdentifierOffsets[Index];
87070b57cec5SDimitry Andric 
8708fe6060f1SDimitry Andric     ASTIdentifierLookupTrait Trait(*this, *M);
8709fe6060f1SDimitry Andric     auto KeyDataLen = Trait.ReadKeyDataLength(Data);
8710fe6060f1SDimitry Andric     auto Key = Trait.ReadKey(Data, KeyDataLen.first);
8711fe6060f1SDimitry Andric     auto &II = PP.getIdentifierTable().get(Key);
87120b57cec5SDimitry Andric     IdentifiersLoaded[ID] = &II;
87130b57cec5SDimitry Andric     markIdentifierFromAST(*this,  II);
87140b57cec5SDimitry Andric     if (DeserializationListener)
87150b57cec5SDimitry Andric       DeserializationListener->IdentifierRead(ID + 1, &II);
87160b57cec5SDimitry Andric   }
87170b57cec5SDimitry Andric 
87180b57cec5SDimitry Andric   return IdentifiersLoaded[ID];
87190b57cec5SDimitry Andric }
87200b57cec5SDimitry Andric 
87210b57cec5SDimitry Andric IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
87220b57cec5SDimitry Andric   return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
87230b57cec5SDimitry Andric }
87240b57cec5SDimitry Andric 
87250b57cec5SDimitry Andric IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
87260b57cec5SDimitry Andric   if (LocalID < NUM_PREDEF_IDENT_IDS)
87270b57cec5SDimitry Andric     return LocalID;
87280b57cec5SDimitry Andric 
87290b57cec5SDimitry Andric   if (!M.ModuleOffsetMap.empty())
87300b57cec5SDimitry Andric     ReadModuleOffsetMap(M);
87310b57cec5SDimitry Andric 
87320b57cec5SDimitry Andric   ContinuousRangeMap<uint32_t, int, 2>::iterator I
87330b57cec5SDimitry Andric     = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
87340b57cec5SDimitry Andric   assert(I != M.IdentifierRemap.end()
87350b57cec5SDimitry Andric          && "Invalid index into identifier index remap");
87360b57cec5SDimitry Andric 
87370b57cec5SDimitry Andric   return LocalID + I->second;
87380b57cec5SDimitry Andric }
87390b57cec5SDimitry Andric 
87400b57cec5SDimitry Andric MacroInfo *ASTReader::getMacro(MacroID ID) {
87410b57cec5SDimitry Andric   if (ID == 0)
87420b57cec5SDimitry Andric     return nullptr;
87430b57cec5SDimitry Andric 
87440b57cec5SDimitry Andric   if (MacrosLoaded.empty()) {
87450b57cec5SDimitry Andric     Error("no macro table in AST file");
87460b57cec5SDimitry Andric     return nullptr;
87470b57cec5SDimitry Andric   }
87480b57cec5SDimitry Andric 
87490b57cec5SDimitry Andric   ID -= NUM_PREDEF_MACRO_IDS;
87500b57cec5SDimitry Andric   if (!MacrosLoaded[ID]) {
87510b57cec5SDimitry Andric     GlobalMacroMapType::iterator I
87520b57cec5SDimitry Andric       = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
87530b57cec5SDimitry Andric     assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
87540b57cec5SDimitry Andric     ModuleFile *M = I->second;
87550b57cec5SDimitry Andric     unsigned Index = ID - M->BaseMacroID;
87565ffd83dbSDimitry Andric     MacrosLoaded[ID] =
87575ffd83dbSDimitry Andric         ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]);
87580b57cec5SDimitry Andric 
87590b57cec5SDimitry Andric     if (DeserializationListener)
87600b57cec5SDimitry Andric       DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
87610b57cec5SDimitry Andric                                          MacrosLoaded[ID]);
87620b57cec5SDimitry Andric   }
87630b57cec5SDimitry Andric 
87640b57cec5SDimitry Andric   return MacrosLoaded[ID];
87650b57cec5SDimitry Andric }
87660b57cec5SDimitry Andric 
87670b57cec5SDimitry Andric MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
87680b57cec5SDimitry Andric   if (LocalID < NUM_PREDEF_MACRO_IDS)
87690b57cec5SDimitry Andric     return LocalID;
87700b57cec5SDimitry Andric 
87710b57cec5SDimitry Andric   if (!M.ModuleOffsetMap.empty())
87720b57cec5SDimitry Andric     ReadModuleOffsetMap(M);
87730b57cec5SDimitry Andric 
87740b57cec5SDimitry Andric   ContinuousRangeMap<uint32_t, int, 2>::iterator I
87750b57cec5SDimitry Andric     = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
87760b57cec5SDimitry Andric   assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
87770b57cec5SDimitry Andric 
87780b57cec5SDimitry Andric   return LocalID + I->second;
87790b57cec5SDimitry Andric }
87800b57cec5SDimitry Andric 
87810b57cec5SDimitry Andric serialization::SubmoduleID
87820b57cec5SDimitry Andric ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
87830b57cec5SDimitry Andric   if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
87840b57cec5SDimitry Andric     return LocalID;
87850b57cec5SDimitry Andric 
87860b57cec5SDimitry Andric   if (!M.ModuleOffsetMap.empty())
87870b57cec5SDimitry Andric     ReadModuleOffsetMap(M);
87880b57cec5SDimitry Andric 
87890b57cec5SDimitry Andric   ContinuousRangeMap<uint32_t, int, 2>::iterator I
87900b57cec5SDimitry Andric     = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
87910b57cec5SDimitry Andric   assert(I != M.SubmoduleRemap.end()
87920b57cec5SDimitry Andric          && "Invalid index into submodule index remap");
87930b57cec5SDimitry Andric 
87940b57cec5SDimitry Andric   return LocalID + I->second;
87950b57cec5SDimitry Andric }
87960b57cec5SDimitry Andric 
87970b57cec5SDimitry Andric Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
87980b57cec5SDimitry Andric   if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
87990b57cec5SDimitry Andric     assert(GlobalID == 0 && "Unhandled global submodule ID");
88000b57cec5SDimitry Andric     return nullptr;
88010b57cec5SDimitry Andric   }
88020b57cec5SDimitry Andric 
88030b57cec5SDimitry Andric   if (GlobalID > SubmodulesLoaded.size()) {
88040b57cec5SDimitry Andric     Error("submodule ID out of range in AST file");
88050b57cec5SDimitry Andric     return nullptr;
88060b57cec5SDimitry Andric   }
88070b57cec5SDimitry Andric 
88080b57cec5SDimitry Andric   return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
88090b57cec5SDimitry Andric }
88100b57cec5SDimitry Andric 
88110b57cec5SDimitry Andric Module *ASTReader::getModule(unsigned ID) {
88120b57cec5SDimitry Andric   return getSubmodule(ID);
88130b57cec5SDimitry Andric }
88140b57cec5SDimitry Andric 
88150b57cec5SDimitry Andric ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
88160b57cec5SDimitry Andric   if (ID & 1) {
88170b57cec5SDimitry Andric     // It's a module, look it up by submodule ID.
88180b57cec5SDimitry Andric     auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
88190b57cec5SDimitry Andric     return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
88200b57cec5SDimitry Andric   } else {
88210b57cec5SDimitry Andric     // It's a prefix (preamble, PCH, ...). Look it up by index.
88220b57cec5SDimitry Andric     unsigned IndexFromEnd = ID >> 1;
88230b57cec5SDimitry Andric     assert(IndexFromEnd && "got reference to unknown module file");
88240b57cec5SDimitry Andric     return getModuleManager().pch_modules().end()[-IndexFromEnd];
88250b57cec5SDimitry Andric   }
88260b57cec5SDimitry Andric }
88270b57cec5SDimitry Andric 
88280b57cec5SDimitry Andric unsigned ASTReader::getModuleFileID(ModuleFile *F) {
88290b57cec5SDimitry Andric   if (!F)
88300b57cec5SDimitry Andric     return 1;
88310b57cec5SDimitry Andric 
88320b57cec5SDimitry Andric   // For a file representing a module, use the submodule ID of the top-level
88330b57cec5SDimitry Andric   // module as the file ID. For any other kind of file, the number of such
88340b57cec5SDimitry Andric   // files loaded beforehand will be the same on reload.
88350b57cec5SDimitry Andric   // FIXME: Is this true even if we have an explicit module file and a PCH?
88360b57cec5SDimitry Andric   if (F->isModule())
88370b57cec5SDimitry Andric     return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
88380b57cec5SDimitry Andric 
88390b57cec5SDimitry Andric   auto PCHModules = getModuleManager().pch_modules();
88400b57cec5SDimitry Andric   auto I = llvm::find(PCHModules, F);
88410b57cec5SDimitry Andric   assert(I != PCHModules.end() && "emitting reference to unknown file");
88420b57cec5SDimitry Andric   return (I - PCHModules.end()) << 1;
88430b57cec5SDimitry Andric }
88440b57cec5SDimitry Andric 
8845bdd1243dSDimitry Andric std::optional<ASTSourceDescriptor> ASTReader::getSourceDescriptor(unsigned ID) {
88465ffd83dbSDimitry Andric   if (Module *M = getSubmodule(ID))
88475ffd83dbSDimitry Andric     return ASTSourceDescriptor(*M);
88480b57cec5SDimitry Andric 
88490b57cec5SDimitry Andric   // If there is only a single PCH, return it instead.
88500b57cec5SDimitry Andric   // Chained PCH are not supported.
88510b57cec5SDimitry Andric   const auto &PCHChain = ModuleMgr.pch_modules();
88520b57cec5SDimitry Andric   if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
88530b57cec5SDimitry Andric     ModuleFile &MF = ModuleMgr.getPrimaryModule();
88540b57cec5SDimitry Andric     StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
88550b57cec5SDimitry Andric     StringRef FileName = llvm::sys::path::filename(MF.FileName);
8856bdd1243dSDimitry Andric     return ASTSourceDescriptor(ModuleName,
8857bdd1243dSDimitry Andric                                llvm::sys::path::parent_path(MF.FileName),
8858bdd1243dSDimitry Andric                                FileName, MF.Signature);
88590b57cec5SDimitry Andric   }
8860bdd1243dSDimitry Andric   return std::nullopt;
88610b57cec5SDimitry Andric }
88620b57cec5SDimitry Andric 
88630b57cec5SDimitry Andric ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) {
88640b57cec5SDimitry Andric   auto I = DefinitionSource.find(FD);
88650b57cec5SDimitry Andric   if (I == DefinitionSource.end())
88660b57cec5SDimitry Andric     return EK_ReplyHazy;
88670b57cec5SDimitry Andric   return I->second ? EK_Never : EK_Always;
88680b57cec5SDimitry Andric }
88690b57cec5SDimitry Andric 
88700b57cec5SDimitry Andric Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
88710b57cec5SDimitry Andric   return DecodeSelector(getGlobalSelectorID(M, LocalID));
88720b57cec5SDimitry Andric }
88730b57cec5SDimitry Andric 
88740b57cec5SDimitry Andric Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
88750b57cec5SDimitry Andric   if (ID == 0)
88760b57cec5SDimitry Andric     return Selector();
88770b57cec5SDimitry Andric 
88780b57cec5SDimitry Andric   if (ID > SelectorsLoaded.size()) {
88790b57cec5SDimitry Andric     Error("selector ID out of range in AST file");
88800b57cec5SDimitry Andric     return Selector();
88810b57cec5SDimitry Andric   }
88820b57cec5SDimitry Andric 
88830b57cec5SDimitry Andric   if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
88840b57cec5SDimitry Andric     // Load this selector from the selector table.
88850b57cec5SDimitry Andric     GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
88860b57cec5SDimitry Andric     assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
88870b57cec5SDimitry Andric     ModuleFile &M = *I->second;
88880b57cec5SDimitry Andric     ASTSelectorLookupTrait Trait(*this, M);
88890b57cec5SDimitry Andric     unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
88900b57cec5SDimitry Andric     SelectorsLoaded[ID - 1] =
88910b57cec5SDimitry Andric       Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
88920b57cec5SDimitry Andric     if (DeserializationListener)
88930b57cec5SDimitry Andric       DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
88940b57cec5SDimitry Andric   }
88950b57cec5SDimitry Andric 
88960b57cec5SDimitry Andric   return SelectorsLoaded[ID - 1];
88970b57cec5SDimitry Andric }
88980b57cec5SDimitry Andric 
88990b57cec5SDimitry Andric Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
89000b57cec5SDimitry Andric   return DecodeSelector(ID);
89010b57cec5SDimitry Andric }
89020b57cec5SDimitry Andric 
89030b57cec5SDimitry Andric uint32_t ASTReader::GetNumExternalSelectors() {
89040b57cec5SDimitry Andric   // ID 0 (the null selector) is considered an external selector.
89050b57cec5SDimitry Andric   return getTotalNumSelectors() + 1;
89060b57cec5SDimitry Andric }
89070b57cec5SDimitry Andric 
89080b57cec5SDimitry Andric serialization::SelectorID
89090b57cec5SDimitry Andric ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
89100b57cec5SDimitry Andric   if (LocalID < NUM_PREDEF_SELECTOR_IDS)
89110b57cec5SDimitry Andric     return LocalID;
89120b57cec5SDimitry Andric 
89130b57cec5SDimitry Andric   if (!M.ModuleOffsetMap.empty())
89140b57cec5SDimitry Andric     ReadModuleOffsetMap(M);
89150b57cec5SDimitry Andric 
89160b57cec5SDimitry Andric   ContinuousRangeMap<uint32_t, int, 2>::iterator I
89170b57cec5SDimitry Andric     = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
89180b57cec5SDimitry Andric   assert(I != M.SelectorRemap.end()
89190b57cec5SDimitry Andric          && "Invalid index into selector index remap");
89200b57cec5SDimitry Andric 
89210b57cec5SDimitry Andric   return LocalID + I->second;
89220b57cec5SDimitry Andric }
89230b57cec5SDimitry Andric 
8924480093f4SDimitry Andric DeclarationNameLoc
8925480093f4SDimitry Andric ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) {
89260b57cec5SDimitry Andric   switch (Name.getNameKind()) {
89270b57cec5SDimitry Andric   case DeclarationName::CXXConstructorName:
89280b57cec5SDimitry Andric   case DeclarationName::CXXDestructorName:
89290b57cec5SDimitry Andric   case DeclarationName::CXXConversionFunctionName:
8930fe6060f1SDimitry Andric     return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo());
89310b57cec5SDimitry Andric 
89320b57cec5SDimitry Andric   case DeclarationName::CXXOperatorName:
8933fe6060f1SDimitry Andric     return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange());
89340b57cec5SDimitry Andric 
89350b57cec5SDimitry Andric   case DeclarationName::CXXLiteralOperatorName:
8936fe6060f1SDimitry Andric     return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc(
8937fe6060f1SDimitry Andric         readSourceLocation());
89380b57cec5SDimitry Andric 
89390b57cec5SDimitry Andric   case DeclarationName::Identifier:
89400b57cec5SDimitry Andric   case DeclarationName::ObjCZeroArgSelector:
89410b57cec5SDimitry Andric   case DeclarationName::ObjCOneArgSelector:
89420b57cec5SDimitry Andric   case DeclarationName::ObjCMultiArgSelector:
89430b57cec5SDimitry Andric   case DeclarationName::CXXUsingDirective:
89440b57cec5SDimitry Andric   case DeclarationName::CXXDeductionGuideName:
89450b57cec5SDimitry Andric     break;
89460b57cec5SDimitry Andric   }
8947fe6060f1SDimitry Andric   return DeclarationNameLoc();
89480b57cec5SDimitry Andric }
89490b57cec5SDimitry Andric 
8950480093f4SDimitry Andric DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() {
8951480093f4SDimitry Andric   DeclarationNameInfo NameInfo;
8952480093f4SDimitry Andric   NameInfo.setName(readDeclarationName());
8953480093f4SDimitry Andric   NameInfo.setLoc(readSourceLocation());
8954480093f4SDimitry Andric   NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName()));
8955480093f4SDimitry Andric   return NameInfo;
89560b57cec5SDimitry Andric }
89570b57cec5SDimitry Andric 
8958480093f4SDimitry Andric void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) {
8959480093f4SDimitry Andric   Info.QualifierLoc = readNestedNameSpecifierLoc();
8960480093f4SDimitry Andric   unsigned NumTPLists = readInt();
89610b57cec5SDimitry Andric   Info.NumTemplParamLists = NumTPLists;
89620b57cec5SDimitry Andric   if (NumTPLists) {
89630b57cec5SDimitry Andric     Info.TemplParamLists =
89640b57cec5SDimitry Andric         new (getContext()) TemplateParameterList *[NumTPLists];
89650b57cec5SDimitry Andric     for (unsigned i = 0; i != NumTPLists; ++i)
8966480093f4SDimitry Andric       Info.TemplParamLists[i] = readTemplateParameterList();
89670b57cec5SDimitry Andric   }
89680b57cec5SDimitry Andric }
89690b57cec5SDimitry Andric 
89700b57cec5SDimitry Andric TemplateParameterList *
8971480093f4SDimitry Andric ASTRecordReader::readTemplateParameterList() {
8972480093f4SDimitry Andric   SourceLocation TemplateLoc = readSourceLocation();
8973480093f4SDimitry Andric   SourceLocation LAngleLoc = readSourceLocation();
8974480093f4SDimitry Andric   SourceLocation RAngleLoc = readSourceLocation();
89750b57cec5SDimitry Andric 
8976480093f4SDimitry Andric   unsigned NumParams = readInt();
89770b57cec5SDimitry Andric   SmallVector<NamedDecl *, 16> Params;
89780b57cec5SDimitry Andric   Params.reserve(NumParams);
89790b57cec5SDimitry Andric   while (NumParams--)
8980480093f4SDimitry Andric     Params.push_back(readDeclAs<NamedDecl>());
89810b57cec5SDimitry Andric 
8982480093f4SDimitry Andric   bool HasRequiresClause = readBool();
8983480093f4SDimitry Andric   Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr;
8984a7dea167SDimitry Andric 
89850b57cec5SDimitry Andric   TemplateParameterList *TemplateParams = TemplateParameterList::Create(
8986a7dea167SDimitry Andric       getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
89870b57cec5SDimitry Andric   return TemplateParams;
89880b57cec5SDimitry Andric }
89890b57cec5SDimitry Andric 
8990480093f4SDimitry Andric void ASTRecordReader::readTemplateArgumentList(
8991480093f4SDimitry Andric                         SmallVectorImpl<TemplateArgument> &TemplArgs,
8992480093f4SDimitry Andric                         bool Canonicalize) {
8993480093f4SDimitry Andric   unsigned NumTemplateArgs = readInt();
89940b57cec5SDimitry Andric   TemplArgs.reserve(NumTemplateArgs);
89950b57cec5SDimitry Andric   while (NumTemplateArgs--)
8996480093f4SDimitry Andric     TemplArgs.push_back(readTemplateArgument(Canonicalize));
89970b57cec5SDimitry Andric }
89980b57cec5SDimitry Andric 
89990b57cec5SDimitry Andric /// Read a UnresolvedSet structure.
9000480093f4SDimitry Andric void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) {
9001480093f4SDimitry Andric   unsigned NumDecls = readInt();
90020b57cec5SDimitry Andric   Set.reserve(getContext(), NumDecls);
90030b57cec5SDimitry Andric   while (NumDecls--) {
9004480093f4SDimitry Andric     DeclID ID = readDeclID();
9005480093f4SDimitry Andric     AccessSpecifier AS = (AccessSpecifier) readInt();
90060b57cec5SDimitry Andric     Set.addLazyDecl(getContext(), ID, AS);
90070b57cec5SDimitry Andric   }
90080b57cec5SDimitry Andric }
90090b57cec5SDimitry Andric 
90100b57cec5SDimitry Andric CXXBaseSpecifier
9011480093f4SDimitry Andric ASTRecordReader::readCXXBaseSpecifier() {
9012480093f4SDimitry Andric   bool isVirtual = readBool();
9013480093f4SDimitry Andric   bool isBaseOfClass = readBool();
9014480093f4SDimitry Andric   AccessSpecifier AS = static_cast<AccessSpecifier>(readInt());
9015480093f4SDimitry Andric   bool inheritConstructors = readBool();
9016480093f4SDimitry Andric   TypeSourceInfo *TInfo = readTypeSourceInfo();
9017480093f4SDimitry Andric   SourceRange Range = readSourceRange();
9018480093f4SDimitry Andric   SourceLocation EllipsisLoc = readSourceLocation();
90190b57cec5SDimitry Andric   CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
90200b57cec5SDimitry Andric                           EllipsisLoc);
90210b57cec5SDimitry Andric   Result.setInheritConstructors(inheritConstructors);
90220b57cec5SDimitry Andric   return Result;
90230b57cec5SDimitry Andric }
90240b57cec5SDimitry Andric 
90250b57cec5SDimitry Andric CXXCtorInitializer **
9026480093f4SDimitry Andric ASTRecordReader::readCXXCtorInitializers() {
90270b57cec5SDimitry Andric   ASTContext &Context = getContext();
9028480093f4SDimitry Andric   unsigned NumInitializers = readInt();
90290b57cec5SDimitry Andric   assert(NumInitializers && "wrote ctor initializers but have no inits");
90300b57cec5SDimitry Andric   auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
90310b57cec5SDimitry Andric   for (unsigned i = 0; i != NumInitializers; ++i) {
90320b57cec5SDimitry Andric     TypeSourceInfo *TInfo = nullptr;
90330b57cec5SDimitry Andric     bool IsBaseVirtual = false;
90340b57cec5SDimitry Andric     FieldDecl *Member = nullptr;
90350b57cec5SDimitry Andric     IndirectFieldDecl *IndirectMember = nullptr;
90360b57cec5SDimitry Andric 
9037480093f4SDimitry Andric     CtorInitializerType Type = (CtorInitializerType) readInt();
90380b57cec5SDimitry Andric     switch (Type) {
90390b57cec5SDimitry Andric     case CTOR_INITIALIZER_BASE:
9040480093f4SDimitry Andric       TInfo = readTypeSourceInfo();
9041480093f4SDimitry Andric       IsBaseVirtual = readBool();
90420b57cec5SDimitry Andric       break;
90430b57cec5SDimitry Andric 
90440b57cec5SDimitry Andric     case CTOR_INITIALIZER_DELEGATING:
9045480093f4SDimitry Andric       TInfo = readTypeSourceInfo();
90460b57cec5SDimitry Andric       break;
90470b57cec5SDimitry Andric 
90480b57cec5SDimitry Andric      case CTOR_INITIALIZER_MEMBER:
9049480093f4SDimitry Andric       Member = readDeclAs<FieldDecl>();
90500b57cec5SDimitry Andric       break;
90510b57cec5SDimitry Andric 
90520b57cec5SDimitry Andric      case CTOR_INITIALIZER_INDIRECT_MEMBER:
9053480093f4SDimitry Andric       IndirectMember = readDeclAs<IndirectFieldDecl>();
90540b57cec5SDimitry Andric       break;
90550b57cec5SDimitry Andric     }
90560b57cec5SDimitry Andric 
9057480093f4SDimitry Andric     SourceLocation MemberOrEllipsisLoc = readSourceLocation();
9058480093f4SDimitry Andric     Expr *Init = readExpr();
9059480093f4SDimitry Andric     SourceLocation LParenLoc = readSourceLocation();
9060480093f4SDimitry Andric     SourceLocation RParenLoc = readSourceLocation();
90610b57cec5SDimitry Andric 
90620b57cec5SDimitry Andric     CXXCtorInitializer *BOMInit;
90630b57cec5SDimitry Andric     if (Type == CTOR_INITIALIZER_BASE)
90640b57cec5SDimitry Andric       BOMInit = new (Context)
90650b57cec5SDimitry Andric           CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
90660b57cec5SDimitry Andric                              RParenLoc, MemberOrEllipsisLoc);
90670b57cec5SDimitry Andric     else if (Type == CTOR_INITIALIZER_DELEGATING)
90680b57cec5SDimitry Andric       BOMInit = new (Context)
90690b57cec5SDimitry Andric           CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
90700b57cec5SDimitry Andric     else if (Member)
90710b57cec5SDimitry Andric       BOMInit = new (Context)
90720b57cec5SDimitry Andric           CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc,
90730b57cec5SDimitry Andric                              Init, RParenLoc);
90740b57cec5SDimitry Andric     else
90750b57cec5SDimitry Andric       BOMInit = new (Context)
90760b57cec5SDimitry Andric           CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
90770b57cec5SDimitry Andric                              LParenLoc, Init, RParenLoc);
90780b57cec5SDimitry Andric 
9079480093f4SDimitry Andric     if (/*IsWritten*/readBool()) {
9080480093f4SDimitry Andric       unsigned SourceOrder = readInt();
90810b57cec5SDimitry Andric       BOMInit->setSourceOrder(SourceOrder);
90820b57cec5SDimitry Andric     }
90830b57cec5SDimitry Andric 
90840b57cec5SDimitry Andric     CtorInitializers[i] = BOMInit;
90850b57cec5SDimitry Andric   }
90860b57cec5SDimitry Andric 
90870b57cec5SDimitry Andric   return CtorInitializers;
90880b57cec5SDimitry Andric }
90890b57cec5SDimitry Andric 
90900b57cec5SDimitry Andric NestedNameSpecifierLoc
9091480093f4SDimitry Andric ASTRecordReader::readNestedNameSpecifierLoc() {
90920b57cec5SDimitry Andric   ASTContext &Context = getContext();
9093480093f4SDimitry Andric   unsigned N = readInt();
90940b57cec5SDimitry Andric   NestedNameSpecifierLocBuilder Builder;
90950b57cec5SDimitry Andric   for (unsigned I = 0; I != N; ++I) {
9096480093f4SDimitry Andric     auto Kind = readNestedNameSpecifierKind();
90970b57cec5SDimitry Andric     switch (Kind) {
90980b57cec5SDimitry Andric     case NestedNameSpecifier::Identifier: {
9099480093f4SDimitry Andric       IdentifierInfo *II = readIdentifier();
9100480093f4SDimitry Andric       SourceRange Range = readSourceRange();
91010b57cec5SDimitry Andric       Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
91020b57cec5SDimitry Andric       break;
91030b57cec5SDimitry Andric     }
91040b57cec5SDimitry Andric 
91050b57cec5SDimitry Andric     case NestedNameSpecifier::Namespace: {
9106480093f4SDimitry Andric       NamespaceDecl *NS = readDeclAs<NamespaceDecl>();
9107480093f4SDimitry Andric       SourceRange Range = readSourceRange();
91080b57cec5SDimitry Andric       Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
91090b57cec5SDimitry Andric       break;
91100b57cec5SDimitry Andric     }
91110b57cec5SDimitry Andric 
91120b57cec5SDimitry Andric     case NestedNameSpecifier::NamespaceAlias: {
9113480093f4SDimitry Andric       NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>();
9114480093f4SDimitry Andric       SourceRange Range = readSourceRange();
91150b57cec5SDimitry Andric       Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
91160b57cec5SDimitry Andric       break;
91170b57cec5SDimitry Andric     }
91180b57cec5SDimitry Andric 
91190b57cec5SDimitry Andric     case NestedNameSpecifier::TypeSpec:
91200b57cec5SDimitry Andric     case NestedNameSpecifier::TypeSpecWithTemplate: {
9121480093f4SDimitry Andric       bool Template = readBool();
9122480093f4SDimitry Andric       TypeSourceInfo *T = readTypeSourceInfo();
91230b57cec5SDimitry Andric       if (!T)
91240b57cec5SDimitry Andric         return NestedNameSpecifierLoc();
9125480093f4SDimitry Andric       SourceLocation ColonColonLoc = readSourceLocation();
91260b57cec5SDimitry Andric 
91270b57cec5SDimitry Andric       // FIXME: 'template' keyword location not saved anywhere, so we fake it.
91280b57cec5SDimitry Andric       Builder.Extend(Context,
91290b57cec5SDimitry Andric                      Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
91300b57cec5SDimitry Andric                      T->getTypeLoc(), ColonColonLoc);
91310b57cec5SDimitry Andric       break;
91320b57cec5SDimitry Andric     }
91330b57cec5SDimitry Andric 
91340b57cec5SDimitry Andric     case NestedNameSpecifier::Global: {
9135480093f4SDimitry Andric       SourceLocation ColonColonLoc = readSourceLocation();
91360b57cec5SDimitry Andric       Builder.MakeGlobal(Context, ColonColonLoc);
91370b57cec5SDimitry Andric       break;
91380b57cec5SDimitry Andric     }
91390b57cec5SDimitry Andric 
91400b57cec5SDimitry Andric     case NestedNameSpecifier::Super: {
9141480093f4SDimitry Andric       CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>();
9142480093f4SDimitry Andric       SourceRange Range = readSourceRange();
91430b57cec5SDimitry Andric       Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
91440b57cec5SDimitry Andric       break;
91450b57cec5SDimitry Andric     }
91460b57cec5SDimitry Andric     }
91470b57cec5SDimitry Andric   }
91480b57cec5SDimitry Andric 
91490b57cec5SDimitry Andric   return Builder.getWithLocInContext(Context);
91500b57cec5SDimitry Andric }
91510b57cec5SDimitry Andric 
915281ad6265SDimitry Andric SourceRange ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
915381ad6265SDimitry Andric                                        unsigned &Idx, LocSeq *Seq) {
915481ad6265SDimitry Andric   SourceLocation beg = ReadSourceLocation(F, Record, Idx, Seq);
915581ad6265SDimitry Andric   SourceLocation end = ReadSourceLocation(F, Record, Idx, Seq);
91560b57cec5SDimitry Andric   return SourceRange(beg, end);
91570b57cec5SDimitry Andric }
91580b57cec5SDimitry Andric 
91590b57cec5SDimitry Andric /// Read a floating-point value
9160480093f4SDimitry Andric llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) {
9161480093f4SDimitry Andric   return llvm::APFloat(Sem, readAPInt());
91620b57cec5SDimitry Andric }
91630b57cec5SDimitry Andric 
91640b57cec5SDimitry Andric // Read a string
9165*06c3fb27SDimitry Andric std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) {
91660b57cec5SDimitry Andric   unsigned Len = Record[Idx++];
91670b57cec5SDimitry Andric   std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
91680b57cec5SDimitry Andric   Idx += Len;
91690b57cec5SDimitry Andric   return Result;
91700b57cec5SDimitry Andric }
91710b57cec5SDimitry Andric 
91720b57cec5SDimitry Andric std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
91730b57cec5SDimitry Andric                                 unsigned &Idx) {
91740b57cec5SDimitry Andric   std::string Filename = ReadString(Record, Idx);
91750b57cec5SDimitry Andric   ResolveImportedPath(F, Filename);
91760b57cec5SDimitry Andric   return Filename;
91770b57cec5SDimitry Andric }
91780b57cec5SDimitry Andric 
91790b57cec5SDimitry Andric std::string ASTReader::ReadPath(StringRef BaseDirectory,
91800b57cec5SDimitry Andric                                 const RecordData &Record, unsigned &Idx) {
91810b57cec5SDimitry Andric   std::string Filename = ReadString(Record, Idx);
91820b57cec5SDimitry Andric   if (!BaseDirectory.empty())
91830b57cec5SDimitry Andric     ResolveImportedPath(Filename, BaseDirectory);
91840b57cec5SDimitry Andric   return Filename;
91850b57cec5SDimitry Andric }
91860b57cec5SDimitry Andric 
91870b57cec5SDimitry Andric VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
91880b57cec5SDimitry Andric                                          unsigned &Idx) {
91890b57cec5SDimitry Andric   unsigned Major = Record[Idx++];
91900b57cec5SDimitry Andric   unsigned Minor = Record[Idx++];
91910b57cec5SDimitry Andric   unsigned Subminor = Record[Idx++];
91920b57cec5SDimitry Andric   if (Minor == 0)
91930b57cec5SDimitry Andric     return VersionTuple(Major);
91940b57cec5SDimitry Andric   if (Subminor == 0)
91950b57cec5SDimitry Andric     return VersionTuple(Major, Minor - 1);
91960b57cec5SDimitry Andric   return VersionTuple(Major, Minor - 1, Subminor - 1);
91970b57cec5SDimitry Andric }
91980b57cec5SDimitry Andric 
91990b57cec5SDimitry Andric CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
92000b57cec5SDimitry Andric                                           const RecordData &Record,
92010b57cec5SDimitry Andric                                           unsigned &Idx) {
92020b57cec5SDimitry Andric   CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
92030b57cec5SDimitry Andric   return CXXTemporary::Create(getContext(), Decl);
92040b57cec5SDimitry Andric }
92050b57cec5SDimitry Andric 
92060b57cec5SDimitry Andric DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const {
92070b57cec5SDimitry Andric   return Diag(CurrentImportLoc, DiagID);
92080b57cec5SDimitry Andric }
92090b57cec5SDimitry Andric 
92100b57cec5SDimitry Andric DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const {
92110b57cec5SDimitry Andric   return Diags.Report(Loc, DiagID);
92120b57cec5SDimitry Andric }
92130b57cec5SDimitry Andric 
92140b57cec5SDimitry Andric /// Retrieve the identifier table associated with the
92150b57cec5SDimitry Andric /// preprocessor.
92160b57cec5SDimitry Andric IdentifierTable &ASTReader::getIdentifierTable() {
92170b57cec5SDimitry Andric   return PP.getIdentifierTable();
92180b57cec5SDimitry Andric }
92190b57cec5SDimitry Andric 
92200b57cec5SDimitry Andric /// Record that the given ID maps to the given switch-case
92210b57cec5SDimitry Andric /// statement.
92220b57cec5SDimitry Andric void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
92230b57cec5SDimitry Andric   assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
92240b57cec5SDimitry Andric          "Already have a SwitchCase with this ID");
92250b57cec5SDimitry Andric   (*CurrSwitchCaseStmts)[ID] = SC;
92260b57cec5SDimitry Andric }
92270b57cec5SDimitry Andric 
92280b57cec5SDimitry Andric /// Retrieve the switch-case statement with the given ID.
92290b57cec5SDimitry Andric SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
92300b57cec5SDimitry Andric   assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
92310b57cec5SDimitry Andric   return (*CurrSwitchCaseStmts)[ID];
92320b57cec5SDimitry Andric }
92330b57cec5SDimitry Andric 
92340b57cec5SDimitry Andric void ASTReader::ClearSwitchCaseIDs() {
92350b57cec5SDimitry Andric   CurrSwitchCaseStmts->clear();
92360b57cec5SDimitry Andric }
92370b57cec5SDimitry Andric 
92380b57cec5SDimitry Andric void ASTReader::ReadComments() {
92390b57cec5SDimitry Andric   ASTContext &Context = getContext();
92400b57cec5SDimitry Andric   std::vector<RawComment *> Comments;
92410b57cec5SDimitry Andric   for (SmallVectorImpl<std::pair<BitstreamCursor,
92420b57cec5SDimitry Andric                                  serialization::ModuleFile *>>::iterator
92430b57cec5SDimitry Andric        I = CommentsCursors.begin(),
92440b57cec5SDimitry Andric        E = CommentsCursors.end();
92450b57cec5SDimitry Andric        I != E; ++I) {
92460b57cec5SDimitry Andric     Comments.clear();
92470b57cec5SDimitry Andric     BitstreamCursor &Cursor = I->first;
92480b57cec5SDimitry Andric     serialization::ModuleFile &F = *I->second;
92490b57cec5SDimitry Andric     SavedStreamPosition SavedPosition(Cursor);
92500b57cec5SDimitry Andric 
92510b57cec5SDimitry Andric     RecordData Record;
92520b57cec5SDimitry Andric     while (true) {
92530b57cec5SDimitry Andric       Expected<llvm::BitstreamEntry> MaybeEntry =
92540b57cec5SDimitry Andric           Cursor.advanceSkippingSubblocks(
92550b57cec5SDimitry Andric               BitstreamCursor::AF_DontPopBlockAtEnd);
92560b57cec5SDimitry Andric       if (!MaybeEntry) {
92570b57cec5SDimitry Andric         Error(MaybeEntry.takeError());
92580b57cec5SDimitry Andric         return;
92590b57cec5SDimitry Andric       }
92600b57cec5SDimitry Andric       llvm::BitstreamEntry Entry = MaybeEntry.get();
92610b57cec5SDimitry Andric 
92620b57cec5SDimitry Andric       switch (Entry.Kind) {
92630b57cec5SDimitry Andric       case llvm::BitstreamEntry::SubBlock: // Handled for us already.
92640b57cec5SDimitry Andric       case llvm::BitstreamEntry::Error:
92650b57cec5SDimitry Andric         Error("malformed block record in AST file");
92660b57cec5SDimitry Andric         return;
92670b57cec5SDimitry Andric       case llvm::BitstreamEntry::EndBlock:
92680b57cec5SDimitry Andric         goto NextCursor;
92690b57cec5SDimitry Andric       case llvm::BitstreamEntry::Record:
92700b57cec5SDimitry Andric         // The interesting case.
92710b57cec5SDimitry Andric         break;
92720b57cec5SDimitry Andric       }
92730b57cec5SDimitry Andric 
92740b57cec5SDimitry Andric       // Read a record.
92750b57cec5SDimitry Andric       Record.clear();
92760b57cec5SDimitry Andric       Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record);
92770b57cec5SDimitry Andric       if (!MaybeComment) {
92780b57cec5SDimitry Andric         Error(MaybeComment.takeError());
92790b57cec5SDimitry Andric         return;
92800b57cec5SDimitry Andric       }
92810b57cec5SDimitry Andric       switch ((CommentRecordTypes)MaybeComment.get()) {
92820b57cec5SDimitry Andric       case COMMENTS_RAW_COMMENT: {
92830b57cec5SDimitry Andric         unsigned Idx = 0;
92840b57cec5SDimitry Andric         SourceRange SR = ReadSourceRange(F, Record, Idx);
92850b57cec5SDimitry Andric         RawComment::CommentKind Kind =
92860b57cec5SDimitry Andric             (RawComment::CommentKind) Record[Idx++];
92870b57cec5SDimitry Andric         bool IsTrailingComment = Record[Idx++];
92880b57cec5SDimitry Andric         bool IsAlmostTrailingComment = Record[Idx++];
92890b57cec5SDimitry Andric         Comments.push_back(new (Context) RawComment(
92900b57cec5SDimitry Andric             SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
92910b57cec5SDimitry Andric         break;
92920b57cec5SDimitry Andric       }
92930b57cec5SDimitry Andric       }
92940b57cec5SDimitry Andric     }
92950b57cec5SDimitry Andric   NextCursor:
9296a7dea167SDimitry Andric     llvm::DenseMap<FileID, std::map<unsigned, RawComment *>>
9297a7dea167SDimitry Andric         FileToOffsetToComment;
9298a7dea167SDimitry Andric     for (RawComment *C : Comments) {
9299a7dea167SDimitry Andric       SourceLocation CommentLoc = C->getBeginLoc();
9300a7dea167SDimitry Andric       if (CommentLoc.isValid()) {
9301a7dea167SDimitry Andric         std::pair<FileID, unsigned> Loc =
9302a7dea167SDimitry Andric             SourceMgr.getDecomposedLoc(CommentLoc);
9303a7dea167SDimitry Andric         if (Loc.first.isValid())
9304a7dea167SDimitry Andric           Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C);
9305a7dea167SDimitry Andric       }
9306a7dea167SDimitry Andric     }
93070b57cec5SDimitry Andric   }
93080b57cec5SDimitry Andric }
93090b57cec5SDimitry Andric 
93100b57cec5SDimitry Andric void ASTReader::visitInputFiles(serialization::ModuleFile &MF,
93110b57cec5SDimitry Andric                                 bool IncludeSystem, bool Complain,
93120b57cec5SDimitry Andric                     llvm::function_ref<void(const serialization::InputFile &IF,
93130b57cec5SDimitry Andric                                             bool isSystem)> Visitor) {
93140b57cec5SDimitry Andric   unsigned NumUserInputs = MF.NumUserInputFiles;
93150b57cec5SDimitry Andric   unsigned NumInputs = MF.InputFilesLoaded.size();
93160b57cec5SDimitry Andric   assert(NumUserInputs <= NumInputs);
93170b57cec5SDimitry Andric   unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
93180b57cec5SDimitry Andric   for (unsigned I = 0; I < N; ++I) {
93190b57cec5SDimitry Andric     bool IsSystem = I >= NumUserInputs;
93200b57cec5SDimitry Andric     InputFile IF = getInputFile(MF, I+1, Complain);
93210b57cec5SDimitry Andric     Visitor(IF, IsSystem);
93220b57cec5SDimitry Andric   }
93230b57cec5SDimitry Andric }
93240b57cec5SDimitry Andric 
93250b57cec5SDimitry Andric void ASTReader::visitTopLevelModuleMaps(
93260b57cec5SDimitry Andric     serialization::ModuleFile &MF,
9327bdd1243dSDimitry Andric     llvm::function_ref<void(FileEntryRef FE)> Visitor) {
93280b57cec5SDimitry Andric   unsigned NumInputs = MF.InputFilesLoaded.size();
93290b57cec5SDimitry Andric   for (unsigned I = 0; I < NumInputs; ++I) {
9330bdd1243dSDimitry Andric     InputFileInfo IFI = getInputFileInfo(MF, I + 1);
93310b57cec5SDimitry Andric     if (IFI.TopLevelModuleMap)
9332e8d8bef9SDimitry Andric       if (auto FE = getInputFile(MF, I + 1).getFile())
9333bdd1243dSDimitry Andric         Visitor(*FE);
93340b57cec5SDimitry Andric   }
93350b57cec5SDimitry Andric }
93360b57cec5SDimitry Andric 
93370b57cec5SDimitry Andric void ASTReader::finishPendingActions() {
9338*06c3fb27SDimitry Andric   while (
9339*06c3fb27SDimitry Andric       !PendingIdentifierInfos.empty() || !PendingDeducedFunctionTypes.empty() ||
9340*06c3fb27SDimitry Andric       !PendingDeducedVarTypes.empty() || !PendingIncompleteDeclChains.empty() ||
9341*06c3fb27SDimitry Andric       !PendingDeclChains.empty() || !PendingMacroIDs.empty() ||
9342*06c3fb27SDimitry Andric       !PendingDeclContextInfos.empty() || !PendingUpdateRecords.empty() ||
934381ad6265SDimitry Andric       !PendingObjCExtensionIvarRedeclarations.empty()) {
93440b57cec5SDimitry Andric     // If any identifiers with corresponding top-level declarations have
93450b57cec5SDimitry Andric     // been loaded, load those declarations now.
93460b57cec5SDimitry Andric     using TopLevelDeclsMap =
93470b57cec5SDimitry Andric         llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
93480b57cec5SDimitry Andric     TopLevelDeclsMap TopLevelDecls;
93490b57cec5SDimitry Andric 
93500b57cec5SDimitry Andric     while (!PendingIdentifierInfos.empty()) {
93510b57cec5SDimitry Andric       IdentifierInfo *II = PendingIdentifierInfos.back().first;
93520b57cec5SDimitry Andric       SmallVector<uint32_t, 4> DeclIDs =
93530b57cec5SDimitry Andric           std::move(PendingIdentifierInfos.back().second);
93540b57cec5SDimitry Andric       PendingIdentifierInfos.pop_back();
93550b57cec5SDimitry Andric 
93560b57cec5SDimitry Andric       SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
93570b57cec5SDimitry Andric     }
93580b57cec5SDimitry Andric 
93590b57cec5SDimitry Andric     // Load each function type that we deferred loading because it was a
93600b57cec5SDimitry Andric     // deduced type that might refer to a local type declared within itself.
9361*06c3fb27SDimitry Andric     for (unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
9362*06c3fb27SDimitry Andric       auto *FD = PendingDeducedFunctionTypes[I].first;
9363*06c3fb27SDimitry Andric       FD->setType(GetType(PendingDeducedFunctionTypes[I].second));
93640b57cec5SDimitry Andric 
93650b57cec5SDimitry Andric       // If we gave a function a deduced return type, remember that we need to
93660b57cec5SDimitry Andric       // propagate that along the redeclaration chain.
93670b57cec5SDimitry Andric       auto *DT = FD->getReturnType()->getContainedDeducedType();
93680b57cec5SDimitry Andric       if (DT && DT->isDeduced())
93690b57cec5SDimitry Andric         PendingDeducedTypeUpdates.insert(
93700b57cec5SDimitry Andric             {FD->getCanonicalDecl(), FD->getReturnType()});
93710b57cec5SDimitry Andric     }
9372*06c3fb27SDimitry Andric     PendingDeducedFunctionTypes.clear();
9373*06c3fb27SDimitry Andric 
9374*06c3fb27SDimitry Andric     // Load each variable type that we deferred loading because it was a
9375*06c3fb27SDimitry Andric     // deduced type that might refer to a local type declared within itself.
9376*06c3fb27SDimitry Andric     for (unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
9377*06c3fb27SDimitry Andric       auto *VD = PendingDeducedVarTypes[I].first;
9378*06c3fb27SDimitry Andric       VD->setType(GetType(PendingDeducedVarTypes[I].second));
9379*06c3fb27SDimitry Andric     }
9380*06c3fb27SDimitry Andric     PendingDeducedVarTypes.clear();
93810b57cec5SDimitry Andric 
93820b57cec5SDimitry Andric     // For each decl chain that we wanted to complete while deserializing, mark
93830b57cec5SDimitry Andric     // it as "still needs to be completed".
93840b57cec5SDimitry Andric     for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
93850b57cec5SDimitry Andric       markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
93860b57cec5SDimitry Andric     }
93870b57cec5SDimitry Andric     PendingIncompleteDeclChains.clear();
93880b57cec5SDimitry Andric 
93890b57cec5SDimitry Andric     // Load pending declaration chains.
93900b57cec5SDimitry Andric     for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
93910b57cec5SDimitry Andric       loadPendingDeclChain(PendingDeclChains[I].first,
93920b57cec5SDimitry Andric                            PendingDeclChains[I].second);
93930b57cec5SDimitry Andric     PendingDeclChains.clear();
93940b57cec5SDimitry Andric 
93950b57cec5SDimitry Andric     // Make the most recent of the top-level declarations visible.
93960b57cec5SDimitry Andric     for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
93970b57cec5SDimitry Andric            TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
93980b57cec5SDimitry Andric       IdentifierInfo *II = TLD->first;
93990b57cec5SDimitry Andric       for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
94000b57cec5SDimitry Andric         pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
94010b57cec5SDimitry Andric       }
94020b57cec5SDimitry Andric     }
94030b57cec5SDimitry Andric 
94040b57cec5SDimitry Andric     // Load any pending macro definitions.
94050b57cec5SDimitry Andric     for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
94060b57cec5SDimitry Andric       IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
94070b57cec5SDimitry Andric       SmallVector<PendingMacroInfo, 2> GlobalIDs;
94080b57cec5SDimitry Andric       GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
94090b57cec5SDimitry Andric       // Initialize the macro history from chained-PCHs ahead of module imports.
94100b57cec5SDimitry Andric       for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
94110b57cec5SDimitry Andric            ++IDIdx) {
94120b57cec5SDimitry Andric         const PendingMacroInfo &Info = GlobalIDs[IDIdx];
94130b57cec5SDimitry Andric         if (!Info.M->isModule())
94140b57cec5SDimitry Andric           resolvePendingMacro(II, Info);
94150b57cec5SDimitry Andric       }
94160b57cec5SDimitry Andric       // Handle module imports.
94170b57cec5SDimitry Andric       for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
94180b57cec5SDimitry Andric            ++IDIdx) {
94190b57cec5SDimitry Andric         const PendingMacroInfo &Info = GlobalIDs[IDIdx];
94200b57cec5SDimitry Andric         if (Info.M->isModule())
94210b57cec5SDimitry Andric           resolvePendingMacro(II, Info);
94220b57cec5SDimitry Andric       }
94230b57cec5SDimitry Andric     }
94240b57cec5SDimitry Andric     PendingMacroIDs.clear();
94250b57cec5SDimitry Andric 
94260b57cec5SDimitry Andric     // Wire up the DeclContexts for Decls that we delayed setting until
94270b57cec5SDimitry Andric     // recursive loading is completed.
94280b57cec5SDimitry Andric     while (!PendingDeclContextInfos.empty()) {
94290b57cec5SDimitry Andric       PendingDeclContextInfo Info = PendingDeclContextInfos.front();
94300b57cec5SDimitry Andric       PendingDeclContextInfos.pop_front();
94310b57cec5SDimitry Andric       DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
94320b57cec5SDimitry Andric       DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
94330b57cec5SDimitry Andric       Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
94340b57cec5SDimitry Andric     }
94350b57cec5SDimitry Andric 
94360b57cec5SDimitry Andric     // Perform any pending declaration updates.
94370b57cec5SDimitry Andric     while (!PendingUpdateRecords.empty()) {
94380b57cec5SDimitry Andric       auto Update = PendingUpdateRecords.pop_back_val();
94390b57cec5SDimitry Andric       ReadingKindTracker ReadingKind(Read_Decl, *this);
94400b57cec5SDimitry Andric       loadDeclUpdateRecords(Update);
94410b57cec5SDimitry Andric     }
944281ad6265SDimitry Andric 
944381ad6265SDimitry Andric     while (!PendingObjCExtensionIvarRedeclarations.empty()) {
944481ad6265SDimitry Andric       auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
944581ad6265SDimitry Andric       auto DuplicateIvars =
944681ad6265SDimitry Andric           PendingObjCExtensionIvarRedeclarations.back().second;
944781ad6265SDimitry Andric       llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls;
944881ad6265SDimitry Andric       StructuralEquivalenceContext Ctx(
944981ad6265SDimitry Andric           ExtensionsPair.first->getASTContext(),
945081ad6265SDimitry Andric           ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
945181ad6265SDimitry Andric           StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false,
945281ad6265SDimitry Andric           /*Complain =*/false,
945381ad6265SDimitry Andric           /*ErrorOnTagTypeMismatch =*/true);
945481ad6265SDimitry Andric       if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
945581ad6265SDimitry Andric         // Merge redeclared ivars with their predecessors.
945681ad6265SDimitry Andric         for (auto IvarPair : DuplicateIvars) {
945781ad6265SDimitry Andric           ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
945881ad6265SDimitry Andric           // Change semantic DeclContext but keep the lexical one.
945981ad6265SDimitry Andric           Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
946081ad6265SDimitry Andric                                     Ivar->getLexicalDeclContext(),
946181ad6265SDimitry Andric                                     getContext());
946281ad6265SDimitry Andric           getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl());
946381ad6265SDimitry Andric         }
946481ad6265SDimitry Andric         // Invalidate duplicate extension and the cached ivar list.
946581ad6265SDimitry Andric         ExtensionsPair.first->setInvalidDecl();
946681ad6265SDimitry Andric         ExtensionsPair.second->getClassInterface()
946781ad6265SDimitry Andric             ->getDefinition()
946881ad6265SDimitry Andric             ->setIvarList(nullptr);
946981ad6265SDimitry Andric       } else {
947081ad6265SDimitry Andric         for (auto IvarPair : DuplicateIvars) {
947181ad6265SDimitry Andric           Diag(IvarPair.first->getLocation(),
947281ad6265SDimitry Andric                diag::err_duplicate_ivar_declaration)
947381ad6265SDimitry Andric               << IvarPair.first->getIdentifier();
947481ad6265SDimitry Andric           Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
947581ad6265SDimitry Andric         }
947681ad6265SDimitry Andric       }
947781ad6265SDimitry Andric       PendingObjCExtensionIvarRedeclarations.pop_back();
947881ad6265SDimitry Andric     }
94790b57cec5SDimitry Andric   }
94800b57cec5SDimitry Andric 
94810b57cec5SDimitry Andric   // At this point, all update records for loaded decls are in place, so any
94820b57cec5SDimitry Andric   // fake class definitions should have become real.
94830b57cec5SDimitry Andric   assert(PendingFakeDefinitionData.empty() &&
94840b57cec5SDimitry Andric          "faked up a class definition but never saw the real one");
94850b57cec5SDimitry Andric 
94860b57cec5SDimitry Andric   // If we deserialized any C++ or Objective-C class definitions, any
94870b57cec5SDimitry Andric   // Objective-C protocol definitions, or any redeclarable templates, make sure
94880b57cec5SDimitry Andric   // that all redeclarations point to the definitions. Note that this can only
94890b57cec5SDimitry Andric   // happen now, after the redeclaration chains have been fully wired.
94900b57cec5SDimitry Andric   for (Decl *D : PendingDefinitions) {
94910b57cec5SDimitry Andric     if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
94920b57cec5SDimitry Andric       if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
94930b57cec5SDimitry Andric         // Make sure that the TagType points at the definition.
94940b57cec5SDimitry Andric         const_cast<TagType*>(TagT)->decl = TD;
94950b57cec5SDimitry Andric       }
94960b57cec5SDimitry Andric 
94970b57cec5SDimitry Andric       if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
94980b57cec5SDimitry Andric         for (auto *R = getMostRecentExistingDecl(RD); R;
94990b57cec5SDimitry Andric              R = R->getPreviousDecl()) {
95000b57cec5SDimitry Andric           assert((R == D) ==
95010b57cec5SDimitry Andric                      cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
95020b57cec5SDimitry Andric                  "declaration thinks it's the definition but it isn't");
95030b57cec5SDimitry Andric           cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
95040b57cec5SDimitry Andric         }
95050b57cec5SDimitry Andric       }
95060b57cec5SDimitry Andric 
95070b57cec5SDimitry Andric       continue;
95080b57cec5SDimitry Andric     }
95090b57cec5SDimitry Andric 
95100b57cec5SDimitry Andric     if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
95110b57cec5SDimitry Andric       // Make sure that the ObjCInterfaceType points at the definition.
95120b57cec5SDimitry Andric       const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
95130b57cec5SDimitry Andric         ->Decl = ID;
95140b57cec5SDimitry Andric 
95150b57cec5SDimitry Andric       for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
95160b57cec5SDimitry Andric         cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
95170b57cec5SDimitry Andric 
95180b57cec5SDimitry Andric       continue;
95190b57cec5SDimitry Andric     }
95200b57cec5SDimitry Andric 
95210b57cec5SDimitry Andric     if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
95220b57cec5SDimitry Andric       for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
95230b57cec5SDimitry Andric         cast<ObjCProtocolDecl>(R)->Data = PD->Data;
95240b57cec5SDimitry Andric 
95250b57cec5SDimitry Andric       continue;
95260b57cec5SDimitry Andric     }
95270b57cec5SDimitry Andric 
95280b57cec5SDimitry Andric     auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
95290b57cec5SDimitry Andric     for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
95300b57cec5SDimitry Andric       cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
95310b57cec5SDimitry Andric   }
95320b57cec5SDimitry Andric   PendingDefinitions.clear();
95330b57cec5SDimitry Andric 
95340b57cec5SDimitry Andric   // Load the bodies of any functions or methods we've encountered. We do
95350b57cec5SDimitry Andric   // this now (delayed) so that we can be sure that the declaration chains
95360b57cec5SDimitry Andric   // have been fully wired up (hasBody relies on this).
95370b57cec5SDimitry Andric   // FIXME: We shouldn't require complete redeclaration chains here.
95380b57cec5SDimitry Andric   for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
95390b57cec5SDimitry Andric                                PBEnd = PendingBodies.end();
95400b57cec5SDimitry Andric        PB != PBEnd; ++PB) {
95410b57cec5SDimitry Andric     if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
95420b57cec5SDimitry Andric       // For a function defined inline within a class template, force the
95430b57cec5SDimitry Andric       // canonical definition to be the one inside the canonical definition of
95440b57cec5SDimitry Andric       // the template. This ensures that we instantiate from a correct view
95450b57cec5SDimitry Andric       // of the template.
95460b57cec5SDimitry Andric       //
95470b57cec5SDimitry Andric       // Sadly we can't do this more generally: we can't be sure that all
95480b57cec5SDimitry Andric       // copies of an arbitrary class definition will have the same members
95490b57cec5SDimitry Andric       // defined (eg, some member functions may not be instantiated, and some
95500b57cec5SDimitry Andric       // special members may or may not have been implicitly defined).
95510b57cec5SDimitry Andric       if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent()))
95520b57cec5SDimitry Andric         if (RD->isDependentContext() && !RD->isThisDeclarationADefinition())
95530b57cec5SDimitry Andric           continue;
95540b57cec5SDimitry Andric 
95550b57cec5SDimitry Andric       // FIXME: Check for =delete/=default?
95560b57cec5SDimitry Andric       const FunctionDecl *Defn = nullptr;
95570b57cec5SDimitry Andric       if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
95580b57cec5SDimitry Andric         FD->setLazyBody(PB->second);
95590b57cec5SDimitry Andric       } else {
95600b57cec5SDimitry Andric         auto *NonConstDefn = const_cast<FunctionDecl*>(Defn);
95610b57cec5SDimitry Andric         mergeDefinitionVisibility(NonConstDefn, FD);
95620b57cec5SDimitry Andric 
95630b57cec5SDimitry Andric         if (!FD->isLateTemplateParsed() &&
95640b57cec5SDimitry Andric             !NonConstDefn->isLateTemplateParsed() &&
95650b57cec5SDimitry Andric             FD->getODRHash() != NonConstDefn->getODRHash()) {
95660b57cec5SDimitry Andric           if (!isa<CXXMethodDecl>(FD)) {
95670b57cec5SDimitry Andric             PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
95680b57cec5SDimitry Andric           } else if (FD->getLexicalParent()->isFileContext() &&
95690b57cec5SDimitry Andric                      NonConstDefn->getLexicalParent()->isFileContext()) {
95700b57cec5SDimitry Andric             // Only diagnose out-of-line method definitions.  If they are
95710b57cec5SDimitry Andric             // in class definitions, then an error will be generated when
95720b57cec5SDimitry Andric             // processing the class bodies.
95730b57cec5SDimitry Andric             PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
95740b57cec5SDimitry Andric           }
95750b57cec5SDimitry Andric         }
95760b57cec5SDimitry Andric       }
95770b57cec5SDimitry Andric       continue;
95780b57cec5SDimitry Andric     }
95790b57cec5SDimitry Andric 
95800b57cec5SDimitry Andric     ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
95810b57cec5SDimitry Andric     if (!getContext().getLangOpts().Modules || !MD->hasBody())
95820b57cec5SDimitry Andric       MD->setLazyBody(PB->second);
95830b57cec5SDimitry Andric   }
95840b57cec5SDimitry Andric   PendingBodies.clear();
95850b57cec5SDimitry Andric 
9586*06c3fb27SDimitry Andric   // Inform any classes that had members added that they now have more members.
9587*06c3fb27SDimitry Andric   for (auto [RD, MD] : PendingAddedClassMembers) {
9588*06c3fb27SDimitry Andric     RD->addedMember(MD);
9589*06c3fb27SDimitry Andric   }
9590*06c3fb27SDimitry Andric   PendingAddedClassMembers.clear();
9591*06c3fb27SDimitry Andric 
95920b57cec5SDimitry Andric   // Do some cleanup.
95930b57cec5SDimitry Andric   for (auto *ND : PendingMergedDefinitionsToDeduplicate)
95940b57cec5SDimitry Andric     getContext().deduplicateMergedDefinitonsFor(ND);
95950b57cec5SDimitry Andric   PendingMergedDefinitionsToDeduplicate.clear();
95960b57cec5SDimitry Andric }
95970b57cec5SDimitry Andric 
95980b57cec5SDimitry Andric void ASTReader::diagnoseOdrViolations() {
95990b57cec5SDimitry Andric   if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
9600bdd1243dSDimitry Andric       PendingRecordOdrMergeFailures.empty() &&
96010b57cec5SDimitry Andric       PendingFunctionOdrMergeFailures.empty() &&
9602bdd1243dSDimitry Andric       PendingEnumOdrMergeFailures.empty() &&
9603bdd1243dSDimitry Andric       PendingObjCInterfaceOdrMergeFailures.empty() &&
9604bdd1243dSDimitry Andric       PendingObjCProtocolOdrMergeFailures.empty())
96050b57cec5SDimitry Andric     return;
96060b57cec5SDimitry Andric 
96070b57cec5SDimitry Andric   // Trigger the import of the full definition of each class that had any
96080b57cec5SDimitry Andric   // odr-merging problems, so we can produce better diagnostics for them.
96090b57cec5SDimitry Andric   // These updates may in turn find and diagnose some ODR failures, so take
96100b57cec5SDimitry Andric   // ownership of the set first.
96110b57cec5SDimitry Andric   auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
96120b57cec5SDimitry Andric   PendingOdrMergeFailures.clear();
96130b57cec5SDimitry Andric   for (auto &Merge : OdrMergeFailures) {
96140b57cec5SDimitry Andric     Merge.first->buildLookup();
96150b57cec5SDimitry Andric     Merge.first->decls_begin();
96160b57cec5SDimitry Andric     Merge.first->bases_begin();
96170b57cec5SDimitry Andric     Merge.first->vbases_begin();
96180b57cec5SDimitry Andric     for (auto &RecordPair : Merge.second) {
96190b57cec5SDimitry Andric       auto *RD = RecordPair.first;
96200b57cec5SDimitry Andric       RD->decls_begin();
96210b57cec5SDimitry Andric       RD->bases_begin();
96220b57cec5SDimitry Andric       RD->vbases_begin();
96230b57cec5SDimitry Andric     }
96240b57cec5SDimitry Andric   }
96250b57cec5SDimitry Andric 
9626bdd1243dSDimitry Andric   // Trigger the import of the full definition of each record in C/ObjC.
9627bdd1243dSDimitry Andric   auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
9628bdd1243dSDimitry Andric   PendingRecordOdrMergeFailures.clear();
9629bdd1243dSDimitry Andric   for (auto &Merge : RecordOdrMergeFailures) {
9630bdd1243dSDimitry Andric     Merge.first->decls_begin();
9631bdd1243dSDimitry Andric     for (auto &D : Merge.second)
9632bdd1243dSDimitry Andric       D->decls_begin();
9633bdd1243dSDimitry Andric   }
9634bdd1243dSDimitry Andric 
9635bdd1243dSDimitry Andric   // Trigger the import of the full interface definition.
9636bdd1243dSDimitry Andric   auto ObjCInterfaceOdrMergeFailures =
9637bdd1243dSDimitry Andric       std::move(PendingObjCInterfaceOdrMergeFailures);
9638bdd1243dSDimitry Andric   PendingObjCInterfaceOdrMergeFailures.clear();
9639bdd1243dSDimitry Andric   for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
9640bdd1243dSDimitry Andric     Merge.first->decls_begin();
9641bdd1243dSDimitry Andric     for (auto &InterfacePair : Merge.second)
9642bdd1243dSDimitry Andric       InterfacePair.first->decls_begin();
9643bdd1243dSDimitry Andric   }
9644bdd1243dSDimitry Andric 
96450b57cec5SDimitry Andric   // Trigger the import of functions.
96460b57cec5SDimitry Andric   auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
96470b57cec5SDimitry Andric   PendingFunctionOdrMergeFailures.clear();
96480b57cec5SDimitry Andric   for (auto &Merge : FunctionOdrMergeFailures) {
96490b57cec5SDimitry Andric     Merge.first->buildLookup();
96500b57cec5SDimitry Andric     Merge.first->decls_begin();
96510b57cec5SDimitry Andric     Merge.first->getBody();
96520b57cec5SDimitry Andric     for (auto &FD : Merge.second) {
96530b57cec5SDimitry Andric       FD->buildLookup();
96540b57cec5SDimitry Andric       FD->decls_begin();
96550b57cec5SDimitry Andric       FD->getBody();
96560b57cec5SDimitry Andric     }
96570b57cec5SDimitry Andric   }
96580b57cec5SDimitry Andric 
96590b57cec5SDimitry Andric   // Trigger the import of enums.
96600b57cec5SDimitry Andric   auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
96610b57cec5SDimitry Andric   PendingEnumOdrMergeFailures.clear();
96620b57cec5SDimitry Andric   for (auto &Merge : EnumOdrMergeFailures) {
96630b57cec5SDimitry Andric     Merge.first->decls_begin();
96640b57cec5SDimitry Andric     for (auto &Enum : Merge.second) {
96650b57cec5SDimitry Andric       Enum->decls_begin();
96660b57cec5SDimitry Andric     }
96670b57cec5SDimitry Andric   }
96680b57cec5SDimitry Andric 
9669bdd1243dSDimitry Andric   // Trigger the import of the full protocol definition.
9670bdd1243dSDimitry Andric   auto ObjCProtocolOdrMergeFailures =
9671bdd1243dSDimitry Andric       std::move(PendingObjCProtocolOdrMergeFailures);
9672bdd1243dSDimitry Andric   PendingObjCProtocolOdrMergeFailures.clear();
9673bdd1243dSDimitry Andric   for (auto &Merge : ObjCProtocolOdrMergeFailures) {
9674bdd1243dSDimitry Andric     Merge.first->decls_begin();
9675bdd1243dSDimitry Andric     for (auto &ProtocolPair : Merge.second)
9676bdd1243dSDimitry Andric       ProtocolPair.first->decls_begin();
9677bdd1243dSDimitry Andric   }
9678bdd1243dSDimitry Andric 
96790b57cec5SDimitry Andric   // For each declaration from a merged context, check that the canonical
96800b57cec5SDimitry Andric   // definition of that context also contains a declaration of the same
96810b57cec5SDimitry Andric   // entity.
96820b57cec5SDimitry Andric   //
96830b57cec5SDimitry Andric   // Caution: this loop does things that might invalidate iterators into
96840b57cec5SDimitry Andric   // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
96850b57cec5SDimitry Andric   while (!PendingOdrMergeChecks.empty()) {
96860b57cec5SDimitry Andric     NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
96870b57cec5SDimitry Andric 
96880b57cec5SDimitry Andric     // FIXME: Skip over implicit declarations for now. This matters for things
96890b57cec5SDimitry Andric     // like implicitly-declared special member functions. This isn't entirely
96900b57cec5SDimitry Andric     // correct; we can end up with multiple unmerged declarations of the same
96910b57cec5SDimitry Andric     // implicit entity.
96920b57cec5SDimitry Andric     if (D->isImplicit())
96930b57cec5SDimitry Andric       continue;
96940b57cec5SDimitry Andric 
96950b57cec5SDimitry Andric     DeclContext *CanonDef = D->getDeclContext();
96960b57cec5SDimitry Andric 
96970b57cec5SDimitry Andric     bool Found = false;
96980b57cec5SDimitry Andric     const Decl *DCanon = D->getCanonicalDecl();
96990b57cec5SDimitry Andric 
9700bdd1243dSDimitry Andric     for (auto *RI : D->redecls()) {
97010b57cec5SDimitry Andric       if (RI->getLexicalDeclContext() == CanonDef) {
97020b57cec5SDimitry Andric         Found = true;
97030b57cec5SDimitry Andric         break;
97040b57cec5SDimitry Andric       }
97050b57cec5SDimitry Andric     }
97060b57cec5SDimitry Andric     if (Found)
97070b57cec5SDimitry Andric       continue;
97080b57cec5SDimitry Andric 
97090b57cec5SDimitry Andric     // Quick check failed, time to do the slow thing. Note, we can't just
97100b57cec5SDimitry Andric     // look up the name of D in CanonDef here, because the member that is
97110b57cec5SDimitry Andric     // in CanonDef might not be found by name lookup (it might have been
97120b57cec5SDimitry Andric     // replaced by a more recent declaration in the lookup table), and we
97130b57cec5SDimitry Andric     // can't necessarily find it in the redeclaration chain because it might
97140b57cec5SDimitry Andric     // be merely mergeable, not redeclarable.
97150b57cec5SDimitry Andric     llvm::SmallVector<const NamedDecl*, 4> Candidates;
97160b57cec5SDimitry Andric     for (auto *CanonMember : CanonDef->decls()) {
97170b57cec5SDimitry Andric       if (CanonMember->getCanonicalDecl() == DCanon) {
97180b57cec5SDimitry Andric         // This can happen if the declaration is merely mergeable and not
97190b57cec5SDimitry Andric         // actually redeclarable (we looked for redeclarations earlier).
97200b57cec5SDimitry Andric         //
97210b57cec5SDimitry Andric         // FIXME: We should be able to detect this more efficiently, without
97220b57cec5SDimitry Andric         // pulling in all of the members of CanonDef.
97230b57cec5SDimitry Andric         Found = true;
97240b57cec5SDimitry Andric         break;
97250b57cec5SDimitry Andric       }
97260b57cec5SDimitry Andric       if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
97270b57cec5SDimitry Andric         if (ND->getDeclName() == D->getDeclName())
97280b57cec5SDimitry Andric           Candidates.push_back(ND);
97290b57cec5SDimitry Andric     }
97300b57cec5SDimitry Andric 
97310b57cec5SDimitry Andric     if (!Found) {
97320b57cec5SDimitry Andric       // The AST doesn't like TagDecls becoming invalid after they've been
97330b57cec5SDimitry Andric       // completed. We only really need to mark FieldDecls as invalid here.
97340b57cec5SDimitry Andric       if (!isa<TagDecl>(D))
97350b57cec5SDimitry Andric         D->setInvalidDecl();
97360b57cec5SDimitry Andric 
97370b57cec5SDimitry Andric       // Ensure we don't accidentally recursively enter deserialization while
97380b57cec5SDimitry Andric       // we're producing our diagnostic.
97390b57cec5SDimitry Andric       Deserializing RecursionGuard(this);
97400b57cec5SDimitry Andric 
97410b57cec5SDimitry Andric       std::string CanonDefModule =
9742bdd1243dSDimitry Andric           ODRDiagsEmitter::getOwningModuleNameForDiagnostic(
9743bdd1243dSDimitry Andric               cast<Decl>(CanonDef));
97440b57cec5SDimitry Andric       Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
9745bdd1243dSDimitry Andric         << D << ODRDiagsEmitter::getOwningModuleNameForDiagnostic(D)
97460b57cec5SDimitry Andric         << CanonDef << CanonDefModule.empty() << CanonDefModule;
97470b57cec5SDimitry Andric 
97480b57cec5SDimitry Andric       if (Candidates.empty())
97490b57cec5SDimitry Andric         Diag(cast<Decl>(CanonDef)->getLocation(),
97500b57cec5SDimitry Andric              diag::note_module_odr_violation_no_possible_decls) << D;
97510b57cec5SDimitry Andric       else {
97520b57cec5SDimitry Andric         for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
97530b57cec5SDimitry Andric           Diag(Candidates[I]->getLocation(),
97540b57cec5SDimitry Andric                diag::note_module_odr_violation_possible_decl)
97550b57cec5SDimitry Andric             << Candidates[I];
97560b57cec5SDimitry Andric       }
97570b57cec5SDimitry Andric 
97580b57cec5SDimitry Andric       DiagnosedOdrMergeFailures.insert(CanonDef);
97590b57cec5SDimitry Andric     }
97600b57cec5SDimitry Andric   }
97610b57cec5SDimitry Andric 
9762bdd1243dSDimitry Andric   if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
9763bdd1243dSDimitry Andric       FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
9764bdd1243dSDimitry Andric       ObjCInterfaceOdrMergeFailures.empty() &&
9765bdd1243dSDimitry Andric       ObjCProtocolOdrMergeFailures.empty())
97660b57cec5SDimitry Andric     return;
97670b57cec5SDimitry Andric 
9768bdd1243dSDimitry Andric   ODRDiagsEmitter DiagsEmitter(Diags, getContext(),
9769bdd1243dSDimitry Andric                                getPreprocessor().getLangOpts());
97705ffd83dbSDimitry Andric 
97715ffd83dbSDimitry Andric   // Issue any pending ODR-failure diagnostics.
97725ffd83dbSDimitry Andric   for (auto &Merge : OdrMergeFailures) {
97735ffd83dbSDimitry Andric     // If we've already pointed out a specific problem with this class, don't
97745ffd83dbSDimitry Andric     // bother issuing a general "something's different" diagnostic.
97755ffd83dbSDimitry Andric     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
97765ffd83dbSDimitry Andric       continue;
97775ffd83dbSDimitry Andric 
97785ffd83dbSDimitry Andric     bool Diagnosed = false;
97795ffd83dbSDimitry Andric     CXXRecordDecl *FirstRecord = Merge.first;
97805ffd83dbSDimitry Andric     for (auto &RecordPair : Merge.second) {
9781bdd1243dSDimitry Andric       if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
9782bdd1243dSDimitry Andric                                         RecordPair.second)) {
97835ffd83dbSDimitry Andric         Diagnosed = true;
97845ffd83dbSDimitry Andric         break;
97855ffd83dbSDimitry Andric       }
97860b57cec5SDimitry Andric     }
97870b57cec5SDimitry Andric 
97880b57cec5SDimitry Andric     if (!Diagnosed) {
97890b57cec5SDimitry Andric       // All definitions are updates to the same declaration. This happens if a
97900b57cec5SDimitry Andric       // module instantiates the declaration of a class template specialization
97910b57cec5SDimitry Andric       // and two or more other modules instantiate its definition.
97920b57cec5SDimitry Andric       //
97930b57cec5SDimitry Andric       // FIXME: Indicate which modules had instantiations of this definition.
97940b57cec5SDimitry Andric       // FIXME: How can this even happen?
97950b57cec5SDimitry Andric       Diag(Merge.first->getLocation(),
97960b57cec5SDimitry Andric            diag::err_module_odr_violation_different_instantiations)
97970b57cec5SDimitry Andric           << Merge.first;
97980b57cec5SDimitry Andric     }
97990b57cec5SDimitry Andric   }
98000b57cec5SDimitry Andric 
9801bdd1243dSDimitry Andric   // Issue any pending ODR-failure diagnostics for RecordDecl in C/ObjC. Note
9802bdd1243dSDimitry Andric   // that in C++ this is done as a part of CXXRecordDecl ODR checking.
9803bdd1243dSDimitry Andric   for (auto &Merge : RecordOdrMergeFailures) {
9804bdd1243dSDimitry Andric     // If we've already pointed out a specific problem with this class, don't
9805bdd1243dSDimitry Andric     // bother issuing a general "something's different" diagnostic.
9806bdd1243dSDimitry Andric     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
98070b57cec5SDimitry Andric       continue;
98080b57cec5SDimitry Andric 
9809bdd1243dSDimitry Andric     RecordDecl *FirstRecord = Merge.first;
9810bdd1243dSDimitry Andric     bool Diagnosed = false;
9811bdd1243dSDimitry Andric     for (auto *SecondRecord : Merge.second) {
9812bdd1243dSDimitry Andric       if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
98130b57cec5SDimitry Andric         Diagnosed = true;
98140b57cec5SDimitry Andric         break;
98150b57cec5SDimitry Andric       }
9816bdd1243dSDimitry Andric     }
9817bdd1243dSDimitry Andric     (void)Diagnosed;
9818bdd1243dSDimitry Andric     assert(Diagnosed && "Unable to emit ODR diagnostic.");
98190b57cec5SDimitry Andric   }
98200b57cec5SDimitry Andric 
9821bdd1243dSDimitry Andric   // Issue ODR failures diagnostics for functions.
9822bdd1243dSDimitry Andric   for (auto &Merge : FunctionOdrMergeFailures) {
9823bdd1243dSDimitry Andric     FunctionDecl *FirstFunction = Merge.first;
9824bdd1243dSDimitry Andric     bool Diagnosed = false;
9825bdd1243dSDimitry Andric     for (auto &SecondFunction : Merge.second) {
9826bdd1243dSDimitry Andric       if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
98270b57cec5SDimitry Andric         Diagnosed = true;
98280b57cec5SDimitry Andric         break;
98290b57cec5SDimitry Andric       }
98300b57cec5SDimitry Andric     }
98310b57cec5SDimitry Andric     (void)Diagnosed;
98320b57cec5SDimitry Andric     assert(Diagnosed && "Unable to emit ODR diagnostic.");
98330b57cec5SDimitry Andric   }
98340b57cec5SDimitry Andric 
98350b57cec5SDimitry Andric   // Issue ODR failures diagnostics for enums.
98360b57cec5SDimitry Andric   for (auto &Merge : EnumOdrMergeFailures) {
98370b57cec5SDimitry Andric     // If we've already pointed out a specific problem with this enum, don't
98380b57cec5SDimitry Andric     // bother issuing a general "something's different" diagnostic.
98390b57cec5SDimitry Andric     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
98400b57cec5SDimitry Andric       continue;
98410b57cec5SDimitry Andric 
98420b57cec5SDimitry Andric     EnumDecl *FirstEnum = Merge.first;
98430b57cec5SDimitry Andric     bool Diagnosed = false;
98440b57cec5SDimitry Andric     for (auto &SecondEnum : Merge.second) {
9845bdd1243dSDimitry Andric       if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
98460b57cec5SDimitry Andric         Diagnosed = true;
98470b57cec5SDimitry Andric         break;
98480b57cec5SDimitry Andric       }
98490b57cec5SDimitry Andric     }
9850bdd1243dSDimitry Andric     (void)Diagnosed;
9851bdd1243dSDimitry Andric     assert(Diagnosed && "Unable to emit ODR diagnostic.");
98520b57cec5SDimitry Andric   }
98530b57cec5SDimitry Andric 
9854bdd1243dSDimitry Andric   for (auto &Merge : ObjCInterfaceOdrMergeFailures) {
9855bdd1243dSDimitry Andric     // If we've already pointed out a specific problem with this interface,
9856bdd1243dSDimitry Andric     // don't bother issuing a general "something's different" diagnostic.
9857bdd1243dSDimitry Andric     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
9858bdd1243dSDimitry Andric       continue;
9859bdd1243dSDimitry Andric 
9860bdd1243dSDimitry Andric     bool Diagnosed = false;
9861bdd1243dSDimitry Andric     ObjCInterfaceDecl *FirstID = Merge.first;
9862bdd1243dSDimitry Andric     for (auto &InterfacePair : Merge.second) {
9863bdd1243dSDimitry Andric       if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
9864bdd1243dSDimitry Andric                                         InterfacePair.second)) {
9865bdd1243dSDimitry Andric         Diagnosed = true;
9866bdd1243dSDimitry Andric         break;
9867bdd1243dSDimitry Andric       }
9868bdd1243dSDimitry Andric     }
9869bdd1243dSDimitry Andric     (void)Diagnosed;
9870bdd1243dSDimitry Andric     assert(Diagnosed && "Unable to emit ODR diagnostic.");
9871bdd1243dSDimitry Andric   }
9872bdd1243dSDimitry Andric 
9873bdd1243dSDimitry Andric   for (auto &Merge : ObjCProtocolOdrMergeFailures) {
9874bdd1243dSDimitry Andric     // If we've already pointed out a specific problem with this protocol,
9875bdd1243dSDimitry Andric     // don't bother issuing a general "something's different" diagnostic.
9876bdd1243dSDimitry Andric     if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
9877bdd1243dSDimitry Andric       continue;
9878bdd1243dSDimitry Andric 
9879bdd1243dSDimitry Andric     ObjCProtocolDecl *FirstProtocol = Merge.first;
9880bdd1243dSDimitry Andric     bool Diagnosed = false;
9881bdd1243dSDimitry Andric     for (auto &ProtocolPair : Merge.second) {
9882bdd1243dSDimitry Andric       if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
9883bdd1243dSDimitry Andric                                         ProtocolPair.second)) {
9884bdd1243dSDimitry Andric         Diagnosed = true;
9885bdd1243dSDimitry Andric         break;
9886bdd1243dSDimitry Andric       }
9887bdd1243dSDimitry Andric     }
98880b57cec5SDimitry Andric     (void)Diagnosed;
98890b57cec5SDimitry Andric     assert(Diagnosed && "Unable to emit ODR diagnostic.");
98900b57cec5SDimitry Andric   }
98910b57cec5SDimitry Andric }
98920b57cec5SDimitry Andric 
98930b57cec5SDimitry Andric void ASTReader::StartedDeserializing() {
98940b57cec5SDimitry Andric   if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
98950b57cec5SDimitry Andric     ReadTimer->startTimer();
98960b57cec5SDimitry Andric }
98970b57cec5SDimitry Andric 
98980b57cec5SDimitry Andric void ASTReader::FinishedDeserializing() {
98990b57cec5SDimitry Andric   assert(NumCurrentElementsDeserializing &&
99000b57cec5SDimitry Andric          "FinishedDeserializing not paired with StartedDeserializing");
99010b57cec5SDimitry Andric   if (NumCurrentElementsDeserializing == 1) {
99020b57cec5SDimitry Andric     // We decrease NumCurrentElementsDeserializing only after pending actions
99030b57cec5SDimitry Andric     // are finished, to avoid recursively re-calling finishPendingActions().
99040b57cec5SDimitry Andric     finishPendingActions();
99050b57cec5SDimitry Andric   }
99060b57cec5SDimitry Andric   --NumCurrentElementsDeserializing;
99070b57cec5SDimitry Andric 
99080b57cec5SDimitry Andric   if (NumCurrentElementsDeserializing == 0) {
99090b57cec5SDimitry Andric     // Propagate exception specification and deduced type updates along
99100b57cec5SDimitry Andric     // redeclaration chains.
99110b57cec5SDimitry Andric     //
99120b57cec5SDimitry Andric     // We do this now rather than in finishPendingActions because we want to
99130b57cec5SDimitry Andric     // be able to walk the complete redeclaration chains of the updated decls.
99140b57cec5SDimitry Andric     while (!PendingExceptionSpecUpdates.empty() ||
99150b57cec5SDimitry Andric            !PendingDeducedTypeUpdates.empty()) {
99160b57cec5SDimitry Andric       auto ESUpdates = std::move(PendingExceptionSpecUpdates);
99170b57cec5SDimitry Andric       PendingExceptionSpecUpdates.clear();
99180b57cec5SDimitry Andric       for (auto Update : ESUpdates) {
99190b57cec5SDimitry Andric         ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
99200b57cec5SDimitry Andric         auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
99210b57cec5SDimitry Andric         auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
99220b57cec5SDimitry Andric         if (auto *Listener = getContext().getASTMutationListener())
99230b57cec5SDimitry Andric           Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
99240b57cec5SDimitry Andric         for (auto *Redecl : Update.second->redecls())
99250b57cec5SDimitry Andric           getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
99260b57cec5SDimitry Andric       }
99270b57cec5SDimitry Andric 
99280b57cec5SDimitry Andric       auto DTUpdates = std::move(PendingDeducedTypeUpdates);
99290b57cec5SDimitry Andric       PendingDeducedTypeUpdates.clear();
99300b57cec5SDimitry Andric       for (auto Update : DTUpdates) {
99310b57cec5SDimitry Andric         ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
99320b57cec5SDimitry Andric         // FIXME: If the return type is already deduced, check that it matches.
99330b57cec5SDimitry Andric         getContext().adjustDeducedFunctionResultType(Update.first,
99340b57cec5SDimitry Andric                                                      Update.second);
99350b57cec5SDimitry Andric       }
99360b57cec5SDimitry Andric     }
99370b57cec5SDimitry Andric 
99380b57cec5SDimitry Andric     if (ReadTimer)
99390b57cec5SDimitry Andric       ReadTimer->stopTimer();
99400b57cec5SDimitry Andric 
99410b57cec5SDimitry Andric     diagnoseOdrViolations();
99420b57cec5SDimitry Andric 
99430b57cec5SDimitry Andric     // We are not in recursive loading, so it's safe to pass the "interesting"
99440b57cec5SDimitry Andric     // decls to the consumer.
99450b57cec5SDimitry Andric     if (Consumer)
99460b57cec5SDimitry Andric       PassInterestingDeclsToConsumer();
99470b57cec5SDimitry Andric   }
99480b57cec5SDimitry Andric }
99490b57cec5SDimitry Andric 
99500b57cec5SDimitry Andric void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
99510b57cec5SDimitry Andric   if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
99520b57cec5SDimitry Andric     // Remove any fake results before adding any real ones.
99530b57cec5SDimitry Andric     auto It = PendingFakeLookupResults.find(II);
99540b57cec5SDimitry Andric     if (It != PendingFakeLookupResults.end()) {
99550b57cec5SDimitry Andric       for (auto *ND : It->second)
99560b57cec5SDimitry Andric         SemaObj->IdResolver.RemoveDecl(ND);
99570b57cec5SDimitry Andric       // FIXME: this works around module+PCH performance issue.
99580b57cec5SDimitry Andric       // Rather than erase the result from the map, which is O(n), just clear
99590b57cec5SDimitry Andric       // the vector of NamedDecls.
99600b57cec5SDimitry Andric       It->second.clear();
99610b57cec5SDimitry Andric     }
99620b57cec5SDimitry Andric   }
99630b57cec5SDimitry Andric 
99640b57cec5SDimitry Andric   if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
99650b57cec5SDimitry Andric     SemaObj->TUScope->AddDecl(D);
99660b57cec5SDimitry Andric   } else if (SemaObj->TUScope) {
99670b57cec5SDimitry Andric     // Adding the decl to IdResolver may have failed because it was already in
99680b57cec5SDimitry Andric     // (even though it was not added in scope). If it is already in, make sure
99690b57cec5SDimitry Andric     // it gets in the scope as well.
99700b57cec5SDimitry Andric     if (std::find(SemaObj->IdResolver.begin(Name),
99710b57cec5SDimitry Andric                   SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
99720b57cec5SDimitry Andric       SemaObj->TUScope->AddDecl(D);
99730b57cec5SDimitry Andric   }
99740b57cec5SDimitry Andric }
99750b57cec5SDimitry Andric 
99760b57cec5SDimitry Andric ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
99770b57cec5SDimitry Andric                      ASTContext *Context,
99780b57cec5SDimitry Andric                      const PCHContainerReader &PCHContainerRdr,
99790b57cec5SDimitry Andric                      ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
9980e8d8bef9SDimitry Andric                      StringRef isysroot,
9981e8d8bef9SDimitry Andric                      DisableValidationForModuleKind DisableValidationKind,
99820b57cec5SDimitry Andric                      bool AllowASTWithCompilerErrors,
99830b57cec5SDimitry Andric                      bool AllowConfigurationMismatch, bool ValidateSystemInputs,
9984a7dea167SDimitry Andric                      bool ValidateASTInputFilesContent, bool UseGlobalIndex,
99850b57cec5SDimitry Andric                      std::unique_ptr<llvm::Timer> ReadTimer)
9986e8d8bef9SDimitry Andric     : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH)
99870b57cec5SDimitry Andric                    ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
99880b57cec5SDimitry Andric                    : cast<ASTReaderListener>(new PCHValidator(PP, *this))),
99890b57cec5SDimitry Andric       SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
99900b57cec5SDimitry Andric       PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
99910b57cec5SDimitry Andric       ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache,
99920b57cec5SDimitry Andric                                      PCHContainerRdr, PP.getHeaderSearchInfo()),
99930b57cec5SDimitry Andric       DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
9994e8d8bef9SDimitry Andric       DisableValidationKind(DisableValidationKind),
99950b57cec5SDimitry Andric       AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
99960b57cec5SDimitry Andric       AllowConfigurationMismatch(AllowConfigurationMismatch),
99970b57cec5SDimitry Andric       ValidateSystemInputs(ValidateSystemInputs),
9998a7dea167SDimitry Andric       ValidateASTInputFilesContent(ValidateASTInputFilesContent),
99990b57cec5SDimitry Andric       UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
100000b57cec5SDimitry Andric   SourceMgr.setExternalSLocEntrySource(this);
100010b57cec5SDimitry Andric 
100020b57cec5SDimitry Andric   for (const auto &Ext : Extensions) {
100030b57cec5SDimitry Andric     auto BlockName = Ext->getExtensionMetadata().BlockName;
100040b57cec5SDimitry Andric     auto Known = ModuleFileExtensions.find(BlockName);
100050b57cec5SDimitry Andric     if (Known != ModuleFileExtensions.end()) {
100060b57cec5SDimitry Andric       Diags.Report(diag::warn_duplicate_module_file_extension)
100070b57cec5SDimitry Andric         << BlockName;
100080b57cec5SDimitry Andric       continue;
100090b57cec5SDimitry Andric     }
100100b57cec5SDimitry Andric 
100110b57cec5SDimitry Andric     ModuleFileExtensions.insert({BlockName, Ext});
100120b57cec5SDimitry Andric   }
100130b57cec5SDimitry Andric }
100140b57cec5SDimitry Andric 
100150b57cec5SDimitry Andric ASTReader::~ASTReader() {
100160b57cec5SDimitry Andric   if (OwnsDeserializationListener)
100170b57cec5SDimitry Andric     delete DeserializationListener;
100180b57cec5SDimitry Andric }
100190b57cec5SDimitry Andric 
100200b57cec5SDimitry Andric IdentifierResolver &ASTReader::getIdResolver() {
100210b57cec5SDimitry Andric   return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
100220b57cec5SDimitry Andric }
100230b57cec5SDimitry Andric 
100240b57cec5SDimitry Andric Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
100250b57cec5SDimitry Andric                                                unsigned AbbrevID) {
100260b57cec5SDimitry Andric   Idx = 0;
100270b57cec5SDimitry Andric   Record.clear();
100280b57cec5SDimitry Andric   return Cursor.readRecord(AbbrevID, Record);
100290b57cec5SDimitry Andric }
100300b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
100310b57cec5SDimitry Andric //// OMPClauseReader implementation
100320b57cec5SDimitry Andric ////===----------------------------------------------------------------------===//
100330b57cec5SDimitry Andric 
10034480093f4SDimitry Andric // This has to be in namespace clang because it's friended by all
10035480093f4SDimitry Andric // of the OMP clauses.
10036480093f4SDimitry Andric namespace clang {
10037480093f4SDimitry Andric 
10038480093f4SDimitry Andric class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
10039480093f4SDimitry Andric   ASTRecordReader &Record;
10040480093f4SDimitry Andric   ASTContext &Context;
10041480093f4SDimitry Andric 
10042480093f4SDimitry Andric public:
10043480093f4SDimitry Andric   OMPClauseReader(ASTRecordReader &Record)
10044480093f4SDimitry Andric       : Record(Record), Context(Record.getContext()) {}
10045e8d8bef9SDimitry Andric #define GEN_CLANG_CLAUSE_CLASS
10046e8d8bef9SDimitry Andric #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
10047e8d8bef9SDimitry Andric #include "llvm/Frontend/OpenMP/OMP.inc"
10048480093f4SDimitry Andric   OMPClause *readClause();
10049480093f4SDimitry Andric   void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
10050480093f4SDimitry Andric   void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
10051480093f4SDimitry Andric };
10052480093f4SDimitry Andric 
10053480093f4SDimitry Andric } // end namespace clang
10054480093f4SDimitry Andric 
10055480093f4SDimitry Andric OMPClause *ASTRecordReader::readOMPClause() {
10056480093f4SDimitry Andric   return OMPClauseReader(*this).readClause();
10057480093f4SDimitry Andric }
10058480093f4SDimitry Andric 
100590b57cec5SDimitry Andric OMPClause *OMPClauseReader::readClause() {
10060a7dea167SDimitry Andric   OMPClause *C = nullptr;
100615ffd83dbSDimitry Andric   switch (llvm::omp::Clause(Record.readInt())) {
100625ffd83dbSDimitry Andric   case llvm::omp::OMPC_if:
100630b57cec5SDimitry Andric     C = new (Context) OMPIfClause();
100640b57cec5SDimitry Andric     break;
100655ffd83dbSDimitry Andric   case llvm::omp::OMPC_final:
100660b57cec5SDimitry Andric     C = new (Context) OMPFinalClause();
100670b57cec5SDimitry Andric     break;
100685ffd83dbSDimitry Andric   case llvm::omp::OMPC_num_threads:
100690b57cec5SDimitry Andric     C = new (Context) OMPNumThreadsClause();
100700b57cec5SDimitry Andric     break;
100715ffd83dbSDimitry Andric   case llvm::omp::OMPC_safelen:
100720b57cec5SDimitry Andric     C = new (Context) OMPSafelenClause();
100730b57cec5SDimitry Andric     break;
100745ffd83dbSDimitry Andric   case llvm::omp::OMPC_simdlen:
100750b57cec5SDimitry Andric     C = new (Context) OMPSimdlenClause();
100760b57cec5SDimitry Andric     break;
10077fe6060f1SDimitry Andric   case llvm::omp::OMPC_sizes: {
10078fe6060f1SDimitry Andric     unsigned NumSizes = Record.readInt();
10079fe6060f1SDimitry Andric     C = OMPSizesClause::CreateEmpty(Context, NumSizes);
10080fe6060f1SDimitry Andric     break;
10081fe6060f1SDimitry Andric   }
10082fe6060f1SDimitry Andric   case llvm::omp::OMPC_full:
10083fe6060f1SDimitry Andric     C = OMPFullClause::CreateEmpty(Context);
10084fe6060f1SDimitry Andric     break;
10085fe6060f1SDimitry Andric   case llvm::omp::OMPC_partial:
10086fe6060f1SDimitry Andric     C = OMPPartialClause::CreateEmpty(Context);
10087fe6060f1SDimitry Andric     break;
100885ffd83dbSDimitry Andric   case llvm::omp::OMPC_allocator:
100890b57cec5SDimitry Andric     C = new (Context) OMPAllocatorClause();
100900b57cec5SDimitry Andric     break;
100915ffd83dbSDimitry Andric   case llvm::omp::OMPC_collapse:
100920b57cec5SDimitry Andric     C = new (Context) OMPCollapseClause();
100930b57cec5SDimitry Andric     break;
100945ffd83dbSDimitry Andric   case llvm::omp::OMPC_default:
100950b57cec5SDimitry Andric     C = new (Context) OMPDefaultClause();
100960b57cec5SDimitry Andric     break;
100975ffd83dbSDimitry Andric   case llvm::omp::OMPC_proc_bind:
100980b57cec5SDimitry Andric     C = new (Context) OMPProcBindClause();
100990b57cec5SDimitry Andric     break;
101005ffd83dbSDimitry Andric   case llvm::omp::OMPC_schedule:
101010b57cec5SDimitry Andric     C = new (Context) OMPScheduleClause();
101020b57cec5SDimitry Andric     break;
101035ffd83dbSDimitry Andric   case llvm::omp::OMPC_ordered:
101040b57cec5SDimitry Andric     C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
101050b57cec5SDimitry Andric     break;
101065ffd83dbSDimitry Andric   case llvm::omp::OMPC_nowait:
101070b57cec5SDimitry Andric     C = new (Context) OMPNowaitClause();
101080b57cec5SDimitry Andric     break;
101095ffd83dbSDimitry Andric   case llvm::omp::OMPC_untied:
101100b57cec5SDimitry Andric     C = new (Context) OMPUntiedClause();
101110b57cec5SDimitry Andric     break;
101125ffd83dbSDimitry Andric   case llvm::omp::OMPC_mergeable:
101130b57cec5SDimitry Andric     C = new (Context) OMPMergeableClause();
101140b57cec5SDimitry Andric     break;
101155ffd83dbSDimitry Andric   case llvm::omp::OMPC_read:
101160b57cec5SDimitry Andric     C = new (Context) OMPReadClause();
101170b57cec5SDimitry Andric     break;
101185ffd83dbSDimitry Andric   case llvm::omp::OMPC_write:
101190b57cec5SDimitry Andric     C = new (Context) OMPWriteClause();
101200b57cec5SDimitry Andric     break;
101215ffd83dbSDimitry Andric   case llvm::omp::OMPC_update:
101225ffd83dbSDimitry Andric     C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
101230b57cec5SDimitry Andric     break;
101245ffd83dbSDimitry Andric   case llvm::omp::OMPC_capture:
101250b57cec5SDimitry Andric     C = new (Context) OMPCaptureClause();
101260b57cec5SDimitry Andric     break;
101270eae32dcSDimitry Andric   case llvm::omp::OMPC_compare:
101280eae32dcSDimitry Andric     C = new (Context) OMPCompareClause();
101290eae32dcSDimitry Andric     break;
101305ffd83dbSDimitry Andric   case llvm::omp::OMPC_seq_cst:
101310b57cec5SDimitry Andric     C = new (Context) OMPSeqCstClause();
101320b57cec5SDimitry Andric     break;
101335ffd83dbSDimitry Andric   case llvm::omp::OMPC_acq_rel:
101345ffd83dbSDimitry Andric     C = new (Context) OMPAcqRelClause();
101355ffd83dbSDimitry Andric     break;
101365ffd83dbSDimitry Andric   case llvm::omp::OMPC_acquire:
101375ffd83dbSDimitry Andric     C = new (Context) OMPAcquireClause();
101385ffd83dbSDimitry Andric     break;
101395ffd83dbSDimitry Andric   case llvm::omp::OMPC_release:
101405ffd83dbSDimitry Andric     C = new (Context) OMPReleaseClause();
101415ffd83dbSDimitry Andric     break;
101425ffd83dbSDimitry Andric   case llvm::omp::OMPC_relaxed:
101435ffd83dbSDimitry Andric     C = new (Context) OMPRelaxedClause();
101445ffd83dbSDimitry Andric     break;
101455ffd83dbSDimitry Andric   case llvm::omp::OMPC_threads:
101460b57cec5SDimitry Andric     C = new (Context) OMPThreadsClause();
101470b57cec5SDimitry Andric     break;
101485ffd83dbSDimitry Andric   case llvm::omp::OMPC_simd:
101490b57cec5SDimitry Andric     C = new (Context) OMPSIMDClause();
101500b57cec5SDimitry Andric     break;
101515ffd83dbSDimitry Andric   case llvm::omp::OMPC_nogroup:
101520b57cec5SDimitry Andric     C = new (Context) OMPNogroupClause();
101530b57cec5SDimitry Andric     break;
101545ffd83dbSDimitry Andric   case llvm::omp::OMPC_unified_address:
101550b57cec5SDimitry Andric     C = new (Context) OMPUnifiedAddressClause();
101560b57cec5SDimitry Andric     break;
101575ffd83dbSDimitry Andric   case llvm::omp::OMPC_unified_shared_memory:
101580b57cec5SDimitry Andric     C = new (Context) OMPUnifiedSharedMemoryClause();
101590b57cec5SDimitry Andric     break;
101605ffd83dbSDimitry Andric   case llvm::omp::OMPC_reverse_offload:
101610b57cec5SDimitry Andric     C = new (Context) OMPReverseOffloadClause();
101620b57cec5SDimitry Andric     break;
101635ffd83dbSDimitry Andric   case llvm::omp::OMPC_dynamic_allocators:
101640b57cec5SDimitry Andric     C = new (Context) OMPDynamicAllocatorsClause();
101650b57cec5SDimitry Andric     break;
101665ffd83dbSDimitry Andric   case llvm::omp::OMPC_atomic_default_mem_order:
101670b57cec5SDimitry Andric     C = new (Context) OMPAtomicDefaultMemOrderClause();
101680b57cec5SDimitry Andric     break;
10169bdd1243dSDimitry Andric   case llvm::omp::OMPC_at:
10170bdd1243dSDimitry Andric     C = new (Context) OMPAtClause();
10171bdd1243dSDimitry Andric     break;
10172bdd1243dSDimitry Andric   case llvm::omp::OMPC_severity:
10173bdd1243dSDimitry Andric     C = new (Context) OMPSeverityClause();
10174bdd1243dSDimitry Andric     break;
10175bdd1243dSDimitry Andric   case llvm::omp::OMPC_message:
10176bdd1243dSDimitry Andric     C = new (Context) OMPMessageClause();
10177bdd1243dSDimitry Andric     break;
101785ffd83dbSDimitry Andric   case llvm::omp::OMPC_private:
101790b57cec5SDimitry Andric     C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
101800b57cec5SDimitry Andric     break;
101815ffd83dbSDimitry Andric   case llvm::omp::OMPC_firstprivate:
101820b57cec5SDimitry Andric     C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
101830b57cec5SDimitry Andric     break;
101845ffd83dbSDimitry Andric   case llvm::omp::OMPC_lastprivate:
101850b57cec5SDimitry Andric     C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
101860b57cec5SDimitry Andric     break;
101875ffd83dbSDimitry Andric   case llvm::omp::OMPC_shared:
101880b57cec5SDimitry Andric     C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
101890b57cec5SDimitry Andric     break;
101905ffd83dbSDimitry Andric   case llvm::omp::OMPC_reduction: {
101915ffd83dbSDimitry Andric     unsigned N = Record.readInt();
101925ffd83dbSDimitry Andric     auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>();
101935ffd83dbSDimitry Andric     C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
101940b57cec5SDimitry Andric     break;
101955ffd83dbSDimitry Andric   }
101965ffd83dbSDimitry Andric   case llvm::omp::OMPC_task_reduction:
101970b57cec5SDimitry Andric     C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
101980b57cec5SDimitry Andric     break;
101995ffd83dbSDimitry Andric   case llvm::omp::OMPC_in_reduction:
102000b57cec5SDimitry Andric     C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
102010b57cec5SDimitry Andric     break;
102025ffd83dbSDimitry Andric   case llvm::omp::OMPC_linear:
102030b57cec5SDimitry Andric     C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
102040b57cec5SDimitry Andric     break;
102055ffd83dbSDimitry Andric   case llvm::omp::OMPC_aligned:
102060b57cec5SDimitry Andric     C = OMPAlignedClause::CreateEmpty(Context, Record.readInt());
102070b57cec5SDimitry Andric     break;
102085ffd83dbSDimitry Andric   case llvm::omp::OMPC_copyin:
102090b57cec5SDimitry Andric     C = OMPCopyinClause::CreateEmpty(Context, Record.readInt());
102100b57cec5SDimitry Andric     break;
102115ffd83dbSDimitry Andric   case llvm::omp::OMPC_copyprivate:
102120b57cec5SDimitry Andric     C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt());
102130b57cec5SDimitry Andric     break;
102145ffd83dbSDimitry Andric   case llvm::omp::OMPC_flush:
102150b57cec5SDimitry Andric     C = OMPFlushClause::CreateEmpty(Context, Record.readInt());
102160b57cec5SDimitry Andric     break;
102175ffd83dbSDimitry Andric   case llvm::omp::OMPC_depobj:
102185ffd83dbSDimitry Andric     C = OMPDepobjClause::CreateEmpty(Context);
102195ffd83dbSDimitry Andric     break;
102205ffd83dbSDimitry Andric   case llvm::omp::OMPC_depend: {
102210b57cec5SDimitry Andric     unsigned NumVars = Record.readInt();
102220b57cec5SDimitry Andric     unsigned NumLoops = Record.readInt();
102230b57cec5SDimitry Andric     C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops);
102240b57cec5SDimitry Andric     break;
102250b57cec5SDimitry Andric   }
102265ffd83dbSDimitry Andric   case llvm::omp::OMPC_device:
102270b57cec5SDimitry Andric     C = new (Context) OMPDeviceClause();
102280b57cec5SDimitry Andric     break;
102295ffd83dbSDimitry Andric   case llvm::omp::OMPC_map: {
102300b57cec5SDimitry Andric     OMPMappableExprListSizeTy Sizes;
102310b57cec5SDimitry Andric     Sizes.NumVars = Record.readInt();
102320b57cec5SDimitry Andric     Sizes.NumUniqueDeclarations = Record.readInt();
102330b57cec5SDimitry Andric     Sizes.NumComponentLists = Record.readInt();
102340b57cec5SDimitry Andric     Sizes.NumComponents = Record.readInt();
102350b57cec5SDimitry Andric     C = OMPMapClause::CreateEmpty(Context, Sizes);
102360b57cec5SDimitry Andric     break;
102370b57cec5SDimitry Andric   }
102385ffd83dbSDimitry Andric   case llvm::omp::OMPC_num_teams:
102390b57cec5SDimitry Andric     C = new (Context) OMPNumTeamsClause();
102400b57cec5SDimitry Andric     break;
102415ffd83dbSDimitry Andric   case llvm::omp::OMPC_thread_limit:
102420b57cec5SDimitry Andric     C = new (Context) OMPThreadLimitClause();
102430b57cec5SDimitry Andric     break;
102445ffd83dbSDimitry Andric   case llvm::omp::OMPC_priority:
102450b57cec5SDimitry Andric     C = new (Context) OMPPriorityClause();
102460b57cec5SDimitry Andric     break;
102475ffd83dbSDimitry Andric   case llvm::omp::OMPC_grainsize:
102480b57cec5SDimitry Andric     C = new (Context) OMPGrainsizeClause();
102490b57cec5SDimitry Andric     break;
102505ffd83dbSDimitry Andric   case llvm::omp::OMPC_num_tasks:
102510b57cec5SDimitry Andric     C = new (Context) OMPNumTasksClause();
102520b57cec5SDimitry Andric     break;
102535ffd83dbSDimitry Andric   case llvm::omp::OMPC_hint:
102540b57cec5SDimitry Andric     C = new (Context) OMPHintClause();
102550b57cec5SDimitry Andric     break;
102565ffd83dbSDimitry Andric   case llvm::omp::OMPC_dist_schedule:
102570b57cec5SDimitry Andric     C = new (Context) OMPDistScheduleClause();
102580b57cec5SDimitry Andric     break;
102595ffd83dbSDimitry Andric   case llvm::omp::OMPC_defaultmap:
102600b57cec5SDimitry Andric     C = new (Context) OMPDefaultmapClause();
102610b57cec5SDimitry Andric     break;
102625ffd83dbSDimitry Andric   case llvm::omp::OMPC_to: {
102630b57cec5SDimitry Andric     OMPMappableExprListSizeTy Sizes;
102640b57cec5SDimitry Andric     Sizes.NumVars = Record.readInt();
102650b57cec5SDimitry Andric     Sizes.NumUniqueDeclarations = Record.readInt();
102660b57cec5SDimitry Andric     Sizes.NumComponentLists = Record.readInt();
102670b57cec5SDimitry Andric     Sizes.NumComponents = Record.readInt();
102680b57cec5SDimitry Andric     C = OMPToClause::CreateEmpty(Context, Sizes);
102690b57cec5SDimitry Andric     break;
102700b57cec5SDimitry Andric   }
102715ffd83dbSDimitry Andric   case llvm::omp::OMPC_from: {
102720b57cec5SDimitry Andric     OMPMappableExprListSizeTy Sizes;
102730b57cec5SDimitry Andric     Sizes.NumVars = Record.readInt();
102740b57cec5SDimitry Andric     Sizes.NumUniqueDeclarations = Record.readInt();
102750b57cec5SDimitry Andric     Sizes.NumComponentLists = Record.readInt();
102760b57cec5SDimitry Andric     Sizes.NumComponents = Record.readInt();
102770b57cec5SDimitry Andric     C = OMPFromClause::CreateEmpty(Context, Sizes);
102780b57cec5SDimitry Andric     break;
102790b57cec5SDimitry Andric   }
102805ffd83dbSDimitry Andric   case llvm::omp::OMPC_use_device_ptr: {
102810b57cec5SDimitry Andric     OMPMappableExprListSizeTy Sizes;
102820b57cec5SDimitry Andric     Sizes.NumVars = Record.readInt();
102830b57cec5SDimitry Andric     Sizes.NumUniqueDeclarations = Record.readInt();
102840b57cec5SDimitry Andric     Sizes.NumComponentLists = Record.readInt();
102850b57cec5SDimitry Andric     Sizes.NumComponents = Record.readInt();
102860b57cec5SDimitry Andric     C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes);
102870b57cec5SDimitry Andric     break;
102880b57cec5SDimitry Andric   }
102895ffd83dbSDimitry Andric   case llvm::omp::OMPC_use_device_addr: {
102905ffd83dbSDimitry Andric     OMPMappableExprListSizeTy Sizes;
102915ffd83dbSDimitry Andric     Sizes.NumVars = Record.readInt();
102925ffd83dbSDimitry Andric     Sizes.NumUniqueDeclarations = Record.readInt();
102935ffd83dbSDimitry Andric     Sizes.NumComponentLists = Record.readInt();
102945ffd83dbSDimitry Andric     Sizes.NumComponents = Record.readInt();
102955ffd83dbSDimitry Andric     C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes);
102965ffd83dbSDimitry Andric     break;
102975ffd83dbSDimitry Andric   }
102985ffd83dbSDimitry Andric   case llvm::omp::OMPC_is_device_ptr: {
102990b57cec5SDimitry Andric     OMPMappableExprListSizeTy Sizes;
103000b57cec5SDimitry Andric     Sizes.NumVars = Record.readInt();
103010b57cec5SDimitry Andric     Sizes.NumUniqueDeclarations = Record.readInt();
103020b57cec5SDimitry Andric     Sizes.NumComponentLists = Record.readInt();
103030b57cec5SDimitry Andric     Sizes.NumComponents = Record.readInt();
103040b57cec5SDimitry Andric     C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);
103050b57cec5SDimitry Andric     break;
103060b57cec5SDimitry Andric   }
1030781ad6265SDimitry Andric   case llvm::omp::OMPC_has_device_addr: {
1030881ad6265SDimitry Andric     OMPMappableExprListSizeTy Sizes;
1030981ad6265SDimitry Andric     Sizes.NumVars = Record.readInt();
1031081ad6265SDimitry Andric     Sizes.NumUniqueDeclarations = Record.readInt();
1031181ad6265SDimitry Andric     Sizes.NumComponentLists = Record.readInt();
1031281ad6265SDimitry Andric     Sizes.NumComponents = Record.readInt();
1031381ad6265SDimitry Andric     C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes);
1031481ad6265SDimitry Andric     break;
1031581ad6265SDimitry Andric   }
103165ffd83dbSDimitry Andric   case llvm::omp::OMPC_allocate:
103170b57cec5SDimitry Andric     C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());
103180b57cec5SDimitry Andric     break;
103195ffd83dbSDimitry Andric   case llvm::omp::OMPC_nontemporal:
10320480093f4SDimitry Andric     C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt());
10321480093f4SDimitry Andric     break;
103225ffd83dbSDimitry Andric   case llvm::omp::OMPC_inclusive:
103235ffd83dbSDimitry Andric     C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt());
103245ffd83dbSDimitry Andric     break;
103255ffd83dbSDimitry Andric   case llvm::omp::OMPC_exclusive:
103265ffd83dbSDimitry Andric     C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt());
103275ffd83dbSDimitry Andric     break;
103285ffd83dbSDimitry Andric   case llvm::omp::OMPC_order:
103295ffd83dbSDimitry Andric     C = new (Context) OMPOrderClause();
103305ffd83dbSDimitry Andric     break;
10331fe6060f1SDimitry Andric   case llvm::omp::OMPC_init:
10332fe6060f1SDimitry Andric     C = OMPInitClause::CreateEmpty(Context, Record.readInt());
10333fe6060f1SDimitry Andric     break;
10334fe6060f1SDimitry Andric   case llvm::omp::OMPC_use:
10335fe6060f1SDimitry Andric     C = new (Context) OMPUseClause();
10336fe6060f1SDimitry Andric     break;
103375ffd83dbSDimitry Andric   case llvm::omp::OMPC_destroy:
103385ffd83dbSDimitry Andric     C = new (Context) OMPDestroyClause();
103395ffd83dbSDimitry Andric     break;
10340fe6060f1SDimitry Andric   case llvm::omp::OMPC_novariants:
10341fe6060f1SDimitry Andric     C = new (Context) OMPNovariantsClause();
10342fe6060f1SDimitry Andric     break;
10343fe6060f1SDimitry Andric   case llvm::omp::OMPC_nocontext:
10344fe6060f1SDimitry Andric     C = new (Context) OMPNocontextClause();
10345fe6060f1SDimitry Andric     break;
103465ffd83dbSDimitry Andric   case llvm::omp::OMPC_detach:
103475ffd83dbSDimitry Andric     C = new (Context) OMPDetachClause();
103485ffd83dbSDimitry Andric     break;
103495ffd83dbSDimitry Andric   case llvm::omp::OMPC_uses_allocators:
103505ffd83dbSDimitry Andric     C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt());
103515ffd83dbSDimitry Andric     break;
103525ffd83dbSDimitry Andric   case llvm::omp::OMPC_affinity:
103535ffd83dbSDimitry Andric     C = OMPAffinityClause::CreateEmpty(Context, Record.readInt());
103545ffd83dbSDimitry Andric     break;
10355fe6060f1SDimitry Andric   case llvm::omp::OMPC_filter:
10356fe6060f1SDimitry Andric     C = new (Context) OMPFilterClause();
10357fe6060f1SDimitry Andric     break;
10358349cc55cSDimitry Andric   case llvm::omp::OMPC_bind:
10359349cc55cSDimitry Andric     C = OMPBindClause::CreateEmpty(Context);
10360349cc55cSDimitry Andric     break;
10361349cc55cSDimitry Andric   case llvm::omp::OMPC_align:
10362349cc55cSDimitry Andric     C = new (Context) OMPAlignClause();
10363349cc55cSDimitry Andric     break;
10364bdd1243dSDimitry Andric   case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
10365bdd1243dSDimitry Andric     C = new (Context) OMPXDynCGroupMemClause();
10366bdd1243dSDimitry Andric     break;
10367*06c3fb27SDimitry Andric   case llvm::omp::OMPC_doacross: {
10368*06c3fb27SDimitry Andric     unsigned NumVars = Record.readInt();
10369*06c3fb27SDimitry Andric     unsigned NumLoops = Record.readInt();
10370*06c3fb27SDimitry Andric     C = OMPDoacrossClause::CreateEmpty(Context, NumVars, NumLoops);
10371*06c3fb27SDimitry Andric     break;
10372*06c3fb27SDimitry Andric   }
103735ffd83dbSDimitry Andric #define OMP_CLAUSE_NO_CLASS(Enum, Str)                                         \
103745ffd83dbSDimitry Andric   case llvm::omp::Enum:                                                        \
103755ffd83dbSDimitry Andric     break;
103765ffd83dbSDimitry Andric #include "llvm/Frontend/OpenMP/OMPKinds.def"
103775ffd83dbSDimitry Andric   default:
103785ffd83dbSDimitry Andric     break;
103790b57cec5SDimitry Andric   }
10380a7dea167SDimitry Andric   assert(C && "Unknown OMPClause type");
10381a7dea167SDimitry Andric 
103820b57cec5SDimitry Andric   Visit(C);
103830b57cec5SDimitry Andric   C->setLocStart(Record.readSourceLocation());
103840b57cec5SDimitry Andric   C->setLocEnd(Record.readSourceLocation());
103850b57cec5SDimitry Andric 
103860b57cec5SDimitry Andric   return C;
103870b57cec5SDimitry Andric }
103880b57cec5SDimitry Andric 
103890b57cec5SDimitry Andric void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
103900b57cec5SDimitry Andric   C->setPreInitStmt(Record.readSubStmt(),
103910b57cec5SDimitry Andric                     static_cast<OpenMPDirectiveKind>(Record.readInt()));
103920b57cec5SDimitry Andric }
103930b57cec5SDimitry Andric 
103940b57cec5SDimitry Andric void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
103950b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
103960b57cec5SDimitry Andric   C->setPostUpdateExpr(Record.readSubExpr());
103970b57cec5SDimitry Andric }
103980b57cec5SDimitry Andric 
103990b57cec5SDimitry Andric void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
104000b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
104010b57cec5SDimitry Andric   C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt()));
104020b57cec5SDimitry Andric   C->setNameModifierLoc(Record.readSourceLocation());
104030b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
104040b57cec5SDimitry Andric   C->setCondition(Record.readSubExpr());
104050b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104060b57cec5SDimitry Andric }
104070b57cec5SDimitry Andric 
104080b57cec5SDimitry Andric void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
10409a7dea167SDimitry Andric   VisitOMPClauseWithPreInit(C);
104100b57cec5SDimitry Andric   C->setCondition(Record.readSubExpr());
104110b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104120b57cec5SDimitry Andric }
104130b57cec5SDimitry Andric 
104140b57cec5SDimitry Andric void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
104150b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
104160b57cec5SDimitry Andric   C->setNumThreads(Record.readSubExpr());
104170b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104180b57cec5SDimitry Andric }
104190b57cec5SDimitry Andric 
104200b57cec5SDimitry Andric void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
104210b57cec5SDimitry Andric   C->setSafelen(Record.readSubExpr());
104220b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104230b57cec5SDimitry Andric }
104240b57cec5SDimitry Andric 
104250b57cec5SDimitry Andric void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
104260b57cec5SDimitry Andric   C->setSimdlen(Record.readSubExpr());
104270b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104280b57cec5SDimitry Andric }
104290b57cec5SDimitry Andric 
10430fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) {
10431fe6060f1SDimitry Andric   for (Expr *&E : C->getSizesRefs())
10432fe6060f1SDimitry Andric     E = Record.readSubExpr();
10433fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10434fe6060f1SDimitry Andric }
10435fe6060f1SDimitry Andric 
10436fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {}
10437fe6060f1SDimitry Andric 
10438fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) {
10439fe6060f1SDimitry Andric   C->setFactor(Record.readSubExpr());
10440fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10441fe6060f1SDimitry Andric }
10442fe6060f1SDimitry Andric 
104430b57cec5SDimitry Andric void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) {
104440b57cec5SDimitry Andric   C->setAllocator(Record.readExpr());
104450b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104460b57cec5SDimitry Andric }
104470b57cec5SDimitry Andric 
104480b57cec5SDimitry Andric void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
104490b57cec5SDimitry Andric   C->setNumForLoops(Record.readSubExpr());
104500b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104510b57cec5SDimitry Andric }
104520b57cec5SDimitry Andric 
104530b57cec5SDimitry Andric void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
104545ffd83dbSDimitry Andric   C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt()));
104550b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104560b57cec5SDimitry Andric   C->setDefaultKindKwLoc(Record.readSourceLocation());
104570b57cec5SDimitry Andric }
104580b57cec5SDimitry Andric 
104590b57cec5SDimitry Andric void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
10460480093f4SDimitry Andric   C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));
104610b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104620b57cec5SDimitry Andric   C->setProcBindKindKwLoc(Record.readSourceLocation());
104630b57cec5SDimitry Andric }
104640b57cec5SDimitry Andric 
104650b57cec5SDimitry Andric void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
104660b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
104670b57cec5SDimitry Andric   C->setScheduleKind(
104680b57cec5SDimitry Andric        static_cast<OpenMPScheduleClauseKind>(Record.readInt()));
104690b57cec5SDimitry Andric   C->setFirstScheduleModifier(
104700b57cec5SDimitry Andric       static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
104710b57cec5SDimitry Andric   C->setSecondScheduleModifier(
104720b57cec5SDimitry Andric       static_cast<OpenMPScheduleClauseModifier>(Record.readInt()));
104730b57cec5SDimitry Andric   C->setChunkSize(Record.readSubExpr());
104740b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104750b57cec5SDimitry Andric   C->setFirstScheduleModifierLoc(Record.readSourceLocation());
104760b57cec5SDimitry Andric   C->setSecondScheduleModifierLoc(Record.readSourceLocation());
104770b57cec5SDimitry Andric   C->setScheduleKindLoc(Record.readSourceLocation());
104780b57cec5SDimitry Andric   C->setCommaLoc(Record.readSourceLocation());
104790b57cec5SDimitry Andric }
104800b57cec5SDimitry Andric 
104810b57cec5SDimitry Andric void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
104820b57cec5SDimitry Andric   C->setNumForLoops(Record.readSubExpr());
104830b57cec5SDimitry Andric   for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
104840b57cec5SDimitry Andric     C->setLoopNumIterations(I, Record.readSubExpr());
104850b57cec5SDimitry Andric   for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I)
104860b57cec5SDimitry Andric     C->setLoopCounter(I, Record.readSubExpr());
104870b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104880b57cec5SDimitry Andric }
104890b57cec5SDimitry Andric 
104905ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) {
104915ffd83dbSDimitry Andric   C->setEventHandler(Record.readSubExpr());
104925ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
104935ffd83dbSDimitry Andric }
104945ffd83dbSDimitry Andric 
104950b57cec5SDimitry Andric void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
104960b57cec5SDimitry Andric 
104970b57cec5SDimitry Andric void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
104980b57cec5SDimitry Andric 
104990b57cec5SDimitry Andric void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
105000b57cec5SDimitry Andric 
105010b57cec5SDimitry Andric void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
105020b57cec5SDimitry Andric 
105030b57cec5SDimitry Andric void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
105040b57cec5SDimitry Andric 
105055ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
105065ffd83dbSDimitry Andric   if (C->isExtended()) {
105075ffd83dbSDimitry Andric     C->setLParenLoc(Record.readSourceLocation());
105085ffd83dbSDimitry Andric     C->setArgumentLoc(Record.readSourceLocation());
105095ffd83dbSDimitry Andric     C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
105105ffd83dbSDimitry Andric   }
105115ffd83dbSDimitry Andric }
105120b57cec5SDimitry Andric 
105130b57cec5SDimitry Andric void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
105140b57cec5SDimitry Andric 
105150eae32dcSDimitry Andric void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
105160eae32dcSDimitry Andric 
105170b57cec5SDimitry Andric void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
105180b57cec5SDimitry Andric 
105195ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
105205ffd83dbSDimitry Andric 
105215ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
105225ffd83dbSDimitry Andric 
105235ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
105245ffd83dbSDimitry Andric 
105255ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
105265ffd83dbSDimitry Andric 
105270b57cec5SDimitry Andric void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
105280b57cec5SDimitry Andric 
105290b57cec5SDimitry Andric void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
105300b57cec5SDimitry Andric 
105310b57cec5SDimitry Andric void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
105320b57cec5SDimitry Andric 
10533fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) {
10534fe6060f1SDimitry Andric   unsigned NumVars = C->varlist_size();
10535fe6060f1SDimitry Andric   SmallVector<Expr *, 16> Vars;
10536fe6060f1SDimitry Andric   Vars.reserve(NumVars);
10537fe6060f1SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
10538fe6060f1SDimitry Andric     Vars.push_back(Record.readSubExpr());
10539fe6060f1SDimitry Andric   C->setVarRefs(Vars);
10540fe6060f1SDimitry Andric   C->setIsTarget(Record.readBool());
10541fe6060f1SDimitry Andric   C->setIsTargetSync(Record.readBool());
10542fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10543fe6060f1SDimitry Andric   C->setVarLoc(Record.readSourceLocation());
10544fe6060f1SDimitry Andric }
10545fe6060f1SDimitry Andric 
10546fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) {
10547fe6060f1SDimitry Andric   C->setInteropVar(Record.readSubExpr());
10548fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10549fe6060f1SDimitry Andric   C->setVarLoc(Record.readSourceLocation());
10550fe6060f1SDimitry Andric }
10551fe6060f1SDimitry Andric 
10552fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) {
10553fe6060f1SDimitry Andric   C->setInteropVar(Record.readSubExpr());
10554fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10555fe6060f1SDimitry Andric   C->setVarLoc(Record.readSourceLocation());
10556fe6060f1SDimitry Andric }
10557fe6060f1SDimitry Andric 
10558fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) {
10559fe6060f1SDimitry Andric   VisitOMPClauseWithPreInit(C);
10560fe6060f1SDimitry Andric   C->setCondition(Record.readSubExpr());
10561fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10562fe6060f1SDimitry Andric }
10563fe6060f1SDimitry Andric 
10564fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) {
10565fe6060f1SDimitry Andric   VisitOMPClauseWithPreInit(C);
10566fe6060f1SDimitry Andric   C->setCondition(Record.readSubExpr());
10567fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10568fe6060f1SDimitry Andric }
105695ffd83dbSDimitry Andric 
105700b57cec5SDimitry Andric void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
105710b57cec5SDimitry Andric 
105720b57cec5SDimitry Andric void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
105730b57cec5SDimitry Andric     OMPUnifiedSharedMemoryClause *) {}
105740b57cec5SDimitry Andric 
105750b57cec5SDimitry Andric void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
105760b57cec5SDimitry Andric 
105770b57cec5SDimitry Andric void
105780b57cec5SDimitry Andric OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
105790b57cec5SDimitry Andric }
105800b57cec5SDimitry Andric 
105810b57cec5SDimitry Andric void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
105820b57cec5SDimitry Andric     OMPAtomicDefaultMemOrderClause *C) {
105830b57cec5SDimitry Andric   C->setAtomicDefaultMemOrderKind(
105840b57cec5SDimitry Andric       static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt()));
105850b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
105860b57cec5SDimitry Andric   C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
105870b57cec5SDimitry Andric }
105880b57cec5SDimitry Andric 
10589bdd1243dSDimitry Andric void OMPClauseReader::VisitOMPAtClause(OMPAtClause *C) {
10590bdd1243dSDimitry Andric   C->setAtKind(static_cast<OpenMPAtClauseKind>(Record.readInt()));
10591bdd1243dSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10592bdd1243dSDimitry Andric   C->setAtKindKwLoc(Record.readSourceLocation());
10593bdd1243dSDimitry Andric }
10594bdd1243dSDimitry Andric 
10595bdd1243dSDimitry Andric void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *C) {
10596bdd1243dSDimitry Andric   C->setSeverityKind(static_cast<OpenMPSeverityClauseKind>(Record.readInt()));
10597bdd1243dSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10598bdd1243dSDimitry Andric   C->setSeverityKindKwLoc(Record.readSourceLocation());
10599bdd1243dSDimitry Andric }
10600bdd1243dSDimitry Andric 
10601bdd1243dSDimitry Andric void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *C) {
10602bdd1243dSDimitry Andric   C->setMessageString(Record.readSubExpr());
10603bdd1243dSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10604bdd1243dSDimitry Andric }
10605bdd1243dSDimitry Andric 
106060b57cec5SDimitry Andric void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
106070b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
106080b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
106090b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
106100b57cec5SDimitry Andric   Vars.reserve(NumVars);
106110b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106120b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106130b57cec5SDimitry Andric   C->setVarRefs(Vars);
106140b57cec5SDimitry Andric   Vars.clear();
106150b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106160b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106170b57cec5SDimitry Andric   C->setPrivateCopies(Vars);
106180b57cec5SDimitry Andric }
106190b57cec5SDimitry Andric 
106200b57cec5SDimitry Andric void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
106210b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
106220b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
106230b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
106240b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
106250b57cec5SDimitry Andric   Vars.reserve(NumVars);
106260b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106270b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106280b57cec5SDimitry Andric   C->setVarRefs(Vars);
106290b57cec5SDimitry Andric   Vars.clear();
106300b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106310b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106320b57cec5SDimitry Andric   C->setPrivateCopies(Vars);
106330b57cec5SDimitry Andric   Vars.clear();
106340b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106350b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106360b57cec5SDimitry Andric   C->setInits(Vars);
106370b57cec5SDimitry Andric }
106380b57cec5SDimitry Andric 
106390b57cec5SDimitry Andric void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
106400b57cec5SDimitry Andric   VisitOMPClauseWithPostUpdate(C);
106410b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10642480093f4SDimitry Andric   C->setKind(Record.readEnum<OpenMPLastprivateModifier>());
10643480093f4SDimitry Andric   C->setKindLoc(Record.readSourceLocation());
10644480093f4SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
106450b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
106460b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
106470b57cec5SDimitry Andric   Vars.reserve(NumVars);
106480b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106490b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106500b57cec5SDimitry Andric   C->setVarRefs(Vars);
106510b57cec5SDimitry Andric   Vars.clear();
106520b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106530b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106540b57cec5SDimitry Andric   C->setPrivateCopies(Vars);
106550b57cec5SDimitry Andric   Vars.clear();
106560b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106570b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106580b57cec5SDimitry Andric   C->setSourceExprs(Vars);
106590b57cec5SDimitry Andric   Vars.clear();
106600b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106610b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106620b57cec5SDimitry Andric   C->setDestinationExprs(Vars);
106630b57cec5SDimitry Andric   Vars.clear();
106640b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106650b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106660b57cec5SDimitry Andric   C->setAssignmentOps(Vars);
106670b57cec5SDimitry Andric }
106680b57cec5SDimitry Andric 
106690b57cec5SDimitry Andric void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
106700b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
106710b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
106720b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
106730b57cec5SDimitry Andric   Vars.reserve(NumVars);
106740b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106750b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106760b57cec5SDimitry Andric   C->setVarRefs(Vars);
106770b57cec5SDimitry Andric }
106780b57cec5SDimitry Andric 
106790b57cec5SDimitry Andric void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
106800b57cec5SDimitry Andric   VisitOMPClauseWithPostUpdate(C);
106810b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
106825ffd83dbSDimitry Andric   C->setModifierLoc(Record.readSourceLocation());
106830b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
106840b57cec5SDimitry Andric   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
10685480093f4SDimitry Andric   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
106860b57cec5SDimitry Andric   C->setQualifierLoc(NNSL);
106870b57cec5SDimitry Andric   C->setNameInfo(DNI);
106880b57cec5SDimitry Andric 
106890b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
106900b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
106910b57cec5SDimitry Andric   Vars.reserve(NumVars);
106920b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106930b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106940b57cec5SDimitry Andric   C->setVarRefs(Vars);
106950b57cec5SDimitry Andric   Vars.clear();
106960b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
106970b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
106980b57cec5SDimitry Andric   C->setPrivates(Vars);
106990b57cec5SDimitry Andric   Vars.clear();
107000b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
107010b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107020b57cec5SDimitry Andric   C->setLHSExprs(Vars);
107030b57cec5SDimitry Andric   Vars.clear();
107040b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
107050b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107060b57cec5SDimitry Andric   C->setRHSExprs(Vars);
107070b57cec5SDimitry Andric   Vars.clear();
107080b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
107090b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107100b57cec5SDimitry Andric   C->setReductionOps(Vars);
107115ffd83dbSDimitry Andric   if (C->getModifier() == OMPC_REDUCTION_inscan) {
107125ffd83dbSDimitry Andric     Vars.clear();
107135ffd83dbSDimitry Andric     for (unsigned i = 0; i != NumVars; ++i)
107145ffd83dbSDimitry Andric       Vars.push_back(Record.readSubExpr());
107155ffd83dbSDimitry Andric     C->setInscanCopyOps(Vars);
107165ffd83dbSDimitry Andric     Vars.clear();
107175ffd83dbSDimitry Andric     for (unsigned i = 0; i != NumVars; ++i)
107185ffd83dbSDimitry Andric       Vars.push_back(Record.readSubExpr());
107195ffd83dbSDimitry Andric     C->setInscanCopyArrayTemps(Vars);
107205ffd83dbSDimitry Andric     Vars.clear();
107215ffd83dbSDimitry Andric     for (unsigned i = 0; i != NumVars; ++i)
107225ffd83dbSDimitry Andric       Vars.push_back(Record.readSubExpr());
107235ffd83dbSDimitry Andric     C->setInscanCopyArrayElems(Vars);
107245ffd83dbSDimitry Andric   }
107250b57cec5SDimitry Andric }
107260b57cec5SDimitry Andric 
107270b57cec5SDimitry Andric void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) {
107280b57cec5SDimitry Andric   VisitOMPClauseWithPostUpdate(C);
107290b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
107300b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
107310b57cec5SDimitry Andric   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
10732480093f4SDimitry Andric   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
107330b57cec5SDimitry Andric   C->setQualifierLoc(NNSL);
107340b57cec5SDimitry Andric   C->setNameInfo(DNI);
107350b57cec5SDimitry Andric 
107360b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
107370b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
107380b57cec5SDimitry Andric   Vars.reserve(NumVars);
107390b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107400b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107410b57cec5SDimitry Andric   C->setVarRefs(Vars);
107420b57cec5SDimitry Andric   Vars.clear();
107430b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107440b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107450b57cec5SDimitry Andric   C->setPrivates(Vars);
107460b57cec5SDimitry Andric   Vars.clear();
107470b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107480b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107490b57cec5SDimitry Andric   C->setLHSExprs(Vars);
107500b57cec5SDimitry Andric   Vars.clear();
107510b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107520b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107530b57cec5SDimitry Andric   C->setRHSExprs(Vars);
107540b57cec5SDimitry Andric   Vars.clear();
107550b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107560b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107570b57cec5SDimitry Andric   C->setReductionOps(Vars);
107580b57cec5SDimitry Andric }
107590b57cec5SDimitry Andric 
107600b57cec5SDimitry Andric void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) {
107610b57cec5SDimitry Andric   VisitOMPClauseWithPostUpdate(C);
107620b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
107630b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
107640b57cec5SDimitry Andric   NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
10765480093f4SDimitry Andric   DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
107660b57cec5SDimitry Andric   C->setQualifierLoc(NNSL);
107670b57cec5SDimitry Andric   C->setNameInfo(DNI);
107680b57cec5SDimitry Andric 
107690b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
107700b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
107710b57cec5SDimitry Andric   Vars.reserve(NumVars);
107720b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107730b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107740b57cec5SDimitry Andric   C->setVarRefs(Vars);
107750b57cec5SDimitry Andric   Vars.clear();
107760b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107770b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107780b57cec5SDimitry Andric   C->setPrivates(Vars);
107790b57cec5SDimitry Andric   Vars.clear();
107800b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107810b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107820b57cec5SDimitry Andric   C->setLHSExprs(Vars);
107830b57cec5SDimitry Andric   Vars.clear();
107840b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107850b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107860b57cec5SDimitry Andric   C->setRHSExprs(Vars);
107870b57cec5SDimitry Andric   Vars.clear();
107880b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107890b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107900b57cec5SDimitry Andric   C->setReductionOps(Vars);
107910b57cec5SDimitry Andric   Vars.clear();
107920b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
107930b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
107940b57cec5SDimitry Andric   C->setTaskgroupDescriptors(Vars);
107950b57cec5SDimitry Andric }
107960b57cec5SDimitry Andric 
107970b57cec5SDimitry Andric void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
107980b57cec5SDimitry Andric   VisitOMPClauseWithPostUpdate(C);
107990b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
108000b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
108010b57cec5SDimitry Andric   C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt()));
108020b57cec5SDimitry Andric   C->setModifierLoc(Record.readSourceLocation());
108030b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
108040b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
108050b57cec5SDimitry Andric   Vars.reserve(NumVars);
108060b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108070b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
108080b57cec5SDimitry Andric   C->setVarRefs(Vars);
108090b57cec5SDimitry Andric   Vars.clear();
108100b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108110b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
108120b57cec5SDimitry Andric   C->setPrivates(Vars);
108130b57cec5SDimitry Andric   Vars.clear();
108140b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108150b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
108160b57cec5SDimitry Andric   C->setInits(Vars);
108170b57cec5SDimitry Andric   Vars.clear();
108180b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108190b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
108200b57cec5SDimitry Andric   C->setUpdates(Vars);
108210b57cec5SDimitry Andric   Vars.clear();
108220b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108230b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
108240b57cec5SDimitry Andric   C->setFinals(Vars);
108250b57cec5SDimitry Andric   C->setStep(Record.readSubExpr());
108260b57cec5SDimitry Andric   C->setCalcStep(Record.readSubExpr());
10827a7dea167SDimitry Andric   Vars.clear();
10828a7dea167SDimitry Andric   for (unsigned I = 0; I != NumVars + 1; ++I)
10829a7dea167SDimitry Andric     Vars.push_back(Record.readSubExpr());
10830a7dea167SDimitry Andric   C->setUsedExprs(Vars);
108310b57cec5SDimitry Andric }
108320b57cec5SDimitry Andric 
108330b57cec5SDimitry Andric void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
108340b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
108350b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
108360b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
108370b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
108380b57cec5SDimitry Andric   Vars.reserve(NumVars);
108390b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108400b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
108410b57cec5SDimitry Andric   C->setVarRefs(Vars);
108420b57cec5SDimitry Andric   C->setAlignment(Record.readSubExpr());
108430b57cec5SDimitry Andric }
108440b57cec5SDimitry Andric 
108450b57cec5SDimitry Andric void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
108460b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
108470b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
108480b57cec5SDimitry Andric   SmallVector<Expr *, 16> Exprs;
108490b57cec5SDimitry Andric   Exprs.reserve(NumVars);
108500b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108510b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108520b57cec5SDimitry Andric   C->setVarRefs(Exprs);
108530b57cec5SDimitry Andric   Exprs.clear();
108540b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108550b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108560b57cec5SDimitry Andric   C->setSourceExprs(Exprs);
108570b57cec5SDimitry Andric   Exprs.clear();
108580b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108590b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108600b57cec5SDimitry Andric   C->setDestinationExprs(Exprs);
108610b57cec5SDimitry Andric   Exprs.clear();
108620b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108630b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108640b57cec5SDimitry Andric   C->setAssignmentOps(Exprs);
108650b57cec5SDimitry Andric }
108660b57cec5SDimitry Andric 
108670b57cec5SDimitry Andric void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
108680b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
108690b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
108700b57cec5SDimitry Andric   SmallVector<Expr *, 16> Exprs;
108710b57cec5SDimitry Andric   Exprs.reserve(NumVars);
108720b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108730b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108740b57cec5SDimitry Andric   C->setVarRefs(Exprs);
108750b57cec5SDimitry Andric   Exprs.clear();
108760b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108770b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108780b57cec5SDimitry Andric   C->setSourceExprs(Exprs);
108790b57cec5SDimitry Andric   Exprs.clear();
108800b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108810b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108820b57cec5SDimitry Andric   C->setDestinationExprs(Exprs);
108830b57cec5SDimitry Andric   Exprs.clear();
108840b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108850b57cec5SDimitry Andric     Exprs.push_back(Record.readSubExpr());
108860b57cec5SDimitry Andric   C->setAssignmentOps(Exprs);
108870b57cec5SDimitry Andric }
108880b57cec5SDimitry Andric 
108890b57cec5SDimitry Andric void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
108900b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
108910b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
108920b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
108930b57cec5SDimitry Andric   Vars.reserve(NumVars);
108940b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
108950b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
108960b57cec5SDimitry Andric   C->setVarRefs(Vars);
108970b57cec5SDimitry Andric }
108980b57cec5SDimitry Andric 
108995ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
109005ffd83dbSDimitry Andric   C->setDepobj(Record.readSubExpr());
109015ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
109025ffd83dbSDimitry Andric }
109035ffd83dbSDimitry Andric 
109040b57cec5SDimitry Andric void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
109050b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
109065ffd83dbSDimitry Andric   C->setModifier(Record.readSubExpr());
109070b57cec5SDimitry Andric   C->setDependencyKind(
109080b57cec5SDimitry Andric       static_cast<OpenMPDependClauseKind>(Record.readInt()));
109090b57cec5SDimitry Andric   C->setDependencyLoc(Record.readSourceLocation());
109100b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
1091181ad6265SDimitry Andric   C->setOmpAllMemoryLoc(Record.readSourceLocation());
109120b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
109130b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
109140b57cec5SDimitry Andric   Vars.reserve(NumVars);
109150b57cec5SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
109160b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
109170b57cec5SDimitry Andric   C->setVarRefs(Vars);
109180b57cec5SDimitry Andric   for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
109190b57cec5SDimitry Andric     C->setLoopData(I, Record.readSubExpr());
109200b57cec5SDimitry Andric }
109210b57cec5SDimitry Andric 
109220b57cec5SDimitry Andric void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
109230b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
109245ffd83dbSDimitry Andric   C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>());
109250b57cec5SDimitry Andric   C->setDevice(Record.readSubExpr());
109265ffd83dbSDimitry Andric   C->setModifierLoc(Record.readSourceLocation());
109270b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
109280b57cec5SDimitry Andric }
109290b57cec5SDimitry Andric 
109300b57cec5SDimitry Andric void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
109310b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
10932bdd1243dSDimitry Andric   bool HasIteratorModifier = false;
109335ffd83dbSDimitry Andric   for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
109340b57cec5SDimitry Andric     C->setMapTypeModifier(
109350b57cec5SDimitry Andric         I, static_cast<OpenMPMapModifierKind>(Record.readInt()));
109360b57cec5SDimitry Andric     C->setMapTypeModifierLoc(I, Record.readSourceLocation());
10937bdd1243dSDimitry Andric     if (C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
10938bdd1243dSDimitry Andric       HasIteratorModifier = true;
109390b57cec5SDimitry Andric   }
109400b57cec5SDimitry Andric   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
10941480093f4SDimitry Andric   C->setMapperIdInfo(Record.readDeclarationNameInfo());
109420b57cec5SDimitry Andric   C->setMapType(
109430b57cec5SDimitry Andric      static_cast<OpenMPMapClauseKind>(Record.readInt()));
109440b57cec5SDimitry Andric   C->setMapLoc(Record.readSourceLocation());
109450b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
109460b57cec5SDimitry Andric   auto NumVars = C->varlist_size();
109470b57cec5SDimitry Andric   auto UniqueDecls = C->getUniqueDeclarationsNum();
109480b57cec5SDimitry Andric   auto TotalLists = C->getTotalComponentListNum();
109490b57cec5SDimitry Andric   auto TotalComponents = C->getTotalComponentsNum();
109500b57cec5SDimitry Andric 
109510b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
109520b57cec5SDimitry Andric   Vars.reserve(NumVars);
109530b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
109540b57cec5SDimitry Andric     Vars.push_back(Record.readExpr());
109550b57cec5SDimitry Andric   C->setVarRefs(Vars);
109560b57cec5SDimitry Andric 
109570b57cec5SDimitry Andric   SmallVector<Expr *, 16> UDMappers;
109580b57cec5SDimitry Andric   UDMappers.reserve(NumVars);
109590b57cec5SDimitry Andric   for (unsigned I = 0; I < NumVars; ++I)
109600b57cec5SDimitry Andric     UDMappers.push_back(Record.readExpr());
109610b57cec5SDimitry Andric   C->setUDMapperRefs(UDMappers);
109620b57cec5SDimitry Andric 
10963bdd1243dSDimitry Andric   if (HasIteratorModifier)
10964bdd1243dSDimitry Andric     C->setIteratorModifier(Record.readExpr());
10965bdd1243dSDimitry Andric 
109660b57cec5SDimitry Andric   SmallVector<ValueDecl *, 16> Decls;
109670b57cec5SDimitry Andric   Decls.reserve(UniqueDecls);
109680b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
109690b57cec5SDimitry Andric     Decls.push_back(Record.readDeclAs<ValueDecl>());
109700b57cec5SDimitry Andric   C->setUniqueDecls(Decls);
109710b57cec5SDimitry Andric 
109720b57cec5SDimitry Andric   SmallVector<unsigned, 16> ListsPerDecl;
109730b57cec5SDimitry Andric   ListsPerDecl.reserve(UniqueDecls);
109740b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
109750b57cec5SDimitry Andric     ListsPerDecl.push_back(Record.readInt());
109760b57cec5SDimitry Andric   C->setDeclNumLists(ListsPerDecl);
109770b57cec5SDimitry Andric 
109780b57cec5SDimitry Andric   SmallVector<unsigned, 32> ListSizes;
109790b57cec5SDimitry Andric   ListSizes.reserve(TotalLists);
109800b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalLists; ++i)
109810b57cec5SDimitry Andric     ListSizes.push_back(Record.readInt());
109820b57cec5SDimitry Andric   C->setComponentListSizes(ListSizes);
109830b57cec5SDimitry Andric 
109840b57cec5SDimitry Andric   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
109850b57cec5SDimitry Andric   Components.reserve(TotalComponents);
109860b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalComponents; ++i) {
10987e8d8bef9SDimitry Andric     Expr *AssociatedExprPr = Record.readExpr();
109880b57cec5SDimitry Andric     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
10989e8d8bef9SDimitry Andric     Components.emplace_back(AssociatedExprPr, AssociatedDecl,
10990e8d8bef9SDimitry Andric                             /*IsNonContiguous=*/false);
109910b57cec5SDimitry Andric   }
109920b57cec5SDimitry Andric   C->setComponents(Components, ListSizes);
109930b57cec5SDimitry Andric }
109940b57cec5SDimitry Andric 
109950b57cec5SDimitry Andric void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) {
109960b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
109970b57cec5SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
109980b57cec5SDimitry Andric   C->setAllocator(Record.readSubExpr());
109990b57cec5SDimitry Andric   unsigned NumVars = C->varlist_size();
110000b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
110010b57cec5SDimitry Andric   Vars.reserve(NumVars);
110020b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
110030b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
110040b57cec5SDimitry Andric   C->setVarRefs(Vars);
110050b57cec5SDimitry Andric }
110060b57cec5SDimitry Andric 
110070b57cec5SDimitry Andric void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
110080b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
110090b57cec5SDimitry Andric   C->setNumTeams(Record.readSubExpr());
110100b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110110b57cec5SDimitry Andric }
110120b57cec5SDimitry Andric 
110130b57cec5SDimitry Andric void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
110140b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
110150b57cec5SDimitry Andric   C->setThreadLimit(Record.readSubExpr());
110160b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110170b57cec5SDimitry Andric }
110180b57cec5SDimitry Andric 
110190b57cec5SDimitry Andric void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
11020a7dea167SDimitry Andric   VisitOMPClauseWithPreInit(C);
110210b57cec5SDimitry Andric   C->setPriority(Record.readSubExpr());
110220b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110230b57cec5SDimitry Andric }
110240b57cec5SDimitry Andric 
110250b57cec5SDimitry Andric void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
11026a7dea167SDimitry Andric   VisitOMPClauseWithPreInit(C);
11027bdd1243dSDimitry Andric   C->setModifier(Record.readEnum<OpenMPGrainsizeClauseModifier>());
110280b57cec5SDimitry Andric   C->setGrainsize(Record.readSubExpr());
11029bdd1243dSDimitry Andric   C->setModifierLoc(Record.readSourceLocation());
110300b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110310b57cec5SDimitry Andric }
110320b57cec5SDimitry Andric 
110330b57cec5SDimitry Andric void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
11034a7dea167SDimitry Andric   VisitOMPClauseWithPreInit(C);
11035bdd1243dSDimitry Andric   C->setModifier(Record.readEnum<OpenMPNumTasksClauseModifier>());
110360b57cec5SDimitry Andric   C->setNumTasks(Record.readSubExpr());
11037bdd1243dSDimitry Andric   C->setModifierLoc(Record.readSourceLocation());
110380b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110390b57cec5SDimitry Andric }
110400b57cec5SDimitry Andric 
110410b57cec5SDimitry Andric void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
110420b57cec5SDimitry Andric   C->setHint(Record.readSubExpr());
110430b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110440b57cec5SDimitry Andric }
110450b57cec5SDimitry Andric 
110460b57cec5SDimitry Andric void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
110470b57cec5SDimitry Andric   VisitOMPClauseWithPreInit(C);
110480b57cec5SDimitry Andric   C->setDistScheduleKind(
110490b57cec5SDimitry Andric       static_cast<OpenMPDistScheduleClauseKind>(Record.readInt()));
110500b57cec5SDimitry Andric   C->setChunkSize(Record.readSubExpr());
110510b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110520b57cec5SDimitry Andric   C->setDistScheduleKindLoc(Record.readSourceLocation());
110530b57cec5SDimitry Andric   C->setCommaLoc(Record.readSourceLocation());
110540b57cec5SDimitry Andric }
110550b57cec5SDimitry Andric 
110560b57cec5SDimitry Andric void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
110570b57cec5SDimitry Andric   C->setDefaultmapKind(
110580b57cec5SDimitry Andric        static_cast<OpenMPDefaultmapClauseKind>(Record.readInt()));
110590b57cec5SDimitry Andric   C->setDefaultmapModifier(
110600b57cec5SDimitry Andric       static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt()));
110610b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
110620b57cec5SDimitry Andric   C->setDefaultmapModifierLoc(Record.readSourceLocation());
110630b57cec5SDimitry Andric   C->setDefaultmapKindLoc(Record.readSourceLocation());
110640b57cec5SDimitry Andric }
110650b57cec5SDimitry Andric 
110660b57cec5SDimitry Andric void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
110670b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11068e8d8bef9SDimitry Andric   for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
11069e8d8bef9SDimitry Andric     C->setMotionModifier(
11070e8d8bef9SDimitry Andric         I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
11071e8d8bef9SDimitry Andric     C->setMotionModifierLoc(I, Record.readSourceLocation());
11072e8d8bef9SDimitry Andric   }
110730b57cec5SDimitry Andric   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
11074480093f4SDimitry Andric   C->setMapperIdInfo(Record.readDeclarationNameInfo());
11075e8d8bef9SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
110760b57cec5SDimitry Andric   auto NumVars = C->varlist_size();
110770b57cec5SDimitry Andric   auto UniqueDecls = C->getUniqueDeclarationsNum();
110780b57cec5SDimitry Andric   auto TotalLists = C->getTotalComponentListNum();
110790b57cec5SDimitry Andric   auto TotalComponents = C->getTotalComponentsNum();
110800b57cec5SDimitry Andric 
110810b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
110820b57cec5SDimitry Andric   Vars.reserve(NumVars);
110830b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
110840b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
110850b57cec5SDimitry Andric   C->setVarRefs(Vars);
110860b57cec5SDimitry Andric 
110870b57cec5SDimitry Andric   SmallVector<Expr *, 16> UDMappers;
110880b57cec5SDimitry Andric   UDMappers.reserve(NumVars);
110890b57cec5SDimitry Andric   for (unsigned I = 0; I < NumVars; ++I)
110900b57cec5SDimitry Andric     UDMappers.push_back(Record.readSubExpr());
110910b57cec5SDimitry Andric   C->setUDMapperRefs(UDMappers);
110920b57cec5SDimitry Andric 
110930b57cec5SDimitry Andric   SmallVector<ValueDecl *, 16> Decls;
110940b57cec5SDimitry Andric   Decls.reserve(UniqueDecls);
110950b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
110960b57cec5SDimitry Andric     Decls.push_back(Record.readDeclAs<ValueDecl>());
110970b57cec5SDimitry Andric   C->setUniqueDecls(Decls);
110980b57cec5SDimitry Andric 
110990b57cec5SDimitry Andric   SmallVector<unsigned, 16> ListsPerDecl;
111000b57cec5SDimitry Andric   ListsPerDecl.reserve(UniqueDecls);
111010b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
111020b57cec5SDimitry Andric     ListsPerDecl.push_back(Record.readInt());
111030b57cec5SDimitry Andric   C->setDeclNumLists(ListsPerDecl);
111040b57cec5SDimitry Andric 
111050b57cec5SDimitry Andric   SmallVector<unsigned, 32> ListSizes;
111060b57cec5SDimitry Andric   ListSizes.reserve(TotalLists);
111070b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalLists; ++i)
111080b57cec5SDimitry Andric     ListSizes.push_back(Record.readInt());
111090b57cec5SDimitry Andric   C->setComponentListSizes(ListSizes);
111100b57cec5SDimitry Andric 
111110b57cec5SDimitry Andric   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
111120b57cec5SDimitry Andric   Components.reserve(TotalComponents);
111130b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalComponents; ++i) {
11114e8d8bef9SDimitry Andric     Expr *AssociatedExprPr = Record.readSubExpr();
11115e8d8bef9SDimitry Andric     bool IsNonContiguous = Record.readBool();
111160b57cec5SDimitry Andric     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11117e8d8bef9SDimitry Andric     Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
111180b57cec5SDimitry Andric   }
111190b57cec5SDimitry Andric   C->setComponents(Components, ListSizes);
111200b57cec5SDimitry Andric }
111210b57cec5SDimitry Andric 
111220b57cec5SDimitry Andric void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
111230b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11124e8d8bef9SDimitry Andric   for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
11125e8d8bef9SDimitry Andric     C->setMotionModifier(
11126e8d8bef9SDimitry Andric         I, static_cast<OpenMPMotionModifierKind>(Record.readInt()));
11127e8d8bef9SDimitry Andric     C->setMotionModifierLoc(I, Record.readSourceLocation());
11128e8d8bef9SDimitry Andric   }
111290b57cec5SDimitry Andric   C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
11130480093f4SDimitry Andric   C->setMapperIdInfo(Record.readDeclarationNameInfo());
11131e8d8bef9SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
111320b57cec5SDimitry Andric   auto NumVars = C->varlist_size();
111330b57cec5SDimitry Andric   auto UniqueDecls = C->getUniqueDeclarationsNum();
111340b57cec5SDimitry Andric   auto TotalLists = C->getTotalComponentListNum();
111350b57cec5SDimitry Andric   auto TotalComponents = C->getTotalComponentsNum();
111360b57cec5SDimitry Andric 
111370b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
111380b57cec5SDimitry Andric   Vars.reserve(NumVars);
111390b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
111400b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
111410b57cec5SDimitry Andric   C->setVarRefs(Vars);
111420b57cec5SDimitry Andric 
111430b57cec5SDimitry Andric   SmallVector<Expr *, 16> UDMappers;
111440b57cec5SDimitry Andric   UDMappers.reserve(NumVars);
111450b57cec5SDimitry Andric   for (unsigned I = 0; I < NumVars; ++I)
111460b57cec5SDimitry Andric     UDMappers.push_back(Record.readSubExpr());
111470b57cec5SDimitry Andric   C->setUDMapperRefs(UDMappers);
111480b57cec5SDimitry Andric 
111490b57cec5SDimitry Andric   SmallVector<ValueDecl *, 16> Decls;
111500b57cec5SDimitry Andric   Decls.reserve(UniqueDecls);
111510b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
111520b57cec5SDimitry Andric     Decls.push_back(Record.readDeclAs<ValueDecl>());
111530b57cec5SDimitry Andric   C->setUniqueDecls(Decls);
111540b57cec5SDimitry Andric 
111550b57cec5SDimitry Andric   SmallVector<unsigned, 16> ListsPerDecl;
111560b57cec5SDimitry Andric   ListsPerDecl.reserve(UniqueDecls);
111570b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
111580b57cec5SDimitry Andric     ListsPerDecl.push_back(Record.readInt());
111590b57cec5SDimitry Andric   C->setDeclNumLists(ListsPerDecl);
111600b57cec5SDimitry Andric 
111610b57cec5SDimitry Andric   SmallVector<unsigned, 32> ListSizes;
111620b57cec5SDimitry Andric   ListSizes.reserve(TotalLists);
111630b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalLists; ++i)
111640b57cec5SDimitry Andric     ListSizes.push_back(Record.readInt());
111650b57cec5SDimitry Andric   C->setComponentListSizes(ListSizes);
111660b57cec5SDimitry Andric 
111670b57cec5SDimitry Andric   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
111680b57cec5SDimitry Andric   Components.reserve(TotalComponents);
111690b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalComponents; ++i) {
11170e8d8bef9SDimitry Andric     Expr *AssociatedExprPr = Record.readSubExpr();
11171e8d8bef9SDimitry Andric     bool IsNonContiguous = Record.readBool();
111720b57cec5SDimitry Andric     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11173e8d8bef9SDimitry Andric     Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
111740b57cec5SDimitry Andric   }
111750b57cec5SDimitry Andric   C->setComponents(Components, ListSizes);
111760b57cec5SDimitry Andric }
111770b57cec5SDimitry Andric 
111780b57cec5SDimitry Andric void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
111790b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
111800b57cec5SDimitry Andric   auto NumVars = C->varlist_size();
111810b57cec5SDimitry Andric   auto UniqueDecls = C->getUniqueDeclarationsNum();
111820b57cec5SDimitry Andric   auto TotalLists = C->getTotalComponentListNum();
111830b57cec5SDimitry Andric   auto TotalComponents = C->getTotalComponentsNum();
111840b57cec5SDimitry Andric 
111850b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
111860b57cec5SDimitry Andric   Vars.reserve(NumVars);
111870b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
111880b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
111890b57cec5SDimitry Andric   C->setVarRefs(Vars);
111900b57cec5SDimitry Andric   Vars.clear();
111910b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
111920b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
111930b57cec5SDimitry Andric   C->setPrivateCopies(Vars);
111940b57cec5SDimitry Andric   Vars.clear();
111950b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
111960b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
111970b57cec5SDimitry Andric   C->setInits(Vars);
111980b57cec5SDimitry Andric 
111990b57cec5SDimitry Andric   SmallVector<ValueDecl *, 16> Decls;
112000b57cec5SDimitry Andric   Decls.reserve(UniqueDecls);
112010b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
112020b57cec5SDimitry Andric     Decls.push_back(Record.readDeclAs<ValueDecl>());
112030b57cec5SDimitry Andric   C->setUniqueDecls(Decls);
112040b57cec5SDimitry Andric 
112050b57cec5SDimitry Andric   SmallVector<unsigned, 16> ListsPerDecl;
112060b57cec5SDimitry Andric   ListsPerDecl.reserve(UniqueDecls);
112070b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
112080b57cec5SDimitry Andric     ListsPerDecl.push_back(Record.readInt());
112090b57cec5SDimitry Andric   C->setDeclNumLists(ListsPerDecl);
112100b57cec5SDimitry Andric 
112110b57cec5SDimitry Andric   SmallVector<unsigned, 32> ListSizes;
112120b57cec5SDimitry Andric   ListSizes.reserve(TotalLists);
112130b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalLists; ++i)
112140b57cec5SDimitry Andric     ListSizes.push_back(Record.readInt());
112150b57cec5SDimitry Andric   C->setComponentListSizes(ListSizes);
112160b57cec5SDimitry Andric 
112170b57cec5SDimitry Andric   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
112180b57cec5SDimitry Andric   Components.reserve(TotalComponents);
112190b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalComponents; ++i) {
11220e8d8bef9SDimitry Andric     auto *AssociatedExprPr = Record.readSubExpr();
112210b57cec5SDimitry Andric     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11222e8d8bef9SDimitry Andric     Components.emplace_back(AssociatedExprPr, AssociatedDecl,
11223e8d8bef9SDimitry Andric                             /*IsNonContiguous=*/false);
112240b57cec5SDimitry Andric   }
112250b57cec5SDimitry Andric   C->setComponents(Components, ListSizes);
112260b57cec5SDimitry Andric }
112270b57cec5SDimitry Andric 
112285ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) {
112295ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
112305ffd83dbSDimitry Andric   auto NumVars = C->varlist_size();
112315ffd83dbSDimitry Andric   auto UniqueDecls = C->getUniqueDeclarationsNum();
112325ffd83dbSDimitry Andric   auto TotalLists = C->getTotalComponentListNum();
112335ffd83dbSDimitry Andric   auto TotalComponents = C->getTotalComponentsNum();
112345ffd83dbSDimitry Andric 
112355ffd83dbSDimitry Andric   SmallVector<Expr *, 16> Vars;
112365ffd83dbSDimitry Andric   Vars.reserve(NumVars);
112375ffd83dbSDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
112385ffd83dbSDimitry Andric     Vars.push_back(Record.readSubExpr());
112395ffd83dbSDimitry Andric   C->setVarRefs(Vars);
112405ffd83dbSDimitry Andric 
112415ffd83dbSDimitry Andric   SmallVector<ValueDecl *, 16> Decls;
112425ffd83dbSDimitry Andric   Decls.reserve(UniqueDecls);
112435ffd83dbSDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
112445ffd83dbSDimitry Andric     Decls.push_back(Record.readDeclAs<ValueDecl>());
112455ffd83dbSDimitry Andric   C->setUniqueDecls(Decls);
112465ffd83dbSDimitry Andric 
112475ffd83dbSDimitry Andric   SmallVector<unsigned, 16> ListsPerDecl;
112485ffd83dbSDimitry Andric   ListsPerDecl.reserve(UniqueDecls);
112495ffd83dbSDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
112505ffd83dbSDimitry Andric     ListsPerDecl.push_back(Record.readInt());
112515ffd83dbSDimitry Andric   C->setDeclNumLists(ListsPerDecl);
112525ffd83dbSDimitry Andric 
112535ffd83dbSDimitry Andric   SmallVector<unsigned, 32> ListSizes;
112545ffd83dbSDimitry Andric   ListSizes.reserve(TotalLists);
112555ffd83dbSDimitry Andric   for (unsigned i = 0; i < TotalLists; ++i)
112565ffd83dbSDimitry Andric     ListSizes.push_back(Record.readInt());
112575ffd83dbSDimitry Andric   C->setComponentListSizes(ListSizes);
112585ffd83dbSDimitry Andric 
112595ffd83dbSDimitry Andric   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
112605ffd83dbSDimitry Andric   Components.reserve(TotalComponents);
112615ffd83dbSDimitry Andric   for (unsigned i = 0; i < TotalComponents; ++i) {
112625ffd83dbSDimitry Andric     Expr *AssociatedExpr = Record.readSubExpr();
112635ffd83dbSDimitry Andric     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11264e8d8bef9SDimitry Andric     Components.emplace_back(AssociatedExpr, AssociatedDecl,
11265e8d8bef9SDimitry Andric                             /*IsNonContiguous*/ false);
112665ffd83dbSDimitry Andric   }
112675ffd83dbSDimitry Andric   C->setComponents(Components, ListSizes);
112685ffd83dbSDimitry Andric }
112695ffd83dbSDimitry Andric 
112700b57cec5SDimitry Andric void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
112710b57cec5SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
112720b57cec5SDimitry Andric   auto NumVars = C->varlist_size();
112730b57cec5SDimitry Andric   auto UniqueDecls = C->getUniqueDeclarationsNum();
112740b57cec5SDimitry Andric   auto TotalLists = C->getTotalComponentListNum();
112750b57cec5SDimitry Andric   auto TotalComponents = C->getTotalComponentsNum();
112760b57cec5SDimitry Andric 
112770b57cec5SDimitry Andric   SmallVector<Expr *, 16> Vars;
112780b57cec5SDimitry Andric   Vars.reserve(NumVars);
112790b57cec5SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
112800b57cec5SDimitry Andric     Vars.push_back(Record.readSubExpr());
112810b57cec5SDimitry Andric   C->setVarRefs(Vars);
112820b57cec5SDimitry Andric   Vars.clear();
112830b57cec5SDimitry Andric 
112840b57cec5SDimitry Andric   SmallVector<ValueDecl *, 16> Decls;
112850b57cec5SDimitry Andric   Decls.reserve(UniqueDecls);
112860b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
112870b57cec5SDimitry Andric     Decls.push_back(Record.readDeclAs<ValueDecl>());
112880b57cec5SDimitry Andric   C->setUniqueDecls(Decls);
112890b57cec5SDimitry Andric 
112900b57cec5SDimitry Andric   SmallVector<unsigned, 16> ListsPerDecl;
112910b57cec5SDimitry Andric   ListsPerDecl.reserve(UniqueDecls);
112920b57cec5SDimitry Andric   for (unsigned i = 0; i < UniqueDecls; ++i)
112930b57cec5SDimitry Andric     ListsPerDecl.push_back(Record.readInt());
112940b57cec5SDimitry Andric   C->setDeclNumLists(ListsPerDecl);
112950b57cec5SDimitry Andric 
112960b57cec5SDimitry Andric   SmallVector<unsigned, 32> ListSizes;
112970b57cec5SDimitry Andric   ListSizes.reserve(TotalLists);
112980b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalLists; ++i)
112990b57cec5SDimitry Andric     ListSizes.push_back(Record.readInt());
113000b57cec5SDimitry Andric   C->setComponentListSizes(ListSizes);
113010b57cec5SDimitry Andric 
113020b57cec5SDimitry Andric   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
113030b57cec5SDimitry Andric   Components.reserve(TotalComponents);
113040b57cec5SDimitry Andric   for (unsigned i = 0; i < TotalComponents; ++i) {
113050b57cec5SDimitry Andric     Expr *AssociatedExpr = Record.readSubExpr();
113060b57cec5SDimitry Andric     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
11307e8d8bef9SDimitry Andric     Components.emplace_back(AssociatedExpr, AssociatedDecl,
11308e8d8bef9SDimitry Andric                             /*IsNonContiguous=*/false);
113090b57cec5SDimitry Andric   }
113100b57cec5SDimitry Andric   C->setComponents(Components, ListSizes);
113110b57cec5SDimitry Andric }
11312480093f4SDimitry Andric 
1131381ad6265SDimitry Andric void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) {
1131481ad6265SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
1131581ad6265SDimitry Andric   auto NumVars = C->varlist_size();
1131681ad6265SDimitry Andric   auto UniqueDecls = C->getUniqueDeclarationsNum();
1131781ad6265SDimitry Andric   auto TotalLists = C->getTotalComponentListNum();
1131881ad6265SDimitry Andric   auto TotalComponents = C->getTotalComponentsNum();
1131981ad6265SDimitry Andric 
1132081ad6265SDimitry Andric   SmallVector<Expr *, 16> Vars;
1132181ad6265SDimitry Andric   Vars.reserve(NumVars);
1132281ad6265SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
1132381ad6265SDimitry Andric     Vars.push_back(Record.readSubExpr());
1132481ad6265SDimitry Andric   C->setVarRefs(Vars);
1132581ad6265SDimitry Andric   Vars.clear();
1132681ad6265SDimitry Andric 
1132781ad6265SDimitry Andric   SmallVector<ValueDecl *, 16> Decls;
1132881ad6265SDimitry Andric   Decls.reserve(UniqueDecls);
1132981ad6265SDimitry Andric   for (unsigned I = 0; I < UniqueDecls; ++I)
1133081ad6265SDimitry Andric     Decls.push_back(Record.readDeclAs<ValueDecl>());
1133181ad6265SDimitry Andric   C->setUniqueDecls(Decls);
1133281ad6265SDimitry Andric 
1133381ad6265SDimitry Andric   SmallVector<unsigned, 16> ListsPerDecl;
1133481ad6265SDimitry Andric   ListsPerDecl.reserve(UniqueDecls);
1133581ad6265SDimitry Andric   for (unsigned I = 0; I < UniqueDecls; ++I)
1133681ad6265SDimitry Andric     ListsPerDecl.push_back(Record.readInt());
1133781ad6265SDimitry Andric   C->setDeclNumLists(ListsPerDecl);
1133881ad6265SDimitry Andric 
1133981ad6265SDimitry Andric   SmallVector<unsigned, 32> ListSizes;
1134081ad6265SDimitry Andric   ListSizes.reserve(TotalLists);
1134181ad6265SDimitry Andric   for (unsigned i = 0; i < TotalLists; ++i)
1134281ad6265SDimitry Andric     ListSizes.push_back(Record.readInt());
1134381ad6265SDimitry Andric   C->setComponentListSizes(ListSizes);
1134481ad6265SDimitry Andric 
1134581ad6265SDimitry Andric   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
1134681ad6265SDimitry Andric   Components.reserve(TotalComponents);
1134781ad6265SDimitry Andric   for (unsigned I = 0; I < TotalComponents; ++I) {
1134881ad6265SDimitry Andric     Expr *AssociatedExpr = Record.readSubExpr();
1134981ad6265SDimitry Andric     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
1135081ad6265SDimitry Andric     Components.emplace_back(AssociatedExpr, AssociatedDecl,
1135181ad6265SDimitry Andric                             /*IsNonContiguous=*/false);
1135281ad6265SDimitry Andric   }
1135381ad6265SDimitry Andric   C->setComponents(Components, ListSizes);
1135481ad6265SDimitry Andric }
1135581ad6265SDimitry Andric 
11356480093f4SDimitry Andric void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {
11357480093f4SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11358480093f4SDimitry Andric   unsigned NumVars = C->varlist_size();
11359480093f4SDimitry Andric   SmallVector<Expr *, 16> Vars;
11360480093f4SDimitry Andric   Vars.reserve(NumVars);
11361480093f4SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
11362480093f4SDimitry Andric     Vars.push_back(Record.readSubExpr());
11363480093f4SDimitry Andric   C->setVarRefs(Vars);
11364480093f4SDimitry Andric   Vars.clear();
11365480093f4SDimitry Andric   Vars.reserve(NumVars);
11366480093f4SDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
11367480093f4SDimitry Andric     Vars.push_back(Record.readSubExpr());
11368480093f4SDimitry Andric   C->setPrivateRefs(Vars);
11369480093f4SDimitry Andric }
113705ffd83dbSDimitry Andric 
113715ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) {
113725ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
113735ffd83dbSDimitry Andric   unsigned NumVars = C->varlist_size();
113745ffd83dbSDimitry Andric   SmallVector<Expr *, 16> Vars;
113755ffd83dbSDimitry Andric   Vars.reserve(NumVars);
113765ffd83dbSDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
113775ffd83dbSDimitry Andric     Vars.push_back(Record.readSubExpr());
113785ffd83dbSDimitry Andric   C->setVarRefs(Vars);
113795ffd83dbSDimitry Andric }
113805ffd83dbSDimitry Andric 
113815ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) {
113825ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
113835ffd83dbSDimitry Andric   unsigned NumVars = C->varlist_size();
113845ffd83dbSDimitry Andric   SmallVector<Expr *, 16> Vars;
113855ffd83dbSDimitry Andric   Vars.reserve(NumVars);
113865ffd83dbSDimitry Andric   for (unsigned i = 0; i != NumVars; ++i)
113875ffd83dbSDimitry Andric     Vars.push_back(Record.readSubExpr());
113885ffd83dbSDimitry Andric   C->setVarRefs(Vars);
113895ffd83dbSDimitry Andric }
113905ffd83dbSDimitry Andric 
113915ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) {
113925ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
113935ffd83dbSDimitry Andric   unsigned NumOfAllocators = C->getNumberOfAllocators();
113945ffd83dbSDimitry Andric   SmallVector<OMPUsesAllocatorsClause::Data, 4> Data;
113955ffd83dbSDimitry Andric   Data.reserve(NumOfAllocators);
113965ffd83dbSDimitry Andric   for (unsigned I = 0; I != NumOfAllocators; ++I) {
113975ffd83dbSDimitry Andric     OMPUsesAllocatorsClause::Data &D = Data.emplace_back();
113985ffd83dbSDimitry Andric     D.Allocator = Record.readSubExpr();
113995ffd83dbSDimitry Andric     D.AllocatorTraits = Record.readSubExpr();
114005ffd83dbSDimitry Andric     D.LParenLoc = Record.readSourceLocation();
114015ffd83dbSDimitry Andric     D.RParenLoc = Record.readSourceLocation();
114025ffd83dbSDimitry Andric   }
114035ffd83dbSDimitry Andric   C->setAllocatorsData(Data);
114045ffd83dbSDimitry Andric }
114055ffd83dbSDimitry Andric 
114065ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) {
114075ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
114085ffd83dbSDimitry Andric   C->setModifier(Record.readSubExpr());
114095ffd83dbSDimitry Andric   C->setColonLoc(Record.readSourceLocation());
114105ffd83dbSDimitry Andric   unsigned NumOfLocators = C->varlist_size();
114115ffd83dbSDimitry Andric   SmallVector<Expr *, 4> Locators;
114125ffd83dbSDimitry Andric   Locators.reserve(NumOfLocators);
114135ffd83dbSDimitry Andric   for (unsigned I = 0; I != NumOfLocators; ++I)
114145ffd83dbSDimitry Andric     Locators.push_back(Record.readSubExpr());
114155ffd83dbSDimitry Andric   C->setVarRefs(Locators);
114165ffd83dbSDimitry Andric }
114175ffd83dbSDimitry Andric 
114185ffd83dbSDimitry Andric void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) {
114195ffd83dbSDimitry Andric   C->setKind(Record.readEnum<OpenMPOrderClauseKind>());
11420bdd1243dSDimitry Andric   C->setModifier(Record.readEnum<OpenMPOrderClauseModifier>());
114215ffd83dbSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
114225ffd83dbSDimitry Andric   C->setKindKwLoc(Record.readSourceLocation());
11423bdd1243dSDimitry Andric   C->setModifierKwLoc(Record.readSourceLocation());
114245ffd83dbSDimitry Andric }
114255ffd83dbSDimitry Andric 
11426fe6060f1SDimitry Andric void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) {
11427fe6060f1SDimitry Andric   VisitOMPClauseWithPreInit(C);
11428fe6060f1SDimitry Andric   C->setThreadID(Record.readSubExpr());
11429fe6060f1SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11430fe6060f1SDimitry Andric }
11431fe6060f1SDimitry Andric 
11432349cc55cSDimitry Andric void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) {
11433349cc55cSDimitry Andric   C->setBindKind(Record.readEnum<OpenMPBindClauseKind>());
11434349cc55cSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11435349cc55cSDimitry Andric   C->setBindKindLoc(Record.readSourceLocation());
11436349cc55cSDimitry Andric }
11437349cc55cSDimitry Andric 
11438349cc55cSDimitry Andric void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) {
11439349cc55cSDimitry Andric   C->setAlignment(Record.readExpr());
11440349cc55cSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11441349cc55cSDimitry Andric }
11442349cc55cSDimitry Andric 
11443bdd1243dSDimitry Andric void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *C) {
11444bdd1243dSDimitry Andric   VisitOMPClauseWithPreInit(C);
11445bdd1243dSDimitry Andric   C->setSize(Record.readSubExpr());
11446bdd1243dSDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11447bdd1243dSDimitry Andric }
11448bdd1243dSDimitry Andric 
11449*06c3fb27SDimitry Andric void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *C) {
11450*06c3fb27SDimitry Andric   C->setLParenLoc(Record.readSourceLocation());
11451*06c3fb27SDimitry Andric   C->setDependenceType(
11452*06c3fb27SDimitry Andric       static_cast<OpenMPDoacrossClauseModifier>(Record.readInt()));
11453*06c3fb27SDimitry Andric   C->setDependenceLoc(Record.readSourceLocation());
11454*06c3fb27SDimitry Andric   C->setColonLoc(Record.readSourceLocation());
11455*06c3fb27SDimitry Andric   unsigned NumVars = C->varlist_size();
11456*06c3fb27SDimitry Andric   SmallVector<Expr *, 16> Vars;
11457*06c3fb27SDimitry Andric   Vars.reserve(NumVars);
11458*06c3fb27SDimitry Andric   for (unsigned I = 0; I != NumVars; ++I)
11459*06c3fb27SDimitry Andric     Vars.push_back(Record.readSubExpr());
11460*06c3fb27SDimitry Andric   C->setVarRefs(Vars);
11461*06c3fb27SDimitry Andric   for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I)
11462*06c3fb27SDimitry Andric     C->setLoopData(I, Record.readSubExpr());
11463*06c3fb27SDimitry Andric }
11464*06c3fb27SDimitry Andric 
114655ffd83dbSDimitry Andric OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() {
114665ffd83dbSDimitry Andric   OMPTraitInfo &TI = getContext().getNewOMPTraitInfo();
114675ffd83dbSDimitry Andric   TI.Sets.resize(readUInt32());
114685ffd83dbSDimitry Andric   for (auto &Set : TI.Sets) {
114695ffd83dbSDimitry Andric     Set.Kind = readEnum<llvm::omp::TraitSet>();
114705ffd83dbSDimitry Andric     Set.Selectors.resize(readUInt32());
114715ffd83dbSDimitry Andric     for (auto &Selector : Set.Selectors) {
114725ffd83dbSDimitry Andric       Selector.Kind = readEnum<llvm::omp::TraitSelector>();
114735ffd83dbSDimitry Andric       Selector.ScoreOrCondition = nullptr;
114745ffd83dbSDimitry Andric       if (readBool())
114755ffd83dbSDimitry Andric         Selector.ScoreOrCondition = readExprRef();
114765ffd83dbSDimitry Andric       Selector.Properties.resize(readUInt32());
114775ffd83dbSDimitry Andric       for (auto &Property : Selector.Properties)
114785ffd83dbSDimitry Andric         Property.Kind = readEnum<llvm::omp::TraitProperty>();
114795ffd83dbSDimitry Andric     }
114805ffd83dbSDimitry Andric   }
114815ffd83dbSDimitry Andric   return &TI;
114825ffd83dbSDimitry Andric }
11483e8d8bef9SDimitry Andric 
11484e8d8bef9SDimitry Andric void ASTRecordReader::readOMPChildren(OMPChildren *Data) {
11485e8d8bef9SDimitry Andric   if (!Data)
11486e8d8bef9SDimitry Andric     return;
11487e8d8bef9SDimitry Andric   if (Reader->ReadingKind == ASTReader::Read_Stmt) {
11488e8d8bef9SDimitry Andric     // Skip NumClauses, NumChildren and HasAssociatedStmt fields.
11489e8d8bef9SDimitry Andric     skipInts(3);
11490e8d8bef9SDimitry Andric   }
11491e8d8bef9SDimitry Andric   SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses());
11492e8d8bef9SDimitry Andric   for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I)
11493e8d8bef9SDimitry Andric     Clauses[I] = readOMPClause();
11494e8d8bef9SDimitry Andric   Data->setClauses(Clauses);
11495e8d8bef9SDimitry Andric   if (Data->hasAssociatedStmt())
11496e8d8bef9SDimitry Andric     Data->setAssociatedStmt(readStmt());
11497e8d8bef9SDimitry Andric   for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I)
11498e8d8bef9SDimitry Andric     Data->getChildren()[I] = readStmt();
11499e8d8bef9SDimitry Andric }
11500