1995e26b0523ac8e3b6199a509b871b81fa5df6eeNick Lewycky//===--- ASTReader.cpp - AST File Reader ----------------------------------===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file defines the ASTReader class, which reads AST files. 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/ASTReader.h" 157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "ASTCommon.h" 167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "ASTReaderInternals.h" 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ASTConsumer.h" 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ASTContext.h" 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclTemplate.h" 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Expr.h" 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ExprCXX.h" 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/NestedNameSpecifier.h" 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Type.h" 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeLocVisitor.h" 256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/Basic/DiagnosticOptions.h" 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/FileManager.h" 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManager.h" 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManagerInternals.h" 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/TargetInfo.h" 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/TargetOptions.h" 317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Version.h" 327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/VersionTuple.h" 336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "clang/Frontend/Utils.h" 347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/HeaderSearch.h" 357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/HeaderSearchOptions.h" 367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/MacroInfo.h" 377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/PreprocessingRecord.h" 387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/Preprocessor.h" 397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/PreprocessorOptions.h" 407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Sema/Scope.h" 417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Sema/Sema.h" 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/ASTDeserializationListener.h" 431a49d97d762570027863e9209af81d445e4f1502Douglas Gregor#include "clang/Serialization/GlobalModuleIndex.h" 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/ModuleManager.h" 457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/SerializationDiagnostic.h" 46ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis#include "llvm/ADT/Hashing.h" 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h" 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Bitcode/BitstreamReader.h" 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/ErrorHandling.h" 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/FileSystem.h" 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/MemoryBuffer.h" 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Path.h" 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/SaveAndRestore.h" 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/raw_ostream.h" 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include <algorithm> 56e4e4a88eb67ce1cd32a5761f0601fc029d68832bChris Lattner#include <cstdio> 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include <iterator> 58ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include <system_error> 597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::serialization; 627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::serialization::reader; 638f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattnerusing llvm::BitstreamCursor; 647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// ChainedASTReaderListener implementation 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool 71651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->ReadFullVersionInformation(FullVersion) || 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadFullVersionInformation(FullVersion); 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines First->ReadModuleName(ModuleName); 776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Second->ReadModuleName(ModuleName); 786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines First->ReadModuleMapFile(ModuleMapPath); 816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Second->ReadModuleMapFile(ModuleMapPath); 826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Complain) { 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->ReadLanguageOptions(LangOpts, Complain) || 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadLanguageOptions(LangOpts, Complain); 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool 89651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesChainedASTReaderListener::ReadTargetOptions(const TargetOptions &TargetOpts, 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Complain) { 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->ReadTargetOptions(TargetOpts, Complain) || 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadTargetOptions(TargetOpts, Complain); 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ChainedASTReaderListener::ReadDiagnosticOptions( 956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->ReadDiagnosticOptions(DiagOpts, Complain) || 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadDiagnosticOptions(DiagOpts, Complain); 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool 100651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Complain) { 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->ReadFileSystemOptions(FSOpts, Complain) || 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadFileSystemOptions(FSOpts, Complain); 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ChainedASTReaderListener::ReadHeaderSearchOptions( 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const HeaderSearchOptions &HSOpts, bool Complain) { 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->ReadHeaderSearchOptions(HSOpts, Complain) || 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadHeaderSearchOptions(HSOpts, Complain); 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ChainedASTReaderListener::ReadPreprocessorOptions( 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const PreprocessorOptions &PPOpts, bool Complain, 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string &SuggestedPredefines) { 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->ReadPreprocessorOptions(PPOpts, Complain, 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SuggestedPredefines) || 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Value) { 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines First->ReadCounter(M, Value); 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->ReadCounter(M, Value); 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ChainedASTReaderListener::needsInputFileVisitation() { 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->needsInputFileVisitation() || 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->needsInputFileVisitation(); 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ChainedASTReaderListener::needsSystemInputFileVisitation() { 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return First->needsSystemInputFileVisitation() || 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->needsSystemInputFileVisitation(); 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ChainedASTReaderListener::visitModuleFile(StringRef Filename) { 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines First->visitModuleFile(Filename); 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Second->visitModuleFile(Filename); 134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ChainedASTReaderListener::visitInputFile(StringRef Filename, 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isSystem, 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isOverridden) { 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Continue = false; 1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (First->needsInputFileVisitation() && 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (!isSystem || First->needsSystemInputFileVisitation())) 1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Continue |= First->visitInputFile(Filename, isSystem, isOverridden); 1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Second->needsInputFileVisitation() && 1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (!isSystem || Second->needsSystemInputFileVisitation())) 1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Continue |= Second->visitInputFile(Filename, isSystem, isOverridden); 1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Continue; 146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// PCH validator implementation 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReaderListener::~ASTReaderListener() {} 1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare the given set of language options against an existing set of 1557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// language options. 1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Diags If non-NULL, diagnostics will be emitted via this engine. 1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the languagae options mis-match, false otherwise. 1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool checkLanguageOptions(const LangOptions &LangOpts, 1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &ExistingLangOpts, 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine *Diags) { 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define LANGOPT(Name, Bits, Default, Description) \ 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.Name != LangOpts.Name) { \ 1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_mismatch) \ 1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Description << LangOpts.Name << ExistingLangOpts.Name; \ 1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define VALUE_LANGOPT(Name, Bits, Default, Description) \ 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.Name != LangOpts.Name) { \ 1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_value_mismatch) \ 1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Description; \ 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_value_mismatch) \ 1837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Description; \ 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BENIGN_LANGOPT(Name, Bits, Default, Description) 1887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/LangOptions.def" 1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_value_mismatch) 1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "target Objective-C runtime"; 1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1986ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko if (ExistingLangOpts.CommentOpts.BlockCommandNames != 1996ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko LangOpts.CommentOpts.BlockCommandNames) { 2006ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko if (Diags) 2016ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko Diags->Report(diag::err_pch_langopt_value_mismatch) 2026ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko << "block command names"; 2036ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko return true; 2046ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko } 2056ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare the given set of target options against an existing set of 2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// target options. 2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Diags If non-NULL, diagnostics will be emitted via this engine. 2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the target options mis-match, false otherwise. 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool checkTargetOptions(const TargetOptions &TargetOpts, 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts, 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine *Diags) { 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define CHECK_TARGET_OPT(Field, Name) \ 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_mismatch) \ 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(Triple, "target"); 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(CPU, "target CPU"); 2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(ABI, "target ABI"); 2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#undef CHECK_TARGET_OPT 2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compare feature sets. 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<StringRef, 4> ExistingFeatures( 2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingTargetOpts.FeaturesAsWritten.begin(), 2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingTargetOpts.FeaturesAsWritten.end()); 2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.FeaturesAsWritten.end()); 2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::sort(ExistingFeatures.begin(), ExistingFeatures.end()); 2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::sort(ReadFeatures.begin(), ReadFeatures.end()); 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size(); 2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ReadIdx = 0, ReadN = ReadFeatures.size(); 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (ExistingIdx < ExistingN && ReadIdx < ReadN) { 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) { 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++ExistingIdx; 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++ReadIdx; 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) { 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << false << ReadFeatures[ReadIdx]; 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << true << ExistingFeatures[ExistingIdx]; 2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingIdx < ExistingN) { 2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << true << ExistingFeatures[ExistingIdx]; 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadIdx < ReadN) { 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << false << ReadFeatures[ReadIdx]; 2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain) { 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &ExistingLangOpts = PP.getLangOpts(); 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkLanguageOptions(LangOpts, ExistingLangOpts, 2846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Complain? &Reader.Diags : nullptr); 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain) { 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkTargetOptions(TargetOpts, ExistingTargetOpts, 2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Complain? &Reader.Diags : nullptr); 2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> > 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinitionsMap; 2978ae63875f4b078f5303ca7a19cba82fbc8a603c2Craig Topper typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > 2988ae63875f4b078f5303ca7a19cba82fbc8a603c2Craig Topper DeclsMap; 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosticsEngine &Diags, 3036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Complain) { 3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef DiagnosticsEngine::Level Level; 3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Check current mappings for new -Werror mappings, and the stored mappings 3076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // for cases that were explicitly mapped to *not* be errors that are now 3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // errors because of options like -Werror. 3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 3106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (DiagnosticsEngine *MappingSource : MappingSources) { 3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::kind DiagID = DiagIDMappingPair.first; 3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 3156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurLevel < DiagnosticsEngine::Error) 3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; // not significant 3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Level StoredLevel = 3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 3196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (StoredLevel < DiagnosticsEngine::Error) { 3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Complain) 3216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 3226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 3236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 3246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 3296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 3306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 331ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstatic bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 332ef8225444452a1486bd721f3285301fe84643b00Stephen Hines diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 333ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 334ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 335ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return Ext >= diag::Severity::Error; 3366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 3376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 3396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosticsEngine &Diags, 3406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool IsSystem, bool Complain) { 3416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Top-level options 3426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (IsSystem) { 3436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Diags.getSuppressSystemWarnings()) 3446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 3456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If -Wsystem-headers was not enabled before, be conservative 3466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (StoredDiags.getSuppressSystemWarnings()) { 3476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Complain) 3486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 3506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 3546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Complain) 3556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 3566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 3576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 3606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !StoredDiags.getEnableAllWarnings()) { 3616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Complain) 3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 3636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 3646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isExtHandlingFromDiagsError(Diags) && 3676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !isExtHandlingFromDiagsError(StoredDiags)) { 3686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Complain) 3696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 3706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 3716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 3726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 3746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 3756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool PCHValidator::ReadDiagnosticOptions( 3776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 3786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 3796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 3806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 381ef8225444452a1486bd721f3285301fe84643b00Stephen Hines new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 3826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // This should never fail, because we would have processed these options 3836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // before writing them to an ASTFile. 3846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 3856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleManager &ModuleMgr = Reader.getModuleManager(); 3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 3886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If the original import came from a file explicitly generated by the user, 3906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // don't check the diagnostic mappings. 3916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: currently this is approximated by checking whether this is not a 3926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // module import. 3936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 3946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // the transitive closure of its imports, since unrelated modules cannot be 3956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // imported until after this module finishes validation. 3966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleFile *TopImport = *ModuleMgr.rbegin(); 3976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (!TopImport->ImportedBy.empty()) 3986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TopImport = TopImport->ImportedBy[0]; 3996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (TopImport->Kind != MK_Module) 4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 4016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef ModuleName = TopImport->ModuleName; 4036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(!ModuleName.empty() && "diagnostic options read before module name"); 4046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 4066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(M && "missing module"); 4076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 4096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // contains the union of their flags. 4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain); 4116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 4126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Collect the macro definitions provided by the given preprocessor 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// options. 4156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic void 4166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinescollectMacroDefinitions(const PreprocessorOptions &PPOpts, 4176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MacroDefinitionsMap &Macros, 4186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SmallVectorImpl<StringRef> *MacroNames = nullptr) { 4197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Macro = PPOpts.Macros[I].first; 4217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsUndef = PPOpts.Macros[I].second; 4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 4247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MacroName = MacroPair.first; 4257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MacroBody = MacroPair.second; 4267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For an #undef'd macro, we only care about the name. 4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsUndef) { 4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacroNames && !Macros.count(MacroName)) 4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroNames->push_back(MacroName); 4317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macros[MacroName] = std::make_pair("", true); 4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For a #define'd macro, figure out the actual definition. 4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacroName.size() == Macro.size()) 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroBody = "1"; 4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 4407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: GCC drops anything following an end-of-line character. 4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef::size_type End = MacroBody.find_first_of("\n\r"); 4427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroBody = MacroBody.substr(0, End); 4437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacroNames && !Macros.count(MacroName)) 4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroNames->push_back(MacroName); 4477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macros[MacroName] = std::make_pair(MacroBody, false); 4487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Check the preprocessor options deserialized from the control block 4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// against the preprocessor options in an existing preprocessor. 4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Diags If non-null, produce diagnostics for any mismatches incurred. 4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts, 4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine *Diags, 4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 45965110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis std::string &SuggestedPredefines, 46065110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis const LangOptions &LangOpts) { 4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check macro definitions. 4627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinitionsMap ASTFileMacros; 4637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei collectMacroDefinitions(PPOpts, ASTFileMacros); 4647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinitionsMap ExistingMacros; 4657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<StringRef, 4> ExistingMacroNames; 4667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 4677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 4697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Dig out the macro definition in the existing preprocessor options. 4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MacroName = ExistingMacroNames[I]; 4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we know anything about this macro name or not. 4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known 4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ASTFileMacros.find(MacroName); 4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Known == ASTFileMacros.end()) { 4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Check whether this identifier was referenced anywhere in the 4787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // AST file. If so, we should reject the AST file. Unfortunately, this 4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information isn't in the control block. What shall we do about it? 4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Existing.second) { 4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#undef "; 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += MacroName.str(); 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += '\n'; 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#define "; 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += MacroName.str(); 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += ' '; 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += Existing.first.str(); 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += '\n'; 4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the macro was defined in one but undef'd in the other, we have a 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // conflict. 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Existing.second != Known->second.second) { 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) { 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_macro_def_undef) 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << MacroName << Known->second.second; 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the macro was #undef'd in both, or if the macro bodies are identical, 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's fine. 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Existing.second || Existing.first == Known->second.first) 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The macro bodies differ; complain. 5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) { 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_macro_def_conflict) 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << MacroName << Known->second.first << Existing.first; 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we're using predefines. 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) { 5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) { 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52665110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis // Detailed record is important since it is used for the module cache hash. 52765110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis if (LangOpts.Modules && 52865110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) { 52965110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis if (Diags) { 53065110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 53165110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis } 53265110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis return true; 53365110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis } 53465110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis 5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compute the #include and #include_macros lines we need. 5367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef File = ExistingPPOpts.Includes[I]; 5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (File == ExistingPPOpts.ImplicitPCHInclude) 5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei != PPOpts.Includes.end()) 5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#include \""; 5467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += 5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearch::NormalizeDashIncludePath(File, FileMgr); 5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "\"\n"; 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef File = ExistingPPOpts.MacroIncludes[I]; 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File) 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei != PPOpts.MacroIncludes.end()) 5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#__include_macros \""; 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearch::NormalizeDashIncludePath(File, FileMgr); 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "\"\n##\n"; 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &SuggestedPredefines) { 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 5736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Complain? &Reader.Diags : nullptr, 5747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getFileManager(), 57565110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis SuggestedPredefines, 57665110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis PP.getLangOpts()); 5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.setCounterValue(Value); 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// AST reader implementation 5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 5886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool TakeOwnership) { 5897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener = Listener; 5906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OwnsDeserializationListener = TakeOwnership; 5917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return serialization::ComputeHash(Sel); 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(KeyLen, DataLen); 6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::internal_key_type 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorTable &SelTable = Reader.getContext().Selectors; 612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdentifierInfo *FirstII = Reader.getLocalIdentifier( 614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d)); 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (N == 0) 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTable.getNullarySelector(FirstII); 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (N == 1) 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTable.getUnarySelector(FirstII); 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<IdentifierInfo *, 16> Args; 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.push_back(FirstII); 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 1; I != N; ++I) 623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.push_back(Reader.getLocalIdentifier( 624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d))); 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTable.getSelector(N, Args.data()); 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::data_type 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei data_type Result; 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Result.ID = Reader.getGlobalSelectorID( 637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d)); 638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned NumInstanceMethodsAndBits = 639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint16_t, little, unaligned>(d); 640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned NumFactoryMethodsAndBits = 641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint16_t, little, unaligned>(d); 6422e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Result.InstanceBits = NumInstanceMethodsAndBits & 0x3; 6432e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Result.FactoryBits = NumFactoryMethodsAndBits & 0x3; 6442e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2; 6452e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2; 6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load instance methods 6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumInstanceMethods; ++I) { 649651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 650651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d))) 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Result.Instance.push_back(Method); 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load factory methods 6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumFactoryMethods; ++I) { 656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d))) 6587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Result.Factory.push_back(Method); 6597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 664479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregorunsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 665479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor return llvm::HashString(a); 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 669479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas GregorASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(KeyLen, DataLen); 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 676479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas GregorASTIdentifierLookupTraitBase::internal_key_type 677479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas GregorASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 6787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(n >= 2 && d[n-1] == '\0'); 679479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor return StringRef((const char*) d, n-1); 6807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 682f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor/// \brief Whether the given identifier is "interesting". 683f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregorstatic bool isInterestingIdentifier(IdentifierInfo &II) { 684f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor return II.isPoisoned() || 685f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.isExtensionToken() || 686f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.getObjCOrBuiltinID() || 687f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.hasRevertedTokenIDToIdentifier() || 688f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.hadMacroDefinition() || 689f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.getFETokenInfo<void>(); 690f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor} 691f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char* d, 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 696651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsInteresting = RawID & 0x01; 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Wipe out the "is interesting" bit. 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RawID = RawID >> 1; 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsInteresting) { 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For uninteresting identifiers, just build the IdentifierInfo 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and associate it with the persistent ID. 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = KnownII; 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!II) { 708479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor II = &Reader.getIdentifierTable().getOwn(k); 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei KnownII = II; 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.SetIdentifierInfo(ID, II); 712f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (!II->isFromAST()) { 713f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor bool WasInteresting = isInterestingIdentifier(*II); 714f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setIsFromAST(); 715f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (WasInteresting) 716f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setChangedSinceDeserialization(); 717f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor } 718f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor Reader.markIdentifierUpToDate(II); 7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return II; 7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool CPlusPlusOperatorKeyword = Bits & 0x01; 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasRevertedTokenIDToIdentifier = Bits & 0x01; 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Poisoned = Bits & 0x01; 7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool ExtensionToken = Bits & 0x01; 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 7329317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis bool hasSubmoduleMacros = Bits & 0x01; 7339317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Bits >>= 1; 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hadMacroDefinition = Bits & 0x01; 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Bits == 0 && "Extra bits in the identifier?"); 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DataLen -= 8; 7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the IdentifierInfo itself and link the identifier ID with 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the new IdentifierInfo. 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = KnownII; 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!II) { 744479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor II = &Reader.getIdentifierTable().getOwn(StringRef(k)); 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei KnownII = II; 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.markIdentifierUpToDate(II); 748f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (!II->isFromAST()) { 749f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor bool WasInteresting = isInterestingIdentifier(*II); 750f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setIsFromAST(); 751f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (WasInteresting) 752f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setChangedSinceDeserialization(); 753f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor } 7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set or check the various bits in the IdentifierInfo structure. 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Token IDs are read-only. 7571ebefc72e80cc880be376a8704e6936d2746cb35Argyrios Kyrtzidis if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->RevertTokenIDToIdentifier(); 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->setObjCOrBuiltinID(ObjCOrBuiltinID); 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(II->isExtensionToken() == ExtensionToken && 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Incorrect extension token flag"); 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void)ExtensionToken; 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Poisoned) 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->setIsPoisoned(true); 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Incorrect C++ operator keyword flag"); 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void)CPlusPlusOperatorKeyword; 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this identifier is a macro, deserialize the macro 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // definition. 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (hadMacroDefinition) { 772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t MacroDirectivesOffset = 773651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(d); 7749317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis DataLen -= 4; 7759317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis SmallVector<uint32_t, 8> LocalMacroIDs; 7769317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (hasSubmoduleMacros) { 777651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines while (uint32_t LocalMacroID = 778651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(d)) { 7799317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis DataLen -= 4; 7809317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis LocalMacroIDs.push_back(LocalMacroID); 7819317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 782dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis DataLen -= 4; 783dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis } 7849317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 7859317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (F.Kind == MK_Module) { 786651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Macro definitions are stored from newest to oldest, so reverse them 787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // before registering them. 788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::SmallVector<unsigned, 8> MacroSizes; 7899317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis for (SmallVectorImpl<uint32_t>::iterator 790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) { 791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Size = 1; 792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const uint32_t HasOverridesFlag = 0x80000000U; 794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (I + 1 != E && (I[1] & HasOverridesFlag)) 795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Size += 1 + (I[1] & ~HasOverridesFlag); 796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MacroSizes.push_back(Size); 798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I += Size; 7999317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 801651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end(); 802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(), 803651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SE = MacroSizes.rend(); 804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SI != SE; ++SI) { 805651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I -= *SI; 806651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t LocalMacroID = *I; 808ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ArrayRef<uint32_t> Overrides; 809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (*SI != 1) 810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Overrides = llvm::makeArrayRef(&I[2], *SI - 2); 811651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides); 812651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 813651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(I == LocalMacroIDs.begin()); 8149317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } else { 8159317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset); 8169317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 8177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.SetIdentifierInfo(ID, II); 8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read all of the declarations visible at global scope with this 8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // name. 8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DataLen > 0) { 8247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<uint32_t, 4> DeclIDs; 8257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; DataLen > 0; DataLen -= 4) 826651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DeclIDs.push_back(Reader.getGlobalDeclID( 827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d))); 8287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.SetGloballyVisibleDecls(II, DeclIDs); 8297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return II; 8327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned 8357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const { 8367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::FoldingSetNodeID ID; 8377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddInteger(Key.Kind); 8387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Key.Kind) { 8407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 8417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 8427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddString(((IdentifierInfo*)Key.Data)->getName()); 8437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 8457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 8467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 8477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddInteger(serialization::ComputeHash(Selector(Key.Data))); 8487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 8507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddInteger((OverloadedOperatorKind)Key.Data); 8517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 8537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 8547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 8557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 8567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ID.ComputeHash(); 8607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::internal_key_type 8637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::GetInternalKey( 8647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const external_key_type& Name) const { 8657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclNameKey Key; 8667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Kind = Name.getNameKind(); 8677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Name.getNameKind()) { 8687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 8697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Name.getAsIdentifierInfo(); 8707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 8727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 8737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 8747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 8757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 8777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = Name.getCXXOverloadedOperator(); 8787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 8807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Name.getCXXLiteralIdentifier(); 8817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 8837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 8847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 8857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 8867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = 0; 8877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Key; 8917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 8947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 8987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(KeyLen, DataLen); 8997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::internal_key_type 9027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) { 903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 9047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclNameKey Key; 9067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Kind = (DeclarationName::NameKind)*d++; 9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Key.Kind) { 9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Key.Data = (uint64_t)Reader.getLocalIdentifier( 910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d)); 9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = 916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (uint64_t)Reader.getLocalSelector( 917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>( 918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines d)).getAsOpaquePtr(); 9197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 9217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = *d++; // OverloadedOperatorKind 9227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Key.Data = (uint64_t)Reader.getLocalIdentifier( 925651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F, endian::readNext<uint32_t, little, unaligned>(d)); 9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 9287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 9307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 9317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = 0; 9327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Key; 9367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::data_type 9397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ReadData(internal_key_type, 9407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char* d, 9417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d); 944e8b61cfc0c9233b6983ad9ed052900800e7613d9Argyrios Kyrtzidis LE32DeclID *Start = reinterpret_cast<LE32DeclID *>( 945e8b61cfc0c9233b6983ad9ed052900800e7613d9Argyrios Kyrtzidis const_cast<unsigned char *>(d)); 9467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(Start, Start + NumDecls); 9477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadDeclContextStorage(ModuleFile &M, 9508f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor, 9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::pair<uint64_t, uint64_t> &Offsets, 9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextInfo &Info) { 9537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 9547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First the lexical decls. 9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Offsets.first != 0) { 9567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Offsets.first); 9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 959b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 9607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 961b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != DECL_CONTEXT_LEXICAL) { 9637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Expected lexical block"); 9647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 967b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data()); 968b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair); 9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Now the lookup table. 9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Offsets.second != 0) { 9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Offsets.second); 9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 976b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 978b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 9797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != DECL_CONTEXT_VISIBLE) { 9807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Expected visible lookup table block"); 9817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 9827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create( 9846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)Blob.data() + Record[0], 9856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)Blob.data() + sizeof(uint32_t), 9866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)Blob.data(), 9876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ASTDeclContextNameLookupTrait(*this, M)); 9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 9927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::Error(StringRef Msg) { 9947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error(diag::err_fe_pch_malformed, Msg); 995c1478618363083486679fc8325b88fc30bd5aac7Douglas Gregor if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) { 996c1478618363083486679fc8325b88fc30bd5aac7Douglas Gregor Diag(diag::note_module_cache_path) 997c1478618363083486679fc8325b88fc30bd5aac7Douglas Gregor << PP.getHeaderSearchInfo().getModuleCachePath(); 998c1478618363083486679fc8325b88fc30bd5aac7Douglas Gregor } 9997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::Error(unsigned DiagID, 10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Arg1, StringRef Arg2) { 10037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags.isDiagnosticInFlight()) 10047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2); 10057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 10067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(DiagID) << Arg1 << Arg2; 10077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 10107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Source Manager Deserialization 10117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 10127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read the line table in the source manager block. 10147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if there was an error. 10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseLineTable(ModuleFile &F, 10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<uint64_t> &Record) { 10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 10187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineTableInfo &LineTable = SourceMgr.getLineTable(); 10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Parse the file names 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::map<int, int> FileIDs; 10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (int I = 0, N = Record[Idx++]; I != N; ++I) { 10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Extract the file name 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FilenameLen = Record[Idx++]; 10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen); 10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += FilenameLen; 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MaybeAddSystemRootToFilename(F, Filename); 10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Parse the line entries 10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::vector<LineEntry> Entries; 10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Idx < Record.size()) { 10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int FID = Record[Idx++]; 10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(FID >= 0 && "Serialized line entries for non-local file."); 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Remap FileID from 1-based old view. 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FID += F.SLocEntryBaseID - 1; 10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Extract the line entries 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumEntries = Record[Idx++]; 10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(NumEntries && "Numentries is 00000"); 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Entries.clear(); 10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Entries.reserve(NumEntries); 10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumEntries; ++I) { 10457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FileOffset = Record[Idx++]; 10467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = Record[Idx++]; 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int FilenameID = FileIDs[Record[Idx++]]; 10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::CharacteristicKind FileKind 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (SrcMgr::CharacteristicKind)Record[Idx++]; 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IncludeOffset = Record[Idx++]; 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileKind, IncludeOffset)); 10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineTable.AddEntry(FileID::get(FID), Entries); 10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a source manager block 10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace SrcMgr; 10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10648f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 10657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set the source-location entry cursor to the current position in 10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the stream. This cursor will be used to read the contents of the 10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // source manager block initially, and then lazily read 10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // source-location entries as needed. 10707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocEntryCursor = F.Stream; 10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The stream itself is going to skip over the source manager block. 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.Stream.SkipBlock()) { 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Enter the source manager block. 10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed source manager block record in AST file"); 10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 10827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 108688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks(); 108788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 108888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (E.Kind) { 108988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 109088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 109188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 109288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return true; 109388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::EndBlock: 10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 109588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 109688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // The interesting case. 109788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 109988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 1102125eb3e3b6cc2f3e7b2e0e04e59c924f936520f5Chris Lattner StringRef Blob; 1103125eb3e3b6cc2f3e7b2e0e04e59c924f936520f5Chris Lattner switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) { 11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: // Default behavior: ignore. 11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_FILE_ENTRY: 11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_BUFFER_ENTRY: 11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_EXPANSION_ENTRY: 11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Once we hit one of the source location entries, we're done. 11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief If a header file is not found at the path that we expect it to be 11177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and the PCH file was moved from its original location, try to resolve the 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// file by assuming that header+PCH were moved together and the header is in 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the same place relative to the PCH. 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic std::string 11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiresolveFileRelativeToOriginalDir(const std::string &Filename, 11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &OriginalDir, 11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &CurrDir) { 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(OriginalDir != CurrDir && 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "No point trying to resolve the file if the PCH dir didn't change"); 11267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace llvm::sys; 11277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<128> filePath(Filename); 11287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fs::make_absolute(filePath); 11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(path::is_absolute(OriginalDir)); 11307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<128> currPCHPath(CurrDir); 11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fileDirE = path::end(path::parent_path(filePath)); 11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::const_iterator origDirI = path::begin(OriginalDir), 11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei origDirE = path::end(OriginalDir); 11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Skip the common path components from filePath and OriginalDir. 11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (fileDirI != fileDirE && origDirI != origDirE && 11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *fileDirI == *origDirI) { 11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++fileDirI; 11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++origDirI; 11417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; origDirI != origDirE; ++origDirI) 11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::append(currPCHPath, ".."); 11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::append(currPCHPath, fileDirI, fileDirE); 11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::append(currPCHPath, path::filename(Filename)); 11467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return currPCHPath.str(); 11477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadSLocEntry(int ID) { 11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("source location entry ID out-of-range for AST file"); 11557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]); 11608f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BaseOffset = F->SLocEntryBaseOffset; 11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumSLocEntriesRead; 116488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry Entry = SLocEntryCursor.advance(); 116588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) { 11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrectly-formatted source location entry in AST file"); 11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 11687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 116988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 1171b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 1172b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) { 11737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrectly-formatted source location entry in AST file"); 11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_FILE_ENTRY: { 11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will detect whether a file changed and return 'Failure' for it, but 11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // we will also try to fail gracefully by setting up the SLocEntry. 11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned InputID = Record[4]; 11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InputFile IF = getInputFile(*F, InputID); 11828504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis const FileEntry *File = IF.getFile(); 11838504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis bool OverriddenBuffer = IF.isOverridden(); 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11858504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis // Note that we only check if a File was returned. If it was out-of-date 11868504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis // we have complained but we will continue creating a FileID to recover 11878504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis // gracefully. 11888504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis if (!File) 11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 11927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 11937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This is the module's main file. 11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IncludeLoc = getImportLocation(F); 11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::CharacteristicKind 11977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 11987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter, 11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID, BaseOffset + Record[0]); 12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::FileInfo &FileInfo = 12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileInfo.NumCreatedFIDs = Record[5]; 12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[3]) 12047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileInfo.setHasLineDirectives(); 12057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumFileDecls = Record[7]; 12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumFileDecls) { 12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 12107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 12117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumFileDecls)); 12127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const SrcMgr::ContentCache *ContentCache 12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceMgr.getOrCreateContentCache(File, 12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*isSystemFile=*/FileCharacter != SrcMgr::C_User); 12177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (OverriddenBuffer && !ContentCache->BufferOverridden && 12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContentCache->ContentsEntry == ContentCache->OrigEntry) { 12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = SLocEntryCursor.ReadCode(); 12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 1221b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob); 12227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != SM_SLOC_BUFFER_BLOB) { 12247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("AST record has invalid code"); 12257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 12267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MemoryBuffer *Buffer 1229b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName()); 12307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.overrideFileContents(File, Buffer); 12317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_BUFFER_ENTRY: { 1237b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const char *Name = Blob.data(); 12387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Offset = Record[0]; 12397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::CharacteristicKind 12407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 12417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 12427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IncludeLoc.isInvalid() && F->Kind == MK_Module) { 12437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IncludeLoc = getImportLocation(F); 12447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = SLocEntryCursor.ReadCode(); 12467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 12477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RecCode 1248b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = SLocEntryCursor.readRecord(Code, Record, &Blob); 12497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != SM_SLOC_BUFFER_BLOB) { 12517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("AST record has invalid code"); 12527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 12537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MemoryBuffer *Buffer 1256b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name); 12576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceMgr.createFileID(Buffer, FileCharacter, ID, BaseOffset + Offset, 12586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IncludeLoc); 12597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_EXPANSION_ENTRY: { 12637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 12647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.createExpansionLoc(SpellingLoc, 12657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(*F, Record[2]), 12667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(*F, Record[3]), 12677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[4], 12687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID, 12697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset + Record[0]); 12707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 12757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 12787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 12797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(SourceLocation(), ""); 12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("source location entry ID out-of-range for AST file"); 12837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(SourceLocation(), ""); 12847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Find which module file this entry lands in. 12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 12887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M->Kind != MK_Module) 12897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(SourceLocation(), ""); 12907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Can we map this down to a particular submodule? That would be 12927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ideal. 12936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Find the location where the module F is imported. 12977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSourceLocation ASTReader::getImportLocation(ModuleFile *F) { 12987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F->ImportLoc.isValid()) 12997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F->ImportLoc; 13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise we have a PCH. It's considered to be "imported" at the first 13027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // location of its includer. 13037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 13046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Main file is the importer. 13056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file"); 13066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 13076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 13087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F->ImportedBy[0]->FirstLoc; 13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the 13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// specified cursor. Read the abbreviations that are at the top of the block 13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and then leave the cursor pointing into the block. 13148f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattnerbool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) { 13157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Cursor.EnterSubBlock(BlockID)) { 13167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Offset = Cursor.GetCurrentBitNo(); 13227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 13237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We expect all abbrevs to be at the start of the block. 13257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Code != llvm::bitc::DEFINE_ABBREV) { 13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Offset); 13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 13287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.ReadAbbrevRecord(); 13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1333ac32d9044b9c1e7492cef929a322d23ce899d276Richard SmithToken ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1334aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall unsigned &Idx) { 1335aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Token Tok; 1336aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Tok.startToken(); 1337aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1338aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Tok.setLength(Record[Idx++]); 1339aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1340aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Tok.setIdentifierInfo(II); 1341aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Tok.setKind((tok::TokenKind)Record[Idx++]); 1342aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1343aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall return Tok; 1344aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall} 1345aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall 13469317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios KyrtzidisMacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 13478f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.MacroCursor; 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Keep track of where we are in the stream, then jump back there 13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // after reading this macro. 13517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Stream); 13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.JumpToBit(Offset); 13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<IdentifierInfo*, 16> MacroArgs; 13566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MacroInfo *Macro = nullptr; 13577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 135999a5af0088b6340540912921cd0008ac75051a33Chris Lattner // Advance to the next record, but if we get to the end of the block, don't 136099a5af0088b6340540912921cd0008ac75051a33Chris Lattner // pop it (removing all the abbreviations from the cursor) since we want to 136199a5af0088b6340540912921cd0008ac75051a33Chris Lattner // be able to reseek within the block and read entries. 13628f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 136399a5af0088b6340540912921cd0008ac75051a33Chris Lattner llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags); 136499a5af0088b6340540912921cd0008ac75051a33Chris Lattner 136599a5af0088b6340540912921cd0008ac75051a33Chris Lattner switch (Entry.Kind) { 136699a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 136799a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Error: 136899a5af0088b6340540912921cd0008ac75051a33Chris Lattner Error("malformed block record in AST file"); 13699317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return Macro; 137099a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::EndBlock: 13719317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return Macro; 137299a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Record: 137399a5af0088b6340540912921cd0008ac75051a33Chris Lattner // The interesting case. 137499a5af0088b6340540912921cd0008ac75051a33Chris Lattner break; 13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 13787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 13797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessorRecordTypes RecType = 1380b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record); 13817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (RecType) { 13829317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis case PP_MACRO_DIRECTIVE_HISTORY: 13839317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return Macro; 13849317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 13857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_MACRO_OBJECT_LIKE: 13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_MACRO_FUNCTION_LIKE: { 13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we already have a macro, that means that we've hit the end 13887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // of the definition of the macro we were looking for. We're 13897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // done. 13907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Macro) 13919317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return Macro; 13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13939317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis unsigned NextIndex = 1; // Skip identifier ID. 13949317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]); 13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 13969317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID); 13978169b671974fc15b6059b1e9532f7f3207d79786Argyrios Kyrtzidis MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setIsUsed(Record[NextIndex++]); 13996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MI->setUsedForHeaderGuard(Record[NextIndex++]); 14007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecType == PP_MACRO_FUNCTION_LIKE) { 14027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Decode function-like macro info. 14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isC99VarArgs = Record[NextIndex++]; 14047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isGNUVarArgs = Record[NextIndex++]; 14057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hasCommaPasting = Record[NextIndex++]; 14067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroArgs.clear(); 14077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = Record[NextIndex++]; 14087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0; i != NumArgs; ++i) 14097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++])); 14107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Install function-like macro info. 14127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setIsFunctionLike(); 14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isC99VarArgs) MI->setIsC99Varargs(); 14147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isGNUVarArgs) MI->setIsGNUVarargs(); 14157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (hasCommaPasting) MI->setHasCommaPasting(); 14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setArgumentList(MacroArgs.data(), MacroArgs.size(), 14177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getPreprocessorAllocator()); 14187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Remember that we saw this macro last so that we add the tokens that 14217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // form its body to it. 14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macro = MI; 14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[NextIndex]) { 14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We have a macro definition. Register the association 14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID 14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 14297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 14300b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis PreprocessingRecord::PPEntityID 14310b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true); 14320b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis MacroDefinition *PPDef = 14330b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID)); 14340b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis if (PPDef) 14350b849d34b3a9574615e98e108db4e8099e9032e0Argyrios Kyrtzidis PPRec.RegisterMacroDefinition(Macro, PPDef); 14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumMacrosRead; 14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 14407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_TOKEN: { 14437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we see a TOKEN before a PP_MACRO_*, then the file is 14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // erroneous, just pretend we didn't see this. 14456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Macro) break; 14467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1447aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall unsigned Idx = 0; 1448aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall Token Tok = ReadToken(F, Record, Idx); 14497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macro->AddTokenToBody(Tok); 14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntityID 14577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const { 14587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::const_iterator 14597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 14607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.PreprocessedEntityRemap.end() 14617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into preprocessed entity index remap"); 14627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 14647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1466ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidisunsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1467ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis return llvm::hash_combine(ikey.Size, ikey.ModTime); 14687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::internal_key_type 1471ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios KyrtzidisHeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1472ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis internal_key_type ikey = { FE->getSize(), FE->getModificationTime(), 1473ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis FE->getName() }; 1474ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis return ikey; 1475ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis} 14767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1477ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidisbool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1478ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis if (a.Size != b.Size || a.ModTime != b.ModTime) 14797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 14807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1481ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis if (strcmp(a.Filename, b.Filename) == 0) 1482ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis return true; 1483ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis 14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Determine whether the actual files are equivalent. 14851c1508b37bc2a9419b2e22beef9e788eb74203f4Argyrios Kyrtzidis FileManager &FileMgr = Reader.getFileManager(); 1486ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis const FileEntry *FEA = FileMgr.getFile(a.Filename); 1487ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis const FileEntry *FEB = FileMgr.getFile(b.Filename); 14881c1508b37bc2a9419b2e22beef9e788eb74203f4Argyrios Kyrtzidis return (FEA && FEA == FEB); 14897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 14927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 1494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d); 14957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen = (unsigned) *d++; 1496ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis return std::make_pair(KeyLen, DataLen); 14977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1498ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis 1499ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios KyrtzidisHeaderFileInfoTrait::internal_key_type 1500ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios KyrtzidisHeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 1502ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis internal_key_type ikey; 1503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1505ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis ikey.Filename = (const char *)d; 1506ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis return ikey; 1507ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis} 1508ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis 15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::data_type 151055ea75bf61a5d76f6453513d937944ce68181c6aArgyrios KyrtzidisHeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char *End = d + DataLen; 1513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfo HFI; 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = *d++; 1516bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole> 1517bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl ((Flags >> 6) & 0x03); 15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.isImport = (Flags >> 5) & 0x01; 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.isPragmaOnce = (Flags >> 4) & 0x01; 15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.DirInfo = (Flags >> 2) & 0x03; 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.Resolved = (Flags >> 1) & 0x01; 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.IndexHeaderMapHeader = Flags & 0x01; 1523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d); 1524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines M, endian::readNext<uint32_t, little, unaligned>(d)); 1526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (unsigned FrameworkOffset = 1527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(d)) { 15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The framework offset is 1 greater than the actual offset, 15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since 0 is used as an indicator for "no framework name". 15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 153455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis if (d != End) { 1535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 153655ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis if (LocalSMID) { 153755ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // This header is part of a module. Associate it with the module to enable 153855ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // implicit module import. 153955ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 154055ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis Module *Mod = Reader.getSubmodule(GlobalSMID); 154155ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis HFI.isModuleHeader = true; 154255ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis FileManager &FileMgr = Reader.getFileManager(); 154355ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis ModuleMap &ModMap = 154455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1545bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole()); 154655ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis } 154755ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis } 154855ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(End == d && "Wrong data length in HeaderFileInfo deserialization"); 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void)End; 15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This HeaderFileInfo was externally loaded. 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.External = true; 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return HFI; 15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid 1558651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M, 1559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GlobalMacroID GMacID, 1560ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ArrayRef<SubmoduleID> Overrides) { 15619317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 15626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SubmoduleID *OverrideData = nullptr; 1563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Overrides.empty()) { 1564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OverrideData = new (Context) SubmoduleID[Overrides.size() + 1]; 1565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OverrideData[0] = Overrides.size(); 1566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0; I != Overrides.size(); ++I) 1567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]); 1568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData)); 15709317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis} 15719317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 15729317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidisvoid ASTReader::addPendingMacroFromPCH(IdentifierInfo *II, 15739317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis ModuleFile *M, 15749317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis uint64_t MacroDirectivesOffset) { 15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 15769317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDefinedMacros() { 15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading defined macros. 15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing Macros(this); 15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleReverseIterator I = ModuleMgr.rbegin(), 15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ModuleMgr.rend(); I != E; ++I) { 15858f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &MacroCursor = (*I)->MacroCursor; 15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there was no preprocessor block, skip this file. 15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!MacroCursor.getBitStreamReader()) 15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15918f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor Cursor = MacroCursor; 15927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit((*I)->MacroStartOffset); 15937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 159688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks(); 159788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 159888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (E.Kind) { 159988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 160088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 160188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 160288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return; 160388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::EndBlock: 160488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner goto NextCursor; 160588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 160688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 160788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Record.clear(); 1608b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch (Cursor.readRecord(E.ID, Record)) { 160988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner default: // Default behavior: ignore. 161088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 161188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 161288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case PP_MACRO_OBJECT_LIKE: 161388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case PP_MACRO_FUNCTION_LIKE: 161488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner getLocalIdentifier(**I, Record[0]); 161588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 161688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 161788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case PP_TOKEN: 161888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // Ignore tokens. 161988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 16207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 162488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner NextCursor: ; 16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Visitor class used to look up identifirs in an AST file. 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class IdentifierLookupVisitor { 16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration; 1633e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookups; 1634e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookupHits; 16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *Found; 1636e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor 16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 1638e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 1639e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookups, 1640e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookupHits) 1641188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor : Name(Name), PriorGeneration(PriorGeneration), 1642e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookups(NumIdentifierLookups), 1643e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits(NumIdentifierLookupHits), 1644e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor Found() 1645e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor { 1646e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor } 16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 16497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierLookupVisitor *This 16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<IdentifierLookupVisitor *>(UserData); 16517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already searched this module file, skip it now. 16537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M.Generation <= This->PriorGeneration) 16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 16551a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable *IdTable 16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IdTable) 16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), 16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M, This->Found); 1663e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor ++This->NumIdentifierLookups; 1664e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait); 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == IdTable->end()) 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Dereferencing the iterator has the effect of building the 16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // IdentifierInfo node and populating it with the various 16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declarations it needs. 1671e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor ++This->NumIdentifierLookupHits; 16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Found = *Pos; 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // \brief Retrieve the identifier info found within the module 16777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // files. 16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *getIdentifierInfo() const { return Found; } 16797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 16807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 16837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading an identifier. 16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing AnIdentifier(this); 16857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration = 0; 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (getContext().getLangOpts().Modules) 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PriorGeneration = IdentifierGeneration[&II]; 16891a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 16901a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // If there is a global index, look there first to determine which modules 16911a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // provably do not have any results for this identifier. 1692188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor GlobalModuleIndex::HitSet Hits; 16936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalModuleIndex::HitSet *HitsPtr = nullptr; 16941a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (!loadGlobalIndex()) { 1695188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 1696188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor HitsPtr = &Hits; 16971a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 16981a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 16991a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 1700188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 1701e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookups, 1702e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits); 1703188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei markIdentifierUpToDate(&II); 17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!II) 17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->setOutOfDate(false); 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update the generation for this identifier. 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (getContext().getLangOpts().Modules) 17156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierGeneration[II] = getGeneration(); 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct ASTReader::ModuleMacroInfo { 1719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SubmoduleID SubModID; 1720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MacroInfo *MI; 1721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SubmoduleID *Overrides; 1722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Remove this. 1723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ModuleFile *F; 1724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isDefine() const { return MI; } 1726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SubmoduleID getSubmoduleID() const { return SubModID; } 1728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1729ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ArrayRef<SubmoduleID> getOverriddenSubmodules() const { 1730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Overrides) 1731ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return None; 1732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return llvm::makeArrayRef(Overrides + 1, *Overrides); 1733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefMacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const { 1736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MI) 17376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return PP.AllocateDefMacroDirective(MI, ImportLoc, /*isImported=*/true); 1739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1740651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 1741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1742651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesASTReader::ModuleMacroInfo * 1743651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) { 1744651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ModuleMacroInfo Info; 1745651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1746651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t ID = PMInfo.ModuleMacroData.MacID; 1747651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ID & 1) { 1748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Macro undefinition. 1749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1); 17506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Info.MI = nullptr; 1751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Macro definition. 1753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1); 1754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(GMacID); 1755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If this macro has already been loaded, don't do so again. 1757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is highly dubious. Multiple macro definitions can have the 1758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc. 1759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS]) 17606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Info.MI = getMacro(GMacID); 1763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Info.SubModID = Info.MI->getOwningModuleID(); 1764651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Info.Overrides = PMInfo.ModuleMacroData.Overrides; 1766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Info.F = PMInfo.M; 1767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (Context) ModuleMacroInfo(Info); 1769651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 17719317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidisvoid ASTReader::resolvePendingMacro(IdentifierInfo *II, 17729317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis const PendingMacroInfo &PMInfo) { 17739317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis assert(II); 17749317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 17759317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (PMInfo.M->Kind != MK_Module) { 17769317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis installPCHMacroDirectives(II, *PMInfo.M, 17779317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis PMInfo.PCHMacroData.MacroDirectivesOffset); 17789317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return; 17799317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 17809317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 1781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Module Macro. 17829317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 1783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ModuleMacroInfo *MMI = getModuleMacro(PMInfo); 1784651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MMI) 17859317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return; 17869317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 1787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Module *Owner = getSubmodule(MMI->getSubmoduleID()); 1788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Owner && Owner->NameVisibility == Module::Hidden) { 1789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Macros in the owning module are hidden. Just remember this macro to 1790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // install if we make this module visible. 1791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI)); 1792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines installImportedMacro(II, MMI, Owner); 17949317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 17959317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis} 17969317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 17979317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidisvoid ASTReader::installPCHMacroDirectives(IdentifierInfo *II, 17989317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis ModuleFile &M, uint64_t Offset) { 17999317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis assert(M.Kind != MK_Module); 18009317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 18019317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis BitstreamCursor &Cursor = M.MacroCursor; 18029317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis SavedStreamPosition SavedPosition(Cursor); 18039317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Cursor.JumpToBit(Offset); 18049317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 18059317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis llvm::BitstreamEntry Entry = 18069317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 18079317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (Entry.Kind != llvm::BitstreamEntry::Record) { 18089317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Error("malformed block record in AST file"); 18099317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return; 18109317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 18119317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 18129317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis RecordData Record; 18139317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis PreprocessorRecordTypes RecType = 18149317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record); 18159317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (RecType != PP_MACRO_DIRECTIVE_HISTORY) { 18169317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Error("malformed block record in AST file"); 18179317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis return; 18189317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 18199317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 18209317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Deserialize the macro directives history in reverse source-order. 18216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MacroDirective *Latest = nullptr, *Earliest = nullptr; 18229317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis unsigned Idx = 0, N = Record.size(); 18239317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis while (Idx < N) { 18246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MacroDirective *MD = nullptr; 18259317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 1826c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 1827c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis switch (K) { 1828c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis case MacroDirective::MD_Define: { 1829c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]); 1830c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MacroInfo *MI = getMacro(GMacID); 1831c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isImported = Record[Idx++]; 1832c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isAmbiguous = Record[Idx++]; 1833c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis DefMacroDirective *DefMD = 1834c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.AllocateDefMacroDirective(MI, Loc, isImported); 1835c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis DefMD->setAmbiguous(isAmbiguous); 1836c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MD = DefMD; 1837c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis break; 1838c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 1839c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis case MacroDirective::MD_Undefine: 1840c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MD = PP.AllocateUndefMacroDirective(Loc); 1841c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis break; 1842c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis case MacroDirective::MD_Visibility: { 1843c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis bool isPublic = Record[Idx++]; 1844c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 1845c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis break; 1846c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 1847c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 18489317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 18499317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (!Latest) 18509317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Latest = MD; 18519317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (Earliest) 18529317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Earliest->setPrevious(MD); 18539317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis Earliest = MD; 18549317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 18559317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 18569317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis PP.setLoadedMacroDirective(II, Latest); 18579317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis} 18589317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 185952151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis/// \brief For the given macro definitions, check if they are both in system 18607332ae49671762239c9986c8f30f291c3a13d27eDouglas Gregor/// modules. 18617332ae49671762239c9986c8f30f291c3a13d27eDouglas Gregorstatic bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI, 1862f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor Module *NewOwner, ASTReader &Reader) { 186352151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis assert(PrevMI && NewMI); 18646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Module *PrevOwner = nullptr; 186552151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis if (SubmoduleID PrevModID = PrevMI->getOwningModuleID()) 186652151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis PrevOwner = Reader.getSubmodule(PrevModID); 1867f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor SourceManager &SrcMgr = Reader.getSourceManager(); 1868f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor bool PrevInSystem 1869f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor = PrevOwner? PrevOwner->IsSystem 1870f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc()); 1871f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor bool NewInSystem 1872f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor = NewOwner? NewOwner->IsSystem 1873f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc()); 1874f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor if (PrevOwner && PrevOwner == NewOwner) 187552151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis return false; 1876f9dbae754bba75df78b8e73ab35d04134c1fed17Douglas Gregor return PrevInSystem && NewInSystem; 187752151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis} 187852151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis 1879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTReader::removeOverriddenMacros(IdentifierInfo *II, 1880651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AmbiguousMacros &Ambig, 1881ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ArrayRef<SubmoduleID> Overrides) { 1882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) { 1883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SubmoduleID OwnerID = Overrides[OI]; 1884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If this macro is not yet visible, remove it from the hidden names list. 1886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Module *Owner = getSubmodule(OwnerID); 1887651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HiddenNames &Hidden = HiddenNamesMap[Owner]; 1888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II); 1889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (HI != Hidden.HiddenMacros.end()) { 1890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto SubOverrides = HI->second->getOverriddenSubmodules(); 1891651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Hidden.HiddenMacros.erase(HI); 1892651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines removeOverriddenMacros(II, Ambig, SubOverrides); 1893651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 18949317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 1895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If this macro is already in our list of conflicts, remove it from there. 1896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ambig.erase( 1897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) { 1898651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return MD->getInfo()->getOwningModuleID() == OwnerID; 1899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }), 1900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ambig.end()); 1901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1904651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesASTReader::AmbiguousMacros * 1905651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesASTReader::removeOverriddenMacros(IdentifierInfo *II, 1906ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ArrayRef<SubmoduleID> Overrides) { 19079317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacroDirective *Prev = PP.getMacroDirective(II); 1908651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Prev && Overrides.empty()) 19096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 19116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective() 19126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr; 1913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (PrevDef && PrevDef->isAmbiguous()) { 1914651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We had a prior ambiguity. Check whether we resolve it (or make it worse). 1915651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AmbiguousMacros &Ambig = AmbiguousMacroDefs[II]; 1916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ambig.push_back(PrevDef); 1917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines removeOverriddenMacros(II, Ambig, Overrides); 1919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1920651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Ambig.empty()) 1921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return &Ambig; 1922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AmbiguousMacroDefs.erase(II); 1924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1925651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // There's no ambiguity yet. Maybe we're introducing one. 19266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AmbiguousMacros Ambig; 1927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (PrevDef) 1928651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ambig.push_back(PrevDef); 1929651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1930651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines removeOverriddenMacros(II, Ambig, Overrides); 1931651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Ambig.empty()) { 1933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AmbiguousMacros &Result = AmbiguousMacroDefs[II]; 19346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::swap(Result, Ambig); 1935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return &Result; 1936c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis } 19379317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 1938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We ended up with no ambiguity. 19406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1941651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI, 1944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Module *Owner) { 1945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(II && Owner); 1946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation ImportLoc = Owner->MacroVisibilityLoc; 1948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ImportLoc.isInvalid()) { 1949651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: If we made macros from this module visible but didn't provide a 1950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // source location for the import, we don't have a location for the macro. 1951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Use the location at which the containing module file was first imported 1952651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // for now. 1953651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ImportLoc = MMI->F->DirectImportLoc; 1954651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(ImportLoc.isValid() && "no import location for a visible macro?"); 1955651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1956651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 19576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AmbiguousMacros *Prev = 1958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines removeOverriddenMacros(II, MMI->getOverriddenSubmodules()); 1959651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1960651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Create a synthetic macro definition corresponding to the import (or null 1961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // if this was an undefinition of the macro). 1962651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DefMacroDirective *MD = MMI->import(PP, ImportLoc); 1963651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1964651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If there's no ambiguity, just install the macro. 1965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Prev) { 1966651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (MD) 1967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PP.appendMacroDirective(II, MD); 1968651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 1969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PP.appendMacroDirective(II, PP.AllocateUndefMacroDirective(ImportLoc)); 1970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 1971651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(!Prev->empty()); 1973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MD) { 1975651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We imported a #undef that didn't remove all prior definitions. The most 1976651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // recent prior definition remains, and we install it in the place of the 1977651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // imported directive. 1978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MacroInfo *NewMI = Prev->back()->getInfo(); 1979651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Prev->pop_back(); 1980651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc, /*Imported*/true); 1981651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1982651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1983651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We're introducing a macro definition that creates or adds to an ambiguity. 1984651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We can resolve that ambiguity if this macro is token-for-token identical to 1985651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // all of the existing definitions. 1986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MacroInfo *NewMI = MD->getInfo(); 1987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(NewMI && "macro definition with no MacroInfo?"); 1988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines while (!Prev->empty()) { 1989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MacroInfo *PrevMI = Prev->back()->getInfo(); 1990651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(PrevMI && "macro definition with no MacroInfo?"); 1991651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Before marking the macros as ambiguous, check if this is a case where 1993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // both macros are in system headers. If so, we trust that the system 1994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // did not get it wrong. This also handles cases where Clang's own 1995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // headers have a different spelling of certain system macros: 1996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // #define LONG_MAX __LONG_MAX__ (clang's limits.h) 1997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h) 1998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // 1999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Remove the defined-in-system-headers check. clang's limits.h 2000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // overrides the system limits.h's macros, so there's no conflict here. 2001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (NewMI != PrevMI && 2002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) && 2003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this)) 2004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // The previous definition is the same as this one (or both are defined in 2007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // system modules so we can assume they're equivalent); we don't need to 2008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // track it any more. 2009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Prev->pop_back(); 2010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2012651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Prev->empty()) 2013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MD->setAmbiguous(true); 2014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2015c56fff7fd231aebf4b152f60f8f11ef91835c48aArgyrios Kyrtzidis PP.appendMacroDirective(II, MD); 20169317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis} 20179317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 2018651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesASTReader::InputFileInfo 2019651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Go find this input file. 2021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BitstreamCursor &Cursor = F.InputFilesCursor; 2022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SavedStreamPosition SavedPosition(Cursor); 2023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 2024651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Code = Cursor.ReadCode(); 2026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RecordData Record; 2027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Blob; 2028651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Result = Cursor.readRecord(Code, Record, &Blob); 2030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE && 2031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "invalid record type for input file"); 2032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (void)Result; 2033651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string Filename; 2035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines off_t StoredSize; 2036651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines time_t StoredTime; 2037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Overridden; 2038651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(Record[0] == ID && "Bogus stored ID or offset"); 2040651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StoredSize = static_cast<off_t>(Record[1]); 2041651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StoredTime = static_cast<time_t>(Record[2]); 2042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Overridden = static_cast<bool>(Record[3]); 2043651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Filename = Blob; 2044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MaybeAddSystemRootToFilename(F, Filename); 2045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden }; 2047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return R; 2048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstd::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) { 2051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return readInputFileInfo(F, ID).Filename; 2052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2053651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20548504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios KyrtzidisInputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this ID is bogus, just return an empty input file. 20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0 || ID > F.InputFilesLoaded.size()) 20577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InputFile(); 20587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already loaded this input file, return it. 20608504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis if (F.InputFilesLoaded[ID-1].getFile()) 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F.InputFilesLoaded[ID-1]; 20627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2063651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (F.InputFilesLoaded[ID-1].isNotFound()) 2064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return InputFile(); 2065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Go find this input file. 20678f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor = F.InputFilesCursor; 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 20697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2071651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines InputFileInfo FI = readInputFileInfo(F, ID); 2072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines off_t StoredSize = FI.StoredSize; 2073651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines time_t StoredTime = FI.StoredTime; 2074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Overridden = FI.Overridden; 2075651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Filename = FI.Filename; 2076651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2077651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FileEntry *File 2078651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime) 2079651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : FileMgr.getFile(Filename, /*OpenFile=*/false); 2080651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2081651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we didn't find the file, resolve it relative to the 2082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // original directory from which this AST file was created. 20836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() && 2084651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.OriginalDir != CurrentDir) { 2085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string Resolved = resolveFileRelativeToOriginalDir(Filename, 2086651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.OriginalDir, 2087651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentDir); 2088651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Resolved.empty()) 2089651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines File = FileMgr.getFile(Resolved); 2090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2091651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // For an overridden file, create a virtual file with the stored 2093651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // size/timestamp. 20946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Overridden && File == nullptr) { 2095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 2096651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2097651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (File == nullptr) { 2099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Complain) { 2100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string ErrorStr = "could not find file '"; 2101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ErrorStr += Filename; 2102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ErrorStr += "' referenced by AST file"; 2103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Error(ErrorStr.c_str()); 21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Record that we didn't find the file. 2106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return InputFile(); 2108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Check if there was a request to override the contents of the file 2111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // that was part of the precompiled header. Overridding such a file 2112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // can lead to problems when lexing using the source locations from the 2113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // PCH. 2114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceManager &SM = getSourceManager(); 2115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Overridden && SM.isFileOverridden(File)) { 2116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Complain) 2117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Error(diag::err_fe_pch_file_overridden, Filename); 2118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // After emitting the diagnostic, recover by disabling the override so 2119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // that the original file will be used. 2120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SM.disableFileContentsOverride(File); 2121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // The FileEntry is a virtual file entry with the size of the contents 2122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // that would override the original contents. Set it to the original's 2123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // size/time. 2124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FileMgr.modifyFileEntry(const_cast<FileEntry*>(File), 2125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StoredSize, StoredTime); 2126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsOutOfDate = false; 2129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // For an overridden file, there is nothing to validate. 2131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Overridden && (StoredSize != File->getSize() 21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if !defined(LLVM_ON_WIN32) 2133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // In our regression testing, the Windows file system seems to 2134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // have inconsistent modification times that sometimes 2135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // erroneously trigger this error-handling path. 2136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines || StoredTime != File->getModificationTime() 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif 2138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines )) { 2139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Complain) { 2140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Build a list of the PCH imports that got us here (in reverse). 2141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines while (ImportStack.back()->ImportedBy.size() > 0) 2143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // The top-level PCH is stale. 2146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef TopLevelPCHName(ImportStack.back()->FileName); 2147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName); 2148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Print the import stack. 2150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) { 2151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(diag::note_pch_required_by) 2152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << Filename << ImportStack[0]->FileName; 2153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 1; I < ImportStack.size(); ++I) 2154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(diag::note_pch_required_by) 2155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2156677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 2157677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 2158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Diags.isDiagnosticInFlight()) 2159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 21607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IsOutOfDate = true; 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines InputFile IF = InputFile(File, Overridden, IsOutOfDate); 2166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Note that we've loaded this input file. 2168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.InputFilesLoaded[ID-1] = IF; 2169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return IF; 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiconst FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) { 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = ModuleMgr.getPrimaryModule(); 21747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Filename = filenameStrRef; 21757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MaybeAddSystemRootToFilename(M, Filename); 21767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FileEntry *File = FileMgr.getFile(Filename); 21776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (File == nullptr && !M.OriginalDir.empty() && !CurrentDir.empty() && 21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M.OriginalDir != CurrentDir) { 21797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string resolved = resolveFileRelativeToOriginalDir(Filename, 21807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M.OriginalDir, 21817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentDir); 21827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!resolved.empty()) 21837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File = FileMgr.getFile(resolved); 21847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return File; 21877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief If we are loading a relocatable PCH file, and the filename is 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// not an absolute path, add the system root to the beginning of the file 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// name. 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M, 21937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &Filename) { 21947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is not a relocatable PCH file, there's nothing to do. 21957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!M.RelocatablePCH) 21967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 21977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 22007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isysroot.empty()) { 22027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If no system root was given, default to '/' 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Filename.insert(Filename.begin(), '/'); 22047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 22057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Length = isysroot.size(); 22087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isysroot[Length - 1] != '/') 22097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Filename.insert(Filename.begin(), '/'); 22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end()); 22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ASTReadResult 22157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadControlBlock(ModuleFile &F, 2216cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<ImportedModule> &Loaded, 22176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ModuleFile *ImportedBy, 22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ClientLoadCapabilities) { 22198f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.Stream; 22207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 22227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 22237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 22247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read all of the records and blocks in the control block. 22277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 222888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner while (1) { 222988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry Entry = Stream.advance(); 223088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 223188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.Kind) { 223288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 223388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 223488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return Failure; 2235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::BitstreamEntry::EndBlock: { 2236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Validate input files. 2237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const HeaderSearchOptions &HSOpts = 2238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // All user input files reside at the index range [0, Record[1]), and 2241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // system input files reside at [Record[1], Record[0]). 2242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Record is the one from INPUT_FILE_OFFSETS. 2243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned NumInputs = Record[0]; 2244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned NumUserInputs = Record[1]; 2245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!DisableValidation && 22476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (ValidateSystemInputs || !HSOpts.ModulesValidateOncePerBuildSession || 2248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp)) { 22497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we are reading a module, we will create a verification timestamp, 2252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // so we verify all input files. Otherwise, verify only user input 2253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // files. 2254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned N = NumUserInputs; 2256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ValidateSystemInputs || 2257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (HSOpts.ModulesValidateOncePerBuildSession && F.Kind == MK_Module)) 2258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines N = NumInputs; 2259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0; I < N; ++I) { 22618504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis InputFile IF = getInputFile(F, I+1, Complain); 22628504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis if (!IF.getFile() || IF.isOutOfDate()) 22637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return OutOfDate; 22648504b7b8102a52b2a16231d459fb3cfab4784c38Argyrios Kyrtzidis } 22657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Listener) 2268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Listener->visitModuleFile(F.FileName); 2269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Listener && Listener->needsInputFileVisitation()) { 2271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : NumUserInputs; 2273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0; I < N; ++I) { 2274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsSystem = I >= NumUserInputs; 2275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines InputFileInfo FI = readInputFileInfo(F, I+1); 2276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden); 2277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 2281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 228388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: 228488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.ID) { 22857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case INPUT_FILES_BLOCK_ID: 22867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.InputFilesCursor = Stream; 22877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || // Skip with the main cursor 22887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the abbreviations 22897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 22917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 22927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 229488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 229688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Stream.SkipBlock()) { 229788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 229888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return Failure; 229988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 230088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner continue; 23017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 230288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 230388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 230488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // The interesting case. 230588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read and process a record. 23097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 2310b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 2311b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case METADATA: { 23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0] != VERSION_MAJOR && !DisableValidation) { 23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : diag::err_pch_version_too_new); 23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionMismatch; 23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hasErrors = Record[5]; 23217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 23227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(diag::err_pch_with_compiler_errors); 23237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return HadErrors; 23247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.RelocatablePCH = Record[4]; 23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &CurBranch = getClangFullRepositoryVersion(); 2329b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef ASTBranch = Blob; 23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 23317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionMismatch; 23347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IMPORTS: { 23397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load each of the imported PCH files. 23407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0, N = Record.size(); 23417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Idx < N) { 23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read information about the AST file. 23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 23447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The import location will be the local one for now; we will adjust 23457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // all import locations of module imports after the global source 23467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // location info are setup. 23477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ImportLoc = 23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation::getFromRawEncoding(Record[Idx++]); 2349677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor off_t StoredSize = (off_t)Record[Idx++]; 2350677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor time_t StoredModTime = (time_t)Record[Idx++]; 23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Length = Record[Idx++]; 23527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<128> ImportedFile(Record.begin() + Idx, 23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.begin() + Idx + Length); 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += Length; 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the AST file. 23577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded, 2358677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor StoredSize, StoredModTime, 23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClientLoadCapabilities)) { 23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Failure: return Failure; 23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have to ignore the dependency, we'll have to ignore this too. 2362ac39f135ea0d45bc37d1154fa8380d46aac0547dDouglas Gregor case Missing: 23637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OutOfDate: return OutOfDate; 23647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VersionMismatch: return VersionMismatch; 23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ConfigurationMismatch: return ConfigurationMismatch; 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HadErrors: return HadErrors; 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Success: break; 23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case LANGUAGE_OPTIONS: { 23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseLanguageOptions(Record, Complain, *Listener) && 2377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !DisableValidation && !AllowConfigurationMismatch) 23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TARGET_OPTIONS: { 23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseTargetOptions(Record, Complain, *Listener) && 2386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !DisableValidation && !AllowConfigurationMismatch) 23877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DIAGNOSTIC_OPTIONS: { 23926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0; 23937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 23947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseDiagnosticOptions(Record, Complain, *Listener) && 23956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !DisableValidation) 23966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return OutOfDate; 23977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case FILE_SYSTEM_OPTIONS: { 24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseFileSystemOptions(Record, Complain, *Listener) && 2404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !DisableValidation && !AllowConfigurationMismatch) 24057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 24067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HEADER_SEARCH_OPTIONS: { 24107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 24117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseHeaderSearchOptions(Record, Complain, *Listener) && 2413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !DisableValidation && !AllowConfigurationMismatch) 24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREPROCESSOR_OPTIONS: { 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParsePreprocessorOptions(Record, Complain, *Listener, 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines) && 2423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !DisableValidation && !AllowConfigurationMismatch) 24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ORIGINAL_FILE: 24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalSourceFileID = FileID::get(Record[0]); 2430b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.ActualOriginalSourceFileName = Blob; 24317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName); 24337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ORIGINAL_FILE_ID: 24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalSourceFileID = FileID::get(Record[0]); 24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ORIGINAL_PCH_DIR: 2440b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.OriginalDir = Blob; 24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case MODULE_NAME: 24446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines F.ModuleName = Blob; 24456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Listener) 24466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Listener->ReadModuleName(F.ModuleName); 24476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 24486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 24496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case MODULE_MAP_FILE: 24506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines F.ModuleMapPath = Blob; 24516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 24526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Try to resolve ModuleName in the current header search context and 24536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // verify that it is found in the same module map file as we saved. If the 24546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // top-level AST file is a main file, skip this check because there is no 24556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // usable header search context. 24566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(!F.ModuleName.empty() && 24576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "MODULE_NAME should come before MOUDLE_MAP_FILE"); 24586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (F.Kind == MK_Module && 24596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (*ModuleMgr.begin())->Kind != MK_MainFile) { 24606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 24616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!M) { 24626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(ImportedBy && "top-level import should be verified"); 24636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if ((ClientLoadCapabilities & ARR_Missing) == 0) 24646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diag(diag::err_imported_module_not_found) 24656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << F.ModuleName << ImportedBy->FileName; 24666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Missing; 24676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 24686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 24696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath); 24706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (StoredModMap == nullptr || StoredModMap != M->ModuleMap) { 24716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(M->ModuleMap && "found module is missing module map file"); 24726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(M->Name == F.ModuleName && "found module with different name"); 24736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(ImportedBy && "top-level import should be verified"); 24746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 24756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diag(diag::err_imported_module_modmap_changed) 24766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << F.ModuleName << ImportedBy->FileName 24776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << M->ModuleMap->getName() << F.ModuleMapPath; 24786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return OutOfDate; 24796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 24806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 24816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 24826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Listener) 24836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Listener->ReadModuleMapFile(F.ModuleMapPath); 24846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 24856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case INPUT_FILE_OFFSETS: 2487b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.InputFileOffsets = (const uint32_t *)Blob.data(); 24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.InputFilesLoaded.resize(Record[0]); 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesASTReader::ASTReadResult 24956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 24968f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.Stream; 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.EnterSubBlock(AST_BLOCK_ID)) { 24997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 25006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read all of the records and blocks for the AST file. 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 250588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner while (1) { 250688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry Entry = Stream.advance(); 250788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 250888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.Kind) { 250988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 251088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("error at end of module block in AST file"); 25116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 251288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::EndBlock: { 25134382867f04549f9bfcd33a08342f4f74ab13841cRichard Smith // Outside of C++, we do not store a lookup map for the translation unit. 25144382867f04549f9bfcd33a08342f4f74ab13841cRichard Smith // Instead, mark it as needing a lookup map to be built if this module 25154382867f04549f9bfcd33a08342f4f74ab13841cRichard Smith // contains any declarations lexically within it (which it always does!). 25164382867f04549f9bfcd33a08342f4f74ab13841cRichard Smith // This usually has no cost, since we very rarely need the lookup map for 25174382867f04549f9bfcd33a08342f4f74ab13841cRichard Smith // the translation unit outside C++. 25187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContext *DC = Context.getTranslationUnitDecl(); 25194382867f04549f9bfcd33a08342f4f74ab13841cRichard Smith if (DC->hasExternalLexicalStorage() && 25204382867f04549f9bfcd33a08342f4f74ab13841cRichard Smith !getContext().getLangOpts().CPlusPlus) 25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DC->setMustBuildLookupTable(); 252288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 25236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Success; 25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 252588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: 252688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.ID) { 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECLTYPES_BLOCK_ID: 25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We lazily load the decls block, but we want to set up the 25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // DeclsCursor cursor to point into it. Clone our current bitcode 25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // cursor to it, enter the block and read the abbrevs in that block. 25317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // With the main cursor, we just skip over it. 25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.DeclsCursor = Stream; 25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || // Skip with the main cursor. 25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the abbrevs. 25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) { 25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 25376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 2540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREPROCESSOR_BLOCK_ID: 25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.MacroCursor = Stream; 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getExternalSource()) 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.setExternalSource(this); 254588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || 25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 25496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 255388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREPROCESSOR_DETAIL_BLOCK_ID: 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreprocessorDetailCursor = Stream; 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || 255788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner ReadBlockAbbrevs(F.PreprocessorDetailCursor, 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PREPROCESSOR_DETAIL_BLOCK_ID)) { 255988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed preprocessor detail record in AST file"); 25606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 256188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreprocessorDetailStartOffset 256388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner = F.PreprocessorDetailCursor.GetCurrentBitNo(); 256488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 25657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()) 25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.createPreprocessingRecord(); 25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()->getExternalSource()) 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getPreprocessingRecord()->SetExternalSource(*this); 25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_MANAGER_BLOCK_ID: 25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadSourceManagerBlock(F)) 25736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 25747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 257588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_BLOCK_ID: 25776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities)) 25786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Result; 25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 258088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case COMMENTS_BLOCK_ID: { 25828f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor C = Stream; 25837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || 25847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 25857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed comments block in AST file"); 25866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CommentsCursors.push_back(std::make_pair(C, &F)); 25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 259188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 259388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Stream.SkipBlock()) { 259488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 25956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 259688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 259788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 260088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 260188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 260288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // The interesting case. 260388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 26047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read and process a record. 26077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 2608b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 2609b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 26107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: // Default behavior: ignore. 26117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OFFSET: { 26147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumTypes != 0) { 26157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate TYPE_OFFSET record in AST file"); 26166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 26177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2618b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.TypeOffsets = (const uint32_t *)Blob.data(); 26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumTypes = Record[0]; 26207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseTypeIndex = Record[1]; 26217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseTypeIndex = getTotalNumTypes(); 26227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumTypes > 0) { 26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for types within this module. 26257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for types within this module. 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.TypeRemap.insertOrReplace( 26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseTypeIndex, 26307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseTypeIndex - LocalBaseTypeIndex)); 26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECL_OFFSET: { 26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumDecls != 0) { 26397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate DECL_OFFSET record in AST file"); 26406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 26417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2642b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.DeclOffsets = (const DeclOffset *)Blob.data(); 26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumDecls = Record[0]; 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseDeclID = Record[1]; 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseDeclID = getTotalNumDecls(); 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumDecls > 0) { 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for declarations within this 26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMap.insert( 26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 26527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for declarations within this 26547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.DeclRemap.insertOrReplace( 26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for declarations within this 26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TU_UPDATE_LEXICAL: { 26687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContext *TU = Context.getTranslationUnitDecl(); 26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextInfo &Info = F.DeclContextInfos[TU]; 2670b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data()); 26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.NumLexicalDecls 2672b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair)); 26737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TU->setHasExternalLexicalStorage(true); 26747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UPDATE_VISIBLE: { 26787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 26797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei serialization::DeclID ID = ReadDeclID(F, Record, Idx); 26807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable *Table = 26816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ASTDeclContextNameLookupTable::Create( 26826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)Blob.data() + Record[Idx++], 26836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)Blob.data() + sizeof(uint32_t), 26846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)Blob.data(), 26856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ASTDeclContextNameLookupTrait(*this, F)); 26866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Decl *D = GetExistingDecl(ID)) { 2687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto *DC = cast<DeclContext>(D); 2688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DC->getPrimaryContext()->setHasExternalVisibleStorage(true); 2689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData; 26906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: There should never be an existing lookup table. 2691651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines delete LookupTable; 2692651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LookupTable = Table; 26937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F)); 26957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IDENTIFIER_TABLE: 2699b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.IdentifierTableData = Blob.data(); 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0]) { 27016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 27026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)F.IdentifierTableData + Record[0], 27036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t), 27046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (const unsigned char *)F.IdentifierTableData, 27056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ASTIdentifierLookupTrait(*this, F)); 27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getIdentifierTable().setExternalIdentifierLookup(this); 27087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IDENTIFIER_OFFSET: { 27127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumIdentifiers != 0) { 27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate IDENTIFIER_OFFSET record in AST file"); 27146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2716b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.IdentifierOffsets = (const uint32_t *)Blob.data(); 27177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumIdentifiers = Record[0]; 27187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseIdentifierID = Record[1]; 27197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseIdentifierID = getTotalNumIdentifiers(); 27207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumIdentifiers > 0) { 27227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for identifiers within this 27237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 27247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 27257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &F)); 27267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for identifiers within this 27287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 27297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.IdentifierRemap.insertOrReplace( 27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseIdentifierID, 27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseIdentifierID - LocalBaseIdentifierID)); 27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifiersLoaded.resize(IdentifiersLoaded.size() 27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei + F.LocalNumIdentifiers); 27357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case EAGERLY_DESERIALIZED_DECLS: 27407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 2741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 27427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SPECIAL_TYPES: 2745f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor if (SpecialTypes.empty()) { 2746f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor for (unsigned I = 0, N = Record.size(); I != N; ++I) 2747f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 2748f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor break; 2749f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor } 2750f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor 2751f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor if (SpecialTypes.size() != Record.size()) { 2752f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor Error("invalid special-types record"); 27536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 2754f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor } 2755f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor 2756f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor for (unsigned I = 0, N = Record.size(); I != N; ++I) { 2757f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 2758f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor if (!SpecialTypes[I]) 2759f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor SpecialTypes[I] = ID; 2760f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 2761f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor // merge step? 2762f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor } 27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case STATISTICS: 27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumStatements += Record[0]; 27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumMacros += Record[1]; 27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalLexicalDeclContexts += Record[2]; 27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalVisibleDeclContexts += Record[3]; 27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UNUSED_FILESCOPED_DECLS: 27737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 27747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DELEGATING_CTORS: 27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 27797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 27807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case WEAK_UNDECLARED_IDENTIFIERS: 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 4 != 0) { 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid weak identifiers record"); 27856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Ignore weak undeclared identifiers from non-original PCH 27897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // files. This isn't the way to do it :) 27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.clear(); 27917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Translate the weak, undeclared identifiers into global IDs. 27937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back( 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getGlobalIdentifierID(F, Record[I++])); 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back( 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getGlobalIdentifierID(F, Record[I++])); 27987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back( 27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(F, Record, I).getRawEncoding()); 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back(Record[I++]); 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28045ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith case LOCALLY_SCOPED_EXTERN_C_DECLS: 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 28065ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I])); 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SELECTOR_OFFSETS: { 2810b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.SelectorOffsets = (const uint32_t *)Blob.data(); 28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumSelectors = Record[0]; 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseSelectorID = Record[1]; 28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSelectorID = getTotalNumSelectors(); 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumSelectors > 0) { 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for selectors within this 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for selectors within this 28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 28227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorRemap.insertOrReplace( 28237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseSelectorID, 28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSelectorID - LocalBaseSelectorID)); 28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case METHOD_POOL: 2832b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0]) 28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorLookupTable 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ASTSelectorLookupTable::Create( 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorLookupTableData + Record[0], 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorLookupTableData, 28387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTrait(*this, F)); 28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumMethodPoolEntries += Record[1]; 28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case REFERENCED_SELECTOR_POOL: 28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Record.empty()) { 28447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 28457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[Idx++])); 28477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getRawEncoding()); 28497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_COUNTER_VALUE: 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Record.empty() && Listener) 28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Listener->ReadCounter(F, Record[0]); 28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case FILE_SORTED_DECLS: 2859b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.FileSortedDecls = (const DeclID *)Blob.data(); 28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.NumFileSortedDecls = Record[0]; 28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_LOCATION_OFFSETS: { 2864b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumSLocEntries = Record[0]; 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned SLocSpaceSize = Record[1]; 2867651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocSpaceSize); 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Make our entry in the range map. BaseID is negative and growing, so 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // we invert it. Because we invert it, though, we need the other end of 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the range. 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RangeStart = 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocOffsetMap.insert( 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei - SLocSpaceSize,&F)); 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Initialize the remapping table. 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Invalid stays invalid. 2886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This module. Base was 2 when being compiled. 2888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.SLocRemap.insertOrReplace(std::make_pair(2U, 28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<int>(F.SLocEntryBaseOffset - 2))); 28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumSLocEntries += F.LocalNumSLocEntries; 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case MODULE_OFFSET_MAP: { 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Additional remapping information. 2897b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const unsigned char *Data = (const unsigned char*)Blob.data(); 2898b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const unsigned char *DataEnd = Data + Blob.size(); 2899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 2901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 2902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.SLocRemap.insert(std::make_pair(0U, 0)); 2903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F.SLocRemap.insert(std::make_pair(2U, 1)); 2904651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2905651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Continuous range maps we may be updating in our module. 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap); 29087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierRemap(F.IdentifierRemap); 29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 29117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroRemap(F.MacroRemap); 29127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityRemap(F.PreprocessedEntityRemap); 29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleRemap(F.SubmoduleRemap); 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorRemap(F.SelectorRemap); 29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap); 29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap); 29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while(Data < DataEnd) { 2922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace llvm::support; 2923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 29247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = StringRef((const char*)Data, Len); 29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Data += Len; 29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *OM = ModuleMgr.lookup(Name); 29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!OM) { 29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("SourceLocation remap refers to unknown module"); 29296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t SLocOffset = 2933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t IdentifierIDOffset = 2935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t MacroIDOffset = 2937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t PreprocessedEntityIDOffset = 2939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2940651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t SubmoduleIDOffset = 2941651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t SelectorIDOffset = 2943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t DeclIDOffset = 2945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines uint32_t TypeIndexOffset = 2947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines endian::readNext<uint32_t, little, unaligned>(Data); 2948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Source location offset is mapped to OM->SLocEntryBaseOffset. 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocRemap.insert(std::make_pair(SLocOffset, 29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset))); 29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierRemap.insert( 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(IdentifierIDOffset, 29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseIdentifierID - IdentifierIDOffset)); 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroRemap.insert(std::make_pair(MacroIDOffset, 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseMacroID - MacroIDOffset)); 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityRemap.insert( 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(PreprocessedEntityIDOffset, 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset)); 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset, 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseSubmoduleID - SubmoduleIDOffset)); 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorRemap.insert(std::make_pair(SelectorIDOffset, 29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseSelectorID - SelectorIDOffset)); 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclRemap.insert(std::make_pair(DeclIDOffset, 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseDeclID - DeclIDOffset)); 29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeRemap.insert(std::make_pair(TypeIndexOffset, 29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseTypeIndex - TypeIndexOffset)); 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Global -> local mappings. 29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_MANAGER_LINE_TABLE: 29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ParseLineTable(F, Record)) 29786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 29797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_LOCATION_PRELOADS: { 29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Need to transform from the local view (1-based IDs) to the global view, 29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // which is based off F.SLocEntryBaseID. 29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!F.PreloadSLocEntries.empty()) { 29857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 29866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreloadSLocEntries.swap(Record); 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case EXT_VECTOR_DECLS: 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 29967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VTABLE_USES: 29997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 3 != 0) { 30007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid VTABLE_USES record"); 30016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 30057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Modules will have some trouble with this. This is clearly not 30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the right way to do this. 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.clear(); 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.push_back( 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(F, Record, Idx).getRawEncoding()); 30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.push_back(Record[Idx++]); 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DYNAMIC_CLASSES: 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DynamicClasses.push_back(getGlobalDeclID(F, Record[I])); 30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PENDING_IMPLICIT_INSTANTIATIONS: 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PendingInstantiations.size() % 2 != 0) { 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid existing PendingInstantiations"); 30256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 2 != 0) { 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 30306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingInstantiations.push_back( 30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(F, Record, I).getRawEncoding()); 30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SEMA_DECL_REFS: 30419b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith if (Record.size() != 2) { 30429b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith Error("Invalid SEMA_DECL_REFS block"); 30436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 30449b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith } 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 30477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_ENTITIES_OFFSETS: { 3050b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3051b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3052b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBasePreprocessedEntityID = Record[0]; 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned StartingID; 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()) 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.createPreprocessingRecord(); 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()->getExternalSource()) 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getPreprocessingRecord()->SetExternalSource(*this); 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StartingID 30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = PP.getPreprocessingRecord() 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->allocateLoadedEntities(F.NumPreprocessedEntities); 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BasePreprocessedEntityID = StartingID; 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.NumPreprocessedEntities > 0) { 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for preprocessed entities in 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this module. 30697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for preprocessed entities in 30727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this module. 30737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreprocessedEntityRemap.insertOrReplace( 30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBasePreprocessedEntityID, 30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 30767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECL_UPDATE_OFFSETS: { 30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 2 != 0) { 30837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 30846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 30856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 30866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 30876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 30886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 30896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 30906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If we've already loaded the decl, perform the updates when we finish 30916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // loading this block. 30926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Decl *D = GetExistingDecl(ID)) 30936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PendingUpdateRecords.push_back(std::make_pair(ID, D)); 30947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECL_REPLACEMENTS: { 30997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 3 != 0) { 31007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid DECL_REPLACEMENTS block in AST file"); 31016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 31027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; I += 3) 31047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReplacedDecls[getGlobalDeclID(F, Record[I])] 31057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]); 31067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OBJC_CATEGORIES_MAP: { 31107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumObjCCategoriesInMap != 0) { 31117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 31126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 31137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumObjCCategoriesInMap = Record[0]; 3116b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 31177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OBJC_CATEGORIES: 31217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.ObjCCategories.swap(Record); 31227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CXX_BASE_SPECIFIER_OFFSETS: { 31257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumCXXBaseSpecifiers != 0) { 31267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file"); 31276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 31287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumCXXBaseSpecifiers = Record[0]; 3131b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data(); 31327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers; 31337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DIAG_PRAGMA_MAPPINGS: 31377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.PragmaDiagMappings.empty()) 31387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PragmaDiagMappings.swap(Record); 31397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 31407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 31417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.begin(), Record.end()); 31427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CUDA_SPECIAL_DECL_REFS: 31457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 31467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Modules will have trouble with this. 31477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CUDASpecialDeclRefs.clear(); 31487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 31497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HEADER_SEARCH_TABLE: { 3153b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.HeaderFileInfoTableData = Blob.data(); 31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumHeaderFileInfos = Record[1]; 31557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0]) { 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.HeaderFileInfoTable 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = HeaderFileInfoLookupTable::Create( 31587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 31597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)F.HeaderFileInfoTableData, 31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoTrait(*this, F, 31617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &PP.getHeaderSearchInfo(), 3162b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Blob.data() + Record[2])); 31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getHeaderSearchInfo().SetExternalSource(this); 31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getHeaderSearchInfo().getExternalLookup()) 31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getHeaderSearchInfo().SetExternalLookup(this); 31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case FP_PRAGMA_OPTIONS: 31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 31737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FPPragmaOptions.swap(Record); 31747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OPENCL_EXTENSIONS: 31777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 31787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OpenCLExtensions.swap(Record); 31797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TENTATIVE_DEFINITIONS: 31827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 31837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 31847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case KNOWN_NAMESPACES: 31877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 31887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 31897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 319001a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 3191cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky case UNDEFINED_BUT_USED: 3192cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky if (UndefinedButUsed.size() % 2 != 0) { 3193cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky Error("Invalid existing UndefinedButUsed"); 31946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 319501a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 319601a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 319701a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky if (Record.size() % 2 != 0) { 3198cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky Error("invalid undefined-but-used record"); 31996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 320001a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 320101a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3202cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3203cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky UndefinedButUsed.push_back( 320401a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky ReadSourceLocation(F, Record, I).getRawEncoding()); 320501a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 320601a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky break; 320701a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 32087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IMPORTED_MODULES: { 32097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.Kind != MK_Module) { 32107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we aren't loading a module (which has its own exports), make 32117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // all of the imported modules visible. 32127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Deal with macros-only imports. 3213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation Loc = ReadSourceLocation(F, Record, I); 3216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (GlobalID) 3217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 32187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case LOCAL_REDECLARATIONS: { 32247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.RedeclarationChains.swap(Record); 32257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case LOCAL_REDECLARATIONS_MAP: { 32297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumRedeclarationsInMap != 0) { 32307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file"); 32316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 32327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumRedeclarationsInMap = Record[0]; 3235b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data(); 32367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case MERGED_DECLARATIONS: { 32407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) { 32417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]); 32427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID]; 32437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N > 0; --N) 32447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(getGlobalDeclID(F, Record[Idx++])); 32457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case MACRO_OFFSET: { 32507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumMacros != 0) { 32517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate MACRO_OFFSET record in AST file"); 32526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 32537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3254b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.MacroOffsets = (const uint32_t *)Blob.data(); 32557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumMacros = Record[0]; 32567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseMacroID = Record[1]; 32577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseMacroID = getTotalNumMacros(); 32587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumMacros > 0) { 32607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for macros within this module. 32617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 32627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for macros within this module. 32647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.MacroRemap.insertOrReplace( 32657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseMacroID, 32667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseMacroID - LocalBaseMacroID)); 32677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 32697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32739317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis case MACRO_TABLE: { 32749317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // FIXME: Not used yet. 32757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3277ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 3278ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith case LATE_PARSED_TEMPLATE: { 3279ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith LateParsedTemplates.append(Record.begin(), Record.end()); 3280ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith break; 3281ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith } 32826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 32836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case OPTIMIZE_PRAGMA_OPTIONS: 32846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Record.size() != 1) { 32856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Error("invalid pragma optimize record"); 32866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 32876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 32886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 32896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 32907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32942cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor/// \brief Move the given method to the back of the global list of methods. 32952cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregorstatic void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 32962cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor // Find the entry for this selector in the method pool. 32972cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor Sema::GlobalMethodPool::iterator Known 32982cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor = S.MethodPool.find(Method->getSelector()); 32992cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (Known == S.MethodPool.end()) 33002cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor return; 33012cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor 33022cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor // Retrieve the appropriate method list. 33032cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 33042cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor : Known->second.second; 33052cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor bool Found = false; 33062e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 33072cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (!Found) { 33082cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (List->Method == Method) { 33092cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor Found = true; 33102cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } else { 33112cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor // Keep searching. 33122cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor continue; 33132cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 33142cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 33152cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor 33162e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis if (List->getNext()) 33172e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis List->Method = List->getNext()->Method; 33182cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor else 33192cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor List->Method = Method; 33202cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 33212cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor} 33222cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor 332352151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidisvoid ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 3324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0, N = Names.HiddenDecls.size(); I != N; ++I) { 3325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Decl *D = Names.HiddenDecls[I]; 3326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool wasHidden = D->Hidden; 3327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D->Hidden = false; 3328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (wasHidden && SemaObj) { 3330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 3331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines moveMethodToBackOfGlobalList(*SemaObj, Method); 33322cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 33337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (HiddenMacrosMap::const_iterator I = Names.HiddenMacros.begin(), 3337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines E = Names.HiddenMacros.end(); 3338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I != E; ++I) 3339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines installImportedMacro(I->first, I->second, Owner); 33407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTReader::makeModuleVisible(Module *Mod, 33435ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis Module::NameVisibilityKind NameVisibility, 3344906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor SourceLocation ImportLoc, 3345906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor bool Complain) { 33467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::SmallPtrSet<Module *, 4> Visited; 3347cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<Module *, 4> Stack; 3348344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm Stack.push_back(Mod); 33497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!Stack.empty()) { 3350344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm Mod = Stack.pop_back_val(); 33517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NameVisibility <= Mod->NameVisibility) { 3353344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm // This module already has this level of visibility (or greater), so 33547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // there is nothing more to do. 33557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 33567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 33587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Mod->isAvailable()) { 33597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Modules that aren't available cannot be made visible. 33607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 33617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update the module's name visibility. 3364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (NameVisibility >= Module::MacrosVisible && 3365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Mod->NameVisibility < Module::MacrosVisible) 3366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Mod->MacroVisibilityLoc = ImportLoc; 33677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mod->NameVisibility = NameVisibility; 3368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 33697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already deserialized any names from this module, 33707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // mark them as visible. 33717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 33727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Hidden != HiddenNamesMap.end()) { 337352151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis makeNamesVisible(Hidden->second, Hidden->first); 33747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMap.erase(Hidden); 33757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 337686250895597e288c86ef08c2e824956ea9835fedDmitri Gribenko 33777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push any exported modules onto the stack to be marked as visible. 337821a0004d80f50808ee343ae70092f6260a4c9477Argyrios Kyrtzidis SmallVector<Module *, 16> Exports; 337921a0004d80f50808ee343ae70092f6260a4c9477Argyrios Kyrtzidis Mod->getExportedModules(Exports); 338021a0004d80f50808ee343ae70092f6260a4c9477Argyrios Kyrtzidis for (SmallVectorImpl<Module *>::iterator 338121a0004d80f50808ee343ae70092f6260a4c9477Argyrios Kyrtzidis I = Exports.begin(), E = Exports.end(); I != E; ++I) { 338221a0004d80f50808ee343ae70092f6260a4c9477Argyrios Kyrtzidis Module *Exported = *I; 338321a0004d80f50808ee343ae70092f6260a4c9477Argyrios Kyrtzidis if (Visited.insert(Exported)) 338421a0004d80f50808ee343ae70092f6260a4c9477Argyrios Kyrtzidis Stack.push_back(Exported); 33857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3386906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 3387906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Detect any conflicts. 3388906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (Complain) { 3389906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor assert(ImportLoc.isValid() && "Missing import location"); 3390906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) { 3391906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) { 3392906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Diag(ImportLoc, diag::warn_module_conflict) 3393906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << Mod->getFullModuleName() 3394906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << Mod->Conflicts[I].Other->getFullModuleName() 3395906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << Mod->Conflicts[I].Message; 3396906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // FIXME: Need note where the other module was imported. 3397906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 3398906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 3399906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 34007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34031a49d97d762570027863e9209af81d445e4f1502Douglas Gregorbool ASTReader::loadGlobalIndex() { 34041a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (GlobalIndex) 34051a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return false; 34061a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 34071a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (TriedLoadingGlobalIndex || !UseGlobalIndex || 34081a49d97d762570027863e9209af81d445e4f1502Douglas Gregor !Context.getLangOpts().Modules) 34091a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return true; 34101a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 34111a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // Try to load the global index. 34121a49d97d762570027863e9209af81d445e4f1502Douglas Gregor TriedLoadingGlobalIndex = true; 34131a49d97d762570027863e9209af81d445e4f1502Douglas Gregor StringRef ModuleCachePath 34141a49d97d762570027863e9209af81d445e4f1502Douglas Gregor = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 34151a49d97d762570027863e9209af81d445e4f1502Douglas Gregor std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 3416677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor = GlobalModuleIndex::readIndex(ModuleCachePath); 34171a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (!Result.first) 34181a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return true; 34191a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 34201a49d97d762570027863e9209af81d445e4f1502Douglas Gregor GlobalIndex.reset(Result.first); 3421188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor ModuleMgr.setGlobalIndex(GlobalIndex.get()); 34221a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return false; 34231a49d97d762570027863e9209af81d445e4f1502Douglas Gregor} 34241a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 34251a49d97d762570027863e9209af81d445e4f1502Douglas Gregorbool ASTReader::isGlobalIndexUnavailable() const { 34261a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return Context.getLangOpts().Modules && UseGlobalIndex && 34271a49d97d762570027863e9209af81d445e4f1502Douglas Gregor !hasGlobalIndex() && TriedLoadingGlobalIndex; 34281a49d97d762570027863e9209af81d445e4f1502Douglas Gregor} 34291a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 3430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic void updateModuleTimestamp(ModuleFile &MF) { 3431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Overwrite the timestamp file contents so that file's mtime changes. 3432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string TimestampFilename = MF.getTimestampFilename(); 3433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string ErrorInfo; 3434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_fd_ostream OS(TimestampFilename.c_str(), ErrorInfo, 3435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::fs::F_Text); 3436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!ErrorInfo.empty()) 3437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 3438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "Timestamp file\n"; 3439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 3440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 34417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, 34427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleKind Type, 34437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ImportLoc, 34447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ClientLoadCapabilities) { 34453b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis llvm::SaveAndRestore<SourceLocation> 34463b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 34473b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis 34486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Defer any pending actions until we get to the end of reading the AST file. 34496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Deserializing AnASTFile(this); 34506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bump the generation number. 34526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned PreviousGeneration = incrementGeneration(Context); 34537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumModules = ModuleMgr.size(); 3455cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ImportedModule, 4> Loaded; 34567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 34576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*ImportedBy=*/nullptr, Loaded, 3458677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 0, 0, 34597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClientLoadCapabilities)) { 34607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Failure: 3461677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case Missing: 34627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OutOfDate: 34637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VersionMismatch: 34647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ConfigurationMismatch: 3465ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case HadErrors: { 3466ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet; 3467ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (const ImportedModule &IM : Loaded) 3468ef8225444452a1486bd721f3285301fe84643b00Stephen Hines LoadedSet.insert(IM.Mod); 3469ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 3470677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(), 3471ef8225444452a1486bd721f3285301fe84643b00Stephen Hines LoadedSet, 3472677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor Context.getLangOpts().Modules 3473677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ? &PP.getHeaderSearchInfo().getModuleMap() 34746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : nullptr); 34751a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 34761a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // If we find that any modules are unusable, the global index is going 34771a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // to be out-of-date. Just remove it. 34781a49d97d762570027863e9209af81d445e4f1502Douglas Gregor GlobalIndex.reset(); 34796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleMgr.setGlobalIndex(nullptr); 34807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadResult; 3481ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 34827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Success: 34837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 34847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Here comes stuff that we only do once the entire chain is loaded. 34877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the AST blocks of all of the modules that we loaded. 3489cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3490cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko MEnd = Loaded.end(); 34917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M != MEnd; ++M) { 34927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *M->Mod; 34937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the AST block. 34956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 34966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Result; 34977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Once read, set the ModuleFile bit base offset and update the size in 34997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // bits of all files we've seen. 35007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.GlobalBitOffset = TotalModulesSizeInBits; 35017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalModulesSizeInBits += F.SizeInBits; 35027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 35037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Preload SLocEntries. 35057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 35067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 35077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load it through the SourceManager and don't call ReadSLocEntry() 35087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // directly because the entry may have already been loaded in which case 35097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // calling ReadSLocEntry() directly would trigger an assertion in 35107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // SourceManager. 35117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.getLoadedSLocEntryByID(Index); 35127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3515fa69fc19121da3fc5673ccc00d4e8afa5b540a4fDouglas Gregor // Setup the import locations and notify the module manager that we've 3516fa69fc19121da3fc5673ccc00d4e8afa5b540a4fDouglas Gregor // committed to these module files. 3517cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3518cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko MEnd = Loaded.end(); 35197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M != MEnd; ++M) { 35207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *M->Mod; 3521fa69fc19121da3fc5673ccc00d4e8afa5b540a4fDouglas Gregor 3522fa69fc19121da3fc5673ccc00d4e8afa5b540a4fDouglas Gregor ModuleMgr.moduleFileAccepted(&F); 3523fa69fc19121da3fc5673ccc00d4e8afa5b540a4fDouglas Gregor 3524fa69fc19121da3fc5673ccc00d4e8afa5b540a4fDouglas Gregor // Set the import location. 35258b136d85487ec3cc017470d97479159d93a14f91Argyrios Kyrtzidis F.DirectImportLoc = ImportLoc; 35267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!M->ImportedBy) 35277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.ImportLoc = M->ImportLoc; 35287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 35297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.ImportLoc = ReadSourceLocation(*M->ImportedBy, 35307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M->ImportLoc.getRawEncoding()); 35317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mark all of the identifiers in the identifier table as being out of date, 35347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // so that various accessors know to check the loaded modules when the 35357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // identifier is used. 35367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 35377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdEnd = PP.getIdentifierTable().end(); 35387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Id != IdEnd; ++Id) 35397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Id->second->setOutOfDate(true); 35407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Resolve any unresolved module exports. 3542906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 3543906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 35447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 35457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module *ResolvedMod = getSubmodule(GlobalID); 3546906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 3547906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor switch (Unresolved.Kind) { 3548906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor case UnresolvedModuleRef::Conflict: 3549906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (ResolvedMod) { 3550906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module::Conflict Conflict; 3551906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Conflict.Other = ResolvedMod; 3552906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Conflict.Message = Unresolved.String.str(); 3553906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.Mod->Conflicts.push_back(Conflict); 3554906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 3555906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor continue; 3556906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 3557906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor case UnresolvedModuleRef::Import: 35587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ResolvedMod) 35597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.Mod->Imports.push_back(ResolvedMod); 35607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 35617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3562906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor case UnresolvedModuleRef::Export: 3563906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (ResolvedMod || Unresolved.IsWildcard) 3564906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.Mod->Exports.push_back( 3565906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 3566906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor continue; 3567906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 35687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3569906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRefs.clear(); 3570ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper 3571ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper // FIXME: How do we load the 'use'd modules? They may not be submodules. 3572ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper // Might be unnecessary as use declarations are only used to build the 3573ddd2dfc1d3f4a36cbe8cd775c588623a17049f9fDaniel Jasper // module itself. 35747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InitializeContext(); 35767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35779b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith if (SemaObj) 35789b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith UpdateSema(); 35799b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith 35807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 35817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->ReaderInitialized(this); 35827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 35847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PrimaryModule.OriginalSourceFileID.isInvalid()) { 35857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrimaryModule.OriginalSourceFileID 35867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FileID::get(PrimaryModule.SLocEntryBaseID 35877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 35887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this AST file is a precompiled preamble, then set the 35907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // preamble file ID of the source manager to the file source file 35917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // from which the preamble was built. 35927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Type == MK_Preamble) { 35937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 35947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Type == MK_MainFile) { 35957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 35967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For any Objective-C class definitions we have already loaded, make sure 36007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that we load any additional categories. 36017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 36027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 36037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCClassesLoaded[I], 36047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreviousGeneration); 36057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36061a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 3607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (PP.getHeaderSearchInfo() 3608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .getHeaderSearchOpts() 3609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .ModulesValidateOncePerBuildSession) { 3610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Now we are certain that the module and all modules it depends on are 3611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // up to date. Create or update timestamp files for modules that are 3612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // located in the module cache (not for PCH files that could be anywhere 3613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // in the filesystem). 3614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 3615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ImportedModule &M = Loaded[I]; 3616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (M.Mod->Kind == MK_Module) { 3617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines updateModuleTimestamp(*M.Mod); 3618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 36227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 36237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ASTReadResult 36267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadASTCore(StringRef FileName, 36277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleKind Type, 36287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ImportLoc, 36297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *ImportedBy, 3630cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<ImportedModule> &Loaded, 3631677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor off_t ExpectedSize, time_t ExpectedModTime, 36327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ClientLoadCapabilities) { 36337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M; 36347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string ErrorStr; 3635677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor ModuleManager::AddModuleResult AddResult 3636677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 36376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getGeneration(), ExpectedSize, ExpectedModTime, 3638677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor M, ErrorStr); 36397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3640677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor switch (AddResult) { 3641677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ModuleManager::AlreadyLoaded: 36427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 3643677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 3644677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ModuleManager::NewlyLoaded: 3645677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Load module file below. 3646677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor break; 3647677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 3648677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ModuleManager::Missing: 3649677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // The module file was missing; if the client handle handle, that, return 3650677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // it. 3651677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (ClientLoadCapabilities & ARR_Missing) 3652677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return Missing; 3653677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 3654677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Otherwise, return an error. 3655677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor { 3656677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3657677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor + ErrorStr; 3658677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor Error(Msg); 3659677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 3660677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return Failure; 3661677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 3662677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case ModuleManager::OutOfDate: 3663677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // We couldn't load the module file because it is out-of-date. If the 3664677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // client can handle out-of-date, return it. 3665677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (ClientLoadCapabilities & ARR_OutOfDate) 3666677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return OutOfDate; 3667677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 3668677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor // Otherwise, return an error. 3669677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor { 3670677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3671677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor + ErrorStr; 3672677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor Error(Msg); 3673677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 3674677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor return Failure; 36757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3677677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor assert(M && "Missing module file"); 3678677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 36797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This seems rather a hack. Should CurrentDir be part of the 36807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module? 36817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FileName != "-") { 36827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentDir = llvm::sys::path::parent_path(FileName); 36837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurrentDir.empty()) CurrentDir = "."; 36847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *M; 36878f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.Stream; 36887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.init(F.StreamFile); 36897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SizeInBits = F.Buffer->getBufferSize() * 8; 36907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sniff for the signature. 36927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.Read(8) != 'C' || 36937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'P' || 36947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'C' || 36957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'H') { 36967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(diag::err_not_a_pch_file) << FileName; 36977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 36987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This is used for compatibility with older PCH formats. 37017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HaveReadControlBlock = false; 37027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 370399a5af0088b6340540912921cd0008ac75051a33Chris Lattner while (1) { 370499a5af0088b6340540912921cd0008ac75051a33Chris Lattner llvm::BitstreamEntry Entry = Stream.advance(); 370599a5af0088b6340540912921cd0008ac75051a33Chris Lattner 370699a5af0088b6340540912921cd0008ac75051a33Chris Lattner switch (Entry.Kind) { 370799a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Error: 370899a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::EndBlock: 370999a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Record: 37107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid record at top-level of AST file"); 37117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 371299a5af0088b6340540912921cd0008ac75051a33Chris Lattner 371399a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::SubBlock: 371499a5af0088b6340540912921cd0008ac75051a33Chris Lattner break; 37157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We only know the control subblock ID. 371899a5af0088b6340540912921cd0008ac75051a33Chris Lattner switch (Entry.ID) { 37197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case llvm::bitc::BLOCKINFO_BLOCK_ID: 37207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.ReadBlockInfoBlock()) { 37217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed BlockInfoBlock in AST file"); 37227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 37237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 37257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CONTROL_BLOCK_ID: 37267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HaveReadControlBlock = true; 37276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 37287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Success: 37297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 37307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Failure: return Failure; 3732677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor case Missing: return Missing; 37337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OutOfDate: return OutOfDate; 37347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VersionMismatch: return VersionMismatch; 37357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ConfigurationMismatch: return ConfigurationMismatch; 37367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HadErrors: return HadErrors; 37377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 37397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case AST_BLOCK_ID: 37407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HaveReadControlBlock) { 37417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 3742651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diag(diag::err_pch_version_too_old); 37437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionMismatch; 37447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record that we've loaded this module. 37477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 37487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 37497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 37517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock()) { 37527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 37537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 37547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 37567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 37607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::InitializeContext() { 37637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there's a listener, notify them that we "read" the translation unit. 37647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 37657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 37667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getTranslationUnitDecl()); 37677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Find a better way to deal with collisions between these 37697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // built-in types. Right now, we just ignore the problem. 37707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the special types. 37727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SpecialTypes.size() >= NumSpecialTypeIDs) { 37737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 37747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.CFConstantStringTypeDecl) 37757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setCFConstantStringType(GetType(String)); 37767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 37797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FileType = GetType(File); 37807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FileType.isNull()) { 37817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("FILE type is NULL"); 37827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 37837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.FILEDecl) { 37867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 37877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setFILEDecl(Typedef->getDecl()); 37887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 37897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = FileType->getAs<TagType>(); 37907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Tag) { 37917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid FILE type in AST file"); 37927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 37937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setFILEDecl(Tag->getDecl()); 37957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 38007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Jmp_bufType = GetType(Jmp_buf); 38017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Jmp_bufType.isNull()) { 38027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("jmp_buf type is NULL"); 38037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 38047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.jmp_bufDecl) { 38077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 38087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setjmp_bufDecl(Typedef->getDecl()); 38097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 38107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = Jmp_bufType->getAs<TagType>(); 38117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Tag) { 38127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid jmp_buf type in AST file"); 38137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 38147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setjmp_bufDecl(Tag->getDecl()); 38167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 38217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Sigjmp_bufType = GetType(Sigjmp_buf); 38227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Sigjmp_bufType.isNull()) { 38237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("sigjmp_buf type is NULL"); 38247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 38257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.sigjmp_bufDecl) { 38287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 38297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setsigjmp_bufDecl(Typedef->getDecl()); 38307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 38317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 38327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Tag && "Invalid sigjmp_buf type in AST file"); 38337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setsigjmp_bufDecl(Tag->getDecl()); 38347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned ObjCIdRedef 38397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 38407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Context.ObjCIdRedefinitionType.isNull()) 38417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 38427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned ObjCClassRedef 38457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 38467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Context.ObjCClassRedefinitionType.isNull()) 38477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 38487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned ObjCSelRedef 38517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 38527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Context.ObjCSelRedefinitionType.isNull()) 38537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 38547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 38577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Ucontext_tType = GetType(Ucontext_t); 38587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ucontext_tType.isNull()) { 38597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("ucontext_t type is NULL"); 38607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 38617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.ucontext_tDecl) { 38647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 38657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setucontext_tDecl(Typedef->getDecl()); 38667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 38677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = Ucontext_tType->getAs<TagType>(); 38687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Tag && "Invalid ucontext_t type in AST file"); 38697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setucontext_tDecl(Tag->getDecl()); 38707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 38767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there were any CUDA special declarations, deserialize them. 38787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CUDASpecialDeclRefs.empty()) { 38797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 38807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setcudaConfigureCallDecl( 38817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 38827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 38847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Re-export any modules that were imported by a non-module AST file. 3885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This does not make macro-only imports visible again. It also doesn't 3886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // make #includes mapped to module imports visible. 3887651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto &Import : ImportedModules) { 3888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Module *Imported = getSubmodule(Import.ID)) 38895ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis makeModuleVisible(Imported, Module::AllVisible, 3890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /*ImportLoc=*/Import.ImportLoc, 3891906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor /*Complain=*/false); 38927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImportedModules.clear(); 38947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::finalizeForWriting() { 38977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(), 38987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenEnd = HiddenNamesMap.end(); 38997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Hidden != HiddenEnd; ++Hidden) { 390052151fd57eaf40603fa8f1cd34dcb4ad5f7701b3Argyrios Kyrtzidis makeNamesVisible(Hidden->second, Hidden->first); 39017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMap.clear(); 39037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 39047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3905bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis/// \brief Given a cursor at the start of an AST file, scan ahead and drop the 3906bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis/// cursor into the start of the given block ID, returning false on success and 3907bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis/// true on failure. 3908bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidisstatic bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 39098f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner while (1) { 39108f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = Cursor.advance(); 39118f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch (Entry.Kind) { 39128f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Error: 39138f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::EndBlock: 39148f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 39158f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 39168f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Record: 39178f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Ignore top-level records. 39188f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Cursor.skipRecord(Entry.ID); 39198f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 39208f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 39218f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::SubBlock: 3922bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (Entry.ID == BlockID) { 3923bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (Cursor.EnterSubBlock(BlockID)) 39248f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 39258f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Found it! 39268f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return false; 39278f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 39288f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 39298f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Cursor.SkipBlock()) 39308f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 39318f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 39328f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 39338f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner} 39348f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 39357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieve the name of the original source file name 39367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// directly from the AST file, without actually loading the AST 39377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// file. 39387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName, 39397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 39407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine &Diags) { 39417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Open the AST file. 39427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string ErrStr; 3943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<llvm::MemoryBuffer> Buffer; 39447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr)); 39457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Buffer) { 39467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr; 39477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::string(); 39487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Initialize the stream 39517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::BitstreamReader StreamFile; 39528f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor Stream; 39537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 39547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)Buffer->getBufferEnd()); 39557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.init(StreamFile); 39567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sniff for the signature. 39587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.Read(8) != 'C' || 39597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'P' || 39607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'C' || 39617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'H') { 39627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 39637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::string(); 39647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39658f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 396688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // Scan for the CONTROL_BLOCK_ID block. 3967bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 39688f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 39698f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return std::string(); 397088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 39717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39728f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Scan for ORIGINAL_FILE inside the control block. 39738f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner RecordData Record; 397488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner while (1) { 39758f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 397688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 397788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return std::string(); 397888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 397988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) { 398088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 398188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return std::string(); 39827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 398388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 39847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 3985b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 3986b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 3987b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner return Blob.str(); 39887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 39907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 39927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class SimplePCHValidator : public ASTReaderListener { 39937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &ExistingLangOpts; 39947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts; 39957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts; 39967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr; 39977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 39997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SimplePCHValidator(const LangOptions &ExistingLangOpts, 40007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts, 40017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts, 40027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr) 40037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : ExistingLangOpts(ExistingLangOpts), 40047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingTargetOpts(ExistingTargetOpts), 40057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingPPOpts(ExistingPPOpts), 40067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileMgr(FileMgr) 40077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei { 40087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 40097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ReadLanguageOptions(const LangOptions &LangOpts, 4011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Complain) override { 40126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr); 40137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ReadTargetOptions(const TargetOptions &TargetOpts, 4015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Complain) override { 40166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr); 40177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4018651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 4019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Complain, 4020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string &SuggestedPredefines) override { 40216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 402265110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis SuggestedPredefines, ExistingLangOpts); 40237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 40247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 40257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 40267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::readASTFileControlBlock(StringRef Filename, 40287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 40297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 40307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Open the AST file. 40317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string ErrStr; 4032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<llvm::MemoryBuffer> Buffer; 40337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr)); 40347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Buffer) { 40357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 40367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 40377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Initialize the stream 40397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::BitstreamReader StreamFile; 40408f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor Stream; 40417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 40427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)Buffer->getBufferEnd()); 40437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.init(StreamFile); 40447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sniff for the signature. 40467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.Read(8) != 'C' || 40477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'P' || 40487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'C' || 40497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'H') { 40507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 40517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 40527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40538f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Scan for the CONTROL_BLOCK_ID block. 4054bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 40558f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 4056bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis 4057bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis bool NeedsInputFiles = Listener.needsInputFileVisitation(); 4058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 4059bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis BitstreamCursor InputFilesCursor; 4060bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (NeedsInputFiles) { 4061bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis InputFilesCursor = Stream; 4062bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 4063bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis return true; 4064bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis 4065bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis // Read the abbreviations 4066bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis while (true) { 4067bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis uint64_t Offset = InputFilesCursor.GetCurrentBitNo(); 4068bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis unsigned Code = InputFilesCursor.ReadCode(); 4069bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis 4070bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis // We expect all abbrevs to be at the start of the block. 4071bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (Code != llvm::bitc::DEFINE_ABBREV) { 4072bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis InputFilesCursor.JumpToBit(Offset); 4073bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis break; 4074bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis } 4075bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis InputFilesCursor.ReadAbbrevRecord(); 4076bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis } 4077bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis } 40788f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 40798f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Scan for ORIGINAL_FILE inside the control block. 40807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 40818f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner while (1) { 40828f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 40838f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 40848f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return false; 40858f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 40868f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) 40878f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 40888f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 40897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 4090b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 4091b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 40928f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch ((ControlRecordTypes)RecCode) { 40938f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case METADATA: { 40948f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Record[0] != VERSION_MAJOR) 40958f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 40967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4097c544ba09695e300f31355af342258bd57619e737Douglas Gregor if (Listener.ReadFullVersionInformation(Blob)) 40988f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 4099c544ba09695e300f31355af342258bd57619e737Douglas Gregor 41008f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41018f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 41026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case MODULE_NAME: 41036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Listener.ReadModuleName(Blob); 41046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 41056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case MODULE_MAP_FILE: 41066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Listener.ReadModuleMapFile(Blob); 41076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 41088f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case LANGUAGE_OPTIONS: 41098f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseLanguageOptions(Record, false, Listener)) 41108f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 41118f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41138f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case TARGET_OPTIONS: 41148f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseTargetOptions(Record, false, Listener)) 41158f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 41168f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41188f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case DIAGNOSTIC_OPTIONS: 41198f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseDiagnosticOptions(Record, false, Listener)) 41208f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 41218f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41238f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case FILE_SYSTEM_OPTIONS: 41248f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseFileSystemOptions(Record, false, Listener)) 41258f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 41268f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41288f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case HEADER_SEARCH_OPTIONS: 41298f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseHeaderSearchOptions(Record, false, Listener)) 41308f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 41318f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41338f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case PREPROCESSOR_OPTIONS: { 41348f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner std::string IgnoredSuggestedPredefines; 41358f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParsePreprocessorOptions(Record, false, Listener, 41368f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner IgnoredSuggestedPredefines)) 41378f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 41388f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41398f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 41407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4141bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis case INPUT_FILE_OFFSETS: { 4142bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (!NeedsInputFiles) 4143bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis break; 4144bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis 4145bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis unsigned NumInputFiles = Record[0]; 4146bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis unsigned NumUserFiles = Record[1]; 4147bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis const uint32_t *InputFileOffs = (const uint32_t *)Blob.data(); 4148bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis for (unsigned I = 0; I != NumInputFiles; ++I) { 4149bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis // Go find this input file. 4150bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis bool isSystemFile = I >= NumUserFiles; 4151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isSystemFile && !NeedsSystemInputFiles) 4153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; // the rest are system input files 4154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4155bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis BitstreamCursor &Cursor = InputFilesCursor; 4156bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis SavedStreamPosition SavedPosition(Cursor); 4157bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis Cursor.JumpToBit(InputFileOffs[I]); 4158bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis 4159bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis unsigned Code = Cursor.ReadCode(); 4160bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis RecordData Record; 4161bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis StringRef Blob; 4162bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis bool shouldContinue = false; 4163bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 4164bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis case INPUT_FILE: 4165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Overridden = static_cast<bool>(Record[3]); 4166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden); 4167bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis break; 4168bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis } 4169bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis if (!shouldContinue) 4170bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis break; 4171bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis } 4172bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis break; 4173bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis } 4174bdfdb1da9763b3d0966eb61e9fa0fa7804f9eb9bArgyrios Kyrtzidis 41758f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner default: 41768f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // No other validation to perform. 41778f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 41787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 41797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 41807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 41817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::isAcceptableASTFile(StringRef Filename, 41847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 41857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &LangOpts, 41867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &TargetOpts, 41877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &PPOpts) { 41887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr); 41897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return !readASTFileControlBlock(Filename, FileMgr, validator); 41907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 41917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesASTReader::ASTReadResult 41936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 41947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Enter the submodule block. 41957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 41967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed submodule block record in AST file"); 41976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 41987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 41997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 42017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool First = true; 42026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Module *CurrentModule = nullptr; 42037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 42047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 42058f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 42067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42078f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch (Entry.Kind) { 42088f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 42098f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Error: 42108f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Error("malformed block record in AST file"); 42116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 42128f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::EndBlock: 42136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Success; 42148f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Record: 42158f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // The interesting case. 42168f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 42177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42188f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 42197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 4220b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 42217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 4222b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) { 42237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: // Default behavior: ignore. 42247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 42257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_DEFINITION: { 42277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 42287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 42296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 42307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4232970e441671be130c9a12b7eda2a0b795008812a5Douglas Gregor if (Record.size() < 8) { 42337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed module definition"); 42346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 42357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4237b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Name = Blob; 4238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Idx = 0; 4239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 4240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 4241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsFramework = Record[Idx++]; 4242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsExplicit = Record[Idx++]; 4243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsSystem = Record[Idx++]; 4244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsExternC = Record[Idx++]; 4245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InferSubmodules = Record[Idx++]; 4246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InferExplicitSubmodules = Record[Idx++]; 4247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InferExportWildcard = Record[Idx++]; 4248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ConfigMacrosExhaustive = Record[Idx++]; 4249970e441671be130c9a12b7eda2a0b795008812a5Douglas Gregor 42506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Module *ParentModule = nullptr; 42516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const FileEntry *ModuleMap = nullptr; 42526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Parent) { 42537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParentModule = getSubmodule(Parent); 42546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleMap = ParentModule->ModuleMap; 42556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 42566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 42576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!F.ModuleMapPath.empty()) 42586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleMap = FileMgr.getFile(F.ModuleMapPath); 42596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 42607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Retrieve this (sub)module from the module map, creating it if 42617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // necessary. 42626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, ModuleMap, 42637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsFramework, 42647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsExplicit).first; 42657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 42667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalIndex >= SubmodulesLoaded.size() || 42677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmodulesLoaded[GlobalIndex]) { 42687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("too many submodules"); 42696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 42707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42718bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor 4272677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (!ParentModule) { 4273677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 4274677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (CurFile != F.File) { 4275677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor if (!Diags.isDiagnosticInFlight()) { 4276677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor Diag(diag::err_module_file_conflict) 4277677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << CurrentModule->getTopLevelModuleName() 4278677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << CurFile->getName() 4279677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor << F.File->getName(); 4280677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor } 42816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 42828bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } 42838bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } 4284677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor 4285677e15ffee2ecc9c1c8f46fd77cab4b5afb59640Douglas Gregor CurrentModule->setASTFile(F.File); 42868bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } 42876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 42887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->IsFromModuleFile = true; 42897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 4290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentModule->IsExternC = IsExternC; 42917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->InferSubmodules = InferSubmodules; 42927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 42937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->InferExportWildcard = InferExportWildcard; 4294970e441671be130c9a12b7eda2a0b795008812a5Douglas Gregor CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 42957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 42967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->ModuleRead(GlobalID, CurrentModule); 42977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmodulesLoaded[GlobalIndex] = CurrentModule; 4299b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 4300906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Clear out data that will be replaced by what is the module file. 4301b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor CurrentModule->LinkLibraries.clear(); 4302970e441671be130c9a12b7eda2a0b795008812a5Douglas Gregor CurrentModule->ConfigMacros.clear(); 4303906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor CurrentModule->UnresolvedConflicts.clear(); 4304906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor CurrentModule->Conflicts.clear(); 43057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_UMBRELLA_HEADER: { 43097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 43107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 43116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 43127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 43157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4317b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) { 43187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule->getUmbrellaHeader()) 43197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModMap.setUmbrellaHeader(CurrentModule, Umbrella); 43207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (CurrentModule->getUmbrellaHeader() != Umbrella) { 43216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 43226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Error("mismatched umbrella headers in submodule"); 43236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return OutOfDate; 43247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_HEADER: { 43307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 43317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 43326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 43337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 43367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 433855ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // We lazily associate headers with their modules via the HeaderInfoTable. 433955ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 434055ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // of complete filenames or remove it entirely. 43417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_EXCLUDED_HEADER: { 43457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 43467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 43476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 43487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 43517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 435355ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // We lazily associate headers with their modules via the HeaderInfoTable. 435455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 435555ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis // of complete filenames or remove it entirely. 43567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4359bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl case SUBMODULE_PRIVATE_HEADER: { 4360bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl if (First) { 4361bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl Error("missing submodule metadata record at beginning of block"); 43626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 4363bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl } 4364bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl 4365bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl if (!CurrentModule) 4366bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl break; 4367bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl 4368bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl // We lazily associate headers with their modules via the HeaderInfoTable. 4369bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 4370bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl // of complete filenames or remove it entirely. 4371bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl break; 4372bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl } 4373bc3f628815b3841dc99109e7f67f9afa7793bc94Lawrence Crowl 43747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_TOPHEADER: { 43757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 43767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 43776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 43787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 43817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4383c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis CurrentModule->addTopHeaderFilename(Blob); 43847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_UMBRELLA_DIR: { 43887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 43897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 43906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 43917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 43947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 43957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const DirectoryEntry *Umbrella 4397b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = PP.getFileManager().getDirectory(Blob)) { 43987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule->getUmbrellaDir()) 43997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModMap.setUmbrellaDir(CurrentModule, Umbrella); 44007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (CurrentModule->getUmbrellaDir() != Umbrella) { 44016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 44026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Error("mismatched umbrella directories in submodule"); 44036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return OutOfDate; 44047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_METADATA: { 44107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!First) { 44117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("submodule metadata record not at beginning of block"); 44126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 44137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei First = false; 44157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSubmoduleID = getTotalNumSubmodules(); 44177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumSubmodules = Record[0]; 44187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseSubmoduleID = Record[1]; 44197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumSubmodules > 0) { 44207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for submodules within this 44217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 44227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 44237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for submodules within this 44257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 44267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SubmoduleRemap.insertOrReplace( 44277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseSubmoduleID, 44287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSubmoduleID - LocalBaseSubmoduleID)); 44297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 44317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_IMPORTS: { 44367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 44377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 44386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 44397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 44427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 4445906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRef Unresolved; 44467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.File = &F; 44477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.Mod = CurrentModule; 44487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.ID = Record[Idx]; 4449906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.Kind = UnresolvedModuleRef::Import; 44507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.IsWildcard = false; 4451906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRefs.push_back(Unresolved); 44527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_EXPORTS: { 44577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 44587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 44596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 44607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 44637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 4466906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRef Unresolved; 44677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.File = &F; 44687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.Mod = CurrentModule; 44697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.ID = Record[Idx]; 4470906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.Kind = UnresolvedModuleRef::Export; 44717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.IsWildcard = Record[Idx + 1]; 4472906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRefs.push_back(Unresolved); 44737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Once we've loaded the set of exports, there's no reason to keep 44767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the parsed, unresolved exports around. 44777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->UnresolvedExports.clear(); 44787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_REQUIRES: { 44817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 44827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 44836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 44847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 44877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44895794b53ad5b38b53c9eaf3a172354e63081ceb2fRichard Smith CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(), 44907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getTargetInfo()); 44917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 44927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4493b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 4494b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor case SUBMODULE_LINK_LIBRARY: 4495b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (First) { 4496b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Error("missing submodule metadata record at beginning of block"); 44976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 4498b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor } 4499b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 4500b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (!CurrentModule) 4501b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor break; 4502b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 4503b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor CurrentModule->LinkLibraries.push_back( 4504b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Module::LinkLibrary(Blob, Record[0])); 4505b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor break; 450663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 450763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor case SUBMODULE_CONFIG_MACRO: 450863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (First) { 450963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Error("missing submodule metadata record at beginning of block"); 45106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 451163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 451263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 451363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!CurrentModule) 451463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 451563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 451663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor CurrentModule->ConfigMacros.push_back(Blob.str()); 451763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 4518906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 4519906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor case SUBMODULE_CONFLICT: { 4520906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (First) { 4521906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Error("missing submodule metadata record at beginning of block"); 45226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return Failure; 4523906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 4524906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 4525906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (!CurrentModule) 4526906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor break; 4527906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 4528906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRef Unresolved; 4529906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.File = &F; 4530906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.Mod = CurrentModule; 4531906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.ID = Record[0]; 4532906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.Kind = UnresolvedModuleRef::Conflict; 4533906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.IsWildcard = false; 4534906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Unresolved.String = Blob; 4535906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor UnresolvedModuleRefs.push_back(Unresolved); 4536906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor break; 4537906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 45387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 45417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Parse the record that corresponds to a LangOptions data 45437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// structure. 45447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 45457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// This routine parses the language options from the AST file and then gives 45467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// them to the AST listener if one is set. 45477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 45487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the listener deems the file unacceptable, false otherwise. 45497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseLanguageOptions(const RecordData &Record, 45507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 45517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 45527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOptions LangOpts; 45537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define LANGOPT(Name, Bits, Default, Description) \ 45557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.Name = Record[Idx++]; 45567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 45577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 45587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/LangOptions.def" 45594f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++]; 45604f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#include "clang/Basic/Sanitizers.def" 45617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 45637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 45647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 45657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Length = Record[Idx++]; 45677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.CurrentModule.assign(Record.begin() + Idx, 45687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.begin() + Idx + Length); 45696ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 45706ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko Idx += Length; 45716ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 45726ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko // Comment options. 45736ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko for (unsigned N = Record[Idx++]; N; --N) { 45746ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko LangOpts.CommentOpts.BlockCommandNames.push_back( 45756ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko ReadString(Record, Idx)); 45766ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko } 45776fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 45786ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 45797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadLanguageOptions(LangOpts, Complain); 45807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 45817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseTargetOptions(const RecordData &Record, 45837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 45847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 45857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOptions TargetOpts; 45877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.Triple = ReadString(Record, Idx); 45887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.CPU = ReadString(Record, Idx); 45897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.ABI = ReadString(Record, Idx); 45907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 45917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 45927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 45947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.Features.push_back(ReadString(Record, Idx)); 45957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadTargetOptions(TargetOpts, Complain); 45987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 45997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 46017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 46026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 46037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 46046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 46057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 46066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 46077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/DiagnosticOptions.def" 46087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 46106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 46117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 46147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 46157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 46177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 46187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileSystemOptions FSOpts; 46197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 46207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FSOpts.WorkingDir = ReadString(Record, Idx); 46217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadFileSystemOptions(FSOpts, Complain); 46227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 46237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 46257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 46267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 46277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearchOptions HSOpts; 46287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 46297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.Sysroot = ReadString(Record, Idx); 46307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Include entries. 46327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 46337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Path = ReadString(Record, Idx); 46347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei frontend::IncludeDirGroup Group 46357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 46367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsFramework = Record[Idx++]; 46377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IgnoreSysRoot = Record[Idx++]; 46387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UserEntries.push_back( 463959fd63581d6d572f23e82e81a50e0b940c8d1089Daniel Dunbar HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot)); 46407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // System header prefixes. 46437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 46447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Prefix = ReadString(Record, Idx); 46457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsSystemHeader = Record[Idx++]; 46467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.SystemHeaderPrefixes.push_back( 46477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader)); 46487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.ResourceDir = ReadString(Record, Idx); 46517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.ModuleCachePath = ReadString(Record, Idx); 4652651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 46537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.DisableModuleHash = Record[Idx++]; 46547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseBuiltinIncludes = Record[Idx++]; 46557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseStandardSystemIncludes = Record[Idx++]; 46567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseStandardCXXIncludes = Record[Idx++]; 46577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseLibcxx = Record[Idx++]; 46587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadHeaderSearchOptions(HSOpts, Complain); 46607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 46617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 46637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 46647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener, 46657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &SuggestedPredefines) { 46667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessorOptions PPOpts; 46677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 46687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Macro definitions/undefs 46707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 46717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Macro = ReadString(Record, Idx); 46727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsUndef = Record[Idx++]; 46737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 46747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Includes 46777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 46787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.Includes.push_back(ReadString(Record, Idx)); 46797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Macro Includes 46827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 46837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 46847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.UsePredefines = Record[Idx++]; 468765110caf70bc6c07c3bc223acf03643af47a6643Argyrios Kyrtzidis PPOpts.DetailedRecord = Record[Idx++]; 46887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 46897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 46907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.ObjCXXARCStandardLibrary = 46917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 46927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines.clear(); 46937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadPreprocessorOptions(PPOpts, Complain, 46947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines); 46957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 46967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<ModuleFile *, unsigned> 46987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 46997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalPreprocessedEntityMapType::iterator 47007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = GlobalPreprocessedEntityMap.find(GlobalIndex); 47017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalPreprocessedEntityMap.end() && 47027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Corrupted global preprocessed entity map"); 47037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 47047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 47057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(M, LocalIndex); 47067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator> 47097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 47107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 47117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 47127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mod.NumPreprocessedEntities); 47137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(PreprocessingRecord::iterator(), 47157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessingRecord::iterator()); 47167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator> 47197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 47207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 47217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleDeclIterator(this, &Mod, 47227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 47237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 47267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID PPID = Index+1; 47277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 47287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *PPInfo.first; 47297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = PPInfo.second; 47307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 47317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()) { 47337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("no preprocessing record"); 47346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 47367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47378f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 47388f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 47398f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 47408f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = 47418f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 47428f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) 47436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 47448f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 47457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the record. 47467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range(ReadSourceLocation(M, PPOffs.Begin), 47477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(M, PPOffs.End)); 47487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 4749b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 47507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 47517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessorDetailRecordTypes RecType = 4752b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 4753b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Entry.ID, Record, &Blob); 47547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (RecType) { 47557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_MACRO_EXPANSION: { 47567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isBuiltin = Record[0]; 47576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IdentifierInfo *Name = nullptr; 47586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MacroDefinition *Def = nullptr; 47597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isBuiltin) 47607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getLocalIdentifier(M, Record[1]); 47617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 47627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID 47637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalID = getGlobalPreprocessedEntityID(M, Record[1]); 47647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1)); 47657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 47667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroExpansion *ME; 47687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isBuiltin) 47697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ME = new (PPRec) MacroExpansion(Name, Range); 47707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 47717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ME = new (PPRec) MacroExpansion(Def, Range); 47727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ME; 47747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 47757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_MACRO_DEFINITION: { 47777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Decode the identifier info and then check again; if the macro is 47787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // still defined and associated with the identifier, 47797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 47807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinition *MD 47817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = new (PPRec) MacroDefinition(II, Range); 47827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 47847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->MacroDefinitionRead(PPID, MD); 47857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return MD; 47877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 47887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_INCLUSION_DIRECTIVE: { 4790b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const char *FullFileNameStart = Blob.data() + Record[0]; 4791b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 47926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const FileEntry *File = nullptr; 47937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FullFileName.empty()) 47947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File = PP.getFileManager().getFile(FullFileName); 47957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 47967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Stable encoding 47977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InclusionDirective::InclusionKind Kind 47987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<InclusionDirective::InclusionKind>(Record[2]); 47997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InclusionDirective *ID 48007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = new (PPRec) InclusionDirective(PPRec, Kind, 4801b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef(Blob.data(), Record[0]), 48027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[1], Record[3], 48037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File, 48047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Range); 48057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ID; 48067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 48107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief \arg SLocMapI points at a chunk of a module that contains no 48137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// preprocessed entities or the entities it contains are not the ones we are 48147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// looking for. Find the next module that contains entities and return the ID 48157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// of the first entry. 48167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntityID ASTReader::findNextPreprocessedEntity( 48177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 48187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++SLocMapI; 48197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (GlobalSLocOffsetMapType::const_iterator 48207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 48217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *SLocMapI->second; 48227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M.NumPreprocessedEntities) 48237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return M.BasePreprocessedEntityID; 48247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getTotalNumPreprocessedEntities(); 48277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 48307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate <unsigned PPEntityOffset::*PPLoc> 48327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct PPEntityComp { 48337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader &Reader; 48347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M; 48357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 48377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 48397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLoc(L); 48407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLoc(R); 48417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 48427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 48457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLoc(L); 48467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 48477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 48507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLoc(R); 48517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 48527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation getLoc(const PPEntityOffset &PPE) const { 48557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.ReadSourceLocation(M, PPE.*PPLoc); 48567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 48587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesPreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 48626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool EndsAfter) const { 48636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (SourceMgr.isLocalSourceLocation(Loc)) 48647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getTotalNumPreprocessedEntities(); 48657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 48676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 48687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(SLocMapI != GlobalSLocOffsetMap.end() && 48697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Corrupted global sloc offset map"); 48707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SLocMapI->second->NumPreprocessedEntities == 0) 48727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return findNextPreprocessedEntity(SLocMapI); 48737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *SLocMapI->second; 48757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei typedef const PPEntityOffset *pp_iterator; 48767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator pp_begin = M.PreprocessedEntityOffsets; 48777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 48787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t Count = M.NumPreprocessedEntities; 48807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t Half; 48817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator First = pp_begin; 48827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator PPI; 48837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (EndsAfter) { 48856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PPI = std::upper_bound(pp_begin, pp_end, Loc, 48866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PPEntityComp<&PPEntityOffset::Begin>(*this, M)); 48876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else { 48886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Do a binary search manually instead of using std::lower_bound because 48896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // The end locations of entities may be unordered (when a macro expansion 48906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // is inside another macro argument), but for this case it is not important 48916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // whether we get the first macro expansion or its containing macro. 48926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (Count > 0) { 48936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Half = Count / 2; 48946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PPI = First; 48956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::advance(PPI, Half); 48966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End), 48976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Loc)) { 48986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines First = PPI; 48996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ++First; 49006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Count = Count - Half - 1; 49016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else 49026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Count = Half; 49036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 49047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 49057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PPI == pp_end) 49077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return findNextPreprocessedEntity(SLocMapI); 49087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return M.BasePreprocessedEntityID + (PPI - pp_begin); 49107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 49117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Returns a pair of [Begin, End) indices of preallocated 49137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// preprocessed entities that \arg Range encompasses. 49147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 49157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 49167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Range.isInvalid()) 49177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(0,0); 49187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 49197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PreprocessedEntityID BeginID = 49216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines findPreprocessedEntity(Range.getBegin(), false); 49226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 49237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(BeginID, EndID); 49247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 49257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Optionally returns true or false if the preallocated preprocessed 49277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// entity with index \arg Index came from file \arg FID. 4928dc84cd5efdd3430efb22546b4ac656aa0540b210David BlaikieOptional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 49297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileID FID) { 49307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FID.isInvalid()) 49317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 49327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 49347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *PPInfo.first; 49357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = PPInfo.second; 49367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 49377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin); 49397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid()) 49407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 49417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 49437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 49447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 49457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 49467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 49477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 49497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Visitor used to search for information about a header file. 49507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class HeaderFileInfoVisitor { 49517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FileEntry *FE; 49527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4953dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<HeaderFileInfo> HFI; 49547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 495636592b1fa381a978b1b6d4b97c66fb274915fe50Argyrios Kyrtzidis explicit HeaderFileInfoVisitor(const FileEntry *FE) 495736592b1fa381a978b1b6d4b97c66fb274915fe50Argyrios Kyrtzidis : FE(FE) { } 49587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 49607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoVisitor *This 49617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<HeaderFileInfoVisitor *>(UserData); 49627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoLookupTable *Table 49647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 49657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Table) 49667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 49677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Look in the on-disk hash table for an entry for this file name. 4969ed3802e5da6e7d41975b1cb3d7ae3a3b9e855d10Argyrios Kyrtzidis HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE); 49707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == Table->end()) 49717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 49727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->HFI = *Pos; 49747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 49757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 49767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4977dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 49787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 49797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 49807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 498236592b1fa381a978b1b6d4b97c66fb274915fe50Argyrios Kyrtzidis HeaderFileInfoVisitor Visitor(FE); 49837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor); 4984f9ba851c9b5db8ea30846215e737702a1cc2c194Argyrios Kyrtzidis if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 49857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return *HFI; 49867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return HeaderFileInfo(); 49887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 49897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 49917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Make it work properly with modules. 4992cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 49937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 49947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *(*I); 49957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 49967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagStates.clear(); 49977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!Diag.DiagStates.empty()); 49987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 49997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Idx < F.PragmaDiagMappings.size()) { 50007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 50017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 50027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DiagStateID != 0) { 50037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag.DiagStatePoints.push_back( 50047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 50057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FullSourceLoc(Loc, SourceMgr))); 50067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 50077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(DiagStateID == 0); 50107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A new DiagState was created here. 50117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 50127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 50137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagStates.push_back(NewState); 50147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag.DiagStatePoints.push_back( 50157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine::DiagStatePoint(NewState, 50167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FullSourceLoc(Loc, SourceMgr))); 50177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (1) { 50187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Idx < F.PragmaDiagMappings.size() && 50197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Invalid data, didn't find '-1' marking end of diag/map pairs"); 50207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Idx >= F.PragmaDiagMappings.size()) { 50217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; // Something is messed up but at least avoid infinite loop in 50227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // release build. 50237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = F.PragmaDiagMappings[Idx++]; 50257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DiagID == (unsigned)-1) { 50267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; // no more diag/map pairs for this location. 50277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5028ef8225444452a1486bd721f3285301fe84643b00Stephen Hines diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++]; 5029ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc); 5030ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Diag.GetCurDiagState()->setMapping(DiagID, Mapping); 50317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Get the correct cursor and offset for loading a type. 50377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 50387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 50397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 50407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 50417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 50427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read and return the type with the given index.. 50457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 50467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// The index is the type ID, shifted and minus the number of predefs. This 50477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// routine actually reads the record corresponding to the type at the given 50487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// location. It is a helper routine for GetType, which deals with reading type 50497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// IDs. 50507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiQualType ASTReader::readTypeRecord(unsigned Index) { 50517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Loc = TypeCursorForIndex(Index); 50528f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 50537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Keep track of where we are in the stream, then jump back there 50557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // after reading this type. 50567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(DeclsCursor); 50577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadingKindTracker ReadingKind(Read_Type, *this); 50597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading a type record. 50617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing AType(this); 50627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 50647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclsCursor.JumpToBit(Loc.Offset); 50657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 50667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = DeclsCursor.ReadCode(); 5067b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 50687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_EXT_QUAL: { 50697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 50707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of extended qualifier type"); 50717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 50727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Base = readType(*Loc.F, Record, Idx); 50747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 50757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getQualifiedType(Base, Quals); 50767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_COMPLEX: { 50797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 50807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of complex type"); 50817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 50827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElemType = readType(*Loc.F, Record, Idx); 50847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getComplexType(ElemType); 50857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_POINTER: { 50887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 50897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of pointer type"); 50907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 50917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 50937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getPointerType(PointeeType); 50947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 509612df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case TYPE_DECAYED: { 509712df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner if (Record.size() != 1) { 509812df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner Error("Incorrect encoding of decayed type"); 509912df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return QualType(); 510012df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner } 510112df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner QualType OriginalType = readType(*Loc.F, Record, Idx); 510212df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner QualType DT = Context.getAdjustedParameterType(OriginalType); 510312df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner if (!isa<DecayedType>(DT)) 510412df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner Error("Decayed type does not decay"); 510512df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner return DT; 510612df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner } 510712df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner 5108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case TYPE_ADJUSTED: { 5109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Record.size() != 2) { 5110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Error("Incorrect encoding of adjusted type"); 5111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return QualType(); 5112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 5113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType OriginalTy = readType(*Loc.F, Record, Idx); 5114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType AdjustedTy = readType(*Loc.F, Record, Idx); 5115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Context.getAdjustedType(OriginalTy, AdjustedTy); 5116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 5117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 51187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_BLOCK_POINTER: { 51197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 51207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of block pointer type"); 51217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 51227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 51247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getBlockPointerType(PointeeType); 51257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_LVALUE_REFERENCE: { 51287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 51297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of lvalue reference type"); 51307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 51317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 51337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getLValueReferenceType(PointeeType, Record[1]); 51347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_RVALUE_REFERENCE: { 51377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 51387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of rvalue reference type"); 51397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 51407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 51427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getRValueReferenceType(PointeeType); 51437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_MEMBER_POINTER: { 51467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 51477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of member pointer type"); 51487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 51497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 51517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ClassType = readType(*Loc.F, Record, Idx); 51527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PointeeType.isNull() || ClassType.isNull()) 51537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 51547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 51567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_CONSTANT_ARRAY: { 51597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 51607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 51617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[2]; 51627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 3; 51637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt Size = ReadAPInt(Record, Idx); 51647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getConstantArrayType(ElementType, Size, 51657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASM, IndexTypeQuals); 51667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_INCOMPLETE_ARRAY: { 51697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 51707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 51717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[2]; 51727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 51737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_VARIABLE_ARRAY: { 51767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 51777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 51787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[2]; 51797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 51807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 51817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 51827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASM, IndexTypeQuals, 51837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange(LBLoc, RBLoc)); 51847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_VECTOR: { 51877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 3) { 51887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of vector type in AST file"); 51897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 51907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 51937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumElements = Record[1]; 51947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VecKind = Record[2]; 51957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getVectorType(ElementType, NumElements, 51967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (VectorType::VectorKind)VecKind); 51977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_EXT_VECTOR: { 52007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 3) { 52017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of extended vector type in AST file"); 52027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 52037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 52067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumElements = Record[1]; 52077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getExtVectorType(ElementType, NumElements); 52087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_FUNCTION_NO_PROTO: { 52117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 6) { 52127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of no-proto function type"); 52137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 52147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ResultType = readType(*Loc.F, Record, Idx); 52167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 52177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (CallingConv)Record[4], Record[5]); 52187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getFunctionNoProtoType(ResultType, Info); 52197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_FUNCTION_PROTO: { 52227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ResultType = readType(*Loc.F, Record, Idx); 52237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionProtoType::ExtProtoInfo EPI; 52257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 52267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*hasregparm*/ Record[2], 52277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*regparm*/ Record[3], 52287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<CallingConv>(Record[4]), 52297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*produces*/ Record[5]); 52307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 6; 52327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumParams = Record[Idx++]; 52337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<QualType, 16> ParamTypes; 52347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumParams; ++I) 52357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 52367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.Variadic = Record[Idx++]; 52387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.HasTrailingReturn = Record[Idx++]; 52397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.TypeQuals = Record[Idx++]; 52407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 5241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVector<QualType, 8> ExceptionStorage; 5242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines readExceptionSpec(*Loc.F, ExceptionStorage, EPI, Record, Idx); 5243bea522ff43a3f11c7a2bc7949119dbb9fce19e39Jordan Rose return Context.getFunctionType(ResultType, ParamTypes, EPI); 52447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_UNRESOLVED_USING: { 52477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 52487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypeDeclType( 52497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 52507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TYPEDEF: { 52537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 52547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of typedef type"); 52557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 52567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 52587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 52597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Canonical = readType(*Loc.F, Record, Idx); 52607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Canonical.isNull()) 52617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Canonical = Context.getCanonicalType(Canonical); 52627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypedefType(Decl, Canonical); 52637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TYPEOF_EXPR: 52667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 52677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TYPEOF: { 52697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 52707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of typeof(type) in AST file"); 52717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 52727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnderlyingType = readType(*Loc.F, Record, Idx); 52747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypeOfType(UnderlyingType); 52757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DECLTYPE: { 52787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnderlyingType = readType(*Loc.F, Record, Idx); 52797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 52807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_UNARY_TRANSFORM: { 52837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType BaseType = readType(*Loc.F, Record, Idx); 52847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnderlyingType = readType(*Loc.F, Record, Idx); 52857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 52867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 52877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5289a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith case TYPE_AUTO: { 5290a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith QualType Deduced = readType(*Loc.F, Record, Idx); 5291a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith bool IsDecltypeAuto = Record[Idx++]; 5292dc7a4f5d7a7e3b60d4dc4a80338d7a2728540998Richard Smith bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 5293152b4e4652baedfceba1cd8115515629225e713fManuel Klimek return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent); 5294a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith } 52957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_RECORD: { 52977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 52987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of record type"); 52997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 53007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsDependent = Record[Idx++]; 53037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 53047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 53057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = Context.getRecordType(RD); 53067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 53077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 53087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ENUM: { 53117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 53127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of enum type"); 53137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 53147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsDependent = Record[Idx++]; 53177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T 53187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 53197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 53207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 53217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ATTRIBUTED: { 53247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 3) { 53257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of attributed type"); 53267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 53277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType modifiedType = readType(*Loc.F, Record, Idx); 53297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType equivalentType = readType(*Loc.F, Record, Idx); 53307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 53317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getAttributedType(kind, modifiedType, equivalentType); 53327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_PAREN: { 53357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 53367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of paren type"); 53377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 53387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType InnerType = readType(*Loc.F, Record, Idx); 53407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getParenType(InnerType); 53417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_PACK_EXPANSION: { 53447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 53457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of pack expansion type"); 53467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 53477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Pattern = readType(*Loc.F, Record, Idx); 53497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pattern.isNull()) 53507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 5351dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<unsigned> NumExpansions; 53527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[1]) 53537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumExpansions = Record[1] - 1; 53547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getPackExpansionType(Pattern, NumExpansions); 53557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ELABORATED: { 53587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 53607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 53617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType NamedType = readType(*Loc.F, Record, Idx); 53627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getElaboratedType(Keyword, NNS, NamedType); 53637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OBJC_INTERFACE: { 53667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ItfD 53687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 53697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 53707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OBJC_OBJECT: { 53737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Base = readType(*Loc.F, Record, Idx); 53757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumProtos = Record[Idx++]; 53767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<ObjCProtocolDecl*, 4> Protos; 53777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumProtos; ++I) 53787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 53797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCObjectType(Base, Protos.data(), NumProtos); 53807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OBJC_OBJECT_POINTER: { 53837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Pointee = readType(*Loc.F, Record, Idx); 53857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCObjectPointerType(Pointee); 53867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 53897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Parm = readType(*Loc.F, Record, Idx); 53917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Replacement = readType(*Loc.F, Record, Idx); 5392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Context.getSubstTemplateTypeParmType( 5393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<TemplateTypeParmType>(Parm), 5394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Context.getCanonicalType(Replacement)); 53957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 53987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 53997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Parm = readType(*Loc.F, Record, Idx); 54007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 54017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getSubstTemplateTypeParmPackType( 54027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<TemplateTypeParmType>(Parm), 54037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArgPack); 54047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_INJECTED_CLASS_NAME: { 54077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 54087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 54097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 54107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for AST reading, too much interdependencies. 54116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const Type *T; 54126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (const Type *Existing = D->getTypeForDecl()) 54136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T = Existing; 54146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else if (auto *Prev = D->getPreviousDecl()) 54156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T = Prev->getTypeForDecl(); 54166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else 54176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); 54186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return QualType(T, 0); 54197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TEMPLATE_TYPE_PARM: { 54227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 54237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Depth = Record[Idx++]; 54247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = Record[Idx++]; 54257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Pack = Record[Idx++]; 54267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateTypeParmDecl *D 54277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 54287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 54297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DEPENDENT_NAME: { 54327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 54337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 54347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 54357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 54367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Canon = readType(*Loc.F, Record, Idx); 54377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Canon.isNull()) 54387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Canon = Context.getCanonicalType(Canon); 54397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentNameType(Keyword, NNS, Name, Canon); 54407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 54437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 54447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 54457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 54467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 54477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = Record[Idx++]; 54487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<TemplateArgument, 8> Args; 54497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.reserve(NumArgs); 54507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumArgs--) 54517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 54527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 54537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.size(), Args.data()); 54547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DEPENDENT_SIZED_ARRAY: { 54577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 54587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ArrayType 54607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 54617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM 54627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ArrayType::ArraySizeModifier)Record[Idx++]; 54637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[Idx++]; 54647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // DependentSizedArrayType 54667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Expr *NumElts = ReadExpr(*Loc.F); 54677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 54687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 54707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IndexTypeQuals, Brackets); 54717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TEMPLATE_SPECIALIZATION: { 54747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 54757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsDependent = Record[Idx++]; 54767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 54777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<TemplateArgument, 8> Args; 54787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 54797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Underlying = readType(*Loc.F, Record, Idx); 54807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T; 54817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Underlying.isNull()) 54827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 54837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.size()); 54847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 54857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getTemplateSpecializationType(Name, Args.data(), 54867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.size(), Underlying); 54877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 54887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 54897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ATOMIC: { 54927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 54937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of atomic type"); 54947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 54957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ValueType = readType(*Loc.F, Record, Idx); 54977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getAtomicType(ValueType); 54987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid TypeCode!"); 55017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ASTReader::readExceptionSpec(ModuleFile &ModuleFile, 5504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVectorImpl<QualType> &Exceptions, 5505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FunctionProtoType::ExtProtoInfo &EPI, 5506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const RecordData &Record, unsigned &Idx) { 5507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ExceptionSpecificationType EST = 5508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_cast<ExceptionSpecificationType>(Record[Idx++]); 5509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EPI.ExceptionSpecType = EST; 5510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (EST == EST_Dynamic) { 5511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EPI.NumExceptions = Record[Idx++]; 5512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0; I != EPI.NumExceptions; ++I) 5513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Exceptions.push_back(readType(ModuleFile, Record, Idx)); 5514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EPI.Exceptions = Exceptions.data(); 5515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (EST == EST_ComputedNoexcept) { 5516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EPI.NoexceptExpr = ReadExpr(ModuleFile); 5517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (EST == EST_Uninstantiated) { 5518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EPI.ExceptionSpecTemplate = 5520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (EST == EST_Unevaluated) { 5522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 5524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 5525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 55267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 55277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 55287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F; 55297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader::RecordData &Record; 55307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx; 55317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 55337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &I) { 55347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.ReadSourceLocation(F, R, I); 55357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei template<typename T> 55387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { 55397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.ReadDeclAs<T>(F, Record, Idx); 55407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic: 55437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeLocReader(ASTReader &Reader, ModuleFile &F, 55447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader::RecordData &Record, unsigned &Idx) 55457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), F(F), Record(Record), Idx(Idx) 55467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei { } 55477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want compile-time assurance that we've enumerated all of 55497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // these, so unfortunately we have to declare them first, then 55507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // define them out-of-line. 55517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPELOC(CLASS, PARENT) 55527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPELOC(CLASS, PARENT) \ 55537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 55547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeLocNodes.def" 55557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void VisitFunctionTypeLoc(FunctionTypeLoc); 55577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void VisitArrayTypeLoc(ArrayTypeLoc); 55587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 55597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 55617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // nothing to do 55627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 55647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setBuiltinLoc(ReadSourceLocation(Record, Idx)); 55657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TL.needsExtraLocalData()) { 55667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 55677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 55687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 55697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setModeAttr(Record[Idx++]); 55707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 55737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 55747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 55767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setStarLoc(ReadSourceLocation(Record, Idx)); 55777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 557812df246d6dea2ee1f92c186f922f1afcf499647aReid Klecknervoid TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 557912df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner // nothing to do 558012df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner} 5581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 5582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // nothing to do 5583651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 55847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 55857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setCaretLoc(ReadSourceLocation(Record, Idx)); 55867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 55887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAmpLoc(ReadSourceLocation(Record, Idx)); 55897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 55917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 55927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 55947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setStarLoc(ReadSourceLocation(Record, Idx)); 55957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 55967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 55987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLBracketLoc(ReadSourceLocation(Record, Idx)); 55997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRBracketLoc(ReadSourceLocation(Record, Idx)); 56007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Idx++]) 56017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setSizeExpr(Reader.ReadExpr(F)); 56027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 56036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TL.setSizeExpr(nullptr); 56047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 56067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 56077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 56097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 56107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 56127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 56137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentSizedArrayTypeLoc( 56157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentSizedArrayTypeLoc TL) { 56167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 56177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 56197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentSizedExtVectorTypeLoc TL) { 56207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 56237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 56267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 56297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx)); 56307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 56317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 56327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); 5633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 5634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx)); 56357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 56367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 56387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitFunctionTypeLoc(TL); 56397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 56417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitFunctionTypeLoc(TL); 56427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 56447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 56477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 56507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 56517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 56527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 56537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 56557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 56567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 56577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 56587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 56597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 56617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 56647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setKWLoc(ReadSourceLocation(Record, Idx)); 56657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 56667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 56677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 56687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 56707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 56737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 56767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 56797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrNameLoc(ReadSourceLocation(Record, Idx)); 56807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TL.hasAttrOperand()) { 56817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange range; 56827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei range.setBegin(ReadSourceLocation(Record, Idx)); 56837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei range.setEnd(ReadSourceLocation(Record, Idx)); 56847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrOperandParensRange(range); 56857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 56867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TL.hasAttrExprOperand()) { 56877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Idx++]) 56887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrExprOperand(Reader.ReadExpr(F)); 56897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 56906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TL.setAttrExprOperand(nullptr); 56917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (TL.hasAttrEnumOperand()) 56927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx)); 56937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 56957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 56967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 56987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubstTemplateTypeParmTypeLoc TL) { 56997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 57007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 57027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubstTemplateTypeParmPackTypeLoc TL) { 57037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 57047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTemplateSpecializationTypeLoc( 57067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateSpecializationTypeLoc TL) { 57077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 57087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 57097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 57107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 57117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 57127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setArgLocInfo(i, 57137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.GetTemplateArgumentLocInfo(F, 57147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.getTypePtr()->getArg(i).getKind(), 57157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record, Idx)); 57167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 57187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 57197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 57207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 57227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 57237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 57247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 57267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 57277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 57297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 57307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 57317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 57327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 57347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentTemplateSpecializationTypeLoc TL) { 57357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 57367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 57377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 57387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 57397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 57407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 57417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 57427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setArgLocInfo(I, 57437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.GetTemplateArgumentLocInfo(F, 57447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.getTypePtr()->getArg(I).getKind(), 57457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record, Idx)); 57467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 57487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setEllipsisLoc(ReadSourceLocation(Record, Idx)); 57497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 57517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 57527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 57547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setHasBaseTypeAsWritten(Record[Idx++]); 57557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 57567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 57577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 57587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx)); 57597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 57617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setStarLoc(ReadSourceLocation(Record, Idx)); 57627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 57647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setKWLoc(ReadSourceLocation(Record, Idx)); 57657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 57667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 57677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F, 57707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 57717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 57727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType InfoTy = readType(F, Record, Idx); 57737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (InfoTy.isNull()) 57746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 57757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 57777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeLocReader TLR(*this, F, Record, Idx); 57787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 57797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TLR.Visit(TL); 57807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TInfo; 57817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiQualType ASTReader::GetType(TypeID ID) { 57847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FastQuals = ID & Qualifiers::FastMask; 57857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID >> Qualifiers::FastWidth; 57867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index < NUM_PREDEF_TYPE_IDS) { 57887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T; 57897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch ((PredefinedTypeIDs)Index) { 57907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_NULL_ID: return QualType(); 57917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break; 57927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break; 57937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR_U_ID: 57957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR_S_ID: 57967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Check that the signedness of CharTy is correct! 57977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.CharTy; 57987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 57997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break; 58017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break; 58027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break; 58037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break; 58047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break; 58057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break; 58067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break; 58077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break; 58087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break; 58097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_INT_ID: T = Context.IntTy; break; 58107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break; 58117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break; 58127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break; 58137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break; 58147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break; 58157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break; 58167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break; 58177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break; 58187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break; 58197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break; 58207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break; 58217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break; 58227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break; 58237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break; 58247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break; 58257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break; 58267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break; 58277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break; 5828b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break; 5829b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break; 5830b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break; 5831b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break; 5832b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break; 5833b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break; 583421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break; 5835e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break; 58367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break; 58377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_AUTO_RREF_DEDUCT: 58397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getAutoRRefDeductType(); 58407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 58417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 58437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.ARCUnbridgedCastTy; 58447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 58457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_VA_LIST_TAG: 58477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getVaListTagType(); 58487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 58497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_BUILTIN_FN: 58517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.BuiltinFnTy; 58527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 58537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!T.isNull() && "Unknown predefined type"); 58567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T.withFastQualifiers(FastQuals); 58577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Index -= NUM_PREDEF_TYPE_IDS; 58607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Index < TypesLoaded.size() && "Type index out-of-range"); 58617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypesLoaded[Index].isNull()) { 58627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded[Index] = readTypeRecord(Index); 58637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypesLoaded[Index].isNull()) 58647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 58657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded[Index]->setFromAST(); 58677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 58687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 58697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded[Index]); 58707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TypesLoaded[Index].withFastQualifiers(FastQuals); 58737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 58747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiQualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 58767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GetType(getGlobalTypeID(F, LocalID)); 58777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 58787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::TypeID 58807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 58817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FastQuals = LocalID & Qualifiers::FastMask; 58827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 58837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalIndex < NUM_PREDEF_TYPE_IDS) 58857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 58867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 58887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 58897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 58907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned GlobalIndex = LocalIndex + I->second; 58927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 58937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 58947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateArgumentLocInfo 58967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 58977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument::ArgKind Kind, 58987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 58997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Index) { 59007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 59017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Expression: 59027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadExpr(F); 59037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Type: 59047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GetTypeSourceInfo(F, Record, Index); 59057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Template: { 59067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 59077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Index); 59087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 59097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 59107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation()); 59117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 59127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::TemplateExpansion: { 59137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 59147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Index); 59157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 59167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 59177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 59187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EllipsisLoc); 59197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 59207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Null: 59217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Integral: 59227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Declaration: 59237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::NullPtr: 59247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Pack: 59257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Is this right? 59267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLocInfo(); 59277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 59287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("unexpected template argument loc"); 59297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 59307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateArgumentLoc 59327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 59337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Index) { 59347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 59357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Arg.getKind() == TemplateArgument::Expression) { 59377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Index++]) // bool InfoHasSameExpr. 59387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 59397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 59407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 59417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record, Index)); 59427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 59437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5944c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanellaconst ASTTemplateArgumentListInfo* 5945c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea ZaffanellaASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 5946c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella const RecordData &Record, 5947c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella unsigned &Index) { 5948c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 5949c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 5950c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella unsigned NumArgsAsWritten = Record[Index++]; 5951c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 5952c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella for (unsigned i = 0; i != NumArgsAsWritten; ++i) 5953c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 5954c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 5955c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella} 5956c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella 59577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDecl *ASTReader::GetExternalDecl(uint32_t ID) { 59587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GetDecl(ID); 59597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 59607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ASTReader::CompleteRedeclChain(const Decl *D) { 59626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (NumCurrentElementsDeserializing) { 59636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // We arrange to not care about the complete redeclaration chain while we're 59646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // deserializing. Just remember that the AST has marked this one as complete 59656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // but that it's not actually complete yet, so we know we still need to 59666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // complete it later. 59676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 59686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 59696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 59706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 59716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 59726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 59736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Recursively ensure that the decl context itself is complete 59746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // (in particular, this matters if the decl context is a namespace). 59756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // 59766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: This should be performed by lookup instead of here. 59776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines cast<Decl>(DC)->getMostRecentDecl(); 59786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 59796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If this is a named declaration, complete it by looking it up 59806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // within its context. 59816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // 59826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: We don't currently handle the cases where we can't do this; 59836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // merging a class definition that contains unnamed entities should merge 59846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // those entities. Likewise, merging a function definition should merge 59856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // all mergeable entities within it. 59866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 59876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 59886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 59896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto *II = Name.getAsIdentifierInfo(); 59906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isa<TranslationUnitDecl>(DC) && II) { 59916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Outside of C++, we don't have a lookup table for the TU, so update 59926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // the identifier instead. In C++, either way should work fine. 59936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (II->isOutOfDate()) 59946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines updateOutOfDateIdentifier(*II); 59956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else 59966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DC->lookup(Name); 59976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 59986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 59996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 60006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 60016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesuint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, 60026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const RecordData &Record, 60036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned &Idx) { 60046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) { 60056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Error("malformed AST file: missing C++ base specifier"); 60067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 60076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 60086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 60097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalID = Record[Idx++]; 60107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]); 60117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 60147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Loc = getLocalBitOffset(Offset); 60158f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor = Loc.F->DeclsCursor; 60167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 60177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Loc.Offset); 60187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadingKindTracker ReadingKind(Read_Decl, *this); 60197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 60207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 6021b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Cursor.readRecord(Code, Record); 60227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 60236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Error("malformed AST file: missing C++ base specifiers"); 60246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 60257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 60287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumBases = Record[Idx++]; 60297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 60307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 60317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumBases; ++I) 60327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 60337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Bases; 60347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::DeclID 60377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 60387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_DECL_IDS) 60397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 60407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 60427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 60437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 60447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 60467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 60497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M) const { 60507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID); 60517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 60527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return &M == I->second; 60537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60555a04f9fc2b000da98fd903c8156034304bdadb2fDouglas GregorModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 60567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!D->isFromASTFile()) 60576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 60587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 60597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 60607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return I->second; 60617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 60647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID < NUM_PREDEF_DECL_IDS) 60657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SourceLocation(); 60666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 60677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - NUM_PREDEF_DECL_IDS; 60687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index > DeclsLoaded.size()) { 60707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("declaration ID out-of-range for AST file"); 60717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SourceLocation(); 60727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 60747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Decl *D = DeclsLoaded[Index]) 60757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return D->getLocation(); 60767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RawLocation = 0; 60787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Rec = DeclCursorForID(ID, RawLocation); 60797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadSourceLocation(*Rec.F, RawLocation); 60807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDecl *ASTReader::GetExistingDecl(DeclID ID) { 60836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (ID < NUM_PREDEF_DECL_IDS) { 60847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch ((PredefinedDeclIDs)ID) { 60857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_NULL_ID: 60866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 60876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 60887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_TRANSLATION_UNIT_ID: 60897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTranslationUnitDecl(); 60906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 60917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_ID_ID: 60927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCIdDecl(); 60937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_SEL_ID: 60957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCSelDecl(); 60967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_CLASS_ID: 60987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCClassDecl(); 60996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_PROTOCOL_ID: 61017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCProtocolDecl(); 61026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_INT_128_ID: 61047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getInt128Decl(); 61057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_UNSIGNED_INT_128_ID: 61077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getUInt128Decl(); 61086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 61107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCInstanceTypeDecl(); 61117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_BUILTIN_VA_LIST_ID: 61137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getBuiltinVaListDecl(); 61147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - NUM_PREDEF_DECL_IDS; 61187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index >= DeclsLoaded.size()) { 61207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(0 && "declaration ID out-of-range for AST file"); 61217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("declaration ID out-of-range for AST file"); 61226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 61237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return DeclsLoaded[Index]; 61266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 61276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesDecl *ASTReader::GetDecl(DeclID ID) { 61296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (ID < NUM_PREDEF_DECL_IDS) 61306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return GetExistingDecl(ID); 61316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned Index = ID - NUM_PREDEF_DECL_IDS; 61336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Index >= DeclsLoaded.size()) { 61356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(0 && "declaration ID out-of-range for AST file"); 61366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Error("declaration ID out-of-range for AST file"); 61376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 61386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 61396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 61407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DeclsLoaded[Index]) { 61417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadDeclRecord(ID); 61427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 61437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 61447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DeclsLoaded[Index]; 61477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 61507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclID GlobalID) { 61517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalID < NUM_PREDEF_DECL_IDS) 61527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GlobalID; 61537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 61557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 61567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *Owner = I->second; 61577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 61597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.GlobalToLocalDeclIDs.find(Owner); 61607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == M.GlobalToLocalDeclIDs.end()) 61617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 61627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GlobalID - Owner->BaseDeclID + Pos->second; 61647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 61677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 61687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 61697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Idx >= Record.size()) { 61707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Corrupted AST file"); 61717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 61727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getGlobalDeclID(F, Record[Idx++]); 61757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Resolve the offset of a statement into a statement. 61787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 61797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// This operation will read a new statement from the external 61807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// source each time it is called, and is meant to be used via a 61817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 61827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 61837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Switch case IDs are per Decl. 61847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClearSwitchCaseIDs(); 61857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Offset here is a global offset across the entire chain. 61877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Loc = getLocalBitOffset(Offset); 61887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 61897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadStmtFromStream(*Loc.F); 61907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 61937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class FindExternalLexicalDeclsVisitor { 61947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 61957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC; 61967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool (*isKindWeWant)(Decl::Kind); 61977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl*> &Decls; 61997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool PredefsVisited[NUM_PREDEF_DECL_IDS]; 62007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 62027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC, 62037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool (*isKindWeWant)(Decl::Kind), 62047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl*> &Decls) 62057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls) 62067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei { 62077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I) 62087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PredefsVisited[I] = false; 62097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, bool Preorder, void *UserData) { 62127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Preorder) 62137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 62147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FindExternalLexicalDeclsVisitor *This 62167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<FindExternalLexicalDeclsVisitor *>(UserData); 62177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile::DeclContextInfosMap::iterator Info 62197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.DeclContextInfos.find(This->DC); 62207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls) 62217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 62227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load all of the declaration IDs 62247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (const KindDeclIDPair *ID = Info->second.LexicalDecls, 62257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *IDE = ID + Info->second.NumLexicalDecls; 62267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID != IDE; ++ID) { 62277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first)) 62287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 62297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't add predefined declarations to the lexical context more 62317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // than once. 62327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->second < NUM_PREDEF_DECL_IDS) { 62337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (This->PredefsVisited[ID->second]) 62347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 62357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->PredefsVisited[ID->second] = true; 62377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) { 62407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!This->DC->isDeclInLexicalTraversal(D)) 62417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Decls.push_back(D); 62427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 62467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 62487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 62497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC, 62517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool (*isKindWeWant)(Decl::Kind), 62527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl*> &Decls) { 62537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // There might be lexical decls in multiple modules, for the TU at 62547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // least. Walk all of the modules in the order they were loaded. 62557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls); 62567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor); 62577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumLexicalDeclContextsRead; 62587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ELR_Success; 62597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 62607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 62627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass DeclIDComp { 62647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 62657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &Mod; 62667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic: 62687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 62697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(LocalDeclID L, LocalDeclID R) const { 62717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLocation(L); 62727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLocation(R); 62737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 62747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(SourceLocation LHS, LocalDeclID R) const { 62777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLocation(R); 62787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 62797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(LocalDeclID L, SourceLocation RHS) const { 62827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLocation(L); 62837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 62847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation getLocation(LocalDeclID ID) const { 62877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().getFileLoc( 62887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 62897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 62917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 62937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::FindFileRegionDecls(FileID File, 62957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Offset, unsigned Length, 62967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl *> &Decls) { 62977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = getSourceManager(); 62987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 63007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I == FileDeclIDs.end()) 63017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 63027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileDeclsInfo &DInfo = I->second; 63047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DInfo.Decls.empty()) 63057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 63067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation 63087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 63097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 63107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclIDComp DIDComp(*this, *DInfo.Mod); 63127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<serialization::LocalDeclID>::iterator 63137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 63147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BeginLoc, DIDComp); 63157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BeginIt != DInfo.Decls.begin()) 63167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --BeginIt; 63177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we are pointing at a top-level decl inside an objc container, we need 63197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // to backtrack until we find it otherwise we will fail to report that the 63207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // region overlaps with an objc container. 63217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (BeginIt != DInfo.Decls.begin() && 63227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 63237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->isTopLevelDeclInObjCContainer()) 63247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --BeginIt; 63257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<serialization::LocalDeclID>::iterator 63277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 63287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EndLoc, DIDComp); 63297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (EndIt != DInfo.Decls.end()) 63307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++EndIt; 63317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ArrayRef<serialization::LocalDeclID>::iterator 63337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIt = BeginIt; DIt != EndIt; ++DIt) 63347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 63357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 63387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief ModuleFile visitor used to perform name lookup into a 63397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// declaration context. 63407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class DeclContextNameLookupVisitor { 63417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 6342cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<const DeclContext *> &Contexts; 63437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name; 63447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<NamedDecl *> &Decls; 63457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 63477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextNameLookupVisitor(ASTReader &Reader, 63487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<const DeclContext *> &Contexts, 63497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name, 63507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<NamedDecl *> &Decls) 63517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { } 63527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 63547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextNameLookupVisitor *This 63557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<DeclContextNameLookupVisitor *>(UserData); 63567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we have any visible declaration information for 63587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this context in this module. 63597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile::DeclContextInfosMap::iterator Info; 63607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundInfo = false; 63617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 63627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info = M.DeclContextInfos.find(This->Contexts[I]); 63637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info != M.DeclContextInfos.end() && 63647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData) { 63657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundInfo = true; 63667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 63677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FoundInfo) 63717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 63727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Look for this name within this module. 63747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable *LookupTable = 63757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData; 63767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable::iterator Pos 63777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = LookupTable->find(This->Name); 63787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == LookupTable->end()) 63797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 63807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundAnything = false; 63827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTrait::data_type Data = *Pos; 63837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; Data.first != Data.second; ++Data.first) { 63847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first); 63857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ND) 63867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 63877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ND->getDeclName() != This->Name) { 63897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A name might be null because the decl's redeclarable part is 63907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // currently read before reading its name. The lookup is triggered by 63917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // building that decl (likely indirectly), and so it is later in the 63927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // sense of "already existing" and can be ignored here. 63937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 63947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record this declaration. 63977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundAnything = true; 63987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Decls.push_back(ND); 63997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 64007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FoundAnything; 64027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 64037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 64047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 64057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64065a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// \brief Retrieve the "definitive" module file for the definition of the 64075a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// given declaration context, if there is one. 64085a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// 64095a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// The "definitive" module file is the only place where we need to look to 64105a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// find information about the declarations within the given declaration 64115a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// context. For example, C++ and Objective-C classes, C structs/unions, and 64125a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// Objective-C protocols, categories, and extensions are all defined in a 64135a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// single place in the source code, so they have definitive module files 64145a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// associated with them. C++ namespaces, on the other hand, can have 64155a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// definitions in multiple different module files. 64165a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// 64175a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's 64185a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// NDEBUG checking. 64195a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregorstatic ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC, 64205a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor ASTReader &Reader) { 6421e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor if (const DeclContext *DefDC = getDefinitiveDeclContext(DC)) 6422e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor return Reader.getOwningModuleFile(cast<Decl>(DefDC)); 64235a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 64246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 64255a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor} 64265a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 64273646c68676c3c46a026b23d52188ef6e0d856178Richard Smithbool 64287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 64297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name) { 64307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(DC->hasExternalVisibleStorage() && 64317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "DeclContext has no visible decls in storage"); 64327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name) 64333646c68676c3c46a026b23d52188ef6e0d856178Richard Smith return false; 64347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<NamedDecl *, 64> Decls; 64367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compute the declaration contexts we need to look into. Multiple such 64387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declaration contexts occur when two declaration contexts from disjoint 64397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // modules get merged, e.g., when two namespaces with the same name are 64407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // independently defined in separate modules. 64417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<const DeclContext *, 2> Contexts; 64427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(DC); 64437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isNamespace()) { 64456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 64467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Merged != MergedDecls.end()) { 64477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 64487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 64497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 64507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 64516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isa<CXXRecordDecl>(DC)) { 64526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto Merged = MergedLookups.find(DC); 64536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Merged != MergedLookups.end()) 64546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Contexts.insert(Contexts.end(), Merged->second.begin(), 64556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Merged->second.end()); 64566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 64576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 64587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls); 64595a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 64605a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // If we can definitively determine which module file to look into, 64615a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // only look there. Otherwise, look in all module files. 64625a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor ModuleFile *Definitive; 64635a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor if (Contexts.size() == 1 && 64645a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor (Definitive = getDefinitiveModuleFileFor(DC, *this))) { 64655a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor DeclContextNameLookupVisitor::visit(*Definitive, &Visitor); 64665a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor } else { 64675a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor); 64685a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor } 64697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumVisibleDeclContextsRead; 64707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SetExternalVisibleDeclsForName(DC, Name, Decls); 64713646c68676c3c46a026b23d52188ef6e0d856178Richard Smith return !Decls.empty(); 64727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 64737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 64757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief ModuleFile visitor used to retrieve all visible names in a 64767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// declaration context. 64777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class DeclContextAllNamesVisitor { 64787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 6479cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<const DeclContext *> &Contexts; 64808ae63875f4b078f5303ca7a19cba82fbc8a603c2Craig Topper DeclsMap &Decls; 6481ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis bool VisitAll; 64827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 64847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextAllNamesVisitor(ASTReader &Reader, 64857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<const DeclContext *> &Contexts, 64868ae63875f4b078f5303ca7a19cba82fbc8a603c2Craig Topper DeclsMap &Decls, bool VisitAll) 6487ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { } 64887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 64907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextAllNamesVisitor *This 64917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<DeclContextAllNamesVisitor *>(UserData); 64927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we have any visible declaration information for 64947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this context in this module. 64957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile::DeclContextInfosMap::iterator Info; 64967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundInfo = false; 64977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 64987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info = M.DeclContextInfos.find(This->Contexts[I]); 64997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info != M.DeclContextInfos.end() && 65007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData) { 65017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundInfo = true; 65027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 65037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FoundInfo) 65077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 65087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable *LookupTable = 65107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData; 65117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundAnything = false; 65127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ASTDeclContextNameLookupTable::data_iterator 6513a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor I = LookupTable->data_begin(), E = LookupTable->data_end(); 6514a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor I != E; 6515a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor ++I) { 65167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTrait::data_type Data = *I; 65177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; Data.first != Data.second; ++Data.first) { 65187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, 65197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Data.first); 65207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ND) 65217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 65227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record this declaration. 65247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundAnything = true; 65257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Decls[ND->getDeclName()].push_back(ND); 65267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6529ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis return FoundAnything && !This->VisitAll; 65307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 65327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 65337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 65357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DC->hasExternalVisibleStorage()) 65367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 6537ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper DeclsMap Decls; 65387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compute the declaration contexts we need to look into. Multiple such 65407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declaration contexts occur when two declaration contexts from disjoint 65417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // modules get merged, e.g., when two namespaces with the same name are 65427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // independently defined in separate modules. 65437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<const DeclContext *, 2> Contexts; 65447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(DC); 65457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isNamespace()) { 65477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MergedDeclsMap::iterator Merged 65487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 65497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Merged != MergedDecls.end()) { 65507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 65517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 65527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6555ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls, 6556ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis /*VisitAll=*/DC->isFileContext()); 65577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor); 65587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumVisibleDeclContextsRead; 65597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6560ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 65617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SetExternalVisibleDeclsForName(DC, I->first, I->second); 65627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 65647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 65657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Under non-PCH compilation the consumer receives the objc methods 65677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// before receiving the implementation, and codegen depends on this. 65687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// We simulate this by deserializing and passing to consumer the methods of the 65697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// implementation before passing the deserialized implementation decl. 65707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 65717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTConsumer *Consumer) { 65727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ImplD && Consumer); 65737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *I : ImplD->methods()) 6575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Consumer->HandleInterestingDecl(DeclGroupRef(I)); 65767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 65787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 65797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::PassInterestingDeclsToConsumer() { 65817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Consumer); 6582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6583651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (PassingDeclsToConsumer) 6584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 6585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Guard variable to avoid recursively redoing the process of passing 6587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // decls to consumer. 6588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 6589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines true); 6590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 65917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!InterestingDecls.empty()) { 65927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decl *D = InterestingDecls.front(); 65937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InterestingDecls.pop_front(); 65947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassInterestingDeclToConsumer(D); 65967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 65987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::PassInterestingDeclToConsumer(Decl *D) { 66007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 66017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassObjCImplDeclToConsumer(ImplD, Consumer); 66027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 66037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Consumer->HandleInterestingDecl(DeclGroupRef(D)); 66047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 66057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 66077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei this->Consumer = Consumer; 66087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Consumer) 66107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 66117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) { 66137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Force deserialization of this decl, which will cause it to be queued for 66147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // passing to the consumer. 6615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GetDecl(EagerlyDeserializedDecls[I]); 66167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EagerlyDeserializedDecls.clear(); 66187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassInterestingDeclsToConsumer(); 66207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 66217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::PrintStats() { 66237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, "*** AST File Statistics:\n"); 66247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTypesLoaded 66267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 66277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType()); 66287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumDeclsLoaded 66297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 66306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (Decl *)nullptr); 66317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumIdentifiersLoaded 66327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 66337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifiersLoaded.end(), 66346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (IdentifierInfo *)nullptr); 66357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumMacrosLoaded 66367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 66377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacrosLoaded.end(), 66386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (MacroInfo *)nullptr); 66397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumSelectorsLoaded 66407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 66417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorsLoaded.end(), 66427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Selector()); 66437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 66457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 66467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumSLocEntriesRead, TotalNumSLocEntries, 66477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 66487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!TypesLoaded.empty()) 66497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u types read (%f%%)\n", 66507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumTypesLoaded, (unsigned)TypesLoaded.size(), 66517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 66527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DeclsLoaded.empty()) 66537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 66547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 66557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 66567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IdentifiersLoaded.empty()) 66577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 66587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 66597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 66607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!MacrosLoaded.empty()) 66617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 66627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 66637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 66647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SelectorsLoaded.empty()) 66657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 66667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 66677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 66687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalNumStatements) 66697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 66707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumStatementsRead, TotalNumStatements, 66717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumStatementsRead/TotalNumStatements * 100)); 66727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalNumMacros) 66737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 66747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumMacrosRead, TotalNumMacros, 66757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumMacrosRead/TotalNumMacros * 100)); 66767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalLexicalDeclContexts) 66777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 66787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 66797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 66807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei * 100)); 66817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalVisibleDeclContexts) 66827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 66837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 66847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 66857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei * 100)); 66867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalNumMethodPoolEntries) { 66877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 66887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 66897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 66907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei * 100)); 66917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 669295fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor if (NumMethodPoolLookups) { 669395fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 669495fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor NumMethodPoolHits, NumMethodPoolLookups, 669595fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 669695fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor } 669795fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor if (NumMethodPoolTableLookups) { 669895fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 669995fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor NumMethodPoolTableHits, NumMethodPoolTableLookups, 670095fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 670195fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor * 100.0)); 670295fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor } 670395fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 6704e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor if (NumIdentifierLookupHits) { 6705e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor std::fprintf(stderr, 6706e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor " %u / %u identifier table lookups succeeded (%f%%)\n", 6707e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits, NumIdentifierLookups, 6708e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 6709e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor } 6710e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor 67111a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (GlobalIndex) { 67121a49d97d762570027863e9209af81d445e4f1502Douglas Gregor std::fprintf(stderr, "\n"); 67131a49d97d762570027863e9209af81d445e4f1502Douglas Gregor GlobalIndex->printStats(); 67141a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 67151a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 67167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, "\n"); 67177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dump(); 67187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, "\n"); 67197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 67207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate<typename Key, typename ModuleFile, unsigned InitialCapacity> 67227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void 67237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeidumpModuleIDMap(StringRef Name, 67247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ContinuousRangeMap<Key, ModuleFile *, 67257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InitialCapacity> &Map) { 67267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Map.begin() == Map.end()) 67277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 67287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 67307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << Name << ":\n"; 67317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 67327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != IEnd; ++I) { 67337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << " " << I->first << " -> " << I->second->FileName 67347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "\n"; 67357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 67377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::dump() { 67397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 67407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 67417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 67427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global type map", GlobalTypeMap); 67437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global declaration map", GlobalDeclMap); 67447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 67457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global macro map", GlobalMacroMap); 67467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 67477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global selector map", GlobalSelectorMap); 67487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global preprocessed entity map", 67497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalPreprocessedEntityMap); 67507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << "\n*** PCH/Modules Loaded:"; 67527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 67537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MEnd = ModuleMgr.end(); 67547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M != MEnd; ++M) 67557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (*M)->dump(); 67567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 67577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Return the amount of memory used by memory buffers, breaking down 67597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// by heap-backed versus mmap'ed memory. 67607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 67617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleConstIterator I = ModuleMgr.begin(), 67627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ModuleMgr.end(); I != E; ++I) { 67637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 67647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t bytes = buf->getBufferSize(); 67657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (buf->getBufferKind()) { 67667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case llvm::MemoryBuffer::MemoryBuffer_Malloc: 67677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizes.malloc_bytes += bytes; 67687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 67697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case llvm::MemoryBuffer::MemoryBuffer_MMap: 67707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizes.mmap_bytes += bytes; 67717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 67727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 67767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::InitializeSema(Sema &S) { 67787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj = &S; 67797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei S.addExternalSource(this); 67807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Makes sure any declarations that were deserialized "too early" 67827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // still get added to the identifier's declaration chains. 67837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) { 67840532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis pushExternalDeclIntoScope(PreloadedDecls[I], 67850532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis PreloadedDecls[I]->getDeclName()); 67867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreloadedDecls.clear(); 67887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67899b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith // FIXME: What happens if these are changed by a module import? 67907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FPPragmaOptions.empty()) { 67917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 67927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 67937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67959b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith // FIXME: What happens if these are changed by a module import? 67967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!OpenCLExtensions.empty()) { 67977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned I = 0; 67987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++]; 67997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/OpenCLExtensions.def" 68007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS"); 68027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68039b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith 68049b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith UpdateSema(); 68059b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith} 68069b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith 68079b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smithvoid ASTReader::UpdateSema() { 68089b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith assert(SemaObj && "no Sema to update"); 68099b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith 68109b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith // Load the offsets of the declarations that Sema references. 68119b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith // They will be lazily deserialized when needed. 68129b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith if (!SemaDeclRefs.empty()) { 68139b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith assert(SemaDeclRefs.size() % 2 == 0); 68149b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) { 68159b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith if (!SemaObj->StdNamespace) 68169b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith SemaObj->StdNamespace = SemaDeclRefs[I]; 68179b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith if (!SemaObj->StdBadAlloc) 68189b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 68199b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith } 68209b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith SemaDeclRefs.clear(); 68219b6711873cbba149dd50cedcfdf31f9dd254df50Richard Smith } 68226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 68236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Update the state of 'pragma clang optimize'. Use the same API as if we had 68246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // encountered the pragma in the source. 68256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if(OptimizeOffPragmaLocation.isValid()) 68266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); 68277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) { 68307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading an identifier. 68317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing AnIdentifier(this); 68321a49d97d762570027863e9209af81d445e4f1502Douglas Gregor StringRef Name(NameStart, NameEnd - NameStart); 68331a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 68341a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // If there is a global index, look there first to determine which modules 68351a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // provably do not have any results for this identifier. 6836188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor GlobalModuleIndex::HitSet Hits; 68376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines GlobalModuleIndex::HitSet *HitsPtr = nullptr; 68381a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (!loadGlobalIndex()) { 6839188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor if (GlobalIndex->lookupIdentifier(Name, Hits)) { 6840188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor HitsPtr = &Hits; 68411a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 68421a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 6843188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 6844e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookups, 6845e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits); 6846188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 68477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = Visitor.getIdentifierInfo(); 68487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei markIdentifierUpToDate(II); 68497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return II; 68507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace clang { 68537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief An identifier-lookup iterator that enumerates all of the 68547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// identifiers stored within a set of AST files. 68557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class ASTIdentifierIterator : public IdentifierIterator { 68567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The AST reader whose identifiers are being enumerated. 68577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader &Reader; 68587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The current index into the chain of AST files stored in 68607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// the AST reader. 68617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index; 68627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The current position within the identifier lookup table 68647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// of the current AST file. 68657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable::key_iterator Current; 68667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The end position within the identifier lookup table of 68687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// the current AST file. 68697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable::key_iterator End; 68707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 68727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei explicit ASTIdentifierIterator(const ASTReader &Reader); 68737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef Next() override; 68757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 68767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 68797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 68807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable *IdTable 68817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 68827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Current = IdTable->key_begin(); 68837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei End = IdTable->key_end(); 68847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef ASTIdentifierIterator::Next() { 68877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Current == End) { 68887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have exhausted all of our AST files, we're done. 68897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index == 0) 68907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(); 68917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --Index; 68937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable *IdTable 68947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 68957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierLookupTable; 68967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Current = IdTable->key_begin(); 68977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei End = IdTable->key_end(); 68987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We have any identifiers remaining in the current AST file; return 69017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the next one. 6902479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor StringRef Result = *Current; 69037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++Current; 6904479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor return Result; 69057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 690787f9d81d0ab806dcf6ca50a0c068dcb2ba7f51b3Argyrios KyrtzidisIdentifierIterator *ASTReader::getIdentifiers() { 690887f9d81d0ab806dcf6ca50a0c068dcb2ba7f51b3Argyrios Kyrtzidis if (!loadGlobalIndex()) 690987f9d81d0ab806dcf6ca50a0c068dcb2ba7f51b3Argyrios Kyrtzidis return GlobalIndex->createIdentifierIterator(); 691087f9d81d0ab806dcf6ca50a0c068dcb2ba7f51b3Argyrios Kyrtzidis 69117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return new ASTIdentifierIterator(*this); 69127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace clang { namespace serialization { 69157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class ReadMethodPoolVisitor { 69167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 69177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Selector Sel; 69187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration; 69192e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned InstanceBits; 69202e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned FactoryBits; 6921cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 6922cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 69237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 69257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 69267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration) 69272e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 69282e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis InstanceBits(0), FactoryBits(0) { } 69297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 69317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPoolVisitor *This 69327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<ReadMethodPoolVisitor *>(UserData); 69337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!M.SelectorLookupTable) 69357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 69367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already searched this module file, skip it now. 69387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M.Generation <= This->PriorGeneration) 69397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 69407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 694195fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++This->Reader.NumMethodPoolTableLookups; 69427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTable *PoolTable 69437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTSelectorLookupTable*)M.SelectorLookupTable; 69447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel); 69457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == PoolTable->end()) 69467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 694795fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 694895fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++This->Reader.NumMethodPoolTableHits; 69497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++This->Reader.NumSelectorsRead; 69507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Not quite happy with the statistics here. We probably should 69517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // disable this tracking when called via LoadSelector. 69527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Also, should entries without methods count as misses? 69537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++This->Reader.NumMethodPoolEntriesRead; 69547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTrait::data_type Data = *Pos; 69557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (This->Reader.DeserializationListener) 69567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Reader.DeserializationListener->SelectorRead(Data.ID, 69577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Sel); 69587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 69607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 69612e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis This->InstanceBits = Data.InstanceBits; 69622e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis This->FactoryBits = Data.FactoryBits; 69637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 69647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Retrieve the instance methods found by this visitor. 69677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 69687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InstanceMethods; 69697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Retrieve the instance methods found by this visitor. 69727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 69737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FactoryMethods; 69747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69752e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis 69762e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned getInstanceBits() const { return InstanceBits; } 69772e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis unsigned getFactoryBits() const { return FactoryBits; } 69787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 69797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} } // end namespace clang::serialization 69807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Add the given set of methods to the method list. 69827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 69837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodList &List) { 69847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 69857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei S.addMethodToGlobalList(&List, Methods[I]); 69867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadMethodPool(Selector Sel) { 69907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the selector generation and update it to the current generation. 69917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Generation = SelectorGeneration[Sel]; 69927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration = Generation; 69936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Generation = getGeneration(); 69947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Search for methods defined with this selector. 699695fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++NumMethodPoolLookups; 69977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 69987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor); 69997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Visitor.getInstanceMethods().empty() && 700195fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor Visitor.getFactoryMethods().empty()) 70027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 700395fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 700495fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++NumMethodPoolHits; 700595fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 70067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getSema()) 70077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 70087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Sema &S = *getSema(); 70107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Sema::GlobalMethodPool::iterator Pos 70117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 70127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 70147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 70152e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Pos->second.first.setBits(Visitor.getInstanceBits()); 70162e3d8c0815acaf1bc5995ebe56cea07471e5c9c7Argyrios Kyrtzidis Pos->second.second.setBits(Visitor.getFactoryBits()); 70177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 70187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadKnownNamespaces( 70207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<NamespaceDecl *> &Namespaces) { 70217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Namespaces.clear(); 70227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 70247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NamespaceDecl *Namespace 70257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 70267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Namespaces.push_back(Namespace); 70277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 70297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7030cd0655b17249c4c4908ca91462657f62285017e6Nick Lewyckyvoid ASTReader::ReadUndefinedButUsed( 7031995e26b0523ac8e3b6199a509b871b81fa5df6eeNick Lewycky llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) { 7032cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 7033cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 703401a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky SourceLocation Loc = 7035cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 703601a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky Undefined.insert(std::make_pair(D, Loc)); 703701a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 703801a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky} 703901a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 70407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadTentativeDefinitions( 70417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<VarDecl *> &TentativeDefs) { 70427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 70437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 70447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Var) 70457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TentativeDefs.push_back(Var); 70467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TentativeDefinitions.clear(); 70487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 70497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadUnusedFileScopedDecls( 70517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<const DeclaratorDecl *> &Decls) { 70527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 70537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclaratorDecl *D 70547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 70557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 70567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 70577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnusedFileScopedDecls.clear(); 70597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 70607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDelegatingConstructors( 70627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<CXXConstructorDecl *> &Decls) { 70637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 70647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXConstructorDecl *D 70657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 70667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 70677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 70687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DelegatingCtorDecls.clear(); 70707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 70717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 70737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 70747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypedefNameDecl *D 70757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 70767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 70777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 70787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExtVectorDecls.clear(); 70807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 70817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) { 70837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) { 70847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXRecordDecl *D 70857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I])); 70867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 70877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 70887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DynamicClasses.clear(); 70907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 70917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 70935ea6ef490547917426d5e2ed14c9f36521bbeacfRichard SmithASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) { 70945ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) { 70955ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith NamedDecl *D 70965ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I])); 70977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 70987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 70997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71005ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith LocallyScopedExternCDecls.clear(); 71017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadReferencedSelectors( 71047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 71057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReferencedSelectorsData.empty()) 71067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 71077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there are @selector references added them to its pool. This is for 71097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // implementation of -Wselector. 71107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned int DataSize = ReferencedSelectorsData.size()-1; 71117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned I = 0; 71127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (I < DataSize) { 71137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 71147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation SelLoc 71157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 71167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Sels.push_back(std::make_pair(Sel, SelLoc)); 71177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReferencedSelectorsData.clear(); 71197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadWeakUndeclaredIdentifiers( 71227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 71237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (WeakUndeclaredIdentifiers.empty()) 71247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 71257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 71277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *WeakId 71287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 71297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *AliasId 71307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 71317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc 71327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 71337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Used = WeakUndeclaredIdentifiers[I++]; 71347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakInfo WI(AliasId, Loc); 71357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WI.setUsed(Used); 71367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakIDs.push_back(std::make_pair(WeakId, WI)); 71377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.clear(); 71397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 71427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 71437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExternalVTableUse VT; 71447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 71457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 71467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VT.DefinitionRequired = VTableUses[Idx++]; 71477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTables.push_back(VT); 71487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.clear(); 71517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadPendingInstantiations( 71547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 71557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 71567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 71577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc 71587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 71597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Pending.push_back(std::make_pair(D, Loc)); 71617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingInstantiations.clear(); 71637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7165ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smithvoid ASTReader::ReadLateParsedTemplates( 7166ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 7167ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 7168ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith /* In loop */) { 7169ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 7170ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 7171ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith LateParsedTemplate *LT = new LateParsedTemplate; 7172ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith LT->D = GetDecl(LateParsedTemplates[Idx++]); 7173ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 7174ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith ModuleFile *F = getOwningModuleFile(LT->D); 7175ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith assert(F && "No module"); 7176ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 7177ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith unsigned TokN = LateParsedTemplates[Idx++]; 7178ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith LT->Toks.reserve(TokN); 7179ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith for (unsigned T = 0; T < TokN; ++T) 7180ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 7181ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 7182ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith LPTMap[FD] = LT; 7183ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith } 7184ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 7185ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith LateParsedTemplates.clear(); 7186ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith} 7187ac32d9044b9c1e7492cef929a322d23ce899d276Richard Smith 71887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::LoadSelector(Selector Sel) { 71897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It would be complicated to avoid reading the methods anyway. So don't. 71907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPool(Sel); 71917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 71947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ID && "Non-zero identifier ID required"); 71957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 71967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifiersLoaded[ID - 1] = II; 71977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 71987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->IdentifierRead(ID, II); 71997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 72007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Set the globally-visible declarations associated with the given 72027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// identifier. 72037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 72047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// If the AST reader is currently in a state where the given declaration IDs 72057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// cannot safely be resolved, they are queued until it is safe to resolve 72067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// them. 72077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 72087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param II an IdentifierInfo that refers to one or more globally-visible 72097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declarations. 72107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 72117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param DeclIDs the set of declaration IDs with the name @p II that are 72127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// visible at global scope. 72137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 7214aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor/// \param Decls if non-null, this vector will be populated with the set of 7215aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor/// deserialized declarations. These declarations will not be pushed into 7216aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor/// scope. 72177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 72187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 72197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const SmallVectorImpl<uint32_t> &DeclIDs, 7220aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor SmallVectorImpl<Decl *> *Decls) { 7221aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor if (NumCurrentElementsDeserializing && !Decls) { 7222aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 72237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 72247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 72257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 72277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 72287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SemaObj) { 7229aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor // If we're simply supposed to record the declarations, do so now. 7230aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor if (Decls) { 7231aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor Decls->push_back(D); 7232aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor continue; 7233aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor } 7234aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor 72357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce this declaration into the translation-unit scope 72367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and add it to the declaration chain for this identifier, so 72377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that (unqualified) name lookup will find it. 72380532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis pushExternalDeclIntoScope(D, II); 72397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 72407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Queue this declaration so that it will be added to the 72417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // translation unit scope and identifier's declaration chain 72427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // once a Sema object is known. 72437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreloadedDecls.push_back(D); 72447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 72457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 72467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 72477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72488222b8951da749d4f086d7b39de5ff0221297509Douglas GregorIdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 72497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 72506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 72517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IdentifiersLoaded.empty()) { 72537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("no identifier table in AST file"); 72546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 72557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 72567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID -= 1; 72587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IdentifiersLoaded[ID]) { 72597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 72607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 72617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 72627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - M->BaseIdentifierID; 72637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 72647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // All of the strings in the AST file are preceded by a 16-bit length. 72667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Extract that 16-bit length to avoid having to execute strlen(). 72677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 72687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // unsigned integers. This is important to avoid integer overflow when 72697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // we cast them to 'unsigned'. 72707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 72717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned StrLen = (((unsigned) StrLenPtr[0]) 72727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei | (((unsigned) StrLenPtr[1]) << 8)) - 1; 72738222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor IdentifiersLoaded[ID] 72748222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor = &PP.getIdentifierTable().get(StringRef(Str, StrLen)); 72757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 72767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]); 72777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 72787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return IdentifiersLoaded[ID]; 72807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 72817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72828222b8951da749d4f086d7b39de5ff0221297509Douglas GregorIdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 72838222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 72847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 72857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 72877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_IDENT_IDS) 72887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 72897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 72917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 72927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.IdentifierRemap.end() 72937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into identifier index remap"); 72947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 72967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 72977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 72989317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios KyrtzidisMacroInfo *ASTReader::getMacro(MacroID ID) { 72997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 73006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 73017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacrosLoaded.empty()) { 73037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("no macro table in AST file"); 73046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 73057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 73067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID -= NUM_PREDEF_MACRO_IDS; 73087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!MacrosLoaded[ID]) { 73097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalMacroMapType::iterator I 73107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 73117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 73127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 73137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - M->BaseMacroID; 73149317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 73159317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis 73169317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (DeserializationListener) 73179317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 73189317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis MacrosLoaded[ID]); 73197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 73207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return MacrosLoaded[ID]; 73227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 73237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiMacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 73257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_MACRO_IDS) 73267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 73277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 73297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 73307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 73317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 73337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 73347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::SubmoduleID 73367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 73377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 73387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 73397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 73417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 73427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.SubmoduleRemap.end() 73437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into submodule index remap"); 73447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 73467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 73477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiModule *ASTReader::getSubmodule(SubmoduleID GlobalID) { 73497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 73507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(GlobalID == 0 && "Unhandled global submodule ID"); 73516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 73527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 73537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalID > SubmodulesLoaded.size()) { 73557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("submodule ID out of range in AST file"); 73566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 73577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 73587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 73607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7361ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 7362ca2ab45341c448284cf93770018c717810575f86Douglas GregorModule *ASTReader::getModule(unsigned ID) { 7363ca2ab45341c448284cf93770018c717810575f86Douglas Gregor return getSubmodule(ID); 7364ca2ab45341c448284cf93770018c717810575f86Douglas Gregor} 7365ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 73667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSelector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 73677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DecodeSelector(getGlobalSelectorID(M, LocalID)); 73687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 73697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSelector ASTReader::DecodeSelector(serialization::SelectorID ID) { 73717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 73727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Selector(); 73737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID > SelectorsLoaded.size()) { 73757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("selector ID out of range in AST file"); 73767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Selector(); 73777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 73787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 73807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load this selector from the selector table. 73817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 73827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 73837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *I->second; 73847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTrait Trait(*this, M); 73857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 73867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorsLoaded[ID - 1] = 73877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 73887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 73897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 73907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 73917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelectorsLoaded[ID - 1]; 73937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 73947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSelector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 73967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DecodeSelector(ID); 73977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 73987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 73997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiuint32_t ASTReader::GetNumExternalSelectors() { 74007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ID 0 (the null selector) is considered an external selector. 74017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getTotalNumSelectors() + 1; 74027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 74037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::SelectorID 74057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 74067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_SELECTOR_IDS) 74077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 74087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 74107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 74117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.SelectorRemap.end() 74127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into selector index remap"); 74137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 74157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 74167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDeclarationName 74187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadDeclarationName(ModuleFile &F, 74197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 74207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 74217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 74227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 74238222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 74247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 74267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 74277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 74287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DeclarationName(ReadSelector(F, Record, Idx)); 74297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 74317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXConstructorName( 74327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getCanonicalType(readType(F, Record, Idx))); 74337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 74357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXDestructorName( 74367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getCanonicalType(readType(F, Record, Idx))); 74377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 74397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXConversionFunctionName( 74407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getCanonicalType(readType(F, Record, Idx))); 74417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 74437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXOperatorName( 74447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (OverloadedOperatorKind)Record[Idx++]); 74457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 74477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXLiteralOperatorName( 74487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetIdentifierInfo(F, Record, Idx)); 74497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 74517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DeclarationName::getUsingDirectiveName(); 74527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 74537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid NameKind!"); 74557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 74567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 74587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationNameLoc &DNLoc, 74597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name, 74607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 74617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Name.getNameKind()) { 74627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 74637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 74647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 74657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 74667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 74677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 74697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.CXXOperatorName.BeginOpNameLoc 74707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 74717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.CXXOperatorName.EndOpNameLoc 74727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 74737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 74747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 74767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.CXXLiteralOperatorName.OpNameLoc 74777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 74787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 74797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 74817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 74827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 74837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 74847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 74857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 74867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 74877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 74887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 74907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationNameInfo &NameInfo, 74917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 74927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 74937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 74947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationNameLoc DNLoc; 74957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 74967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameInfo.setInfo(DNLoc); 74977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 74987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 74997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 75007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 75017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 75027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTPLists = Record[Idx++]; 75037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.NumTemplParamLists = NumTPLists; 75047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumTPLists) { 75057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 75067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i=0; i != NumTPLists; ++i) 75077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 75087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 75107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateName 75127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 75137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 75147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 75157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 75167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::Template: 75177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 75187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::OverloadedTemplate: { 75207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned size = Record[Idx++]; 75217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedSet<8> Decls; 75227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (size--) 75237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 75247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 75267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::QualifiedTemplate: { 75297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 75307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hasTemplKeyword = Record[Idx++]; 75317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 75327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 75337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::DependentTemplate: { 75367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 75377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Idx++]) // isIdentifier 75387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentTemplateName(NNS, 75397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetIdentifierInfo(F, Record, 75407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx)); 75417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentTemplateName(NNS, 75427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (OverloadedOperatorKind)Record[Idx++]); 75437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParm: { 75467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateTemplateParmDecl *param 75477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 75487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!param) return TemplateName(); 75497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName replacement = ReadTemplateName(F, Record, Idx); 75507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getSubstTemplateTemplateParm(param, replacement); 75517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParmPack: { 75547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateTemplateParmDecl *Param 75557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 75567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Param) 75577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateName(); 75587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 75607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ArgPack.getKind() != TemplateArgument::Pack) 75617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateName(); 75627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 75647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unhandled template name kind!"); 75687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 75697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 75707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateArgument 75717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateArgument(ModuleFile &F, 75727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 75737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 75747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 75757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Null: 75767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(); 75777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Type: 75787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(readType(F, Record, Idx)); 75797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Declaration: { 75807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 75817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool ForReferenceParam = Record[Idx++]; 75827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(D, ForReferenceParam); 75837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::NullPtr: 75857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 75867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Integral: { 75877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APSInt Value = ReadAPSInt(Record, Idx); 75887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = readType(F, Record, Idx); 75897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(Context, Value, T); 75907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 75917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Template: 75927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(ReadTemplateName(F, Record, Idx)); 75937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::TemplateExpansion: { 75947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName Name = ReadTemplateName(F, Record, Idx); 7595dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Optional<unsigned> NumTemplateExpansions; 75967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned NumExpansions = Record[Idx++]) 75977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumTemplateExpansions = NumExpansions - 1; 75987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(Name, NumTemplateExpansions); 75997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 76007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Expression: 76017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(ReadExpr(F)); 76027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Pack: { 76037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = Record[Idx++]; 76047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 76057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumArgs; ++I) 76067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args[I] = ReadTemplateArgument(F, Record, Idx); 76077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(Args, NumArgs); 76087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 76097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 76107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unhandled template argument kind!"); 76127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 76137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateParameterList * 76157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateParameterList(ModuleFile &F, 76167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 76177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 76187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 76197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 76207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumParams = Record[Idx++]; 76227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<NamedDecl *, 16> Params; 76237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Params.reserve(NumParams); 76247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumParams--) 76257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 76267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList* TemplateParams = 76287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 76297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Params.data(), Params.size(), RAngleLoc); 76307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateParams; 76317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 76327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 76347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader:: 76356b9240e058bf3451685df73fc8ce181b3046e92bCraig TopperReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 76367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F, const RecordData &Record, 76377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 76387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs = Record[Idx++]; 76397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplArgs.reserve(NumTemplateArgs); 76407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumTemplateArgs--) 76417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx)); 76427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 76437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a UnresolvedSet structure. 7645c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smithvoid ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 76467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 76477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumDecls = Record[Idx++]; 76487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Set.reserve(Context, NumDecls); 76497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumDecls--) { 7650c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith DeclID ID = ReadDeclID(F, Record, Idx); 76517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 7652c2d775714f79af977672e4f1dbc16ee9e02d1deaRichard Smith Set.addLazyDecl(Context, ID, AS); 76537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 76547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 76557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXXBaseSpecifier 76577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 76587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 76597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isVirtual = static_cast<bool>(Record[Idx++]); 76607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 76617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 76627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool inheritConstructors = static_cast<bool>(Record[Idx++]); 76637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 76647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 76657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 76667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 76677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EllipsisLoc); 76687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Result.setInheritConstructors(inheritConstructors); 76697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 76707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 76717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<CXXCtorInitializer **, unsigned> 76737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 76747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 76756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXCtorInitializer **CtorInitializers = nullptr; 76767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumInitializers = Record[Idx++]; 76777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumInitializers) { 76787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CtorInitializers 76797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = new (Context) CXXCtorInitializer*[NumInitializers]; 76807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i=0; i != NumInitializers; ++i) { 76816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TypeSourceInfo *TInfo = nullptr; 76827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsBaseVirtual = false; 76836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FieldDecl *Member = nullptr; 76846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IndirectFieldDecl *IndirectMember = nullptr; 76857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 76877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Type) { 76887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_BASE: 76897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TInfo = GetTypeSourceInfo(F, Record, Idx); 76907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsBaseVirtual = Record[Idx++]; 76917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 76927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_DELEGATING: 76947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TInfo = GetTypeSourceInfo(F, Record, Idx); 76957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 76967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 76977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_MEMBER: 76987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 76997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 77007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_INDIRECT_MEMBER: 77027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 77037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 77047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 77077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Expr *Init = ReadExpr(F); 77087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 77097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 77107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsWritten = Record[Idx++]; 77117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned SourceOrderOrNumArrayIndices; 77127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<VarDecl *, 8> Indices; 77137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsWritten) { 77147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceOrderOrNumArrayIndices = Record[Idx++]; 77157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 77167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceOrderOrNumArrayIndices = Record[Idx++]; 77177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Indices.reserve(SourceOrderOrNumArrayIndices); 77187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 77197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 77207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXCtorInitializer *BOMInit; 77237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Type == CTOR_INITIALIZER_BASE) { 77247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual, 77257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LParenLoc, Init, RParenLoc, 77267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MemberOrEllipsisLoc); 77277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Type == CTOR_INITIALIZER_DELEGATING) { 77287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc, 77297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Init, RParenLoc); 77307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (IsWritten) { 77317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Member) 77327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, 77337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LParenLoc, Init, RParenLoc); 77347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 77357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 77367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MemberOrEllipsisLoc, LParenLoc, 77377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Init, RParenLoc); 77387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 7739f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis if (IndirectMember) { 7740f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis assert(Indices.empty() && "Indirect field improperly initialized"); 7741f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 7742f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis MemberOrEllipsisLoc, LParenLoc, 7743f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis Init, RParenLoc); 7744f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis } else { 7745f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc, 7746f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis LParenLoc, Init, RParenLoc, 7747f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis Indices.data(), Indices.size()); 7748f8f480ff1cba08ce7e93160546168f729c95804cArgyrios Kyrtzidis } 77497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsWritten) 77527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 77537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CtorInitializers[i] = BOMInit; 77547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(CtorInitializers, NumInitializers); 77587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 77597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiNestedNameSpecifier * 77617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadNestedNameSpecifier(ModuleFile &F, 77627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 77637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = Record[Idx++]; 77646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NestedNameSpecifier *NNS = nullptr, *Prev = nullptr; 77657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != N; ++I) { 77667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier::SpecifierKind Kind 77677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 77687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 77697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Identifier: { 77707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 77717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, II); 77727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 77737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Namespace: { 77767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 77777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, NS); 77787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 77797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::NamespaceAlias: { 77827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 77837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 77847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 77857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpec: 77887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpecWithTemplate: { 77897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 77907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!T) 77916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 77926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 77937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Template = Record[Idx++]; 77947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 77957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 77967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 77977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 77987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Global: { 77997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::GlobalSpecifier(Context); 78007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No associated value, and there can't be a prefix. 78017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 78027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Prev = NNS; 78057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NNS; 78077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 78087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiNestedNameSpecifierLoc 78107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 78117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 78127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = Record[Idx++]; 78137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifierLocBuilder Builder; 78147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != N; ++I) { 78157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier::SpecifierKind Kind 78167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 78177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 78187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Identifier: { 78197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 78207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 78217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 78227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 78237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Namespace: { 78267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 78277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 78287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 78297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 78307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::NamespaceAlias: { 78337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 78347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 78357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 78367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 78377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpec: 78407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpecWithTemplate: { 78417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Template = Record[Idx++]; 78427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 78437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!T) 78447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NestedNameSpecifierLoc(); 78457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 78467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: 'template' keyword location not saved anywhere, so we fake it. 78487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, 78497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 78507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T->getTypeLoc(), ColonColonLoc); 78517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 78527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Global: { 78557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 78567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.MakeGlobal(Context, ColonColonLoc); 78577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 78587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 78617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Builder.getWithLocInContext(Context); 78637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 78647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSourceRange 78667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 78677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 78687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation beg = ReadSourceLocation(F, Record, Idx); 78697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation end = ReadSourceLocation(F, Record, Idx); 78707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SourceRange(beg, end); 78717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 78727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read an integral value 78747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 78757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BitWidth = Record[Idx++]; 78767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 78777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 78787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += NumWords; 78797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 78807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 78817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a signed integral value 78837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 78847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isUnsigned = Record[Idx++]; 78857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 78867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 78877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a floating-point value 78899ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northoverllvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 78909ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northover const llvm::fltSemantics &Sem, 78919ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northover unsigned &Idx) { 78929ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northover return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 78937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 78947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 78957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// \brief Read a string 78967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 78977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Len = Record[Idx++]; 78987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 78997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += Len; 79007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 79017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiVersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 79047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 79057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Major = Record[Idx++]; 79067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Minor = Record[Idx++]; 79077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Subminor = Record[Idx++]; 79087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Minor == 0) 79097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionTuple(Major); 79107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Subminor == 0) 79117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionTuple(Major, Minor - 1); 79127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionTuple(Major, Minor - 1, Subminor - 1); 79137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 79167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 79177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 79187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 79197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CXXTemporary::Create(Context, Decl); 79207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 79233b7deda7137e62810a810ce25b062927a9fc7c71Argyrios Kyrtzidis return Diag(CurrentImportLoc, DiagID); 79247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 79277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Diags.Report(Loc, DiagID); 79287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieve the identifier table associated with the 79317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// preprocessor. 79327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierTable &ASTReader::getIdentifierTable() { 79337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PP.getIdentifierTable(); 79347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Record that the given ID maps to the given switch-case 79377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// statement. 79387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 79396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert((*CurrSwitchCaseStmts)[ID] == nullptr && 79407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Already have a SwitchCase with this ID"); 79417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (*CurrSwitchCaseStmts)[ID] = SC; 79427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieve the switch-case statement with the given ID. 79457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 79466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 79477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return (*CurrSwitchCaseStmts)[ID]; 79487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ClearSwitchCaseIDs() { 79517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrSwitchCaseStmts->clear(); 79527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 79537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadComments() { 79557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::vector<RawComment *> Comments; 79568f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner for (SmallVectorImpl<std::pair<BitstreamCursor, 79577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei serialization::ModuleFile *> >::iterator 79587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = CommentsCursors.begin(), 79597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = CommentsCursors.end(); 79607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 7961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Comments.clear(); 79628f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor = I->first; 79637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei serialization::ModuleFile &F = *I->second; 79647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 79657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 79677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 79688f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = 79698f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 7970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 79718f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch (Entry.Kind) { 79728f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 79738f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Error: 79748f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Error("malformed block record in AST file"); 79758f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return; 79768f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::EndBlock: 79778f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner goto NextCursor; 79788f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Record: 79798f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // The interesting case. 79807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 79817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 79827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 79837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 79847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 7985b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 79867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case COMMENTS_RAW_COMMENT: { 79877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 79887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange SR = ReadSourceRange(F, Record, Idx); 79897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RawComment::CommentKind Kind = 79907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (RawComment::CommentKind) Record[Idx++]; 79917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsTrailingComment = Record[Idx++]; 79927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsAlmostTrailingComment = Record[Idx++]; 79936fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko Comments.push_back(new (Context) RawComment( 79946fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 79956fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko Context.getLangOpts().CommentOpts.ParseAllComments)); 79967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 79977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 79987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 79997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NextCursor: 8001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Context.Comments.addDeserializedComments(Comments); 80027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 80037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 80047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 80056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstd::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 80066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If we know the owning module, use it. 80076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Module *M = D->getOwningModule()) 80086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return M->getFullModuleName(); 80096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 80106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Otherwise, use the name of the top-level module the decl is within. 80116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (ModuleFile *M = getOwningModuleFile(D)) 80126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return M->ModuleName; 80136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 80146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Not from a module. 80156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return ""; 80166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 80176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 80187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::finishPendingActions() { 80196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (!PendingIdentifierInfos.empty() || 80206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 80213c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 80226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !PendingUpdateRecords.empty() || !PendingOdrMergeChecks.empty()) { 80237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If any identifiers with corresponding top-level declarations have 80247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // been loaded, load those declarations now. 8025ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 8026ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper TopLevelDeclsMap; 8027ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper TopLevelDeclsMap TopLevelDecls; 8028ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper 80297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!PendingIdentifierInfos.empty()) { 8030aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor IdentifierInfo *II = PendingIdentifierInfos.back().first; 8031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVector<uint32_t, 4> DeclIDs = 8032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::move(PendingIdentifierInfos.back().second); 8033cc9bdcb720931961bac55e321a3e51b9804ca900Douglas Gregor PendingIdentifierInfos.pop_back(); 8034aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor 8035aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 80367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 80386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // For each decl chain that we wanted to complete while deserializing, mark 80396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // it as "still needs to be completed". 80406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 80416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 80426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 80436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PendingIncompleteDeclChains.clear(); 80446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 80457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load pending declaration chains. 80467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != PendingDeclChains.size(); ++I) { 80477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loadPendingDeclChain(PendingDeclChains[I]); 80487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingDeclChainsKnown.erase(PendingDeclChains[I]); 80497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 80507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingDeclChains.clear(); 80517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8052aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor // Make the most recent of the top-level declarations visible. 8053ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 8054ee0a47998ca7db5d31291a397aca38219d3dfd7dCraig Topper TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 8055aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor IdentifierInfo *II = TLD->first; 8056aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 80570532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 8058aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor } 8059aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor } 8060aa945900d5438984bdcaac85c4f54868292231f4Douglas Gregor 80617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load any pending macro definitions. 80627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 80639317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 80649317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis SmallVector<PendingMacroInfo, 2> GlobalIDs; 80659317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 80669317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Initialize the macro history from chained-PCHs ahead of module imports. 8067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 80689317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis ++IDIdx) { 80699317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 80709317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (Info.M->Kind != MK_Module) 80719317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis resolvePendingMacro(II, Info); 80729317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis } 80739317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis // Handle module imports. 8074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8075dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis ++IDIdx) { 80769317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 80779317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis if (Info.M->Kind == MK_Module) 80789317ab94bb68122ba6fc728eb73c1308fb913cd1Argyrios Kyrtzidis resolvePendingMacro(II, Info); 80797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 80807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 80817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingMacroIDs.clear(); 80827640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 80837640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis // Wire up the DeclContexts for Decls that we delayed setting until 80847640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis // recursive loading is completed. 80857640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis while (!PendingDeclContextInfos.empty()) { 80867640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 80877640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis PendingDeclContextInfos.pop_front(); 80887640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 80897640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 80907640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 80917640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis } 80923c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 80936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Perform any pending declaration updates. 8094ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // 8095ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Don't do this if we have known-incomplete redecl chains: it relies on 8096ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // being able to walk redeclaration chains. 8097ef8225444452a1486bd721f3285301fe84643b00Stephen Hines while (PendingDeclChains.empty() && !PendingUpdateRecords.empty()) { 80986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto Update = PendingUpdateRecords.pop_back_val(); 80996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ReadingKindTracker ReadingKind(Read_Decl, *this); 81006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines loadDeclUpdateRecords(Update.first, Update.second); 81016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 81026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 81036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Trigger the import of the full definition of each class that had any 81046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // odr-merging problems, so we can produce better diagnostics for them. 81056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto &Merge : PendingOdrMergeFailures) { 81066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Merge.first->buildLookup(); 81076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Merge.first->decls_begin(); 81086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Merge.first->bases_begin(); 81096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Merge.first->vbases_begin(); 81106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto *RD : Merge.second) { 81116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RD->decls_begin(); 81126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RD->bases_begin(); 81136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines RD->vbases_begin(); 81146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 81156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 81166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 81173c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // For each declaration from a merged context, check that the canonical 81183c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // definition of that context also contains a declaration of the same 81193c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // entity. 81203c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith while (!PendingOdrMergeChecks.empty()) { 81213c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 81223c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 81233c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // FIXME: Skip over implicit declarations for now. This matters for things 81243c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // like implicitly-declared special member functions. This isn't entirely 81253c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // correct; we can end up with multiple unmerged declarations of the same 81263c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // implicit entity. 81273c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith if (D->isImplicit()) 81283c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith continue; 81293c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 81303c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith DeclContext *CanonDef = D->getDeclContext(); 81313c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName()); 81323c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 81333c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith bool Found = false; 81343c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith const Decl *DCanon = D->getCanonicalDecl(); 81353c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 81363c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith llvm::SmallVector<const NamedDecl*, 4> Candidates; 81373c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); 81383c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith !Found && I != E; ++I) { 8139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto RI : (*I)->redecls()) { 8140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (RI->getLexicalDeclContext() == CanonDef) { 81413c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // This declaration is present in the canonical definition. If it's 81423c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith // in the same redecl chain, it's the one we're looking for. 8143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (RI->getCanonicalDecl() == DCanon) 81443c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith Found = true; 81453c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith else 8146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Candidates.push_back(cast<NamedDecl>(RI)); 81473c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith break; 81483c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith } 81493c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith } 81503c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith } 81513c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 81523c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith if (!Found) { 81533c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith D->setInvalidDecl(); 81543c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 81556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::string CanonDefModule = 81566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 81573c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 81586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << D << getOwningModuleNameForDiagnostic(D) 81596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << CanonDef << CanonDefModule.empty() << CanonDefModule; 81603c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith 81613c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith if (Candidates.empty()) 81623c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith Diag(cast<Decl>(CanonDef)->getLocation(), 81633c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith diag::note_module_odr_violation_no_possible_decls) << D; 81643c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith else { 81653c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 81663c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith Diag(Candidates[I]->getLocation(), 81673c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith diag::note_module_odr_violation_possible_decl) 81683c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith << Candidates[I]; 81693c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith } 81706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 81716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DiagnosedOdrMergeFailures.insert(CanonDef); 81723c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith } 81733c40a28aa3dde7c5f7e1520c32e7515eda830fefRichard Smith } 81747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 81757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 81767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we deserialized any C++ or Objective-C class definitions, any 81777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Objective-C protocol definitions, or any redeclarable templates, make sure 81787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that all redeclarations point to the definitions. Note that this can only 81797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // happen now, after the redeclaration chains have been fully wired. 81807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(), 81817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DEnd = PendingDefinitions.end(); 81827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei D != DEnd; ++D) { 81837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TagDecl *TD = dyn_cast<TagDecl>(*D)) { 81846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 81857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Make sure that the TagType points at the definition. 81867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<TagType*>(TagT)->decl = TD; 81877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 81887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (auto RD = dyn_cast<CXXRecordDecl>(*D)) { 8190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto R : RD->redecls()) 8191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 81927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 81937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 81947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 81957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 81967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (auto ID = dyn_cast<ObjCInterfaceDecl>(*D)) { 81987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Make sure that the ObjCInterfaceType points at the definition. 81997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 82007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->Decl = ID; 82017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto R : ID->redecls()) 82037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R->Data = ID->Data; 82047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 82057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 82067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (auto PD = dyn_cast<ObjCProtocolDecl>(*D)) { 8209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto R : PD->redecls()) 82107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R->Data = PD->Data; 82117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 82127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 82137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto RTD = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl(); 8216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto R : RTD->redecls()) 82177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R->Common = RTD->Common; 82187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingDefinitions.clear(); 82207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 82217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the bodies of any functions or methods we've encountered. We do 82227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this now (delayed) so that we can be sure that the declaration chains 82237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have been fully wired up. 82247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 82257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PBEnd = PendingBodies.end(); 82267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PB != PBEnd; ++PB) { 82277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 82287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Check for =delete/=default? 82297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Complain about ODR violations here? 82307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getContext().getLangOpts().Modules || !FD->hasBody()) 82317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD->setLazyBody(PB->second); 82327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 82337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 82357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 82367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getContext().getLangOpts().Modules || !MD->hasBody()) 82377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MD->setLazyBody(PB->second); 82387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingBodies.clear(); 82406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 82416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Issue any pending ODR-failure diagnostics. 82426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto &Merge : PendingOdrMergeFailures) { 82436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!DiagnosedOdrMergeFailures.insert(Merge.first)) 82446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; 82456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 82466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Diagnosed = false; 82476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (auto *RD : Merge.second) { 82486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Multiple different declarations got merged together; tell the user 82496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // where they came from. 82506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Merge.first != RD) { 82516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: Walk the definition, figure out what's different, 82526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // and diagnose that. 82536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Diagnosed) { 82546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::string Module = getOwningModuleNameForDiagnostic(Merge.first); 82556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diag(Merge.first->getLocation(), 82566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::err_module_odr_violation_different_definitions) 82576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << Merge.first << Module.empty() << Module; 82586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diagnosed = true; 82596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 82606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 82616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diag(RD->getLocation(), 82626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::note_module_odr_violation_different_definitions) 82636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << getOwningModuleNameForDiagnostic(RD); 82646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 82656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 82666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 82676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Diagnosed) { 82686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // All definitions are updates to the same declaration. This happens if a 82696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // module instantiates the declaration of a class template specialization 82706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // and two or more other modules instantiate its definition. 82716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // 82726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: Indicate which modules had instantiations of this definition. 82736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: How can this even happen? 82746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Diag(Merge.first->getLocation(), 82756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines diag::err_module_odr_violation_different_instantiations) 82766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << Merge.first; 82776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 82786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 82796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PendingOdrMergeFailures.clear(); 82807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 82817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 82827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::FinishedDeserializing() { 82837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(NumCurrentElementsDeserializing && 82847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "FinishedDeserializing not paired with StartedDeserializing"); 82857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumCurrentElementsDeserializing == 1) { 82867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We decrease NumCurrentElementsDeserializing only after pending actions 82877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // are finished, to avoid recursively re-calling finishPendingActions(). 82887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei finishPendingActions(); 82897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --NumCurrentElementsDeserializing; 82917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (NumCurrentElementsDeserializing == 0 && Consumer) { 8293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We are not in recursive loading, so it's safe to pass the "interesting" 8294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // decls to the consumer. 8295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PassInterestingDeclsToConsumer(); 82967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 82987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 82990532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidisvoid ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 830087bcee88d9b49de8214aa23d07c96f7bec3198e0Rafael Espindola D = D->getMostRecentDecl(); 83010532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis 83020532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 83030532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis SemaObj->TUScope->AddDecl(D); 83040532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis } else if (SemaObj->TUScope) { 83050532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis // Adding the decl to IdResolver may have failed because it was already in 83060532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis // (even though it was not added in scope). If it is already in, make sure 83070532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis // it gets in the scope as well. 83080532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis if (std::find(SemaObj->IdResolver.begin(Name), 83090532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 83100532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis SemaObj->TUScope->AddDecl(D); 83110532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis } 83120532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis} 83130532df02a72a32a6042e961b71989db73d0d0a22Argyrios Kyrtzidis 83146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot, 83156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool DisableValidation, bool AllowASTWithCompilerErrors, 83166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool AllowConfigurationMismatch, bool ValidateSystemInputs, 8317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseGlobalIndex) 83186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr), 83196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()), 83206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()), 83216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr), 83226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ModuleMgr(PP.getFileManager()), isysroot(isysroot), 83236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DisableValidation(DisableValidation), 83246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 83256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AllowConfigurationMismatch(AllowConfigurationMismatch), 83266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ValidateSystemInputs(ValidateSystemInputs), 83276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 83286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CurrSwitchCaseStmts(&SwitchCaseStmts), 83296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0), 83306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0), 83316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0), 83326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0), 83336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NumMethodPoolHits(0), NumMethodPoolTableLookups(0), 83346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0), 83356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 83366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 83376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 83386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0), 83396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ReadingKind(Read_None) { 83407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.setExternalSLocEntrySource(this); 83417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 83427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 83437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::~ASTReader() { 83446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (OwnsDeserializationListener) 83456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines delete DeserializationListener; 83466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 83477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (DeclContextVisibleUpdatesPending::iterator 83487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = PendingVisibleUpdates.begin(), 83497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = PendingVisibleUpdates.end(); 83507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 83517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (DeclContextVisibleUpdates::iterator J = I->second.begin(), 83527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F = I->second.end(); 83537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei J != F; ++J) 83547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei delete J->first; 83557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 83567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8357