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