ASTReader.cpp revision 7640b02a561fd2b2c58a227b262b0c1ba93622ae
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" 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/FileManager.h" 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManager.h" 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManagerInternals.h" 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/TargetInfo.h" 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/TargetOptions.h" 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/Version.h" 317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/VersionTuple.h" 327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/HeaderSearch.h" 337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/HeaderSearchOptions.h" 347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/MacroInfo.h" 357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/PreprocessingRecord.h" 367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/Preprocessor.h" 377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Lex/PreprocessorOptions.h" 387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Sema/Scope.h" 397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Sema/Sema.h" 407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/ASTDeserializationListener.h" 411a49d97d762570027863e9209af81d445e4f1502Douglas Gregor#include "clang/Serialization/GlobalModuleIndex.h" 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/ModuleManager.h" 437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/SerializationDiagnostic.h" 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h" 457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Bitcode/BitstreamReader.h" 467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/ErrorHandling.h" 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/FileSystem.h" 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/MemoryBuffer.h" 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/Path.h" 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/SaveAndRestore.h" 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/system_error.h" 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include <algorithm> 53e4e4a88eb67ce1cd32a5761f0601fc029d68832bChris Lattner#include <cstdio> 547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include <iterator> 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::serialization; 587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang::serialization::reader; 598f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattnerusing llvm::BitstreamCursor; 607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// PCH validator implementation 637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReaderListener::~ASTReaderListener() {} 667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare the given set of language options against an existing set of 687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// language options. 697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Diags If non-NULL, diagnostics will be emitted via this engine. 717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the languagae options mis-match, false otherwise. 737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool checkLanguageOptions(const LangOptions &LangOpts, 747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &ExistingLangOpts, 757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine *Diags) { 767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define LANGOPT(Name, Bits, Default, Description) \ 777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.Name != LangOpts.Name) { \ 787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_mismatch) \ 807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Description << LangOpts.Name << ExistingLangOpts.Name; \ 817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define VALUE_LANGOPT(Name, Bits, Default, Description) \ 857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.Name != LangOpts.Name) { \ 867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_value_mismatch) \ 887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Description; \ 897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_value_mismatch) \ 967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Description; \ 977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BENIGN_LANGOPT(Name, Bits, Default, Description) 1017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/LangOptions.def" 1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 1057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 1067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_langopt_value_mismatch) 1077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "target Objective-C runtime"; 1087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 1097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 1127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Compare the given set of target options against an existing set of 1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// target options. 1167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 1177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Diags If non-NULL, diagnostics will be emitted via this engine. 1187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the target options mis-match, false otherwise. 1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool checkTargetOptions(const TargetOptions &TargetOpts, 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts, 1227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine *Diags) { 1237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define CHECK_TARGET_OPT(Field, Name) \ 1247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) \ 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_mismatch) \ 1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 1287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; \ 1297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(Triple, "target"); 1327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(CPU, "target CPU"); 1337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(ABI, "target ABI"); 1347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(CXXABI, "target C++ ABI"); 1357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CHECK_TARGET_OPT(LinkerVersion, "target linker version"); 1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#undef CHECK_TARGET_OPT 1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compare feature sets. 1397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<StringRef, 4> ExistingFeatures( 1407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingTargetOpts.FeaturesAsWritten.begin(), 1417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingTargetOpts.FeaturesAsWritten.end()); 1427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.FeaturesAsWritten.end()); 1447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::sort(ExistingFeatures.begin(), ExistingFeatures.end()); 1457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::sort(ReadFeatures.begin(), ReadFeatures.end()); 1467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size(); 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ReadIdx = 0, ReadN = ReadFeatures.size(); 1497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (ExistingIdx < ExistingN && ReadIdx < ReadN) { 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) { 1517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++ExistingIdx; 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++ReadIdx; 1537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 1547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) { 1577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 1587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 1597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << false << ReadFeatures[ReadIdx]; 1607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 1617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << true << ExistingFeatures[ExistingIdx]; 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ExistingIdx < ExistingN) { 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << true << ExistingFeatures[ExistingIdx]; 1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadIdx < ReadN) { 1777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) 1787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_targetopt_feature_mismatch) 1797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << false << ReadFeatures[ReadIdx]; 1807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 1817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool 1877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 1887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain) { 1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &ExistingLangOpts = PP.getLangOpts(); 1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkLanguageOptions(LangOpts, ExistingLangOpts, 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Complain? &Reader.Diags : 0); 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain) { 1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkTargetOptions(TargetOpts, ExistingTargetOpts, 1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Complain? &Reader.Diags : 0); 1997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> > 2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinitionsMap; 2047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Collect the macro definitions provided by the given preprocessor 2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// options. 2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void collectMacroDefinitions(const PreprocessorOptions &PPOpts, 2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinitionsMap &Macros, 2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<StringRef> *MacroNames = 0){ 2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Macro = PPOpts.Macros[I].first; 2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsUndef = PPOpts.Macros[I].second; 2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MacroName = MacroPair.first; 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MacroBody = MacroPair.second; 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For an #undef'd macro, we only care about the name. 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsUndef) { 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacroNames && !Macros.count(MacroName)) 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroNames->push_back(MacroName); 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macros[MacroName] = std::make_pair("", true); 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For a #define'd macro, figure out the actual definition. 2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacroName.size() == Macro.size()) 2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroBody = "1"; 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: GCC drops anything following an end-of-line character. 2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef::size_type End = MacroBody.find_first_of("\n\r"); 2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroBody = MacroBody.substr(0, End); 2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacroNames && !Macros.count(MacroName)) 2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroNames->push_back(MacroName); 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macros[MacroName] = std::make_pair(MacroBody, false); 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Check the preprocessor options deserialized from the control block 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// against the preprocessor options in an existing preprocessor. 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Diags If non-null, produce diagnostics for any mismatches incurred. 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts, 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine *Diags, 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &SuggestedPredefines) { 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check macro definitions. 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinitionsMap ASTFileMacros; 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei collectMacroDefinitions(PPOpts, ASTFileMacros); 2557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinitionsMap ExistingMacros; 2567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<StringRef, 4> ExistingMacroNames; 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Dig out the macro definition in the existing preprocessor options. 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef MacroName = ExistingMacroNames[I]; 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 2637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we know anything about this macro name or not. 2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ASTFileMacros.find(MacroName); 2677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Known == ASTFileMacros.end()) { 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Check whether this identifier was referenced anywhere in the 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // AST file. If so, we should reject the AST file. Unfortunately, this 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // information isn't in the control block. What shall we do about it? 2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Existing.second) { 2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#undef "; 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += MacroName.str(); 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += '\n'; 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#define "; 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += MacroName.str(); 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += ' '; 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += Existing.first.str(); 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += '\n'; 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the macro was defined in one but undef'd in the other, we have a 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // conflict. 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Existing.second != Known->second.second) { 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) { 2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_macro_def_undef) 2917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << MacroName << Known->second.second; 2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the macro was #undef'd in both, or if the macro bodies are identical, 2977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it's fine. 2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Existing.second || Existing.first == Known->second.first) 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The macro bodies differ; complain. 3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) { 3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_macro_def_conflict) 3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << MacroName << Known->second.first << Existing.first; 3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we're using predefines. 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) { 3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags) { 3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compute the #include and #include_macros lines we need. 3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef File = ExistingPPOpts.Includes[I]; 3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (File == ExistingPPOpts.ImplicitPCHInclude) 3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei != PPOpts.Includes.end()) 3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#include \""; 3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearch::NormalizeDashIncludePath(File, FileMgr); 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "\"\n"; 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef File = ExistingPPOpts.MacroIncludes[I]; 3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File) 3377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei != PPOpts.MacroIncludes.end()) 3387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 3397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "#__include_macros \""; 3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearch::NormalizeDashIncludePath(File, FileMgr); 3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines += "\"\n##\n"; 3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 3517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &SuggestedPredefines) { 3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Complain? &Reader.Diags : 0, 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getFileManager(), 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines); 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid PCHValidator::ReadHeaderFileInfo(const HeaderFileInfo &HFI, 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ID) { 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, ID); 3637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumHeaderInfos; 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.setCounterValue(Value); 3687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// AST reader implementation 3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::setDeserializationListener(ASTDeserializationListener *Listener) { 3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener = Listener; 3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return serialization::ComputeHash(Sel); 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned KeyLen = ReadUnalignedLE16(d); 3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen = ReadUnalignedLE16(d); 3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(KeyLen, DataLen); 3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::internal_key_type 3957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 3967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 3977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorTable &SelTable = Reader.getContext().Selectors; 3987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = ReadUnalignedLE16(d); 3997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *FirstII 4008222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor = Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)); 4017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (N == 0) 4027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTable.getNullarySelector(FirstII); 4037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (N == 1) 4047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTable.getUnarySelector(FirstII); 4057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<IdentifierInfo *, 16> Args; 4077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.push_back(FirstII); 4087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 1; I != N; ++I) 4098222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor Args.push_back(Reader.getLocalIdentifier(F, ReadUnalignedLE32(d))); 4107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelTable.getSelector(N, Args.data()); 4127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::data_type 4157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 4167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 4177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 4187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei data_type Result; 4207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Result.ID = Reader.getGlobalSelectorID(F, ReadUnalignedLE32(d)); 4227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumInstanceMethods = ReadUnalignedLE16(d); 4237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumFactoryMethods = ReadUnalignedLE16(d); 4247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load instance methods 4267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumInstanceMethods; ++I) { 4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCMethodDecl *Method 4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d))) 4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Result.Instance.push_back(Method); 4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load factory methods 4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumFactoryMethods; ++I) { 4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCMethodDecl *Method 4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d))) 4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Result.Factory.push_back(Method); 4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 4407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 442479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregorunsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 443479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor return llvm::HashString(a); 4447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 447479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas GregorASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 4487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 4497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen = ReadUnalignedLE16(d); 4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned KeyLen = ReadUnalignedLE16(d); 4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(KeyLen, DataLen); 4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 454479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas GregorASTIdentifierLookupTraitBase::internal_key_type 455479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas GregorASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(n >= 2 && d[n-1] == '\0'); 457479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor return StringRef((const char*) d, n-1); 4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 460f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor/// \brief Whether the given identifier is "interesting". 461f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregorstatic bool isInterestingIdentifier(IdentifierInfo &II) { 462f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor return II.isPoisoned() || 463f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.isExtensionToken() || 464f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.getObjCOrBuiltinID() || 465f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.hasRevertedTokenIDToIdentifier() || 466f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.hadMacroDefinition() || 467f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II.getFETokenInfo<void>(); 468f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor} 469f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor 4707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 4717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char* d, 4727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 4737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 4747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RawID = ReadUnalignedLE32(d); 4757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsInteresting = RawID & 0x01; 4767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Wipe out the "is interesting" bit. 4787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RawID = RawID >> 1; 4797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IsInteresting) { 4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For uninteresting identifiers, just build the IdentifierInfo 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and associate it with the persistent ID. 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = KnownII; 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!II) { 486479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor II = &Reader.getIdentifierTable().getOwn(k); 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei KnownII = II; 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.SetIdentifierInfo(ID, II); 490f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (!II->isFromAST()) { 491f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor bool WasInteresting = isInterestingIdentifier(*II); 492f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setIsFromAST(); 493f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (WasInteresting) 494f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setChangedSinceDeserialization(); 495f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor } 496f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor Reader.markIdentifierUpToDate(II); 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return II; 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ObjCOrBuiltinID = ReadUnalignedLE16(d); 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Bits = ReadUnalignedLE16(d); 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool CPlusPlusOperatorKeyword = Bits & 0x01; 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HasRevertedTokenIDToIdentifier = Bits & 0x01; 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Poisoned = Bits & 0x01; 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool ExtensionToken = Bits & 0x01; 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hadMacroDefinition = Bits & 0x01; 5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits >>= 1; 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Bits == 0 && "Extra bits in the identifier?"); 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DataLen -= 8; 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Build the IdentifierInfo itself and link the identifier ID with 5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the new IdentifierInfo. 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = KnownII; 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!II) { 520479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor II = &Reader.getIdentifierTable().getOwn(StringRef(k)); 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei KnownII = II; 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.markIdentifierUpToDate(II); 524f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (!II->isFromAST()) { 525f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor bool WasInteresting = isInterestingIdentifier(*II); 526f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setIsFromAST(); 527f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor if (WasInteresting) 528f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor II->setChangedSinceDeserialization(); 529f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor } 5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set or check the various bits in the IdentifierInfo structure. 5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Token IDs are read-only. 5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (HasRevertedTokenIDToIdentifier) 5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->RevertTokenIDToIdentifier(); 5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->setObjCOrBuiltinID(ObjCOrBuiltinID); 5367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(II->isExtensionToken() == ExtensionToken && 5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Incorrect extension token flag"); 5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void)ExtensionToken; 5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Poisoned) 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->setIsPoisoned(true); 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Incorrect C++ operator keyword flag"); 5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void)CPlusPlusOperatorKeyword; 5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this identifier is a macro, deserialize the macro 5467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // definition. 5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (hadMacroDefinition) { 548dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis SmallVector<MacroID, 4> MacroIDs; 549dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis while (uint32_t LocalID = ReadUnalignedLE32(d)) { 550dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis MacroIDs.push_back(Reader.getGlobalMacroID(F, LocalID)); 551dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis DataLen -= 4; 552dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis } 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DataLen -= 4; 554dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis Reader.setIdentifierIsMacro(II, MacroIDs); 5557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.SetIdentifierInfo(ID, II); 5587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read all of the declarations visible at global scope with this 5607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // name. 5617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DataLen > 0) { 5627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<uint32_t, 4> DeclIDs; 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; DataLen > 0; DataLen -= 4) 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclIDs.push_back(Reader.getGlobalDeclID(F, ReadUnalignedLE32(d))); 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.SetGloballyVisibleDecls(II, DeclIDs); 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return II; 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const { 5737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::FoldingSetNodeID ID; 5747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddInteger(Key.Kind); 5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Key.Kind) { 5777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddString(((IdentifierInfo*)Key.Data)->getName()); 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddInteger(serialization::ComputeHash(Selector(Key.Data))); 5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 5877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID.AddInteger((OverloadedOperatorKind)Key.Data); 5887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 5917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ID.ComputeHash(); 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::internal_key_type 6007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::GetInternalKey( 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const external_key_type& Name) const { 6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclNameKey Key; 6037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Kind = Name.getNameKind(); 6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Name.getNameKind()) { 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Name.getAsIdentifierInfo(); 6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = Name.getCXXOverloadedOperator(); 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Name.getCXXLiteralIdentifier(); 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = 0; 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Key; 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned KeyLen = ReadUnalignedLE16(d); 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen = ReadUnalignedLE16(d); 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(KeyLen, DataLen); 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::internal_key_type 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) { 6407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclNameKey Key; 6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Kind = (DeclarationName::NameKind)*d++; 6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Key.Kind) { 6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)); 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 6497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 6507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (uint64_t)Reader.getLocalSelector(F, ReadUnalignedLE32(d)) 6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .getAsOpaquePtr(); 6547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 6567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = *d++; // OverloadedOperatorKind 6577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 6597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)); 6607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 6657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Key.Data = 0; 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Key; 6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::data_type 6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeclContextNameLookupTrait::ReadData(internal_key_type, 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char* d, 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 6777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumDecls = ReadUnalignedLE16(d); 678e8b61cfc0c9233b6983ad9ed052900800e7613d9Argyrios Kyrtzidis LE32DeclID *Start = reinterpret_cast<LE32DeclID *>( 679e8b61cfc0c9233b6983ad9ed052900800e7613d9Argyrios Kyrtzidis const_cast<unsigned char *>(d)); 6807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(Start, Start + NumDecls); 6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadDeclContextStorage(ModuleFile &M, 6848f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor, 6857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::pair<uint64_t, uint64_t> &Offsets, 6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextInfo &Info) { 6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // First the lexical decls. 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Offsets.first != 0) { 6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Offsets.first); 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 693b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 695b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != DECL_CONTEXT_LEXICAL) { 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Expected lexical block"); 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 701b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data()); 702b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair); 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Now the lookup table. 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Offsets.second != 0) { 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Offsets.second); 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 710b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 712b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != DECL_CONTEXT_VISIBLE) { 7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Expected visible lookup table block"); 7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.NameLookupTableData 7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ASTDeclContextNameLookupTable::Create( 719b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (const unsigned char *)Blob.data() + Record[0], 720b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (const unsigned char *)Blob.data(), 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTrait(*this, M)); 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::Error(StringRef Msg) { 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error(diag::err_fe_pch_malformed, Msg); 7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::Error(unsigned DiagID, 7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Arg1, StringRef Arg2) { 7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Diags.isDiagnosticInFlight()) 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2); 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(DiagID) << Arg1 << Arg2; 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Source Manager Deserialization 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read the line table in the source manager block. 7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if there was an error. 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseLineTable(ModuleFile &F, 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<uint64_t> &Record) { 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineTableInfo &LineTable = SourceMgr.getLineTable(); 7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Parse the file names 7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::map<int, int> FileIDs; 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (int I = 0, N = Record[Idx++]; I != N; ++I) { 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Extract the file name 7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FilenameLen = Record[Idx++]; 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen); 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += FilenameLen; 7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MaybeAddSystemRootToFilename(F, Filename); 7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Parse the line entries 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::vector<LineEntry> Entries; 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Idx < Record.size()) { 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int FID = Record[Idx++]; 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(FID >= 0 && "Serialized line entries for non-local file."); 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Remap FileID from 1-based old view. 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FID += F.SLocEntryBaseID - 1; 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Extract the line entries 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumEntries = Record[Idx++]; 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(NumEntries && "Numentries is 00000"); 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Entries.clear(); 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Entries.reserve(NumEntries); 7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumEntries; ++I) { 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FileOffset = Record[Idx++]; 7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LineNo = Record[Idx++]; 7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int FilenameID = FileIDs[Record[Idx++]]; 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::CharacteristicKind FileKind 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (SrcMgr::CharacteristicKind)Record[Idx++]; 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IncludeOffset = Record[Idx++]; 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileKind, IncludeOffset)); 7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LineTable.AddEntry(FileID::get(FID), Entries); 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a source manager block 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace SrcMgr; 7937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7948f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Set the source-location entry cursor to the current position in 7977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the stream. This cursor will be used to read the contents of the 7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // source manager block initially, and then lazily read 7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // source-location entries as needed. 8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocEntryCursor = F.Stream; 8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The stream itself is going to skip over the source manager block. 8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.Stream.SkipBlock()) { 8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Enter the source manager block. 8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed source manager block record in AST file"); 8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 81688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks(); 81788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 81888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (E.Kind) { 81988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 82088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 82188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 82288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return true; 82388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::EndBlock: 8247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 82588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 82688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // The interesting case. 82788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 8287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 82988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 8307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 8317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 832125eb3e3b6cc2f3e7b2e0e04e59c924f936520f5Chris Lattner StringRef Blob; 833125eb3e3b6cc2f3e7b2e0e04e59c924f936520f5Chris Lattner switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) { 8347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: // Default behavior: ignore. 8357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_FILE_ENTRY: 8387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_BUFFER_ENTRY: 8397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_EXPANSION_ENTRY: 8407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Once we hit one of the source location entries, we're done. 8417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 8427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief If a header file is not found at the path that we expect it to be 8477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and the PCH file was moved from its original location, try to resolve the 8487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// file by assuming that header+PCH were moved together and the header is in 8497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the same place relative to the PCH. 8507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic std::string 8517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiresolveFileRelativeToOriginalDir(const std::string &Filename, 8527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &OriginalDir, 8537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &CurrDir) { 8547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(OriginalDir != CurrDir && 8557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "No point trying to resolve the file if the PCH dir didn't change"); 8567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace llvm::sys; 8577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<128> filePath(Filename); 8587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fs::make_absolute(filePath); 8597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(path::is_absolute(OriginalDir)); 8607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<128> currPCHPath(CurrDir); 8617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 8637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei fileDirE = path::end(path::parent_path(filePath)); 8647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::const_iterator origDirI = path::begin(OriginalDir), 8657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei origDirE = path::end(OriginalDir); 8667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Skip the common path components from filePath and OriginalDir. 8677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (fileDirI != fileDirE && origDirI != origDirE && 8687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *fileDirI == *origDirI) { 8697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++fileDirI; 8707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++origDirI; 8717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; origDirI != origDirE; ++origDirI) 8737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::append(currPCHPath, ".."); 8747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::append(currPCHPath, fileDirI, fileDirE); 8757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei path::append(currPCHPath, path::filename(Filename)); 8767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return currPCHPath.str(); 8777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 8787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadSLocEntry(int ID) { 8807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 8817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 8827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 8847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("source location entry ID out-of-range for AST file"); 8857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 8867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 8897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]); 8908f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 8917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BaseOffset = F->SLocEntryBaseOffset; 8927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumSLocEntriesRead; 89488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry Entry = SLocEntryCursor.advance(); 89588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) { 8967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrectly-formatted source location entry in AST file"); 8977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 8987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 89988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 9007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 901b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 902b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) { 9037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 9047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrectly-formatted source location entry in AST file"); 9057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 9067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_FILE_ENTRY: { 9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We will detect whether a file changed and return 'Failure' for it, but 9097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // we will also try to fail gracefully by setting up the SLocEntry. 9107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned InputID = Record[4]; 9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InputFile IF = getInputFile(*F, InputID); 9127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FileEntry *File = IF.getPointer(); 9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool OverriddenBuffer = IF.getInt(); 9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IF.getPointer()) 9167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 9177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 9197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 9207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This is the module's main file. 9217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IncludeLoc = getImportLocation(F); 9227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::CharacteristicKind 9247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 9257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter, 9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID, BaseOffset + Record[0]); 9277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::FileInfo &FileInfo = 9287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileInfo.NumCreatedFIDs = Record[5]; 9307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[3]) 9317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileInfo.setHasLineDirectives(); 9327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 9347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumFileDecls = Record[7]; 9357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumFileDecls) { 9367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 9377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 9387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumFileDecls)); 9397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const SrcMgr::ContentCache *ContentCache 9427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceMgr.getOrCreateContentCache(File, 9437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*isSystemFile=*/FileCharacter != SrcMgr::C_User); 9447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (OverriddenBuffer && !ContentCache->BufferOverridden && 9457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContentCache->ContentsEntry == ContentCache->OrigEntry) { 9467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = SLocEntryCursor.ReadCode(); 9477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 948b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob); 9497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != SM_SLOC_BUFFER_BLOB) { 9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("AST record has invalid code"); 9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 9537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MemoryBuffer *Buffer 956b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName()); 9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.overrideFileContents(File, Buffer); 9587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_BUFFER_ENTRY: { 964b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const char *Name = Blob.data(); 9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Offset = Record[0]; 9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SrcMgr::CharacteristicKind 9677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IncludeLoc.isInvalid() && F->Kind == MK_Module) { 9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IncludeLoc = getImportLocation(F); 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = SLocEntryCursor.ReadCode(); 9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RecCode 975b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = SLocEntryCursor.readRecord(Code, Record, &Blob); 9767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != SM_SLOC_BUFFER_BLOB) { 9787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("AST record has invalid code"); 9797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 9807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::MemoryBuffer *Buffer 983b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name); 9847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.createFileIDForMemBuffer(Buffer, FileCharacter, ID, 9857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset + Offset, IncludeLoc); 9867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SM_SLOC_EXPANSION_ENTRY: { 9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.createExpansionLoc(SpellingLoc, 9927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(*F, Record[2]), 9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(*F, Record[3]), 9947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[4], 9957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID, 9967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseOffset + Record[0]); 9977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 10057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 10067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(SourceLocation(), ""); 10077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 10097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("source location entry ID out-of-range for AST file"); 10107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(SourceLocation(), ""); 10117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Find which module file this entry lands in. 10147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M->Kind != MK_Module) 10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(SourceLocation(), ""); 10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Can we map this down to a particular submodule? That would be 10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ideal. 10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(M->ImportLoc, llvm::sys::path::stem(M->FileName)); 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Find the location where the module F is imported. 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSourceLocation ASTReader::getImportLocation(ModuleFile *F) { 10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F->ImportLoc.isValid()) 10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F->ImportLoc; 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise we have a PCH. It's considered to be "imported" at the first 10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // location of its includer. 10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Main file is the importer. We assume that it is the first entry in the 10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // entry table. We can't ask the manager, because at the time of PCH loading 10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the main file entry doesn't exist yet. 10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The very first entry is the invalid instantiation loc, which takes up 10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // offsets 0 and 1. 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SourceLocation::getFromRawEncoding(2U); 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei //return F->Loaders[0]->FirstLoc; 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F->ImportedBy[0]->FirstLoc; 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the 10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// specified cursor. Read the abbreviations that are at the top of the block 10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and then leave the cursor pointing into the block. 10458f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattnerbool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) { 10467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Cursor.EnterSubBlock(BlockID)) { 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint64_t Offset = Cursor.GetCurrentBitNo(); 10537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We expect all abbrevs to be at the start of the block. 10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Code != llvm::bitc::DEFINE_ABBREV) { 10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Offset); 10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.ReadAbbrevRecord(); 10617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1064dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidisvoid ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset, 1065dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis MacroInfo *Hint) { 10668f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.MacroCursor; 10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Keep track of where we are in the stream, then jump back there 10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // after reading this macro. 10707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Stream); 10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.JumpToBit(Offset); 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<IdentifierInfo*, 16> MacroArgs; 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroInfo *Macro = 0; 10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1077d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor // RAII object to add the loaded macro information once we're done 1078d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor // adding tokens. 1079d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor struct AddLoadedMacroInfoRAII { 1080d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor Preprocessor &PP; 1081dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis MacroInfo *Hint; 1082d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor MacroInfo *MI; 1083d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor IdentifierInfo *II; 1084d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor 1085dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis AddLoadedMacroInfoRAII(Preprocessor &PP, MacroInfo *Hint) 1086dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis : PP(PP), Hint(Hint), MI(), II() { } 1087d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor ~AddLoadedMacroInfoRAII( ) { 1088d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor if (MI) { 1089d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor // Finally, install the macro. 1090dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis PP.addLoadedMacroInfo(II, MI, Hint); 1091d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor } 1092d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor } 1093dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis } AddLoadedMacroInfo(PP, Hint); 1094d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor 10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 109699a5af0088b6340540912921cd0008ac75051a33Chris Lattner // Advance to the next record, but if we get to the end of the block, don't 109799a5af0088b6340540912921cd0008ac75051a33Chris Lattner // pop it (removing all the abbreviations from the cursor) since we want to 109899a5af0088b6340540912921cd0008ac75051a33Chris Lattner // be able to reseek within the block and read entries. 10998f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 110099a5af0088b6340540912921cd0008ac75051a33Chris Lattner llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags); 110199a5af0088b6340540912921cd0008ac75051a33Chris Lattner 110299a5af0088b6340540912921cd0008ac75051a33Chris Lattner switch (Entry.Kind) { 110399a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 110499a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Error: 110599a5af0088b6340540912921cd0008ac75051a33Chris Lattner Error("malformed block record in AST file"); 11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 110799a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::EndBlock: 110899a5af0088b6340540912921cd0008ac75051a33Chris Lattner return; 110999a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Record: 111099a5af0088b6340540912921cd0008ac75051a33Chris Lattner // The interesting case. 111199a5af0088b6340540912921cd0008ac75051a33Chris Lattner break; 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 11157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 11167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessorRecordTypes RecType = 1117b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record); 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (RecType) { 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_MACRO_OBJECT_LIKE: 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_MACRO_FUNCTION_LIKE: { 11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we already have a macro, that means that we've hit the end 11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // of the definition of the macro we were looking for. We're 11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // done. 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Macro) 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 11267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = getLocalIdentifier(F, Record[0]); 11287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (II == 0) { 11297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("macro must have a name in AST file"); 11307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 11317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned GlobalID = getGlobalMacroID(F, Record[1]); 11347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this macro has already been loaded, don't do so again. 11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS]) 11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID GlobalSubmoduleID = getGlobalSubmoduleID(F, Record[2]); 11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NextIndex = 3; 11417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroInfo *MI = PP.AllocateMacroInfo(Loc); 11438169b671974fc15b6059b1e9532f7f3207d79786Argyrios Kyrtzidis MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record this macro. 11467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS] = MI; 11477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation UndefLoc = ReadSourceLocation(F, Record, NextIndex); 11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (UndefLoc.isValid()) 11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setUndefLoc(UndefLoc); 11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setIsUsed(Record[NextIndex++]); 11537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setIsFromAST(); 11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsPublic = Record[NextIndex++]; 11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setVisibility(IsPublic, ReadSourceLocation(F, Record, NextIndex)); 11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecType == PP_MACRO_FUNCTION_LIKE) { 11597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Decode function-like macro info. 11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isC99VarArgs = Record[NextIndex++]; 11617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isGNUVarArgs = Record[NextIndex++]; 11627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hasCommaPasting = Record[NextIndex++]; 11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroArgs.clear(); 11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = Record[NextIndex++]; 11657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0; i != NumArgs; ++i) 11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++])); 11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Install function-like macro info. 11697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setIsFunctionLike(); 11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isC99VarArgs) MI->setIsC99Varargs(); 11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isGNUVarArgs) MI->setIsGNUVarargs(); 11727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (hasCommaPasting) MI->setHasCommaPasting(); 11737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setArgumentList(MacroArgs.data(), MacroArgs.size(), 11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getPreprocessorAllocator()); 11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->MacroRead(GlobalID, MI); 11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If an update record marked this as undefined, do so now. 11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Only if the submodule this update came from is visible? 11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroUpdatesMap::iterator Update = MacroUpdates.find(GlobalID); 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Update != MacroUpdates.end()) { 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MI->getUndefLoc().isInvalid()) { 11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Update->second.size(); I != N; ++I) { 11867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Hidden = false; 11877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned SubmoduleID = Update->second[I].first) { 11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Module *Owner = getSubmodule(SubmoduleID)) { 11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Owner->NameVisibility == Module::Hidden) { 11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that this #undef is hidden. 11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Hidden = true; 11927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record this hiding for later. 11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMap[Owner].push_back( 11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenName(II, MI, Update->second[I].second.UndefLoc)); 11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Hidden) { 12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setUndefLoc(Update->second[I].second.UndefLoc); 12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PPMutationListener *Listener = PP.getPPMutationListener()) 12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Listener->UndefinedMacro(MI); 12047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroUpdates.erase(Update); 12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Determine whether this macro definition is visible. 12127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Hidden = !MI->isPublic(); 12137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Hidden && GlobalSubmoduleID) { 12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Module *Owner = getSubmodule(GlobalSubmoduleID)) { 12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Owner->NameVisibility == Module::Hidden) { 12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The owning module is not visible, and this macro definition 12177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // should not be, either. 12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Hidden = true; 12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that this macro definition was hidden because its owning 12217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module is not yet visible. 12227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMap[Owner].push_back(HiddenName(II, MI)); 12237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MI->setHidden(Hidden); 12277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1228dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis // Make sure we install the macro once we're done. 1229dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis AddLoadedMacroInfo.MI = MI; 1230dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis AddLoadedMacroInfo.II = II; 1231d3b036efdf0bf4ec216c701183a4b990cd041cd6Douglas Gregor 12327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Remember that we saw this macro last so that we add the tokens that 12337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // form its body to it. 12347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macro = MI; 12357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 12377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[NextIndex]) { 12387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We have a macro definition. Register the association 12397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID 12407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 12417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 12427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPRec.RegisterMacroDefinition(Macro, 12437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true)); 12447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumMacrosRead; 12477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_TOKEN: { 12517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we see a TOKEN before a PP_MACRO_*, then the file is 12527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // erroneous, just pretend we didn't see this. 12537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Macro == 0) break; 12547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Token Tok; 12567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tok.startToken(); 12577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tok.setLocation(ReadSourceLocation(F, Record[0])); 12587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tok.setLength(Record[1]); 12597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IdentifierInfo *II = getLocalIdentifier(F, Record[2])) 12607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tok.setIdentifierInfo(II); 12617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tok.setKind((tok::TokenKind)Record[3]); 12627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Tok.setFlag((Token::TokenFlags)Record[4]); 12637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macro->AddTokenToBody(Tok); 12647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntityID 12717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const { 12727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::const_iterator 12737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 12747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.PreprocessedEntityRemap.end() 12757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into preprocessed entity index remap"); 12767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 12787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned HeaderFileInfoTrait::ComputeHash(const char *path) { 12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::HashString(llvm::sys::path::filename(path)); 12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::internal_key_type 12857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::GetInternalKey(const char *path) { return path; } 12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool HeaderFileInfoTrait::EqualKey(internal_key_type a, internal_key_type b) { 12887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (strcmp(a, b) == 0) 12897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 12907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::sys::path::filename(a) != llvm::sys::path::filename(b)) 12927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 12937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Determine whether the actual files are equivalent. 12957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Result = false; 12967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::sys::fs::equivalent(a, b, Result)) 12977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 12987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 13037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 13047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d); 13057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen = (unsigned) *d++; 13067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(KeyLen + 1, DataLen); 13077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::data_type 13107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfoTrait::ReadData(const internal_key_type, const unsigned char *d, 13117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DataLen) { 13127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char *End = d + DataLen; 13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei using namespace clang::io; 13147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfo HFI; 13157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Flags = *d++; 13167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.isImport = (Flags >> 5) & 0x01; 13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.isPragmaOnce = (Flags >> 4) & 0x01; 13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.DirInfo = (Flags >> 2) & 0x03; 13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.Resolved = (Flags >> 1) & 0x01; 13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.IndexHeaderMapHeader = Flags & 0x01; 13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.NumIncludes = ReadUnalignedLE16(d); 13227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.ControllingMacroID = Reader.getGlobalIdentifierID(M, 13237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadUnalignedLE32(d)); 13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned FrameworkOffset = ReadUnalignedLE32(d)) { 13257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The framework offset is 1 greater than the actual offset, 13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since 0 is used as an indicator for "no framework name". 13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 13287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(End == d && "Wrong data length in HeaderFileInfo deserialization"); 13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void)End; 13337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This HeaderFileInfo was externally loaded. 13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HFI.External = true; 13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return HFI; 13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1339dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidisvoid ASTReader::setIdentifierIsMacro(IdentifierInfo *II, ArrayRef<MacroID> IDs){ 13407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->setHadMacroDefinition(true); 13417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1342dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis PendingMacroIDs[II].append(IDs.begin(), IDs.end()); 13437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDefinedMacros() { 13467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading defined macros. 13477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing Macros(this); 13487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleReverseIterator I = ModuleMgr.rbegin(), 13507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ModuleMgr.rend(); I != E; ++I) { 13518f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &MacroCursor = (*I)->MacroCursor; 13527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there was no preprocessor block, skip this file. 13547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!MacroCursor.getBitStreamReader()) 13557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 13567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13578f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor Cursor = MacroCursor; 13587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit((*I)->MacroStartOffset); 13597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 13617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 136288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks(); 136388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 136488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (E.Kind) { 136588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 136688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 136788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 136888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return; 136988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::EndBlock: 137088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner goto NextCursor; 137188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 137288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 137388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Record.clear(); 1374b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch (Cursor.readRecord(E.ID, Record)) { 137588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner default: // Default behavior: ignore. 137688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 137788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 137888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case PP_MACRO_OBJECT_LIKE: 137988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case PP_MACRO_FUNCTION_LIKE: 138088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner getLocalIdentifier(**I, Record[0]); 138188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 138288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 138388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case PP_TOKEN: 138488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // Ignore tokens. 138588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 13867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 13887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 139088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner NextCursor: ; 13917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 13937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 13957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Visitor class used to look up identifirs in an AST file. 13967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class IdentifierLookupVisitor { 13977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name; 13987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration; 1399e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookups; 1400e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookupHits; 14017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *Found; 1402e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor 14037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 1404e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 1405e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookups, 1406e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor unsigned &NumIdentifierLookupHits) 1407188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor : Name(Name), PriorGeneration(PriorGeneration), 1408e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookups(NumIdentifierLookups), 1409e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits(NumIdentifierLookupHits), 1410e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor Found() 1411e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor { 1412e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor } 14137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 14157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierLookupVisitor *This 14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<IdentifierLookupVisitor *>(UserData); 14177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already searched this module file, skip it now. 14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M.Generation <= This->PriorGeneration) 14207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 14211a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable *IdTable 14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IdTable) 14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), 14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M, This->Found); 1429e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor ++This->NumIdentifierLookups; 1430e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait); 14317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == IdTable->end()) 14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Dereferencing the iterator has the effect of building the 14357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // IdentifierInfo node and populating it with the various 14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declarations it needs. 1437e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor ++This->NumIdentifierLookupHits; 14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Found = *Pos; 14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 14407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // \brief Retrieve the identifier info found within the module 14437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // files. 14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *getIdentifierInfo() const { return Found; } 14457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 14467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 14497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading an identifier. 14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing AnIdentifier(this); 14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration = 0; 14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (getContext().getLangOpts().Modules) 14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PriorGeneration = IdentifierGeneration[&II]; 14551a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 14561a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // If there is a global index, look there first to determine which modules 14571a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // provably do not have any results for this identifier. 1458188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor GlobalModuleIndex::HitSet Hits; 1459188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor GlobalModuleIndex::HitSet *HitsPtr = 0; 14601a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (!loadGlobalIndex()) { 1461188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 1462188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor HitsPtr = &Hits; 14631a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 14641a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 14651a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 1466188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 1467e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookups, 1468e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits); 1469188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 14707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei markIdentifierUpToDate(&II); 14717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 14747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!II) 14757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei II->setOutOfDate(false); 14787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update the generation for this identifier. 14807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (getContext().getLangOpts().Modules) 14817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierGeneration[II] = CurrentGeneration; 14827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::PointerIntPair<const FileEntry *, 1, bool> 14857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 14867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this ID is bogus, just return an empty input file. 14877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0 || ID > F.InputFilesLoaded.size()) 14887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InputFile(); 14897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already loaded this input file, return it. 14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.InputFilesLoaded[ID-1].getPointer()) 14927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return F.InputFilesLoaded[ID-1]; 14937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Go find this input file. 14958f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor = F.InputFilesCursor; 14967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 14977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 14987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 15007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 1501b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 1502b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 15037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case INPUT_FILE: { 15047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned StoredID = Record[0]; 15057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ID == StoredID && "Bogus stored ID or offset"); 15067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void)StoredID; 15077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei off_t StoredSize = (off_t)Record[1]; 15087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei time_t StoredTime = (time_t)Record[2]; 15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Overridden = (bool)Record[3]; 15107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the file entry for this input file. 1512b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef OrigFilename = Blob; 15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Filename = OrigFilename; 15147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MaybeAddSystemRootToFilename(F, Filename); 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FileEntry *File 15167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime) 15177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : FileMgr.getFile(Filename, /*OpenFile=*/false); 15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we didn't find the file, resolve it relative to the 15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // original directory from which this AST file was created. 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (File == 0 && !F.OriginalDir.empty() && !CurrentDir.empty() && 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalDir != CurrentDir) { 15237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Resolved = resolveFileRelativeToOriginalDir(Filename, 15247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalDir, 15257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentDir); 15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Resolved.empty()) 15277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File = FileMgr.getFile(Resolved); 15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For an overridden file, create a virtual file with the stored 15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // size/timestamp. 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Overridden && File == 0) { 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 15347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (File == 0) { 15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Complain) { 15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string ErrorStr = "could not find file '"; 15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ErrorStr += Filename; 15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ErrorStr += "' referenced by AST file"; 15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error(ErrorStr.c_str()); 15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InputFile(); 15447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we've loaded this input file. 15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.InputFilesLoaded[ID-1] = InputFile(File, Overridden); 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if there was a request to override the contents of the file 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that was part of the precompiled header. Overridding such a file 15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // can lead to problems when lexing using the source locations from the 15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // PCH. 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = getSourceManager(); 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Overridden && SM.isFileOverridden(File)) { 15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error(diag::err_fe_pch_file_overridden, Filename); 15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // After emitting the diagnostic, recover by disabling the override so 15577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that the original file will be used. 15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SM.disableFileContentsOverride(File); 15597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The FileEntry is a virtual file entry with the size of the contents 15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that would override the original contents. Set it to the original's 15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // size/time. 15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileMgr.modifyFileEntry(const_cast<FileEntry*>(File), 15637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StoredSize, StoredTime); 15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For an overridden file, there is nothing to validate. 15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Overridden) 15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InputFile(File, Overridden); 15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((StoredSize != File->getSize() 15717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if !defined(LLVM_ON_WIN32) 15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // In our regression testing, the Windows file system seems to 15737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have inconsistent modification times that sometimes 15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // erroneously trigger this error-handling path. 15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei || StoredTime != File->getModificationTime() 15767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif 15777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei )) { 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Complain) 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error(diag::err_fe_pch_file_modified, Filename); 15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InputFile(); 15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InputFile(File, Overridden); 15857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InputFile(); 15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiconst FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) { 15927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = ModuleMgr.getPrimaryModule(); 15937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Filename = filenameStrRef; 15947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MaybeAddSystemRootToFilename(M, Filename); 15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FileEntry *File = FileMgr.getFile(Filename); 15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (File == 0 && !M.OriginalDir.empty() && !CurrentDir.empty() && 15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M.OriginalDir != CurrentDir) { 15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string resolved = resolveFileRelativeToOriginalDir(Filename, 15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M.OriginalDir, 16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentDir); 16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!resolved.empty()) 16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File = FileMgr.getFile(resolved); 16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return File; 16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief If we are loading a relocatable PCH file, and the filename is 16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// not an absolute path, add the system root to the beginning of the file 16107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// name. 16117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M, 16127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &Filename) { 16137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is not a relocatable PCH file, there's nothing to do. 16147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!M.RelocatablePCH) 16157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 16167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 16187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 16197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isysroot.empty()) { 16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If no system root was given, default to '/' 16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Filename.insert(Filename.begin(), '/'); 16237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 16247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Length = isysroot.size(); 16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isysroot[Length - 1] != '/') 16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Filename.insert(Filename.begin(), '/'); 16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end()); 16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ASTReadResult 16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadControlBlock(ModuleFile &F, 1635cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<ImportedModule> &Loaded, 16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ClientLoadCapabilities) { 16378f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.Stream; 16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 16407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read all of the records and blocks in the control block. 16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 164688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner while (1) { 164788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry Entry = Stream.advance(); 164888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 164988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.Kind) { 165088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 165188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 165288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return Failure; 165388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::EndBlock: 16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Validate all of the input files. 16557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DisableValidation) { 16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record[0]; I < N; ++I) 16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getInputFile(F, I+1, Complain).getPointer()) 16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return OutOfDate; 16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 166288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 166388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: 166488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.ID) { 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case INPUT_FILES_BLOCK_ID: 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.InputFilesCursor = Stream; 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || // Skip with the main cursor 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the abbreviations 16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 167488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 167688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Stream.SkipBlock()) { 167788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 167888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return Failure; 167988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 168088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner continue; 16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 168288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 168388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 168488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // The interesting case. 168588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read and process a record. 16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 1690b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 1691b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case METADATA: { 16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0] != VERSION_MAJOR && !DisableValidation) { 16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old 16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : diag::warn_pch_version_too_new); 16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionMismatch; 16987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hasErrors = Record[5]; 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(diag::err_pch_with_compiler_errors); 17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return HadErrors; 17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.RelocatablePCH = Record[4]; 17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const std::string &CurBranch = getClangFullRepositoryVersion(); 1709b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef ASTBranch = Blob; 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch; 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionMismatch; 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IMPORTS: { 17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load each of the imported PCH files. 17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0, N = Record.size(); 17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Idx < N) { 17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read information about the AST file. 17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The import location will be the local one for now; we will adjust 17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // all import locations of module imports after the global source 17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // location info are setup. 17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ImportLoc = 17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation::getFromRawEncoding(Record[Idx++]); 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Length = Record[Idx++]; 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<128> ImportedFile(Record.begin() + Idx, 17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.begin() + Idx + Length); 17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += Length; 17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the AST file. 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded, 17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClientLoadCapabilities)) { 17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Failure: return Failure; 17387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have to ignore the dependency, we'll have to ignore this too. 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OutOfDate: return OutOfDate; 17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VersionMismatch: return VersionMismatch; 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ConfigurationMismatch: return ConfigurationMismatch; 17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HadErrors: return HadErrors; 17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Success: break; 17447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case LANGUAGE_OPTIONS: { 17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 17517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseLanguageOptions(Record, Complain, *Listener) && 17537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !DisableValidation) 17547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 17557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TARGET_OPTIONS: { 17597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 17607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 17617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseTargetOptions(Record, Complain, *Listener) && 17627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !DisableValidation) 17637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 17647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DIAGNOSTIC_OPTIONS: { 17687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 17697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 17707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseDiagnosticOptions(Record, Complain, *Listener) && 17717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !DisableValidation) 17727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 17737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case FILE_SYSTEM_OPTIONS: { 17777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 17787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 17797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseFileSystemOptions(Record, Complain, *Listener) && 17807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !DisableValidation) 17817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 17827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HEADER_SEARCH_OPTIONS: { 17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParseHeaderSearchOptions(Record, Complain, *Listener) && 17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !DisableValidation) 17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREPROCESSOR_OPTIONS: { 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0; 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener && &F == *ModuleMgr.begin() && 17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParsePreprocessorOptions(Record, Complain, *Listener, 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines) && 17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !DisableValidation) 18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ConfigurationMismatch; 18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ORIGINAL_FILE: 18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalSourceFileID = FileID::get(Record[0]); 1806b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.ActualOriginalSourceFileName = Blob; 18077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName); 18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ORIGINAL_FILE_ID: 18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.OriginalSourceFileID = FileID::get(Record[0]); 18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ORIGINAL_PCH_DIR: 1816b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.OriginalDir = Blob; 18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case INPUT_FILE_OFFSETS: 1820b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.InputFileOffsets = (const uint32_t *)Blob.data(); 18217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.InputFilesLoaded.resize(Record[0]); 18227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadASTBlock(ModuleFile &F) { 18288f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.Stream; 18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.EnterSubBlock(AST_BLOCK_ID)) { 18317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 18327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read all of the records and blocks for the AST file. 18367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 183788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner while (1) { 183888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner llvm::BitstreamEntry Entry = Stream.advance(); 183988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 184088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.Kind) { 184188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Error: 184288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("error at end of module block in AST file"); 184388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return true; 184488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::EndBlock: { 18457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContext *DC = Context.getTranslationUnitDecl(); 18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DC->hasExternalVisibleStorage() && DC->hasExternalLexicalStorage()) 18477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DC->setMustBuildLookupTable(); 184888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 18497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 185188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::SubBlock: 185288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner switch (Entry.ID) { 18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECLTYPES_BLOCK_ID: 18547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We lazily load the decls block, but we want to set up the 18557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // DeclsCursor cursor to point into it. Clone our current bitcode 18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // cursor to it, enter the block and read the abbrevs in that block. 18577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // With the main cursor, we just skip over it. 18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.DeclsCursor = Stream; 18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || // Skip with the main cursor. 18607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the abbrevs. 18617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) { 18627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 18637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 18647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 186688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 18677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECL_UPDATES_BLOCK_ID: 18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock()) { 18697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 18707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 18717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 187388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 18747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREPROCESSOR_BLOCK_ID: 18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.MacroCursor = Stream; 18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getExternalSource()) 18777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.setExternalSource(this); 187888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 18797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || 18807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 18837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 18857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 188688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 18877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREPROCESSOR_DETAIL_BLOCK_ID: 18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreprocessorDetailCursor = Stream; 18897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || 189088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner ReadBlockAbbrevs(F.PreprocessorDetailCursor, 18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PREPROCESSOR_DETAIL_BLOCK_ID)) { 189288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed preprocessor detail record in AST file"); 189388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return true; 189488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 18957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreprocessorDetailStartOffset 189688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner = F.PreprocessorDetailCursor.GetCurrentBitNo(); 189788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 18987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()) 18997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.createPreprocessingRecord(); 19007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()->getExternalSource()) 19017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getPreprocessingRecord()->SetExternalSource(*this); 19027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_MANAGER_BLOCK_ID: 19057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadSourceManagerBlock(F)) 19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 19077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 190888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 19097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_BLOCK_ID: 19107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadSubmoduleBlock(F)) 19117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 19127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 191388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case COMMENTS_BLOCK_ID: { 19158f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor C = Stream; 19167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock() || 19177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 19187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed comments block in AST file"); 19197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 19207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CommentsCursors.push_back(std::make_pair(C, &F)); 19227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 192488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 19257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 192688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Stream.SkipBlock()) { 192788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Error("malformed block record in AST file"); 192888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return true; 192988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 193088bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 19317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 193388bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 193488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner case llvm::BitstreamEntry::Record: 193588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // The interesting case. 193688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner break; 19377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read and process a record. 19407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 1941b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 1942b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 19437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: // Default behavior: ignore. 19447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OFFSET: { 19477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumTypes != 0) { 19487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate TYPE_OFFSET record in AST file"); 19497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 19507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1951b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.TypeOffsets = (const uint32_t *)Blob.data(); 19527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumTypes = Record[0]; 19537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseTypeIndex = Record[1]; 19547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseTypeIndex = getTotalNumTypes(); 19557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumTypes > 0) { 19577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for types within this module. 19587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 19597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for types within this module. 19617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.TypeRemap.insertOrReplace( 19627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseTypeIndex, 19637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseTypeIndex - LocalBaseTypeIndex)); 19647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 19667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECL_OFFSET: { 19717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumDecls != 0) { 19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate DECL_OFFSET record in AST file"); 19737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 19747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1975b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.DeclOffsets = (const DeclOffset *)Blob.data(); 19767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumDecls = Record[0]; 19777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseDeclID = Record[1]; 19787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseDeclID = getTotalNumDecls(); 19797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumDecls > 0) { 19817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for declarations within this 19827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 19837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMap.insert( 19847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 19857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for declarations within this 19877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 19887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.DeclRemap.insertOrReplace( 19897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 19907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for declarations within this 19927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 19937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 19947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 19967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TU_UPDATE_LEXICAL: { 20017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContext *TU = Context.getTranslationUnitDecl(); 20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextInfo &Info = F.DeclContextInfos[TU]; 2003b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data()); 20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.NumLexicalDecls 2005b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair)); 20067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TU->setHasExternalLexicalStorage(true); 20077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UPDATE_VISIBLE: { 20117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 20127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei serialization::DeclID ID = ReadDeclID(F, Record, Idx); 20137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable *Table = 20147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable::Create( 2015b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (const unsigned char *)Blob.data() + Record[Idx++], 2016b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (const unsigned char *)Blob.data(), 20177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTrait(*this, F)); 20187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == PREDEF_DECL_TRANSLATION_UNIT_ID) { // Is it the TU? 20197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContext *TU = Context.getTranslationUnitDecl(); 20207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.DeclContextInfos[TU].NameLookupTableData = Table; 20217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TU->setHasExternalVisibleStorage(true); 20227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 20237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F)); 20247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IDENTIFIER_TABLE: 2028b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.IdentifierTableData = Blob.data(); 20297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0]) { 20307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.IdentifierLookupTable 20317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ASTIdentifierLookupTable::Create( 20327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)F.IdentifierTableData + Record[0], 20337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)F.IdentifierTableData, 20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTrait(*this, F)); 20357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getIdentifierTable().setExternalIdentifierLookup(this); 20377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IDENTIFIER_OFFSET: { 20417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumIdentifiers != 0) { 20427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate IDENTIFIER_OFFSET record in AST file"); 20437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 20447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2045b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.IdentifierOffsets = (const uint32_t *)Blob.data(); 20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumIdentifiers = Record[0]; 20477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseIdentifierID = Record[1]; 20487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseIdentifierID = getTotalNumIdentifiers(); 20497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumIdentifiers > 0) { 20517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for identifiers within this 20527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 20537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 20547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &F)); 20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for identifiers within this 20577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 20587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.IdentifierRemap.insertOrReplace( 20597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseIdentifierID, 20607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseIdentifierID - LocalBaseIdentifierID)); 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifiersLoaded.resize(IdentifiersLoaded.size() 20637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei + F.LocalNumIdentifiers); 20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case EXTERNAL_DEFINITIONS: 20697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExternalDefinitions.push_back(getGlobalDeclID(F, Record[I])); 20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SPECIAL_TYPES: 2074f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor if (SpecialTypes.empty()) { 2075f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor for (unsigned I = 0, N = Record.size(); I != N; ++I) 2076f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 2077f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor break; 2078f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor } 2079f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor 2080f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor if (SpecialTypes.size() != Record.size()) { 2081f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor Error("invalid special-types record"); 2082f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor return true; 2083f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor } 2084f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor 2085f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor for (unsigned I = 0, N = Record.size(); I != N; ++I) { 2086f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 2087f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor if (!SpecialTypes[I]) 2088f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor SpecialTypes[I] = ID; 2089f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 2090f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor // merge step? 2091f5cfc89ea46cf20b4d5b5c42568e9ba6a4bbdd80Douglas Gregor } 20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 20937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case STATISTICS: 20957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumStatements += Record[0]; 20967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumMacros += Record[1]; 20977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalLexicalDeclContexts += Record[2]; 20987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalVisibleDeclContexts += Record[3]; 20997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UNUSED_FILESCOPED_DECLS: 21027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 21037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DELEGATING_CTORS: 21077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 21087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 21097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case WEAK_UNDECLARED_IDENTIFIERS: 21127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 4 != 0) { 21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid weak identifiers record"); 21147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 21157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Ignore weak undeclared identifiers from non-original PCH 21187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // files. This isn't the way to do it :) 21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.clear(); 21207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Translate the weak, undeclared identifiers into global IDs. 21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 21237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back( 21247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getGlobalIdentifierID(F, Record[I++])); 21257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back( 21267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getGlobalIdentifierID(F, Record[I++])); 21277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back( 21287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(F, Record, I).getRawEncoding()); 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.push_back(Record[I++]); 21307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21335ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith case LOCALLY_SCOPED_EXTERN_C_DECLS: 21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 21355ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I])); 21367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SELECTOR_OFFSETS: { 2139b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.SelectorOffsets = (const uint32_t *)Blob.data(); 21407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumSelectors = Record[0]; 21417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseSelectorID = Record[1]; 21427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSelectorID = getTotalNumSelectors(); 21437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumSelectors > 0) { 21457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for selectors within this 21467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 21487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for selectors within this 21507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 21517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorRemap.insertOrReplace( 21527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseSelectorID, 21537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSelectorID - LocalBaseSelectorID)); 21547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 21567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case METHOD_POOL: 2161b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 21627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0]) 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorLookupTable 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ASTSelectorLookupTable::Create( 21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorLookupTableData + Record[0], 21667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SelectorLookupTableData, 21677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTrait(*this, F)); 21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumMethodPoolEntries += Record[1]; 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case REFERENCED_SELECTOR_POOL: 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Record.empty()) { 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 21747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 21757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[Idx++])); 21767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 21777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getRawEncoding()); 21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PP_COUNTER_VALUE: 21837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Record.empty() && Listener) 21847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Listener->ReadCounter(F, Record[0]); 21857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case FILE_SORTED_DECLS: 2188b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.FileSortedDecls = (const DeclID *)Blob.data(); 21897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.NumFileSortedDecls = Record[0]; 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_LOCATION_OFFSETS: { 2193b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 21947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumSLocEntries = Record[0]; 21957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned SLocSpaceSize = Record[1]; 21967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 21977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocSpaceSize); 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Make our entry in the range map. BaseID is negative and growing, so 22007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // we invert it. Because we invert it, though, we need the other end of 22017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the range. 22027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RangeStart = 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 22047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 22057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 22067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 22087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 22097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocOffsetMap.insert( 22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei - SLocSpaceSize,&F)); 22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Initialize the remapping table. 22147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Invalid stays invalid. 22157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SLocRemap.insert(std::make_pair(0U, 0)); 22167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This module. Base was 2 when being compiled. 22177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SLocRemap.insert(std::make_pair(2U, 22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<int>(F.SLocEntryBaseOffset - 2))); 22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalNumSLocEntries += F.LocalNumSLocEntries; 22217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case MODULE_OFFSET_MAP: { 22257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Additional remapping information. 2226b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const unsigned char *Data = (const unsigned char*)Blob.data(); 2227b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const unsigned char *DataEnd = Data + Blob.size(); 22287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Continuous range maps we may be updating in our module. 22307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap); 22317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 22327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierRemap(F.IdentifierRemap); 22337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 22347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroRemap(F.MacroRemap); 22357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 22367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityRemap(F.PreprocessedEntityRemap); 22377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 22387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleRemap(F.SubmoduleRemap); 22397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder 22407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorRemap(F.SelectorRemap); 22417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap); 22427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap); 22437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while(Data < DataEnd) { 22457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint16_t Len = io::ReadUnalignedLE16(Data); 22467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Name = StringRef((const char*)Data, Len); 22477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Data += Len; 22487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *OM = ModuleMgr.lookup(Name); 22497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!OM) { 22507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("SourceLocation remap refers to unknown module"); 22517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 22527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t SLocOffset = io::ReadUnalignedLE32(Data); 22557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t IdentifierIDOffset = io::ReadUnalignedLE32(Data); 22567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t MacroIDOffset = io::ReadUnalignedLE32(Data); 22577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t PreprocessedEntityIDOffset = io::ReadUnalignedLE32(Data); 22587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t SubmoduleIDOffset = io::ReadUnalignedLE32(Data); 22597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t SelectorIDOffset = io::ReadUnalignedLE32(Data); 22607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t DeclIDOffset = io::ReadUnalignedLE32(Data); 22617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uint32_t TypeIndexOffset = io::ReadUnalignedLE32(Data); 22627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Source location offset is mapped to OM->SLocEntryBaseOffset. 22647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocRemap.insert(std::make_pair(SLocOffset, 22657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset))); 22667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierRemap.insert( 22677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(IdentifierIDOffset, 22687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseIdentifierID - IdentifierIDOffset)); 22697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroRemap.insert(std::make_pair(MacroIDOffset, 22707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseMacroID - MacroIDOffset)); 22717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityRemap.insert( 22727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(PreprocessedEntityIDOffset, 22737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset)); 22747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset, 22757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseSubmoduleID - SubmoduleIDOffset)); 22767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorRemap.insert(std::make_pair(SelectorIDOffset, 22777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseSelectorID - SelectorIDOffset)); 22787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclRemap.insert(std::make_pair(DeclIDOffset, 22797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseDeclID - DeclIDOffset)); 22807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeRemap.insert(std::make_pair(TypeIndexOffset, 22827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OM->BaseTypeIndex - TypeIndexOffset)); 22837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Global -> local mappings. 22857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 22867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_MANAGER_LINE_TABLE: 22917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ParseLineTable(F, Record)) 22927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 22947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SOURCE_LOCATION_PRELOADS: { 22967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Need to transform from the local view (1-based IDs) to the global view, 22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // which is based off F.SLocEntryBaseID. 22987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!F.PreloadSLocEntries.empty()) { 22997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 23007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 23017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreloadSLocEntries.swap(Record); 23047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case EXT_VECTOR_DECLS: 23087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 23097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 23107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VTABLE_USES: 23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 3 != 0) { 23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid VTABLE_USES record"); 23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Modules will have some trouble with this. This is clearly not 23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the right way to do this. 23217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.clear(); 23227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 23247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 23257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.push_back( 23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(F, Record, Idx).getRawEncoding()); 23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.push_back(Record[Idx++]); 23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DYNAMIC_CLASSES: 23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DynamicClasses.push_back(getGlobalDeclID(F, Record[I])); 23347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PENDING_IMPLICIT_INSTANTIATIONS: 23377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PendingInstantiations.size() % 2 != 0) { 23387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid existing PendingInstantiations"); 23397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 23407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 2 != 0) { 23437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 23447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 23457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 23487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 23497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingInstantiations.push_back( 23507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(F, Record, I).getRawEncoding()); 23517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SEMA_DECL_REFS: 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Modules will have some trouble with this. 23577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaDeclRefs.clear(); 23587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_ENTITIES_OFFSETS: { 2363b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 2364b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner assert(Blob.size() % sizeof(PPEntityOffset) == 0); 2365b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBasePreprocessedEntityID = Record[0]; 23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned StartingID; 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()) 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.createPreprocessingRecord(); 23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()->getExternalSource()) 23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getPreprocessingRecord()->SetExternalSource(*this); 23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StartingID 23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = PP.getPreprocessingRecord() 23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->allocateLoadedEntities(F.NumPreprocessedEntities); 23777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BasePreprocessedEntityID = StartingID; 23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.NumPreprocessedEntities > 0) { 23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for preprocessed entities in 23817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this module. 23827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for preprocessed entities in 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this module. 23867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PreprocessedEntityRemap.insertOrReplace( 23877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBasePreprocessedEntityID, 23887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 23897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 23927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECL_UPDATE_OFFSETS: { 23957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 2 != 0) { 23967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 23977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 23987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; I += 2) 24007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclUpdateOffsets[getGlobalDeclID(F, Record[I])] 24017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei .push_back(std::make_pair(&F, Record[I+1])); 24027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DECL_REPLACEMENTS: { 24067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() % 3 != 0) { 24077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid DECL_REPLACEMENTS block in AST file"); 24087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 24097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; I += 3) 24117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReplacedDecls[getGlobalDeclID(F, Record[I])] 24127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]); 24137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OBJC_CATEGORIES_MAP: { 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumObjCCategoriesInMap != 0) { 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumObjCCategoriesInMap = Record[0]; 2423b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OBJC_CATEGORIES: 24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.ObjCCategories.swap(Record); 24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CXX_BASE_SPECIFIER_OFFSETS: { 24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumCXXBaseSpecifiers != 0) { 24337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file"); 24347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 24357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumCXXBaseSpecifiers = Record[0]; 2438b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data(); 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers; 24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DIAG_PRAGMA_MAPPINGS: 24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.PragmaDiagMappings.empty()) 24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PragmaDiagMappings.swap(Record); 24467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 24477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.begin(), Record.end()); 24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CUDA_SPECIAL_DECL_REFS: 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Modules will have trouble with this. 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CUDASpecialDeclRefs.clear(); 24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HEADER_SEARCH_TABLE: { 2460b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.HeaderFileInfoTableData = Blob.data(); 24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumHeaderFileInfos = Record[1]; 2462b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.HeaderFileFrameworkStrings = Blob.data() + Record[2]; 24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[0]) { 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.HeaderFileInfoTable 24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = HeaderFileInfoLookupTable::Create( 24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)F.HeaderFileInfoTableData, 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoTrait(*this, F, 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &PP.getHeaderSearchInfo(), 2470b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Blob.data() + Record[2])); 24717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getHeaderSearchInfo().SetExternalSource(this); 24737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getHeaderSearchInfo().getExternalLookup()) 24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.getHeaderSearchInfo().SetExternalLookup(this); 24757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case FP_PRAGMA_OPTIONS: 24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 24817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FPPragmaOptions.swap(Record); 24827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OPENCL_EXTENSIONS: 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Later tables overwrite earlier ones. 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OpenCLExtensions.swap(Record); 24877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TENTATIVE_DEFINITIONS: 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 24917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case KNOWN_NAMESPACES: 24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) 24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 249801a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 2499cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky case UNDEFINED_BUT_USED: 2500cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky if (UndefinedButUsed.size() % 2 != 0) { 2501cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky Error("Invalid existing UndefinedButUsed"); 250201a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky return true; 250301a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 250401a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 250501a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky if (Record.size() % 2 != 0) { 2506cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky Error("invalid undefined-but-used record"); 250701a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky return true; 250801a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 250901a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 2510cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 2511cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky UndefinedButUsed.push_back( 251201a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky ReadSourceLocation(F, Record, I).getRawEncoding()); 251301a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 251401a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky break; 251501a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case IMPORTED_MODULES: { 25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.Kind != MK_Module) { 25187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we aren't loading a module (which has its own exports), make 25197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // all of the imported modules visible. 25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Deal with macros-only imports. 25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; ++I) { 25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned GlobalID = getGlobalSubmoduleID(F, Record[I])) 25237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImportedModules.push_back(GlobalID); 25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case LOCAL_REDECLARATIONS: { 25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.RedeclarationChains.swap(Record); 25317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case LOCAL_REDECLARATIONS_MAP: { 25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumRedeclarationsInMap != 0) { 25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file"); 25377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumRedeclarationsInMap = Record[0]; 2541b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data(); 25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case MERGED_DECLARATIONS: { 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) { 25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]); 25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID]; 25497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N > 0; --N) 25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(getGlobalDeclID(F, Record[Idx++])); 25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case MACRO_OFFSET: { 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumMacros != 0) { 25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("duplicate MACRO_OFFSET record in AST file"); 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2560b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner F.MacroOffsets = (const uint32_t *)Blob.data(); 25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumMacros = Record[0]; 25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseMacroID = Record[1]; 25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseMacroID = getTotalNumMacros(); 25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumMacros > 0) { 25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for macros within this module. 25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for macros within this module. 25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.MacroRemap.insertOrReplace( 25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseMacroID, 25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseMacroID - LocalBaseMacroID)); 25737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case MACRO_UPDATES: { 25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroID ID = getGlobalMacroID(F, Record[I++]); 25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I == N) 25837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation UndefLoc = ReadSourceLocation(F, Record, I); 25867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID SubmoduleID = getGlobalSubmoduleID(F, Record[I++]);; 25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroUpdate Update; 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Update.UndefLoc = UndefLoc; 25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroUpdates[ID].push_back(std::make_pair(SubmoduleID, Update)); 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25972cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor/// \brief Move the given method to the back of the global list of methods. 25982cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregorstatic void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 25992cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor // Find the entry for this selector in the method pool. 26002cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor Sema::GlobalMethodPool::iterator Known 26012cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor = S.MethodPool.find(Method->getSelector()); 26022cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (Known == S.MethodPool.end()) 26032cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor return; 26042cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor 26052cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor // Retrieve the appropriate method list. 26062cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 26072cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor : Known->second.second; 26082cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor bool Found = false; 26092cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor for (ObjCMethodList *List = &Start; List; List = List->Next) { 26102cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (!Found) { 26112cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (List->Method == Method) { 26122cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor Found = true; 26132cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } else { 26142cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor // Keep searching. 26152cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor continue; 26162cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 26172cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 26182cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor 26192cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (List->Next) 26202cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor List->Method = List->Next->Method; 26212cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor else 26222cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor List->Method = Method; 26232cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 26242cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor} 26252cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::makeNamesVisible(const HiddenNames &Names) { 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Names.size(); I != N; ++I) { 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Names[I].getKind()) { 26292cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor case HiddenName::Declaration: { 26302cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor Decl *D = Names[I].getDecl(); 26312cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor bool wasHidden = D->Hidden; 26322cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor D->Hidden = false; 26332cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor 26342cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (wasHidden && SemaObj) { 26352cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 26362cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor moveMethodToBackOfGlobalList(*SemaObj, Method); 26372cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 26382cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 26397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26402cbd427ec533f022f612fed0dd93ef5fa214478aDouglas Gregor } 26417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HiddenName::MacroVisibility: { 26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<IdentifierInfo *, MacroInfo *> Macro = Names[I].getMacro(); 26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macro.second->setHidden(!Macro.second->isPublic()); 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Macro.second->isDefined()) { 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.makeLoadedMacroInfoVisible(Macro.first, Macro.second); 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HiddenName::MacroUndef: { 26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<IdentifierInfo *, MacroInfo *> Macro = Names[I].getMacro(); 26527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Macro.second->isDefined()) { 26537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Macro.second->setUndefLoc(Names[I].getMacroUndefLoc()); 26547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PPMutationListener *Listener = PP.getPPMutationListener()) 26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Listener->UndefinedMacro(Macro.second); 26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PP.makeLoadedMacroInfoVisible(Macro.first, Macro.second); 26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::makeModuleVisible(Module *Mod, 26655ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis Module::NameVisibilityKind NameVisibility, 26665ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis SourceLocation ImportLoc) { 26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::SmallPtrSet<Module *, 4> Visited; 2668cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<Module *, 4> Stack; 26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stack.push_back(Mod); 26707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!Stack.empty()) { 26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mod = Stack.back(); 26727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stack.pop_back(); 26737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NameVisibility <= Mod->NameVisibility) { 26757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This module already has this level of visibility (or greater), so 26767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // there is nothing more to do. 26777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 26787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Mod->isAvailable()) { 26817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Modules that aren't available cannot be made visible. 26827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 26837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Update the module's name visibility. 26867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mod->NameVisibility = NameVisibility; 26877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already deserialized any names from this module, 26897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // mark them as visible. 26907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 26917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Hidden != HiddenNamesMap.end()) { 26927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei makeNamesVisible(Hidden->second); 26937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMap.erase(Hidden); 26947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push any non-explicit submodules onto the stack to be marked as 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // visible. 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (Module::submodule_iterator Sub = Mod->submodule_begin(), 26997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubEnd = Mod->submodule_end(); 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Sub != SubEnd; ++Sub) { 27017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!(*Sub)->IsExplicit && Visited.insert(*Sub)) 27027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stack.push_back(*Sub); 27037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Push any exported modules onto the stack to be marked as visible. 27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool AnyWildcard = false; 27077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool UnrestrictedWildcard = false; 2708cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<Module *, 4> WildcardRestrictions; 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Mod->Exports.size(); I != N; ++I) { 27107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module *Exported = Mod->Exports[I].getPointer(); 27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Mod->Exports[I].getInt()) { 27127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Export a named module directly; no wildcards involved. 27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Visited.insert(Exported)) 27147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stack.push_back(Exported); 27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 27177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Wildcard export: export all of the imported modules that match 27207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the given pattern. 27217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AnyWildcard = true; 27227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (UnrestrictedWildcard) 27237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 27247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Module *Restriction = Mod->Exports[I].getPointer()) 27267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WildcardRestrictions.push_back(Restriction); 27277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 27287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WildcardRestrictions.clear(); 27297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnrestrictedWildcard = true; 27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there were any wildcards, push any imported modules that were 27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // re-exported by the wildcard restriction. 27357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!AnyWildcard) 27367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 27377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Mod->Imports.size(); I != N; ++I) { 27397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module *Imported = Mod->Imports[I]; 27407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Visited.insert(Imported)) 27417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 27427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Acceptable = UnrestrictedWildcard; 27447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Acceptable) { 27457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether this module meets one of the restrictions. 27467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) { 27477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module *Restriction = WildcardRestrictions[R]; 27487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Imported == Restriction || Imported->isSubModuleOf(Restriction)) { 27497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Acceptable = true; 27507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Acceptable) 27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 27577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stack.push_back(Imported); 27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 27627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27631a49d97d762570027863e9209af81d445e4f1502Douglas Gregorbool ASTReader::loadGlobalIndex() { 27641a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (GlobalIndex) 27651a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return false; 27661a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 27671a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (TriedLoadingGlobalIndex || !UseGlobalIndex || 27681a49d97d762570027863e9209af81d445e4f1502Douglas Gregor !Context.getLangOpts().Modules) 27691a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return true; 27701a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 27711a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // Try to load the global index. 27721a49d97d762570027863e9209af81d445e4f1502Douglas Gregor TriedLoadingGlobalIndex = true; 27731a49d97d762570027863e9209af81d445e4f1502Douglas Gregor StringRef ModuleCachePath 27741a49d97d762570027863e9209af81d445e4f1502Douglas Gregor = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 27751a49d97d762570027863e9209af81d445e4f1502Douglas Gregor std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 27761a49d97d762570027863e9209af81d445e4f1502Douglas Gregor = GlobalModuleIndex::readIndex(FileMgr, ModuleCachePath); 27771a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (!Result.first) 27781a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return true; 27791a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 27801a49d97d762570027863e9209af81d445e4f1502Douglas Gregor GlobalIndex.reset(Result.first); 2781188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor ModuleMgr.setGlobalIndex(GlobalIndex.get()); 27821a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return false; 27831a49d97d762570027863e9209af81d445e4f1502Douglas Gregor} 27841a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 27851a49d97d762570027863e9209af81d445e4f1502Douglas Gregorbool ASTReader::isGlobalIndexUnavailable() const { 27861a49d97d762570027863e9209af81d445e4f1502Douglas Gregor return Context.getLangOpts().Modules && UseGlobalIndex && 27871a49d97d762570027863e9209af81d445e4f1502Douglas Gregor !hasGlobalIndex() && TriedLoadingGlobalIndex; 27881a49d97d762570027863e9209af81d445e4f1502Douglas Gregor} 27891a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, 27917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleKind Type, 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ImportLoc, 27937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ClientLoadCapabilities) { 27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Bump the generation number. 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PreviousGeneration = CurrentGeneration++; 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumModules = ModuleMgr.size(); 2798cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ImportedModule, 4> Loaded; 27997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*ImportedBy=*/0, Loaded, 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClientLoadCapabilities)) { 28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Failure: 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OutOfDate: 28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VersionMismatch: 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ConfigurationMismatch: 28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HadErrors: 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end()); 28081a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 28091a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // If we find that any modules are unusable, the global index is going 28101a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // to be out-of-date. Just remove it. 28111a49d97d762570027863e9209af81d445e4f1502Douglas Gregor GlobalIndex.reset(); 2812188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor ModuleMgr.setGlobalIndex(0); 28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadResult; 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Success: 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Here comes stuff that we only do once the entire chain is loaded. 28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the AST blocks of all of the modules that we loaded. 2822cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 2823cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko MEnd = Loaded.end(); 28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M != MEnd; ++M) { 28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *M->Mod; 28267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the AST block. 28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReadASTBlock(F)) 28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Once read, set the ModuleFile bit base offset and update the size in 28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // bits of all files we've seen. 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.GlobalBitOffset = TotalModulesSizeInBits; 28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalModulesSizeInBits += F.SizeInBits; 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Preload SLocEntries. 28387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load it through the SourceManager and don't call ReadSLocEntry() 28417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // directly because the entry may have already been loaded in which case 28427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // calling ReadSLocEntry() directly would trigger an assertion in 28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // SourceManager. 28447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.getLoadedSLocEntryByID(Index); 28457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Setup the import locations. 2849cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 2850cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko MEnd = Loaded.end(); 28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M != MEnd; ++M) { 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *M->Mod; 28538b136d85487ec3cc017470d97479159d93a14f91Argyrios Kyrtzidis F.DirectImportLoc = ImportLoc; 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!M->ImportedBy) 28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.ImportLoc = M->ImportLoc; 28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.ImportLoc = ReadSourceLocation(*M->ImportedBy, 28587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M->ImportLoc.getRawEncoding()); 28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mark all of the identifiers in the identifier table as being out of date, 28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // so that various accessors know to check the loaded modules when the 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // identifier is used. 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdEnd = PP.getIdentifierTable().end(); 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Id != IdEnd; ++Id) 28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Id->second->setOutOfDate(true); 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Resolve any unresolved module exports. 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = UnresolvedModuleImportExports.size(); I != N; ++I) { 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedModuleImportExport &Unresolved = UnresolvedModuleImportExports[I]; 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module *ResolvedMod = getSubmodule(GlobalID); 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Unresolved.IsImport) { 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ResolvedMod) 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.Mod->Imports.push_back(ResolvedMod); 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ResolvedMod || Unresolved.IsWildcard) 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.Mod->Exports.push_back( 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedModuleImportExports.clear(); 28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InitializeContext(); 28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->ReaderInitialized(this); 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PrimaryModule.OriginalSourceFileID.isInvalid()) { 28947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrimaryModule.OriginalSourceFileID 28957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = FileID::get(PrimaryModule.SLocEntryBaseID 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this AST file is a precompiled preamble, then set the 28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // preamble file ID of the source manager to the file source file 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // from which the preamble was built. 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Type == MK_Preamble) { 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Type == MK_MainFile) { 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For any Objective-C class definitions we have already loaded, make sure 29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that we load any additional categories. 29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 29117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 29127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCClassesLoaded[I], 29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreviousGeneration); 29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29151a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ASTReadResult 29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadASTCore(StringRef FileName, 29217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleKind Type, 29227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ImportLoc, 29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *ImportedBy, 2924cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<ImportedModule> &Loaded, 29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ClientLoadCapabilities) { 29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M; 29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool NewModule; 29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string ErrorStr; 29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::tie(M, NewModule) = ModuleMgr.addModule(FileName, Type, ImportLoc, 29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImportedBy, CurrentGeneration, 29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ErrorStr); 29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!M) { 29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We couldn't load the module. 29357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 29367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei + ErrorStr; 29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error(Msg); 29387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!NewModule) { 29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We've already loaded this module. 29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This seems rather a hack. Should CurrentDir be part of the 29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module? 29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FileName != "-") { 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentDir = llvm::sys::path::parent_path(FileName); 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CurrentDir.empty()) CurrentDir = "."; 29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *M; 29548f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Stream = F.Stream; 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.init(F.StreamFile); 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SizeInBits = F.Buffer->getBufferSize() * 8; 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sniff for the signature. 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.Read(8) != 'C' || 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'P' || 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'C' || 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'H') { 29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(diag::err_not_a_pch_file) << FileName; 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This is used for compatibility with older PCH formats. 29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool HaveReadControlBlock = false; 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 297099a5af0088b6340540912921cd0008ac75051a33Chris Lattner while (1) { 297199a5af0088b6340540912921cd0008ac75051a33Chris Lattner llvm::BitstreamEntry Entry = Stream.advance(); 297299a5af0088b6340540912921cd0008ac75051a33Chris Lattner 297399a5af0088b6340540912921cd0008ac75051a33Chris Lattner switch (Entry.Kind) { 297499a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Error: 297599a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::EndBlock: 297699a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::Record: 29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("invalid record at top-level of AST file"); 29787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 297999a5af0088b6340540912921cd0008ac75051a33Chris Lattner 298099a5af0088b6340540912921cd0008ac75051a33Chris Lattner case llvm::BitstreamEntry::SubBlock: 298199a5af0088b6340540912921cd0008ac75051a33Chris Lattner break; 29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We only know the control subblock ID. 298599a5af0088b6340540912921cd0008ac75051a33Chris Lattner switch (Entry.ID) { 29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case llvm::bitc::BLOCKINFO_BLOCK_ID: 29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.ReadBlockInfoBlock()) { 29887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed BlockInfoBlock in AST file"); 29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CONTROL_BLOCK_ID: 29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HaveReadControlBlock = true; 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (ReadControlBlock(F, Loaded, ClientLoadCapabilities)) { 29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Success: 29967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Failure: return Failure; 29997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OutOfDate: return OutOfDate; 30007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case VersionMismatch: return VersionMismatch; 30017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case ConfigurationMismatch: return ConfigurationMismatch; 30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case HadErrors: return HadErrors; 30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case AST_BLOCK_ID: 30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!HaveReadControlBlock) { 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag(diag::warn_pch_version_too_old); 30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionMismatch; 30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record that we've loaded this module. 30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.SkipBlock()) { 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed block record in AST file"); 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Failure; 30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Success; 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::InitializeContext() { 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there's a listener, notify them that we "read" the translation unit. 30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getTranslationUnitDecl()); 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Make sure we load the declaration update records for the translation unit, 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // if there are any. 30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loadDeclUpdateRecords(PREDEF_DECL_TRANSLATION_UNIT_ID, 30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getTranslationUnitDecl()); 30387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Find a better way to deal with collisions between these 30407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // built-in types. Right now, we just ignore the problem. 30417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the special types. 30437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SpecialTypes.size() >= NumSpecialTypeIDs) { 30447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.CFConstantStringTypeDecl) 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setCFConstantStringType(GetType(String)); 30477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 30507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType FileType = GetType(File); 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FileType.isNull()) { 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("FILE type is NULL"); 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.FILEDecl) { 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setFILEDecl(Typedef->getDecl()); 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = FileType->getAs<TagType>(); 30617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Tag) { 30627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid FILE type in AST file"); 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setFILEDecl(Tag->getDecl()); 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 30717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Jmp_bufType = GetType(Jmp_buf); 30727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Jmp_bufType.isNull()) { 30737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("jmp_buf type is NULL"); 30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.jmp_bufDecl) { 30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setjmp_bufDecl(Typedef->getDecl()); 30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = Jmp_bufType->getAs<TagType>(); 30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Tag) { 30837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Invalid jmp_buf type in AST file"); 30847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setjmp_bufDecl(Tag->getDecl()); 30877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 30927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Sigjmp_bufType = GetType(Sigjmp_buf); 30937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Sigjmp_bufType.isNull()) { 30947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("sigjmp_buf type is NULL"); 30957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 30967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.sigjmp_bufDecl) { 30997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 31007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setsigjmp_bufDecl(Typedef->getDecl()); 31017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 31027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 31037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Tag && "Invalid sigjmp_buf type in AST file"); 31047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setsigjmp_bufDecl(Tag->getDecl()); 31057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned ObjCIdRedef 31107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 31117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Context.ObjCIdRedefinitionType.isNull()) 31127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 31137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned ObjCClassRedef 31167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 31177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Context.ObjCClassRedefinitionType.isNull()) 31187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 31197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned ObjCSelRedef 31227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 31237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Context.ObjCSelRedefinitionType.isNull()) 31247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 31257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 31287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Ucontext_tType = GetType(Ucontext_t); 31297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Ucontext_tType.isNull()) { 31307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("ucontext_t type is NULL"); 31317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 31327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.ucontext_tDecl) { 31357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 31367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setucontext_tDecl(Typedef->getDecl()); 31377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 31387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagType *Tag = Ucontext_tType->getAs<TagType>(); 31397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Tag && "Invalid ucontext_t type in AST file"); 31407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setucontext_tDecl(Tag->getDecl()); 31417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 31477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there were any CUDA special declarations, deserialize them. 31497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CUDASpecialDeclRefs.empty()) { 31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 31517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.setcudaConfigureCallDecl( 31527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Re-export any modules that were imported by a non-module AST file. 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) { 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Module *Imported = getSubmodule(ImportedModules[I])) 31585ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis makeModuleVisible(Imported, Module::AllVisible, 31595ebcb20b0331a6e64c213f0bb5f4bed9a9e8eb34Argyrios Kyrtzidis /*ImportLoc=*/SourceLocation()); 31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImportedModules.clear(); 31627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::finalizeForWriting() { 31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(), 31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenEnd = HiddenNamesMap.end(); 31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Hidden != HiddenEnd; ++Hidden) { 31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei makeNamesVisible(Hidden->second); 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HiddenNamesMap.clear(); 31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31738f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner/// SkipCursorToControlBlock - Given a cursor at the start of an AST file, scan 31748f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner/// ahead and drop the cursor into the start of the CONTROL_BLOCK, returning 31758f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner/// false on success and true on failure. 31768f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattnerstatic bool SkipCursorToControlBlock(BitstreamCursor &Cursor) { 31778f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner while (1) { 31788f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = Cursor.advance(); 31798f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch (Entry.Kind) { 31808f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Error: 31818f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::EndBlock: 31828f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 31838f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 31848f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Record: 31858f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Ignore top-level records. 31868f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Cursor.skipRecord(Entry.ID); 31878f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 31888f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 31898f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::SubBlock: 31908f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Entry.ID == CONTROL_BLOCK_ID) { 31918f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Cursor.EnterSubBlock(CONTROL_BLOCK_ID)) 31928f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 31938f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Found it! 31948f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return false; 31958f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 31968f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 31978f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Cursor.SkipBlock()) 31988f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 31998f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 32008f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 32018f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner} 32028f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 32037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieve the name of the original source file name 32047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// directly from the AST file, without actually loading the AST 32057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// file. 32067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName, 32077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 32087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine &Diags) { 32097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Open the AST file. 32107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string ErrStr; 32117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OwningPtr<llvm::MemoryBuffer> Buffer; 32127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr)); 32137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Buffer) { 32147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr; 32157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::string(); 32167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Initialize the stream 32197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::BitstreamReader StreamFile; 32208f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor Stream; 32217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 32227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)Buffer->getBufferEnd()); 32237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.init(StreamFile); 32247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sniff for the signature. 32267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.Read(8) != 'C' || 32277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'P' || 32287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'C' || 32297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'H') { 32307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 32317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::string(); 32327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32338f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 323488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner // Scan for the CONTROL_BLOCK_ID block. 32358f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (SkipCursorToControlBlock(Stream)) { 32368f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 32378f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return std::string(); 323888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner } 32397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32408f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Scan for ORIGINAL_FILE inside the control block. 32418f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner RecordData Record; 324288bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner while (1) { 32438f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 324488bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 324588bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return std::string(); 324688bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 324788bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) { 324888bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 324988bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner return std::string(); 32507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 325188bde50fa30ce10f5d554b36dda66b3231ccef54Chris Lattner 32527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 3253b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 3254b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 3255b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner return Blob.str(); 32567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 32607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class SimplePCHValidator : public ASTReaderListener { 32617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &ExistingLangOpts; 32627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts; 32637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts; 32647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr; 32657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 32677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SimplePCHValidator(const LangOptions &ExistingLangOpts, 32687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &ExistingTargetOpts, 32697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &ExistingPPOpts, 32707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr) 32717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : ExistingLangOpts(ExistingLangOpts), 32727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingTargetOpts(ExistingTargetOpts), 32737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExistingPPOpts(ExistingPPOpts), 32747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileMgr(FileMgr) 32757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei { 32767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei virtual bool ReadLanguageOptions(const LangOptions &LangOpts, 32797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain) { 32807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkLanguageOptions(ExistingLangOpts, LangOpts, 0); 32817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, 32837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain) { 32847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkTargetOptions(ExistingTargetOpts, TargetOpts, 0); 32857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 32877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 32887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &SuggestedPredefines) { 32897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return checkPreprocessorOptions(ExistingPPOpts, PPOpts, 0, FileMgr, 32907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines); 32917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 32937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::readASTFileControlBlock(StringRef Filename, 32967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 32977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 32987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Open the AST file. 32997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string ErrStr; 33007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei OwningPtr<llvm::MemoryBuffer> Buffer; 33017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr)); 33027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Buffer) { 33037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 33047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Initialize the stream 33077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::BitstreamReader StreamFile; 33088f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor Stream; 33097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StreamFile.init((const unsigned char *)Buffer->getBufferStart(), 33107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (const unsigned char *)Buffer->getBufferEnd()); 33117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.init(StreamFile); 33127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Sniff for the signature. 33147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Stream.Read(8) != 'C' || 33157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'P' || 33167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'C' || 33177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Stream.Read(8) != 'H') { 33187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 33197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33218f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Scan for the CONTROL_BLOCK_ID block. 33228f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (SkipCursorToControlBlock(Stream)) 33238f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33248f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 33258f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // Scan for ORIGINAL_FILE inside the control block. 33267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 33278f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner while (1) { 33288f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 33298f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 33308f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return false; 33318f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 33328f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) 33338f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33348f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 33357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 3336b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 3337b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 33388f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch ((ControlRecordTypes)RecCode) { 33398f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case METADATA: { 33408f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Record[0] != VERSION_MAJOR) 33418f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33438f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner const std::string &CurBranch = getClangFullRepositoryVersion(); 3344b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (StringRef(CurBranch) != Blob) 33458f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33478f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33488f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 33498f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case LANGUAGE_OPTIONS: 33508f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseLanguageOptions(Record, false, Listener)) 33518f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33528f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33548f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case TARGET_OPTIONS: 33558f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseTargetOptions(Record, false, Listener)) 33568f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33578f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33598f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case DIAGNOSTIC_OPTIONS: 33608f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseDiagnosticOptions(Record, false, Listener)) 33618f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33628f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33648f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case FILE_SYSTEM_OPTIONS: 33658f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseFileSystemOptions(Record, false, Listener)) 33668f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33678f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33698f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case HEADER_SEARCH_OPTIONS: 33708f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParseHeaderSearchOptions(Record, false, Listener)) 33718f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33728f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33748f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case PREPROCESSOR_OPTIONS: { 33758f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner std::string IgnoredSuggestedPredefines; 33768f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (ParsePreprocessorOptions(Record, false, Listener, 33778f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner IgnoredSuggestedPredefines)) 33788f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 33798f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33808f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner } 33817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33828f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner default: 33838f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // No other validation to perform. 33848f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 33857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::isAcceptableASTFile(StringRef Filename, 33917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileManager &FileMgr, 33927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const LangOptions &LangOpts, 33937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TargetOptions &TargetOpts, 33947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PreprocessorOptions &PPOpts) { 33957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr); 33967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return !readASTFileControlBlock(Filename, FileMgr, validator); 33977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ReadSubmoduleBlock(ModuleFile &F) { 34007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Enter the submodule block. 34017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 34027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed submodule block record in AST file"); 34037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 34047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 34077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool First = true; 34087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module *CurrentModule = 0; 34097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 34107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 34118f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 34127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34138f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch (Entry.Kind) { 34148f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 34158f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Error: 34168f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Error("malformed block record in AST file"); 34178f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return true; 34188f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::EndBlock: 34198f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return false; 34208f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Record: 34218f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // The interesting case. 34228f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner break; 34237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34248f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 34257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 3426b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 34277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 3428b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) { 34297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: // Default behavior: ignore. 34307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 34317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_DEFINITION: { 34337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 34347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 34357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 34367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() < 7) { 34397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("malformed module definition"); 34407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 34417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3443b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Name = Blob; 34447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]); 34457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]); 34467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsFramework = Record[2]; 34477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsExplicit = Record[3]; 34487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsSystem = Record[4]; 34497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool InferSubmodules = Record[5]; 34507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool InferExplicitSubmodules = Record[6]; 34517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool InferExportWildcard = Record[7]; 34527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Module *ParentModule = 0; 34547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Parent) 34557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParentModule = getSubmodule(Parent); 34567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Retrieve this (sub)module from the module map, creating it if 34587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // necessary. 34597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, 34607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsFramework, 34617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsExplicit).first; 34627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 34637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalIndex >= SubmodulesLoaded.size() || 34647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmodulesLoaded[GlobalIndex]) { 34657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("too many submodules"); 34667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 34677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34688bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor 34698bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 34708bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor if (CurFile != F.File) { 34718bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor if (!Diags.isDiagnosticInFlight()) { 34728bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor Diag(diag::err_module_file_conflict) 34738bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor << CurrentModule->getTopLevelModuleName() 34748bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor << CurFile->getName() 34758bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor << F.File->getName(); 34768bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } 34778bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor return true; 34788bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } 34798bf778eb9c0afb0a4c63a97ce504f50759c08d5fDouglas Gregor } 34807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->setASTFile(F.File); 34817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->IsFromModuleFile = true; 34827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 34837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->InferSubmodules = InferSubmodules; 34847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 34857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->InferExportWildcard = InferExportWildcard; 34867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 34877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->ModuleRead(GlobalID, CurrentModule); 34887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmodulesLoaded[GlobalIndex] = CurrentModule; 3490b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 3491b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor // Clear out link libraries; the module file has them. 3492b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor CurrentModule->LinkLibraries.clear(); 34937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 34947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_UMBRELLA_HEADER: { 34977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 34987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 34997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 35037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3505b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) { 35067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule->getUmbrellaHeader()) 35077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModMap.setUmbrellaHeader(CurrentModule, Umbrella); 35087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (CurrentModule->getUmbrellaHeader() != Umbrella) { 35097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("mismatched umbrella headers in submodule"); 35107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_HEADER: { 35177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 35187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 35197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 35237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Be more lazy about this! 3526b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (const FileEntry *File = PP.getFileManager().getFile(Blob)) { 35277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (std::find(CurrentModule->Headers.begin(), 35287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->Headers.end(), 35297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File) == CurrentModule->Headers.end()) 35307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModMap.addHeader(CurrentModule, File, false); 35317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_EXCLUDED_HEADER: { 35367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 35377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 35387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 35427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Be more lazy about this! 3545b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (const FileEntry *File = PP.getFileManager().getFile(Blob)) { 35467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (std::find(CurrentModule->Headers.begin(), 35477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->Headers.end(), 35487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File) == CurrentModule->Headers.end()) 35497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModMap.addHeader(CurrentModule, File, true); 35507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_TOPHEADER: { 35557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 35567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 35577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 35617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Be more lazy about this! 3564b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner if (const FileEntry *File = PP.getFileManager().getFile(Blob)) 35657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->TopHeaders.insert(File); 35667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_UMBRELLA_DIR: { 35707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 35717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 35727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 35767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const DirectoryEntry *Umbrella 3579b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner = PP.getFileManager().getDirectory(Blob)) { 35807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule->getUmbrellaDir()) 35817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModMap.setUmbrellaDir(CurrentModule, Umbrella); 35827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (CurrentModule->getUmbrellaDir() != Umbrella) { 35837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("mismatched umbrella directories in submodule"); 35847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 35887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_METADATA: { 35917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!First) { 35927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("submodule metadata record not at beginning of block"); 35937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei First = false; 35967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSubmoduleID = getTotalNumSubmodules(); 35987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.LocalNumSubmodules = Record[0]; 35997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalBaseSubmoduleID = Record[1]; 36007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (F.LocalNumSubmodules > 0) { 36017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the global -> local mapping for submodules within this 36027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 36037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 36047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce the local -> global mapping for submodules within this 36067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // module. 36077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.SubmoduleRemap.insertOrReplace( 36087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::make_pair(LocalBaseSubmoduleID, 36097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F.BaseSubmoduleID - LocalBaseSubmoduleID)); 36107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 36127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 36147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_IMPORTS: { 36177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 36187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 36197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 36207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 36237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 36247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 36267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedModuleImportExport Unresolved; 36277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.File = &F; 36287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.Mod = CurrentModule; 36297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.ID = Record[Idx]; 36307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.IsImport = true; 36317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.IsWildcard = false; 36327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedModuleImportExports.push_back(Unresolved); 36337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 36357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_EXPORTS: { 36387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 36397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 36407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 36417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 36447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 36457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 36477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedModuleImportExport Unresolved; 36487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.File = &F; 36497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.Mod = CurrentModule; 36507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.ID = Record[Idx]; 36517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.IsImport = false; 36527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Unresolved.IsWildcard = Record[Idx + 1]; 36537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedModuleImportExports.push_back(Unresolved); 36547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Once we've loaded the set of exports, there's no reason to keep 36577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the parsed, unresolved exports around. 36587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentModule->UnresolvedExports.clear(); 36597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 36607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case SUBMODULE_REQUIRES: { 36627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (First) { 36637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("missing submodule metadata record at beginning of block"); 36647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 36657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!CurrentModule) 36687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 36697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3670b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner CurrentModule->addRequirement(Blob, Context.getLangOpts(), 36717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getTargetInfo()); 36727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 36737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3674b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 3675b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor case SUBMODULE_LINK_LIBRARY: 3676b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (First) { 3677b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Error("missing submodule metadata record at beginning of block"); 3678b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor return true; 3679b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor } 3680b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 3681b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (!CurrentModule) 3682b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor break; 3683b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 3684b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor CurrentModule->LinkLibraries.push_back( 3685b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Module::LinkLibrary(Blob, Record[0])); 3686b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor break; 36877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Parse the record that corresponds to a LangOptions data 36927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// structure. 36937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 36947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// This routine parses the language options from the AST file and then gives 36957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// them to the AST listener if one is set. 36967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 36977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \returns true if the listener deems the file unacceptable, false otherwise. 36987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseLanguageOptions(const RecordData &Record, 36997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 37007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 37017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOptions LangOpts; 37027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 37037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define LANGOPT(Name, Bits, Default, Description) \ 37047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.Name = Record[Idx++]; 37057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 37067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 37077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/LangOptions.def" 37084f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++]; 37094f45bc099f2665bc6e4bcbb169aa452390dbf3feWill Dietz#include "clang/Basic/Sanitizers.def" 37107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 37127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 37137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 37147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Length = Record[Idx++]; 37167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LangOpts.CurrentModule.assign(Record.begin() + Idx, 37177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.begin() + Idx + Length); 37187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadLanguageOptions(LangOpts, Complain); 37197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseTargetOptions(const RecordData &Record, 37227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 37237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 37247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 37257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOptions TargetOpts; 37267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.Triple = ReadString(Record, Idx); 37277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.CPU = ReadString(Record, Idx); 37287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.ABI = ReadString(Record, Idx); 37297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.CXXABI = ReadString(Record, Idx); 37307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.LinkerVersion = ReadString(Record, Idx); 37317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 37327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 37337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 37357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TargetOpts.Features.push_back(ReadString(Record, Idx)); 37367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadTargetOptions(TargetOpts, Complain); 37397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 37427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 37437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticOptions DiagOpts; 37447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 37457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++]; 37467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 37477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagOpts.set##Name(static_cast<Type>(Record[Idx++])); 37487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/DiagnosticOptions.def" 37497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 37517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagOpts.Warnings.push_back(ReadString(Record, Idx)); 37527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 37557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 37587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 37597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileSystemOptions FSOpts; 37607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 37617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FSOpts.WorkingDir = ReadString(Record, Idx); 37627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadFileSystemOptions(FSOpts, Complain); 37637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 37667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 37677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener) { 37687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearchOptions HSOpts; 37697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 37707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.Sysroot = ReadString(Record, Idx); 37717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Include entries. 37737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 37747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Path = ReadString(Record, Idx); 37757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei frontend::IncludeDirGroup Group 37767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 37777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsFramework = Record[Idx++]; 37787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IgnoreSysRoot = Record[Idx++]; 37797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UserEntries.push_back( 378059fd63581d6d572f23e82e81a50e0b940c8d1089Daniel Dunbar HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot)); 37817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // System header prefixes. 37847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 37857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Prefix = ReadString(Record, Idx); 37867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsSystemHeader = Record[Idx++]; 37877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.SystemHeaderPrefixes.push_back( 37887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader)); 37897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 37907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.ResourceDir = ReadString(Record, Idx); 37927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.ModuleCachePath = ReadString(Record, Idx); 37937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.DisableModuleHash = Record[Idx++]; 37947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseBuiltinIncludes = Record[Idx++]; 37957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseStandardSystemIncludes = Record[Idx++]; 37967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseStandardCXXIncludes = Record[Idx++]; 37977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HSOpts.UseLibcxx = Record[Idx++]; 37987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadHeaderSearchOptions(HSOpts, Complain); 38007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 38037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Complain, 38047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReaderListener &Listener, 38057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string &SuggestedPredefines) { 38067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessorOptions PPOpts; 38077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 38087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Macro definitions/undefs 38107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 38117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Macro = ReadString(Record, Idx); 38127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsUndef = Record[Idx++]; 38137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 38147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Includes 38177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 38187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.Includes.push_back(ReadString(Record, Idx)); 38197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Macro Includes 38227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned N = Record[Idx++]; N; --N) { 38237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 38247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.UsePredefines = Record[Idx++]; 38277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 38287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 38297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPOpts.ObjCXXARCStandardLibrary = 38307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 38317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines.clear(); 38327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Listener.ReadPreprocessorOptions(PPOpts, Complain, 38337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SuggestedPredefines); 38347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<ModuleFile *, unsigned> 38377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 38387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalPreprocessedEntityMapType::iterator 38397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = GlobalPreprocessedEntityMap.find(GlobalIndex); 38407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalPreprocessedEntityMap.end() && 38417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Corrupted global preprocessed entity map"); 38427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 38437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 38447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(M, LocalIndex); 38457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator> 38487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 38497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 38507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 38517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mod.NumPreprocessedEntities); 38527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(PreprocessingRecord::iterator(), 38547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessingRecord::iterator()); 38557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator> 38587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 38597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 38607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleDeclIterator(this, &Mod, 38617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 38627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 38657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID PPID = Index+1; 38667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 38677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *PPInfo.first; 38687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = PPInfo.second; 38697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 38707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!PP.getPreprocessingRecord()) { 38727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("no preprocessing record"); 38737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 38747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 38757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38768f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 38778f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 38788f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 38798f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = 38808f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 38818f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner if (Entry.Kind != llvm::BitstreamEntry::Record) 38828f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return 0; 38838f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 38847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read the record. 38857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range(ReadSourceLocation(M, PPOffs.Begin), 38867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadSourceLocation(M, PPOffs.End)); 38877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 3888b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef Blob; 38897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 38907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessorDetailRecordTypes RecType = 3891b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 3892b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner Entry.ID, Record, &Blob); 38937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (RecType) { 38947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_MACRO_EXPANSION: { 38957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isBuiltin = Record[0]; 38967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *Name = 0; 38977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinition *Def = 0; 38987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isBuiltin) 38997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Name = getLocalIdentifier(M, Record[1]); 39007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 39017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID 39027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalID = getGlobalPreprocessedEntityID(M, Record[1]); 39037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1)); 39047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroExpansion *ME; 39077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isBuiltin) 39087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ME = new (PPRec) MacroExpansion(Name, Range); 39097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 39107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ME = new (PPRec) MacroExpansion(Def, Range); 39117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ME; 39137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_MACRO_DEFINITION: { 39167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Decode the identifier info and then check again; if the macro is 39177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // still defined and associated with the identifier, 39187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 39197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacroDefinition *MD 39207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = new (PPRec) MacroDefinition(II, Range); 39217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 39237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->MacroDefinitionRead(PPID, MD); 39247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return MD; 39267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PPD_INCLUSION_DIRECTIVE: { 3929b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner const char *FullFileNameStart = Blob.data() + Record[0]; 3930b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 39317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FileEntry *File = 0; 39327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FullFileName.empty()) 39337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File = PP.getFileManager().getFile(FullFileName); 39347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Stable encoding 39367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InclusionDirective::InclusionKind Kind 39377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<InclusionDirective::InclusionKind>(Record[2]); 39387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InclusionDirective *ID 39397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = new (PPRec) InclusionDirective(PPRec, Kind, 3940b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner StringRef(Blob.data(), Record[0]), 39417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record[1], Record[3], 39427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei File, 39437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Range); 39447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ID; 39457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 39497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 39507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief \arg SLocMapI points at a chunk of a module that contains no 39527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// preprocessed entities or the entities it contains are not the ones we are 39537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// looking for. Find the next module that contains entities and return the ID 39547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// of the first entry. 39557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntityID ASTReader::findNextPreprocessedEntity( 39567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 39577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++SLocMapI; 39587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (GlobalSLocOffsetMapType::const_iterator 39597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 39607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *SLocMapI->second; 39617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M.NumPreprocessedEntities) 39627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return M.BasePreprocessedEntityID; 39637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getTotalNumPreprocessedEntities(); 39667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 39677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 39697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate <unsigned PPEntityOffset::*PPLoc> 39717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistruct PPEntityComp { 39727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader &Reader; 39737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M; 39747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 39767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 39787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLoc(L); 39797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLoc(R); 39807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 39817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 39847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLoc(L); 39857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 39867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 39897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLoc(R); 39907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 39917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation getLoc(const PPEntityOffset &PPE) const { 39947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.ReadSourceLocation(M, PPE.*PPLoc); 39957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 39967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 39977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 39987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 39997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Returns the first preprocessed entity ID that ends after \arg BLoc. 40017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntityID 40027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::findBeginPreprocessedEntity(SourceLocation BLoc) const { 40037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SourceMgr.isLocalSourceLocation(BLoc)) 40047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getTotalNumPreprocessedEntities(); 40057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocOffsetMapType::const_iterator 40077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - 40087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BLoc.getOffset()); 40097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(SLocMapI != GlobalSLocOffsetMap.end() && 40107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Corrupted global sloc offset map"); 40117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SLocMapI->second->NumPreprocessedEntities == 0) 40137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return findNextPreprocessedEntity(SLocMapI); 40147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *SLocMapI->second; 40167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei typedef const PPEntityOffset *pp_iterator; 40177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator pp_begin = M.PreprocessedEntityOffsets; 40187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 40197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t Count = M.NumPreprocessedEntities; 40217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t Half; 40227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator First = pp_begin; 40237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator PPI; 40247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Do a binary search manually instead of using std::lower_bound because 40267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The end locations of entities may be unordered (when a macro expansion 40277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // is inside another macro argument), but for this case it is not important 40287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // whether we get the first macro expansion or its containing macro. 40297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Count > 0) { 40307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Half = Count/2; 40317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPI = First; 40327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::advance(PPI, Half); 40337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End), 40347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BLoc)){ 40357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei First = PPI; 40367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++First; 40377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = Count - Half - 1; 40387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 40397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Count = Half; 40407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 40417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PPI == pp_end) 40437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return findNextPreprocessedEntity(SLocMapI); 40447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return M.BasePreprocessedEntityID + (PPI - pp_begin); 40467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 40477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Returns the first preprocessed entity ID that begins after \arg ELoc. 40497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiPreprocessedEntityID 40507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::findEndPreprocessedEntity(SourceLocation ELoc) const { 40517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SourceMgr.isLocalSourceLocation(ELoc)) 40527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getTotalNumPreprocessedEntities(); 40537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSLocOffsetMapType::const_iterator 40557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - 40567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ELoc.getOffset()); 40577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(SLocMapI != GlobalSLocOffsetMap.end() && 40587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Corrupted global sloc offset map"); 40597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SLocMapI->second->NumPreprocessedEntities == 0) 40617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return findNextPreprocessedEntity(SLocMapI); 40627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *SLocMapI->second; 40647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei typedef const PPEntityOffset *pp_iterator; 40657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator pp_begin = M.PreprocessedEntityOffsets; 40667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 40677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei pp_iterator PPI = 40687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::upper_bound(pp_begin, pp_end, ELoc, 40697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PPEntityComp<&PPEntityOffset::Begin>(*this, M)); 40707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PPI == pp_end) 40727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return findNextPreprocessedEntity(SLocMapI); 40737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return M.BasePreprocessedEntityID + (PPI - pp_begin); 40757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 40767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Returns a pair of [Begin, End) indices of preallocated 40787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// preprocessed entities that \arg Range encompasses. 40797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<unsigned, unsigned> 40807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 40817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Range.isInvalid()) 40827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(0,0); 40837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 40847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID BeginID = findBeginPreprocessedEntity(Range.getBegin()); 40867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreprocessedEntityID EndID = findEndPreprocessedEntity(Range.getEnd()); 40877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(BeginID, EndID); 40887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 40897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Optionally returns true or false if the preallocated preprocessed 40917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// entity with index \arg Index came from file \arg FID. 40927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 40937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileID FID) { 40947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FID.isInvalid()) 40957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 40967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 40977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 40987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *PPInfo.first; 40997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = PPInfo.second; 41007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 41017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin); 41037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Loc.isInvalid()) 41047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 41057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 41077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 41087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 41097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 41107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 41117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 41137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Visitor used to search for information about a header file. 41147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class HeaderFileInfoVisitor { 41157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 41167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FileEntry *FE; 41177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Optional<HeaderFileInfo> HFI; 41197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 41217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoVisitor(ASTReader &Reader, const FileEntry *FE) 41227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), FE(FE) { } 41237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 41257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoVisitor *This 41267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<HeaderFileInfoVisitor *>(UserData); 41277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoTrait Trait(This->Reader, M, 41297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &This->Reader.getPreprocessor().getHeaderSearchInfo(), 41307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M.HeaderFileFrameworkStrings, 41317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->FE->getName()); 41327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoLookupTable *Table 41347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 41357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Table) 41367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 41377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Look in the on-disk hash table for an entry for this file name. 41397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE->getName(), 41407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei &Trait); 41417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == Table->end()) 41427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 41437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->HFI = *Pos; 41457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 41467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 41477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 41497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 41507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 41517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiHeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 41537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HeaderFileInfoVisitor Visitor(*this, FE); 41547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor); 41557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) { 41567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Listener) 41577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Listener->ReadHeaderFileInfo(*HFI, FE->getUID()); 41587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return *HFI; 41597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 41607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return HeaderFileInfo(); 41627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 41637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 41657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Make it work properly with modules. 4166cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 41677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 41687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F = *(*I); 41697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 41707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagStates.clear(); 41717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!Diag.DiagStates.empty()); 41727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 41737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Idx < F.PragmaDiagMappings.size()) { 41747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 41757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 41767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DiagStateID != 0) { 41777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag.DiagStatePoints.push_back( 41787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 41797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FullSourceLoc(Loc, SourceMgr))); 41807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 41817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 41827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 41837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(DiagStateID == 0); 41847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A new DiagState was created here. 41857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 41867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 41877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagStates.push_back(NewState); 41887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag.DiagStatePoints.push_back( 41897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine::DiagStatePoint(NewState, 41907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FullSourceLoc(Loc, SourceMgr))); 41917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (1) { 41927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Idx < F.PragmaDiagMappings.size() && 41937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Invalid data, didn't find '-1' marking end of diag/map pairs"); 41947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Idx >= F.PragmaDiagMappings.size()) { 41957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; // Something is messed up but at least avoid infinite loop in 41967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // release build. 41977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 41987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = F.PragmaDiagMappings[Idx++]; 41997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DiagID == (unsigned)-1) { 42007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; // no more diag/map pairs for this location. 42017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei diag::Mapping Map = (diag::Mapping)F.PragmaDiagMappings[Idx++]; 42037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticMappingInfo MappingInfo = Diag.makeMappingInfo(Map, Loc); 42047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diag.GetCurDiagState()->setMappingInfo(DiagID, MappingInfo); 42057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 42097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Get the correct cursor and offset for loading a type. 42117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 42127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 42137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 42147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 42157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 42167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 42177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read and return the type with the given index.. 42197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 42207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// The index is the type ID, shifted and minus the number of predefs. This 42217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// routine actually reads the record corresponding to the type at the given 42227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// location. It is a helper routine for GetType, which deals with reading type 42237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// IDs. 42247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiQualType ASTReader::readTypeRecord(unsigned Index) { 42257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Loc = TypeCursorForIndex(Index); 42268f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 42277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Keep track of where we are in the stream, then jump back there 42297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // after reading this type. 42307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(DeclsCursor); 42317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadingKindTracker ReadingKind(Read_Type, *this); 42337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading a type record. 42357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing AType(this); 42367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 42387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclsCursor.JumpToBit(Loc.Offset); 42397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 42407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = DeclsCursor.ReadCode(); 4241b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 42427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_EXT_QUAL: { 42437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 42447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of extended qualifier type"); 42457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 42467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Base = readType(*Loc.F, Record, Idx); 42487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 42497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getQualifiedType(Base, Quals); 42507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_COMPLEX: { 42537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 42547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of complex type"); 42557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 42567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElemType = readType(*Loc.F, Record, Idx); 42587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getComplexType(ElemType); 42597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_POINTER: { 42627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 42637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of pointer type"); 42647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 42657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 42677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getPointerType(PointeeType); 42687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_BLOCK_POINTER: { 42717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 42727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of block pointer type"); 42737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 42747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 42767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getBlockPointerType(PointeeType); 42777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_LVALUE_REFERENCE: { 42807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 42817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of lvalue reference type"); 42827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 42837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 42857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getLValueReferenceType(PointeeType, Record[1]); 42867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_RVALUE_REFERENCE: { 42897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 42907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of rvalue reference type"); 42917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 42927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 42947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getRValueReferenceType(PointeeType); 42957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 42967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 42977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_MEMBER_POINTER: { 42987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 42997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of member pointer type"); 43007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 43017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = readType(*Loc.F, Record, Idx); 43037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ClassType = readType(*Loc.F, Record, Idx); 43047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (PointeeType.isNull() || ClassType.isNull()) 43057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 43067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 43087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_CONSTANT_ARRAY: { 43117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 43127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 43137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[2]; 43147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 3; 43157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt Size = ReadAPInt(Record, Idx); 43167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getConstantArrayType(ElementType, Size, 43177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASM, IndexTypeQuals); 43187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_INCOMPLETE_ARRAY: { 43217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 43227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 43237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[2]; 43247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 43257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_VARIABLE_ARRAY: { 43287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 43297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 43307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[2]; 43317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 43327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 43337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 43347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASM, IndexTypeQuals, 43357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange(LBLoc, RBLoc)); 43367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_VECTOR: { 43397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 3) { 43407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of vector type in AST file"); 43417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 43427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 43457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumElements = Record[1]; 43467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned VecKind = Record[2]; 43477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getVectorType(ElementType, NumElements, 43487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (VectorType::VectorKind)VecKind); 43497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_EXT_VECTOR: { 43527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 3) { 43537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of extended vector type in AST file"); 43547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 43557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 43587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumElements = Record[1]; 43597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getExtVectorType(ElementType, NumElements); 43607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_FUNCTION_NO_PROTO: { 43637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 6) { 43647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of no-proto function type"); 43657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 43667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ResultType = readType(*Loc.F, Record, Idx); 43687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 43697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (CallingConv)Record[4], Record[5]); 43707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getFunctionNoProtoType(ResultType, Info); 43717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 43727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_FUNCTION_PROTO: { 43747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ResultType = readType(*Loc.F, Record, Idx); 43757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionProtoType::ExtProtoInfo EPI; 43777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 43787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*hasregparm*/ Record[2], 43797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*regparm*/ Record[3], 43807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<CallingConv>(Record[4]), 43817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*produces*/ Record[5]); 43827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 6; 43847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumParams = Record[Idx++]; 43857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<QualType, 16> ParamTypes; 43867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumParams; ++I) 43877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 43887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 43897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.Variadic = Record[Idx++]; 43907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.HasTrailingReturn = Record[Idx++]; 43917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.TypeQuals = Record[Idx++]; 43927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 43937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExceptionSpecificationType EST = 43947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static_cast<ExceptionSpecificationType>(Record[Idx++]); 43957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.ExceptionSpecType = EST; 43967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<QualType, 2> Exceptions; 43977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (EST == EST_Dynamic) { 43987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.NumExceptions = Record[Idx++]; 43997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != EPI.NumExceptions; ++I) 44007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Exceptions.push_back(readType(*Loc.F, Record, Idx)); 44017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.Exceptions = Exceptions.data(); 44027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (EST == EST_ComputedNoexcept) { 44037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.NoexceptExpr = ReadExpr(*Loc.F); 44047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (EST == EST_Uninstantiated) { 44057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 44067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.ExceptionSpecTemplate = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 44077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (EST == EST_Unevaluated) { 44087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx); 44097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getFunctionType(ResultType, ParamTypes.data(), NumParams, 44117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EPI); 44127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_UNRESOLVED_USING: { 44157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 44167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypeDeclType( 44177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 44187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TYPEDEF: { 44217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 44227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of typedef type"); 44237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 44247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 44267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 44277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Canonical = readType(*Loc.F, Record, Idx); 44287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Canonical.isNull()) 44297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Canonical = Context.getCanonicalType(Canonical); 44307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypedefType(Decl, Canonical); 44317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TYPEOF_EXPR: 44347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 44357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TYPEOF: { 44377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 44387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of typeof(type) in AST file"); 44397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 44407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnderlyingType = readType(*Loc.F, Record, Idx); 44427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTypeOfType(UnderlyingType); 44437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DECLTYPE: { 44467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnderlyingType = readType(*Loc.F, Record, Idx); 44477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 44487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_UNARY_TRANSFORM: { 44517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType BaseType = readType(*Loc.F, Record, Idx); 44527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType UnderlyingType = readType(*Loc.F, Record, Idx); 44537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 44547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 44557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_AUTO: 44587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getAutoType(readType(*Loc.F, Record, Idx)); 44597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_RECORD: { 44617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 44627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of record type"); 44637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 44647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 44667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsDependent = Record[Idx++]; 44677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 44687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 44697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = Context.getRecordType(RD); 44707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 44717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 44727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ENUM: { 44757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 44767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of enum type"); 44777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 44787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 44807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsDependent = Record[Idx++]; 44817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T 44827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 44837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 44847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 44857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ATTRIBUTED: { 44887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 3) { 44897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of attributed type"); 44907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 44917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType modifiedType = readType(*Loc.F, Record, Idx); 44937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType equivalentType = readType(*Loc.F, Record, Idx); 44947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 44957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getAttributedType(kind, modifiedType, equivalentType); 44967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 44977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 44987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_PAREN: { 44997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 45007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of paren type"); 45017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 45027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType InnerType = readType(*Loc.F, Record, Idx); 45047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getParenType(InnerType); 45057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_PACK_EXPANSION: { 45087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 2) { 45097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("incorrect encoding of pack expansion type"); 45107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 45117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Pattern = readType(*Loc.F, Record, Idx); 45137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pattern.isNull()) 45147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 45157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Optional<unsigned> NumExpansions; 45167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[1]) 45177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumExpansions = Record[1] - 1; 45187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getPackExpansionType(Pattern, NumExpansions); 45197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ELABORATED: { 45227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 45247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 45257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType NamedType = readType(*Loc.F, Record, Idx); 45267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getElaboratedType(Keyword, NNS, NamedType); 45277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OBJC_INTERFACE: { 45307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCInterfaceDecl *ItfD 45327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 45337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 45347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OBJC_OBJECT: { 45377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Base = readType(*Loc.F, Record, Idx); 45397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumProtos = Record[Idx++]; 45407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<ObjCProtocolDecl*, 4> Protos; 45417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumProtos; ++I) 45427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 45437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCObjectType(Base, Protos.data(), NumProtos); 45447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_OBJC_OBJECT_POINTER: { 45477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Pointee = readType(*Loc.F, Record, Idx); 45497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCObjectPointerType(Pointee); 45507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 45537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Parm = readType(*Loc.F, Record, Idx); 45557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Replacement = readType(*Loc.F, Record, Idx); 45567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 45577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm), 45587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Replacement); 45597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 45627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Parm = readType(*Loc.F, Record, Idx); 45647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 45657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getSubstTemplateTypeParmPackType( 45667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<TemplateTypeParmType>(Parm), 45677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArgPack); 45687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_INJECTED_CLASS_NAME: { 45717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 45727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 45737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 45747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for AST reading, too much interdependencies. 45757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 45767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType(new (Context, TypeAlignment) InjectedClassNameType(D, TST), 0); 45777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TEMPLATE_TYPE_PARM: { 45807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Depth = Record[Idx++]; 45827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = Record[Idx++]; 45837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Pack = Record[Idx++]; 45847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateTypeParmDecl *D 45857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 45867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 45877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 45897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DEPENDENT_NAME: { 45907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 45917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 45927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 45937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 45947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Canon = readType(*Loc.F, Record, Idx); 45957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Canon.isNull()) 45967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Canon = Context.getCanonicalType(Canon); 45977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentNameType(Keyword, NNS, Name, Canon); 45987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 45997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 46017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 46027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 46037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 46047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 46057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = Record[Idx++]; 46067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<TemplateArgument, 8> Args; 46077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.reserve(NumArgs); 46087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumArgs--) 46097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 46107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 46117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.size(), Args.data()); 46127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_DEPENDENT_SIZED_ARRAY: { 46157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 46167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ArrayType 46187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ElementType = readType(*Loc.F, Record, Idx); 46197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayType::ArraySizeModifier ASM 46207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ArrayType::ArraySizeModifier)Record[Idx++]; 46217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned IndexTypeQuals = Record[Idx++]; 46227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // DependentSizedArrayType 46247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Expr *NumElts = ReadExpr(*Loc.F); 46257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 46267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 46287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IndexTypeQuals, Brackets); 46297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_TEMPLATE_SPECIALIZATION: { 46327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 46337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsDependent = Record[Idx++]; 46347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 46357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<TemplateArgument, 8> Args; 46367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 46377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Underlying = readType(*Loc.F, Record, Idx); 46387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T; 46397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Underlying.isNull()) 46407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 46417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.size()); 46427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 46437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getTemplateSpecializationType(Name, Args.data(), 46447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args.size(), Underlying); 46457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 46467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T; 46477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TYPE_ATOMIC: { 46507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record.size() != 1) { 46517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Incorrect encoding of atomic type"); 46527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 46537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ValueType = readType(*Loc.F, Record, Idx); 46557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getAtomicType(ValueType); 46567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid TypeCode!"); 46597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 46607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 46627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 46637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F; 46647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader::RecordData &Record; 46657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx; 46667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 46687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &I) { 46697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.ReadSourceLocation(F, R, I); 46707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei template<typename T> 46737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { 46747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.ReadDeclAs<T>(F, Record, Idx); 46757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 46767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic: 46787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeLocReader(ASTReader &Reader, ModuleFile &F, 46797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader::RecordData &Record, unsigned &Idx) 46807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), F(F), Record(Record), Idx(Idx) 46817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei { } 46827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want compile-time assurance that we've enumerated all of 46847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // these, so unfortunately we have to declare them first, then 46857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // define them out-of-line. 46867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPELOC(CLASS, PARENT) 46877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPELOC(CLASS, PARENT) \ 46887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 46897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeLocNodes.def" 46907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void VisitFunctionTypeLoc(FunctionTypeLoc); 46927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void VisitArrayTypeLoc(ArrayTypeLoc); 46937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 46947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 46957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 46967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // nothing to do 46977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 46987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 46997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setBuiltinLoc(ReadSourceLocation(Record, Idx)); 47007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TL.needsExtraLocalData()) { 47017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 47027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 47037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 47047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setModeAttr(Record[Idx++]); 47057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 47067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 47087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 47097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 47117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setStarLoc(ReadSourceLocation(Record, Idx)); 47127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 47147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setCaretLoc(ReadSourceLocation(Record, Idx)); 47157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 47177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAmpLoc(ReadSourceLocation(Record, Idx)); 47187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 47207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 47217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 47237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setStarLoc(ReadSourceLocation(Record, Idx)); 47247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 47257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 47277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLBracketLoc(ReadSourceLocation(Record, Idx)); 47287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRBracketLoc(ReadSourceLocation(Record, Idx)); 47297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Idx++]) 47307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setSizeExpr(Reader.ReadExpr(F)); 47317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 47327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setSizeExpr(0); 47337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 47357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 47367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 47387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 47397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 47417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 47427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentSizedArrayTypeLoc( 47447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentSizedArrayTypeLoc TL) { 47457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitArrayTypeLoc(TL); 47467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 47487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentSizedExtVectorTypeLoc TL) { 47497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 47507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 47527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 47537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 47557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 47567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 47587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx)); 47597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 47607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 47617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); 47627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) { 47637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setArg(i, ReadDeclAs<ParmVarDecl>(Record, Idx)); 47647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 47657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 47677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitFunctionTypeLoc(TL); 47687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 47707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VisitFunctionTypeLoc(TL); 47717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 47737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 47747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 47767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 47777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 47797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 47807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 47817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 47827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 47847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 47857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 47867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 47877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 47887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 47907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 47917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 47937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setKWLoc(ReadSourceLocation(Record, Idx)); 47947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 47957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 47967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 47977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 47987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 47997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 48027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 48057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 48087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrNameLoc(ReadSourceLocation(Record, Idx)); 48097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TL.hasAttrOperand()) { 48107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange range; 48117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei range.setBegin(ReadSourceLocation(Record, Idx)); 48127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei range.setEnd(ReadSourceLocation(Record, Idx)); 48137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrOperandParensRange(range); 48147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 48157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TL.hasAttrExprOperand()) { 48167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Idx++]) 48177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrExprOperand(Reader.ReadExpr(F)); 48187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 48197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrExprOperand(0); 48207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (TL.hasAttrEnumOperand()) 48217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx)); 48227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 48247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 48277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubstTemplateTypeParmTypeLoc TL) { 48287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 48317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubstTemplateTypeParmPackTypeLoc TL) { 48327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitTemplateSpecializationTypeLoc( 48357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateSpecializationTypeLoc TL) { 48367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 48377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 48387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 48397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 48407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 48417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setArgLocInfo(i, 48427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.GetTemplateArgumentLocInfo(F, 48437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.getTypePtr()->getArg(i).getKind(), 48447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record, Idx)); 48457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 48477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 48487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 48497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 48517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 48527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 48537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 48557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 48587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 48597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 48607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 48637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentTemplateSpecializationTypeLoc TL) { 48647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 48657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 48667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 48677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 48687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 48697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 48707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 48717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setArgLocInfo(I, 48727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.GetTemplateArgumentLocInfo(F, 48737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.getTypePtr()->getArg(I).getKind(), 48747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record, Idx)); 48757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 48777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setEllipsisLoc(ReadSourceLocation(Record, Idx)); 48787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 48807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setNameLoc(ReadSourceLocation(Record, Idx)); 48817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 48837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setHasBaseTypeAsWritten(Record[Idx++]); 48847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 48857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 48867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 48877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx)); 48887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 48907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setStarLoc(ReadSourceLocation(Record, Idx)); 48917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 48937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setKWLoc(ReadSourceLocation(Record, Idx)); 48947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 48957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 48967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 48977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 48987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F, 48997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 49007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 49017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType InfoTy = readType(F, Record, Idx); 49027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (InfoTy.isNull()) 49037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 49047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 49067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeLocReader TLR(*this, F, Record, Idx); 49077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 49087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TLR.Visit(TL); 49097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TInfo; 49107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 49117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiQualType ASTReader::GetType(TypeID ID) { 49137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FastQuals = ID & Qualifiers::FastMask; 49147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID >> Qualifiers::FastWidth; 49157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index < NUM_PREDEF_TYPE_IDS) { 49177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T; 49187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch ((PredefinedTypeIDs)Index) { 49197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_NULL_ID: return QualType(); 49207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break; 49217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break; 49227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR_U_ID: 49247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR_S_ID: 49257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Check that the signedness of CharTy is correct! 49267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.CharTy; 49277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 49287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break; 49307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break; 49317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break; 49327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break; 49337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break; 49347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break; 49357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break; 49367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break; 49377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break; 49387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_INT_ID: T = Context.IntTy; break; 49397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break; 49407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break; 49417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break; 49427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break; 49437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break; 49447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break; 49457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break; 49467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break; 49477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break; 49487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break; 49497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break; 49507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break; 49517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break; 49527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break; 49537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break; 49547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break; 49557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break; 49567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break; 4957b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break; 4958b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break; 4959b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break; 4960b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break; 4961b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break; 4962b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break; 496321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break; 4964e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break; 49657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break; 49667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_AUTO_RREF_DEDUCT: 49687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getAutoRRefDeductType(); 49697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 49707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 49727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.ARCUnbridgedCastTy; 49737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 49747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_VA_LIST_TAG: 49767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.getVaListTagType(); 49777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 49787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_TYPE_BUILTIN_FN: 49807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Context.BuiltinFnTy; 49817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 49827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 49837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!T.isNull() && "Unknown predefined type"); 49857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T.withFastQualifiers(FastQuals); 49867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 49877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Index -= NUM_PREDEF_TYPE_IDS; 49897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Index < TypesLoaded.size() && "Type index out-of-range"); 49907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypesLoaded[Index].isNull()) { 49917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded[Index] = readTypeRecord(Index); 49927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypesLoaded[Index].isNull()) 49937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return QualType(); 49947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 49957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded[Index]->setFromAST(); 49967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 49977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 49987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypesLoaded[Index]); 49997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TypesLoaded[Index].withFastQualifiers(FastQuals); 50027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiQualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 50057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GetType(getGlobalTypeID(F, LocalID)); 50067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::TypeID 50097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 50107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned FastQuals = LocalID & Qualifiers::FastMask; 50117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 50127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalIndex < NUM_PREDEF_TYPE_IDS) 50147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 50157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 50177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 50187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 50197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned GlobalIndex = LocalIndex + I->second; 50217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 50227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateArgumentLocInfo 50257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 50267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument::ArgKind Kind, 50277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 50287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Index) { 50297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 50307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Expression: 50317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadExpr(F); 50327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Type: 50337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GetTypeSourceInfo(F, Record, Index); 50347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Template: { 50357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 50367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Index); 50377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 50387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 50397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation()); 50407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::TemplateExpansion: { 50427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 50437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Index); 50447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 50457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 50467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 50477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EllipsisLoc); 50487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Null: 50507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Integral: 50517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Declaration: 50527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::NullPtr: 50537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Pack: 50547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Is this right? 50557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLocInfo(); 50567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("unexpected template argument loc"); 50587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateArgumentLoc 50617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 50627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Index) { 50637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 50647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Arg.getKind() == TemplateArgument::Expression) { 50667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Index++]) // bool InfoHasSameExpr. 50677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 50687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 50707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record, Index)); 50717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDecl *ASTReader::GetExternalDecl(uint32_t ID) { 50747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GetDecl(ID); 50757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiuint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, const RecordData &Record, 50787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx){ 50797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Idx >= Record.size()) 50807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 50817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned LocalID = Record[Idx++]; 50837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]); 50847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 50857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 50867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 50877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Loc = getLocalBitOffset(Offset); 50888f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor = Loc.F->DeclsCursor; 50897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 50907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Cursor.JumpToBit(Loc.Offset); 50917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadingKindTracker ReadingKind(Read_Decl, *this); 50927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 50937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Code = Cursor.ReadCode(); 5094b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner unsigned RecCode = Cursor.readRecord(Code, Record); 50957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 50967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Malformed AST file: missing C++ base specifiers"); 50977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 50987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 50997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 51017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumBases = Record[Idx++]; 51027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 51037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 51047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumBases; ++I) 51057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 51067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Bases; 51077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 51087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::DeclID 51107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 51117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_DECL_IDS) 51127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 51137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 51157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 51167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 51177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 51197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 51207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 51227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M) const { 51237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID); 51247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 51257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return &M == I->second; 51267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 51277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51285a04f9fc2b000da98fd903c8156034304bdadb2fDouglas GregorModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 51297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!D->isFromASTFile()) 51307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 51317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 51327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 51337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return I->second; 51347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 51357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 51377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID < NUM_PREDEF_DECL_IDS) 51387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SourceLocation(); 51397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - NUM_PREDEF_DECL_IDS; 51417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index > DeclsLoaded.size()) { 51437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("declaration ID out-of-range for AST file"); 51447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SourceLocation(); 51457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Decl *D = DeclsLoaded[Index]) 51487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return D->getLocation(); 51497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned RawLocation = 0; 51517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Rec = DeclCursorForID(ID, RawLocation); 51527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadSourceLocation(*Rec.F, RawLocation); 51537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 51547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDecl *ASTReader::GetDecl(DeclID ID) { 51567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID < NUM_PREDEF_DECL_IDS) { 51577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch ((PredefinedDeclIDs)ID) { 51587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_NULL_ID: 51597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 51607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_TRANSLATION_UNIT_ID: 51627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getTranslationUnitDecl(); 51637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_ID_ID: 51657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCIdDecl(); 51667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_SEL_ID: 51687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCSelDecl(); 51697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_CLASS_ID: 51717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCClassDecl(); 51727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_PROTOCOL_ID: 51747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCProtocolDecl(); 51757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_INT_128_ID: 51777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getInt128Decl(); 51787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_UNSIGNED_INT_128_ID: 51807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getUInt128Decl(); 51817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 51837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getObjCInstanceTypeDecl(); 51847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case PREDEF_DECL_BUILTIN_VA_LIST_ID: 51867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getBuiltinVaListDecl(); 51877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - NUM_PREDEF_DECL_IDS; 51917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index >= DeclsLoaded.size()) { 51937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(0 && "declaration ID out-of-range for AST file"); 51947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("declaration ID out-of-range for AST file"); 51957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 51967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 51977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 51987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DeclsLoaded[Index]) { 51997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadDeclRecord(ID); 52007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 52017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 52027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DeclsLoaded[Index]; 52057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 52067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 52087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclID GlobalID) { 52097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalID < NUM_PREDEF_DECL_IDS) 52107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GlobalID; 52117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 52137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 52147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *Owner = I->second; 52157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 52177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.GlobalToLocalDeclIDs.find(Owner); 52187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == M.GlobalToLocalDeclIDs.end()) 52197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 52207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return GlobalID - Owner->BaseDeclID + Pos->second; 52227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 52237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 52257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 52267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 52277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Idx >= Record.size()) { 52287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("Corrupted AST file"); 52297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 52307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getGlobalDeclID(F, Record[Idx++]); 52337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 52347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Resolve the offset of a statement into a statement. 52367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 52377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// This operation will read a new statement from the external 52387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// source each time it is called, and is meant to be used via a 52397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 52407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 52417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Switch case IDs are per Decl. 52427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ClearSwitchCaseIDs(); 52437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Offset here is a global offset across the entire chain. 52457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordLocation Loc = getLocalBitOffset(Offset); 52467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 52477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ReadStmtFromStream(*Loc.F); 52487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 52497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 52517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class FindExternalLexicalDeclsVisitor { 52527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 52537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC; 52547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool (*isKindWeWant)(Decl::Kind); 52557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl*> &Decls; 52577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool PredefsVisited[NUM_PREDEF_DECL_IDS]; 52587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 52607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC, 52617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool (*isKindWeWant)(Decl::Kind), 52627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl*> &Decls) 52637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls) 52647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei { 52657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I) 52667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PredefsVisited[I] = false; 52677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, bool Preorder, void *UserData) { 52707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Preorder) 52717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 52727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FindExternalLexicalDeclsVisitor *This 52747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<FindExternalLexicalDeclsVisitor *>(UserData); 52757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile::DeclContextInfosMap::iterator Info 52777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.DeclContextInfos.find(This->DC); 52787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls) 52797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 52807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load all of the declaration IDs 52827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (const KindDeclIDPair *ID = Info->second.LexicalDecls, 52837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *IDE = ID + Info->second.NumLexicalDecls; 52847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID != IDE; ++ID) { 52857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first)) 52867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 52877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't add predefined declarations to the lexical context more 52897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // than once. 52907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID->second < NUM_PREDEF_DECL_IDS) { 52917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (This->PredefsVisited[ID->second]) 52927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 52937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->PredefsVisited[ID->second] = true; 52957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 52967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 52977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) { 52987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!This->DC->isDeclInLexicalTraversal(D)) 52997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Decls.push_back(D); 53007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 53047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 53067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 53077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC, 53097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool (*isKindWeWant)(Decl::Kind), 53107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl*> &Decls) { 53117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // There might be lexical decls in multiple modules, for the TU at 53127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // least. Walk all of the modules in the order they were loaded. 53137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls); 53147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor); 53157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumLexicalDeclContextsRead; 53167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ELR_Success; 53177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 53187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 53207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass DeclIDComp { 53227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 53237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &Mod; 53247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic: 53267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 53277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(LocalDeclID L, LocalDeclID R) const { 53297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLocation(L); 53307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLocation(R); 53317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 53327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(SourceLocation LHS, LocalDeclID R) const { 53357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RHS = getLocation(R); 53367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 53377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool operator()(LocalDeclID L, SourceLocation RHS) const { 53407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LHS = getLocation(L); 53417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 53427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation getLocation(LocalDeclID ID) const { 53457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Reader.getSourceManager().getFileLoc( 53467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 53477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 53487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 53497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 53517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::FindFileRegionDecls(FileID File, 53537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Offset, unsigned Length, 53547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<Decl *> &Decls) { 53557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceManager &SM = getSourceManager(); 53567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 53587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I == FileDeclIDs.end()) 53597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 53607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FileDeclsInfo &DInfo = I->second; 53627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DInfo.Decls.empty()) 53637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 53647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation 53667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 53677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 53687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclIDComp DIDComp(*this, *DInfo.Mod); 53707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<serialization::LocalDeclID>::iterator 53717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 53727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BeginLoc, DIDComp); 53737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BeginIt != DInfo.Decls.begin()) 53747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --BeginIt; 53757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we are pointing at a top-level decl inside an objc container, we need 53777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // to backtrack until we find it otherwise we will fail to report that the 53787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // region overlaps with an objc container. 53797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (BeginIt != DInfo.Decls.begin() && 53807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 53817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->isTopLevelDeclInObjCContainer()) 53827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --BeginIt; 53837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<serialization::LocalDeclID>::iterator 53857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 53867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EndLoc, DIDComp); 53877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (EndIt != DInfo.Decls.end()) 53887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++EndIt; 53897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ArrayRef<serialization::LocalDeclID>::iterator 53917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DIt = BeginIt; DIt != EndIt; ++DIt) 53927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 53937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 53947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 53957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 53967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief ModuleFile visitor used to perform name lookup into a 53977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// declaration context. 53987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class DeclContextNameLookupVisitor { 53997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 5400cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<const DeclContext *> &Contexts; 54017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name; 54027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<NamedDecl *> &Decls; 54037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 54057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextNameLookupVisitor(ASTReader &Reader, 54067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<const DeclContext *> &Contexts, 54077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name, 54087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<NamedDecl *> &Decls) 54097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { } 54107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 54127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextNameLookupVisitor *This 54137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<DeclContextNameLookupVisitor *>(UserData); 54147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we have any visible declaration information for 54167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this context in this module. 54177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile::DeclContextInfosMap::iterator Info; 54187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundInfo = false; 54197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 54207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info = M.DeclContextInfos.find(This->Contexts[I]); 54217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info != M.DeclContextInfos.end() && 54227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData) { 54237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundInfo = true; 54247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 54257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FoundInfo) 54297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 54307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Look for this name within this module. 54327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable *LookupTable = 54337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData; 54347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable::iterator Pos 54357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = LookupTable->find(This->Name); 54367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == LookupTable->end()) 54377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 54387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundAnything = false; 54407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTrait::data_type Data = *Pos; 54417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; Data.first != Data.second; ++Data.first) { 54427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first); 54437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ND) 54447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 54457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ND->getDeclName() != This->Name) { 54477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A name might be null because the decl's redeclarable part is 54487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // currently read before reading its name. The lookup is triggered by 54497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // building that decl (likely indirectly), and so it is later in the 54507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // sense of "already existing" and can be ignored here. 54517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 54527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record this declaration. 54557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundAnything = true; 54567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Decls.push_back(ND); 54577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FoundAnything; 54607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 54617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 54627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 54637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54645a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// \brief Retrieve the "definitive" module file for the definition of the 54655a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// given declaration context, if there is one. 54665a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// 54675a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// The "definitive" module file is the only place where we need to look to 54685a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// find information about the declarations within the given declaration 54695a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// context. For example, C++ and Objective-C classes, C structs/unions, and 54705a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// Objective-C protocols, categories, and extensions are all defined in a 54715a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// single place in the source code, so they have definitive module files 54725a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// associated with them. C++ namespaces, on the other hand, can have 54735a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// definitions in multiple different module files. 54745a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// 54755a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's 54765a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor/// NDEBUG checking. 54775a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregorstatic ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC, 54785a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor ASTReader &Reader) { 5479e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor if (const DeclContext *DefDC = getDefinitiveDeclContext(DC)) 5480e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor return Reader.getOwningModuleFile(cast<Decl>(DefDC)); 54815a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 54825a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor return 0; 54835a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor} 54845a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 54853646c68676c3c46a026b23d52188ef6e0d856178Richard Smithbool 54867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 54877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name) { 54887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(DC->hasExternalVisibleStorage() && 54897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "DeclContext has no visible decls in storage"); 54907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Name) 54913646c68676c3c46a026b23d52188ef6e0d856178Richard Smith return false; 54927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<NamedDecl *, 64> Decls; 54947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 54957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compute the declaration contexts we need to look into. Multiple such 54967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declaration contexts occur when two declaration contexts from disjoint 54977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // modules get merged, e.g., when two namespaces with the same name are 54987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // independently defined in separate modules. 54997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<const DeclContext *, 2> Contexts; 55007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(DC); 55017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isNamespace()) { 55037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MergedDeclsMap::iterator Merged 55047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 55057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Merged != MergedDecls.end()) { 55067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 55077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 55087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls); 55125a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 55135a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // If we can definitively determine which module file to look into, 55145a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // only look there. Otherwise, look in all module files. 55155a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor ModuleFile *Definitive; 55165a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor if (Contexts.size() == 1 && 55175a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor (Definitive = getDefinitiveModuleFileFor(DC, *this))) { 55185a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor DeclContextNameLookupVisitor::visit(*Definitive, &Visitor); 55195a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor } else { 55205a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor); 55215a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor } 55227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumVisibleDeclContextsRead; 55237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SetExternalVisibleDeclsForName(DC, Name, Decls); 55243646c68676c3c46a026b23d52188ef6e0d856178Richard Smith return !Decls.empty(); 55257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 55287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief ModuleFile visitor used to retrieve all visible names in a 55297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// declaration context. 55307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class DeclContextAllNamesVisitor { 55317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 5532cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<const DeclContext *> &Contexts; 55337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > &Decls; 5534ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis bool VisitAll; 55357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 55377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextAllNamesVisitor(ASTReader &Reader, 55387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<const DeclContext *> &Contexts, 55397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<DeclarationName, 5540ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis SmallVector<NamedDecl *, 8> > &Decls, 5541ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis bool VisitAll) 5542ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { } 55437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 55457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclContextAllNamesVisitor *This 55467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<DeclContextAllNamesVisitor *>(UserData); 55477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check whether we have any visible declaration information for 55497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this context in this module. 55507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile::DeclContextInfosMap::iterator Info; 55517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundInfo = false; 55527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 55537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info = M.DeclContextInfos.find(This->Contexts[I]); 55547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Info != M.DeclContextInfos.end() && 55557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData) { 55567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundInfo = true; 55577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 55587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FoundInfo) 55627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 55637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTable *LookupTable = 55657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info->second.NameLookupTableData; 55667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool FoundAnything = false; 55677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ASTDeclContextNameLookupTable::data_iterator 5568a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor I = LookupTable->data_begin(), E = LookupTable->data_end(); 5569a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor I != E; 5570a6b00fc97669aa25d89ae9f202b05dfadfd0e324Douglas Gregor ++I) { 55717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTDeclContextNameLookupTrait::data_type Data = *I; 55727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (; Data.first != Data.second; ++Data.first) { 55737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, 55747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei *Data.first); 55757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!ND) 55767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 55777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record this declaration. 55797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FoundAnything = true; 55807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Decls[ND->getDeclName()].push_back(ND); 55817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5584ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis return FoundAnything && !This->VisitAll; 55857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 55867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 55877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 55887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 55907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DC->hasExternalVisibleStorage()) 55917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 5592cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > Decls; 55937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 55947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compute the declaration contexts we need to look into. Multiple such 55957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declaration contexts occur when two declaration contexts from disjoint 55967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // modules get merged, e.g., when two namespaces with the same name are 55977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // independently defined in separate modules. 55987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<const DeclContext *, 2> Contexts; 55997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(DC); 56007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isNamespace()) { 56027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MergedDeclsMap::iterator Merged 56037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 56047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Merged != MergedDecls.end()) { 56057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 56067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 56077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 56087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 56097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5610ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls, 5611ca40f30a20d0329900fa3d1e4b3252cece86ccc0Argyrios Kyrtzidis /*VisitAll=*/DC->isFileContext()); 56127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor); 56137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++NumVisibleDeclContextsRead; 56147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (llvm::DenseMap<DeclarationName, 5616cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<NamedDecl *, 8> >::iterator 56177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = Decls.begin(), E = Decls.end(); I != E; ++I) { 56187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SetExternalVisibleDeclsForName(DC, I->first, I->second); 56197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 56207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 56217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Under non-PCH compilation the consumer receives the objc methods 56247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// before receiving the implementation, and codegen depends on this. 56257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// We simulate this by deserializing and passing to consumer the methods of the 56267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// implementation before passing the deserialized implementation decl. 56277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 56287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTConsumer *Consumer) { 56297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ImplD && Consumer); 56307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCImplDecl::method_iterator 56327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = ImplD->meth_begin(), E = ImplD->meth_end(); I != E; ++I) 56337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Consumer->HandleInterestingDecl(DeclGroupRef(*I)); 56347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 56367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::PassInterestingDeclsToConsumer() { 56397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Consumer); 56407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!InterestingDecls.empty()) { 56417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decl *D = InterestingDecls.front(); 56427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InterestingDecls.pop_front(); 56437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassInterestingDeclToConsumer(D); 56457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 56467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::PassInterestingDeclToConsumer(Decl *D) { 56497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 56507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassObjCImplDeclToConsumer(ImplD, Consumer); 56517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 56527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Consumer->HandleInterestingDecl(DeclGroupRef(D)); 56537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 56567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei this->Consumer = Consumer; 56577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Consumer) 56597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 56607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) { 56627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Force deserialization of this decl, which will cause it to be queued for 56637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // passing to the consumer. 56647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetDecl(ExternalDefinitions[I]); 56657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 56667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExternalDefinitions.clear(); 56677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassInterestingDeclsToConsumer(); 56697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 56707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::PrintStats() { 56727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, "*** AST File Statistics:\n"); 56737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTypesLoaded 56757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 56767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType()); 56777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumDeclsLoaded 56787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 56797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (Decl *)0); 56807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumIdentifiersLoaded 56817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 56827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifiersLoaded.end(), 56837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (IdentifierInfo *)0); 56847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumMacrosLoaded 56857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 56867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MacrosLoaded.end(), 56877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (MacroInfo *)0); 56887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumSelectorsLoaded 56897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 56907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorsLoaded.end(), 56917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Selector()); 56927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 56937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 56947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 56957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumSLocEntriesRead, TotalNumSLocEntries, 56967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 56977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!TypesLoaded.empty()) 56987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u types read (%f%%)\n", 56997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumTypesLoaded, (unsigned)TypesLoaded.size(), 57007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 57017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DeclsLoaded.empty()) 57027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 57037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 57047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 57057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IdentifiersLoaded.empty()) 57067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 57077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 57087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 57097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!MacrosLoaded.empty()) 57107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 57117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 57127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 57137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SelectorsLoaded.empty()) 57147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 57157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 57167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 57177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalNumStatements) 57187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 57197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumStatementsRead, TotalNumStatements, 57207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumStatementsRead/TotalNumStatements * 100)); 57217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalNumMacros) 57227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 57237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumMacrosRead, TotalNumMacros, 57247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumMacrosRead/TotalNumMacros * 100)); 57257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalLexicalDeclContexts) 57267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 57277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 57287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 57297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei * 100)); 57307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalVisibleDeclContexts) 57317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 57327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 57337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 57347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei * 100)); 57357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TotalNumMethodPoolEntries) { 57367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 57377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 57387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 57397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei * 100)); 57407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 574195fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor if (NumMethodPoolLookups) { 574295fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 574395fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor NumMethodPoolHits, NumMethodPoolLookups, 574495fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 574595fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor } 574695fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor if (NumMethodPoolTableLookups) { 574795fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 574895fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor NumMethodPoolTableHits, NumMethodPoolTableLookups, 574995fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 575095fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor * 100.0)); 575195fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor } 575295fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 5753e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor if (NumIdentifierLookupHits) { 5754e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor std::fprintf(stderr, 5755e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor " %u / %u identifier table lookups succeeded (%f%%)\n", 5756e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits, NumIdentifierLookups, 5757e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 5758e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor } 5759e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor 57601a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (GlobalIndex) { 57611a49d97d762570027863e9209af81d445e4f1502Douglas Gregor std::fprintf(stderr, "\n"); 57621a49d97d762570027863e9209af81d445e4f1502Douglas Gregor GlobalIndex->printStats(); 57631a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 57641a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 57657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, "\n"); 57667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dump(); 57677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::fprintf(stderr, "\n"); 57687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate<typename Key, typename ModuleFile, unsigned InitialCapacity> 57717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void 57727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeidumpModuleIDMap(StringRef Name, 57737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ContinuousRangeMap<Key, ModuleFile *, 57747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InitialCapacity> &Map) { 57757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Map.begin() == Map.end()) 57767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 57777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 57797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << Name << ":\n"; 57807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 57817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != IEnd; ++I) { 57827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << " " << I->first << " -> " << I->second->FileName 57837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << "\n"; 57847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 57857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 57867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 57877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::dump() { 57887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 57897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 57907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 57917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global type map", GlobalTypeMap); 57927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global declaration map", GlobalDeclMap); 57937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 57947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global macro map", GlobalMacroMap); 57957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 57967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global selector map", GlobalSelectorMap); 57977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dumpModuleIDMap("Global preprocessed entity map", 57987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalPreprocessedEntityMap); 57997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::errs() << "\n*** PCH/Modules Loaded:"; 58017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 58027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MEnd = ModuleMgr.end(); 58037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei M != MEnd; ++M) 58047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (*M)->dump(); 58057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 58067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Return the amount of memory used by memory buffers, breaking down 58087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// by heap-backed versus mmap'ed memory. 58097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 58107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ModuleConstIterator I = ModuleMgr.begin(), 58117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = ModuleMgr.end(); I != E; ++I) { 58127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 58137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei size_t bytes = buf->getBufferSize(); 58147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (buf->getBufferKind()) { 58157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case llvm::MemoryBuffer::MemoryBuffer_Malloc: 58167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizes.malloc_bytes += bytes; 58177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 58187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case llvm::MemoryBuffer::MemoryBuffer_MMap: 58197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei sizes.mmap_bytes += bytes; 58207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 58217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 58257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::InitializeSema(Sema &S) { 58277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj = &S; 58287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei S.addExternalSource(this); 58297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Makes sure any declarations that were deserialized "too early" 58317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // still get added to the identifier's declaration chains. 58327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) { 58337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj->pushExternalDeclIntoScope(PreloadedDecls[I], 58347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreloadedDecls[I]->getDeclName()); 58357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreloadedDecls.clear(); 58377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the offsets of the declarations that Sema references. 58397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // They will be lazily deserialized when needed. 58407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SemaDeclRefs.empty()) { 58417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!"); 58427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SemaObj->StdNamespace) 58437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj->StdNamespace = SemaDeclRefs[0]; 58447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SemaObj->StdBadAlloc) 58457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj->StdBadAlloc = SemaDeclRefs[1]; 58467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FPPragmaOptions.empty()) { 58497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 58507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 58517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!OpenCLExtensions.empty()) { 58547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned I = 0; 58557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++]; 58567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/OpenCLExtensions.def" 58577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS"); 58597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 58607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 58617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) { 58637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we are loading an identifier. 58647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Deserializing AnIdentifier(this); 58651a49d97d762570027863e9209af81d445e4f1502Douglas Gregor StringRef Name(NameStart, NameEnd - NameStart); 58661a49d97d762570027863e9209af81d445e4f1502Douglas Gregor 58671a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // If there is a global index, look there first to determine which modules 58681a49d97d762570027863e9209af81d445e4f1502Douglas Gregor // provably do not have any results for this identifier. 5869188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor GlobalModuleIndex::HitSet Hits; 5870188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor GlobalModuleIndex::HitSet *HitsPtr = 0; 58711a49d97d762570027863e9209af81d445e4f1502Douglas Gregor if (!loadGlobalIndex()) { 5872188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor if (GlobalIndex->lookupIdentifier(Name, Hits)) { 5873188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor HitsPtr = &Hits; 58741a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 58751a49d97d762570027863e9209af81d445e4f1502Douglas Gregor } 5876188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 5877e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookups, 5878e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumIdentifierLookupHits); 5879188bdcd1aaf5e9f457cec6851707d7dc3e7bbb15Douglas Gregor ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 58807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = Visitor.getIdentifierInfo(); 58817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei markIdentifierUpToDate(II); 58827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return II; 58837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 58847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace clang { 58867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief An identifier-lookup iterator that enumerates all of the 58877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// identifiers stored within a set of AST files. 58887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class ASTIdentifierIterator : public IdentifierIterator { 58897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The AST reader whose identifiers are being enumerated. 58907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTReader &Reader; 58917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The current index into the chain of AST files stored in 58937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// the AST reader. 58947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index; 58957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 58967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The current position within the identifier lookup table 58977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// of the current AST file. 58987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable::key_iterator Current; 58997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief The end position within the identifier lookup table of 59017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// the current AST file. 59027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable::key_iterator End; 59037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 59057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei explicit ASTIdentifierIterator(const ASTReader &Reader); 59067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei virtual StringRef Next(); 59087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 59097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 59107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 59127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 59137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable *IdTable 59147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 59157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Current = IdTable->key_begin(); 59167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei End = IdTable->key_end(); 59177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 59187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiStringRef ASTIdentifierIterator::Next() { 59207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (Current == End) { 59217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have exhausted all of our AST files, we're done. 59227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index == 0) 59237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return StringRef(); 59247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --Index; 59267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTIdentifierLookupTable *IdTable 59277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 59287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierLookupTable; 59297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Current = IdTable->key_begin(); 59307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei End = IdTable->key_end(); 59317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 59327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We have any identifiers remaining in the current AST file; return 59347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the next one. 5935479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor StringRef Result = *Current; 59367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++Current; 5937479633ced74c887ee9ec5905b3cb0bb1a37349b0Douglas Gregor return Result; 59387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 59397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierIterator *ASTReader::getIdentifiers() const { 59417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return new ASTIdentifierIterator(*this); 59427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 59437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace clang { namespace serialization { 59457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class ReadMethodPoolVisitor { 59467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTReader &Reader; 59477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Selector Sel; 59487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration; 5949cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 5950cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 59517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 59537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 59547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration) 59557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) { } 59567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static bool visit(ModuleFile &M, void *UserData) { 59587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPoolVisitor *This 59597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = static_cast<ReadMethodPoolVisitor *>(UserData); 59607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!M.SelectorLookupTable) 59627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 59637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we've already searched this module file, skip it now. 59657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (M.Generation <= This->PriorGeneration) 59667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 59677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 596895fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++This->Reader.NumMethodPoolTableLookups; 59697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTable *PoolTable 59707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (ASTSelectorLookupTable*)M.SelectorLookupTable; 59717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel); 59727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Pos == PoolTable->end()) 59737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 597495fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 597595fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++This->Reader.NumMethodPoolTableHits; 59767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++This->Reader.NumSelectorsRead; 59777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Not quite happy with the statistics here. We probably should 59787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // disable this tracking when called via LoadSelector. 59797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Also, should entries without methods count as misses? 59807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++This->Reader.NumMethodPoolEntriesRead; 59817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTrait::data_type Data = *Pos; 59827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (This->Reader.DeserializationListener) 59837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Reader.DeserializationListener->SelectorRead(Data.ID, 59847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->Sel); 59857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 59877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 59887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 59897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 59907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Retrieve the instance methods found by this visitor. 59927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 59937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return InstanceMethods; 59947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 59957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 59967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// \brief Retrieve the instance methods found by this visitor. 59977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 59987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return FactoryMethods; 59997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 60017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} } // end namespace clang::serialization 60027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Add the given set of methods to the method list. 60047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 60057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodList &List) { 60067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 60077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei S.addMethodToGlobalList(&List, Methods[I]); 60087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadMethodPool(Selector Sel) { 60127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get the selector generation and update it to the current generation. 60137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Generation = SelectorGeneration[Sel]; 60147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned PriorGeneration = Generation; 60157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Generation = CurrentGeneration; 60167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Search for methods defined with this selector. 601895fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++NumMethodPoolLookups; 60197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 60207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor); 60217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Visitor.getInstanceMethods().empty() && 602395fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor Visitor.getFactoryMethods().empty()) 60247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 602595fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 602695fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor ++NumMethodPoolHits; 602795fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor 60287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getSema()) 60297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 60307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Sema &S = *getSema(); 60327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Sema::GlobalMethodPool::iterator Pos 60337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 60347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 60367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 60377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadKnownNamespaces( 60407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<NamespaceDecl *> &Namespaces) { 60417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Namespaces.clear(); 60427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 60447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NamespaceDecl *Namespace 60457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 60467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Namespaces.push_back(Namespace); 60477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6050cd0655b17249c4c4908ca91462657f62285017e6Nick Lewyckyvoid ASTReader::ReadUndefinedButUsed( 6051995e26b0523ac8e3b6199a509b871b81fa5df6eeNick Lewycky llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) { 6052cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 6053cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 605401a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky SourceLocation Loc = 6055cd0655b17249c4c4908ca91462657f62285017e6Nick Lewycky SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 605601a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky Undefined.insert(std::make_pair(D, Loc)); 605701a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky } 605801a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky} 605901a41140cd8ec9475ed0c33384310fbdd3b6de11Nick Lewycky 60607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadTentativeDefinitions( 60617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<VarDecl *> &TentativeDefs) { 60627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 60637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 60647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Var) 60657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TentativeDefs.push_back(Var); 60667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TentativeDefinitions.clear(); 60687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadUnusedFileScopedDecls( 60717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<const DeclaratorDecl *> &Decls) { 60727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 60737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclaratorDecl *D 60747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 60757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 60767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 60777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnusedFileScopedDecls.clear(); 60797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDelegatingConstructors( 60827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<CXXConstructorDecl *> &Decls) { 60837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 60847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXConstructorDecl *D 60857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 60867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 60877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 60887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DelegatingCtorDecls.clear(); 60907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 60917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 60927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 60937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 60947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypedefNameDecl *D 60957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 60967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 60977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 60987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExtVectorDecls.clear(); 61007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) { 61037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) { 61047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXRecordDecl *D 61057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I])); 61067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 61077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 61087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DynamicClasses.clear(); 61107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 61135ea6ef490547917426d5e2ed14c9f36521bbeacfRichard SmithASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) { 61145ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) { 61155ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith NamedDecl *D 61165ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I])); 61177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D) 61187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.push_back(D); 61197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61205ea6ef490547917426d5e2ed14c9f36521bbeacfRichard Smith LocallyScopedExternCDecls.clear(); 61217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadReferencedSelectors( 61247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 61257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ReferencedSelectorsData.empty()) 61267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 61277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If there are @selector references added them to its pool. This is for 61297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // implementation of -Wselector. 61307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned int DataSize = ReferencedSelectorsData.size()-1; 61317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned I = 0; 61327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (I < DataSize) { 61337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 61347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation SelLoc 61357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 61367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Sels.push_back(std::make_pair(Sel, SelLoc)); 61377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReferencedSelectorsData.clear(); 61397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadWeakUndeclaredIdentifiers( 61427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 61437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (WeakUndeclaredIdentifiers.empty()) 61447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 61457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 61477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *WeakId 61487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 61497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *AliasId 61507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 61517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc 61527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 61537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Used = WeakUndeclaredIdentifiers[I++]; 61547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakInfo WI(AliasId, Loc); 61557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WI.setUsed(Used); 61567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakIDs.push_back(std::make_pair(WeakId, WI)); 61577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei WeakUndeclaredIdentifiers.clear(); 61597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 61627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 61637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ExternalVTableUse VT; 61647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 61657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 61667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VT.DefinitionRequired = VTableUses[Idx++]; 61677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTables.push_back(VT); 61687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei VTableUses.clear(); 61717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadPendingInstantiations( 61747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 61757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 61767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 61777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation Loc 61787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 61797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Pending.push_back(std::make_pair(D, Loc)); 61817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 61827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingInstantiations.clear(); 61837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::LoadSelector(Selector Sel) { 61867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It would be complicated to avoid reading the methods anyway. So don't. 61877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadMethodPool(Sel); 61887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 61917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ID && "Non-zero identifier ID required"); 61927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 61937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifiersLoaded[ID - 1] = II; 61947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 61957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->IdentifierRead(ID, II); 61967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 61977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 61987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Set the globally-visible declarations associated with the given 61997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// identifier. 62007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 62017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// If the AST reader is currently in a state where the given declaration IDs 62027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// cannot safely be resolved, they are queued until it is safe to resolve 62037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// them. 62047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 62057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param II an IdentifierInfo that refers to one or more globally-visible 62067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declarations. 62077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 62087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param DeclIDs the set of declaration IDs with the name @p II that are 62097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// visible at global scope. 62107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 62117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param Nonrecursive should be true to indicate that the caller knows that 62127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// this call is non-recursive, and therefore the globally-visible declarations 62137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// will not be placed onto the pending queue. 62147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 62157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 62167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const SmallVectorImpl<uint32_t> &DeclIDs, 62177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Nonrecursive) { 62187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumCurrentElementsDeserializing && !Nonrecursive) { 62197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingIdentifierInfos.push_back(PendingIdentifierInfo()); 62207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingIdentifierInfo &PII = PendingIdentifierInfos.back(); 62217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PII.II = II; 62227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PII.DeclIDs.append(DeclIDs.begin(), DeclIDs.end()); 62237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 62247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 62277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 62287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SemaObj) { 62297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Introduce this declaration into the translation-unit scope 62307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and add it to the declaration chain for this identifier, so 62317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that (unqualified) name lookup will find it. 62327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SemaObj->pushExternalDeclIntoScope(D, II); 62337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 62347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Queue this declaration so that it will be added to the 62357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // translation unit scope and identifier's declaration chain 62367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // once a Sema object is known. 62377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PreloadedDecls.push_back(D); 62387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 62417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62428222b8951da749d4f086d7b39de5ff0221297509Douglas GregorIdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 62437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 62447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 62457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IdentifiersLoaded.empty()) { 62477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("no identifier table in AST file"); 62487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 62497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID -= 1; 62527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IdentifiersLoaded[ID]) { 62537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 62547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 62557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 62567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - M->BaseIdentifierID; 62577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 62587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // All of the strings in the AST file are preceded by a 16-bit length. 62607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Extract that 16-bit length to avoid having to execute strlen(). 62617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 62627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // unsigned integers. This is important to avoid integer overflow when 62637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // we cast them to 'unsigned'. 62647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 62657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned StrLen = (((unsigned) StrLenPtr[0]) 62667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei | (((unsigned) StrLenPtr[1]) << 8)) - 1; 62678222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor IdentifiersLoaded[ID] 62688222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor = &PP.getIdentifierTable().get(StringRef(Str, StrLen)); 62697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 62707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]); 62717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 62727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return IdentifiersLoaded[ID]; 62747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 62757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62768222b8951da749d4f086d7b39de5ff0221297509Douglas GregorIdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 62778222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 62787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 62797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 62817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_IDENT_IDS) 62827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 62837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 62857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 62867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.IdentifierRemap.end() 62877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into identifier index remap"); 62887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 62907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 62917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6292dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios KyrtzidisMacroInfo *ASTReader::getMacro(MacroID ID, MacroInfo *Hint) { 62937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 62947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 62957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 62967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MacrosLoaded.empty()) { 62977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("no macro table in AST file"); 62987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 62997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ID -= NUM_PREDEF_MACRO_IDS; 63027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!MacrosLoaded[ID]) { 63037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalMacroMapType::iterator I 63047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 63057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 63067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile *M = I->second; 63077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Index = ID - M->BaseMacroID; 6308dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis ReadMacroRecord(*M, M->MacroOffsets[Index], Hint); 63097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return MacrosLoaded[ID]; 63127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiMacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 63157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_MACRO_IDS) 63167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 63177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 63197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 63207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 63217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 63237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::SubmoduleID 63267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 63277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 63287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 63297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 63317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 63327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.SubmoduleRemap.end() 63337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into submodule index remap"); 63347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 63367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiModule *ASTReader::getSubmodule(SubmoduleID GlobalID) { 63397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 63407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(GlobalID == 0 && "Unhandled global submodule ID"); 63417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 63427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (GlobalID > SubmodulesLoaded.size()) { 63457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("submodule ID out of range in AST file"); 63467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 63477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 63507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6351ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 6352ca2ab45341c448284cf93770018c717810575f86Douglas GregorModule *ASTReader::getModule(unsigned ID) { 6353ca2ab45341c448284cf93770018c717810575f86Douglas Gregor return getSubmodule(ID); 6354ca2ab45341c448284cf93770018c717810575f86Douglas Gregor} 6355ca2ab45341c448284cf93770018c717810575f86Douglas Gregor 63567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSelector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 63577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DecodeSelector(getGlobalSelectorID(M, LocalID)); 63587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSelector ASTReader::DecodeSelector(serialization::SelectorID ID) { 63617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID == 0) 63627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Selector(); 63637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ID > SelectorsLoaded.size()) { 63657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Error("selector ID out of range in AST file"); 63667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Selector(); 63677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) { 63707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load this selector from the selector table. 63717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 63727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 63737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &M = *I->second; 63747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTSelectorLookupTrait Trait(*this, M); 63757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 63767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SelectorsLoaded[ID - 1] = 63777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 63787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DeserializationListener) 63797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 63807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 63817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SelectorsLoaded[ID - 1]; 63837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSelector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 63867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DecodeSelector(ID); 63877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiuint32_t ASTReader::GetNumExternalSelectors() { 63907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ID 0 (the null selector) is considered an external selector. 63917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getTotalNumSelectors() + 1; 63927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 63937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::SelectorID 63957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 63967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (LocalID < NUM_PREDEF_SELECTOR_IDS) 63977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID; 63987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 63997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ContinuousRangeMap<uint32_t, int, 2>::iterator I 64007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 64017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(I != M.SelectorRemap.end() 64027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "Invalid index into selector index remap"); 64037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return LocalID + I->second; 64057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 64067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDeclarationName 64087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadDeclarationName(ModuleFile &F, 64097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 64107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 64117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 64127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 64138222b8951da749d4f086d7b39de5ff0221297509Douglas Gregor return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 64147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 64167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 64177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 64187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DeclarationName(ReadSelector(F, Record, Idx)); 64197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 64217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXConstructorName( 64227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getCanonicalType(readType(F, Record, Idx))); 64237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 64257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXDestructorName( 64267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getCanonicalType(readType(F, Record, Idx))); 64277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 64297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXConversionFunctionName( 64307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.getCanonicalType(readType(F, Record, Idx))); 64317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 64337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXOperatorName( 64347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (OverloadedOperatorKind)Record[Idx++]); 64357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 64377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.DeclarationNames.getCXXLiteralOperatorName( 64387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetIdentifierInfo(F, Record, Idx)); 64397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 64417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DeclarationName::getUsingDirectiveName(); 64427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 64437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Invalid NameKind!"); 64457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 64467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 64487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationNameLoc &DNLoc, 64497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name, 64507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 64517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Name.getNameKind()) { 64527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 64537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 64547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 64557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 64567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 64577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: 64597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.CXXOperatorName.BeginOpNameLoc 64607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 64617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.CXXOperatorName.EndOpNameLoc 64627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 64637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 64647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 64667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DNLoc.CXXLiteralOperatorName.OpNameLoc 64677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 64687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 64697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: 64717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 64727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 64737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 64747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 64757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 64767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 64777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 64787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 64807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationNameInfo &NameInfo, 64817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 64827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 64837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 64847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationNameLoc DNLoc; 64857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 64867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NameInfo.setInfo(DNLoc); 64877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 64887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 64897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 64907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 64917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 64927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTPLists = Record[Idx++]; 64937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.NumTemplParamLists = NumTPLists; 64947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumTPLists) { 64957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 64967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i=0; i != NumTPLists; ++i) 64977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 64987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 64997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 65007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateName 65027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 65037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 65047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 65057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 65067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::Template: 65077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 65087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::OverloadedTemplate: { 65107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned size = Record[Idx++]; 65117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnresolvedSet<8> Decls; 65127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (size--) 65137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 65147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 65167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::QualifiedTemplate: { 65197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 65207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool hasTemplKeyword = Record[Idx++]; 65217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 65227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 65237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::DependentTemplate: { 65267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 65277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record[Idx++]) // isIdentifier 65287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentTemplateName(NNS, 65297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei GetIdentifierInfo(F, Record, 65307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx)); 65317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getDependentTemplateName(NNS, 65327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (OverloadedOperatorKind)Record[Idx++]); 65337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParm: { 65367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateTemplateParmDecl *param 65377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 65387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!param) return TemplateName(); 65397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName replacement = ReadTemplateName(F, Record, Idx); 65407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getSubstTemplateTemplateParm(param, replacement); 65417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParmPack: { 65447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateTemplateParmDecl *Param 65457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 65467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Param) 65477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateName(); 65487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 65507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ArgPack.getKind() != TemplateArgument::Pack) 65517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateName(); 65527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 65547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unhandled template name kind!"); 65587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 65597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 65607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateArgument 65617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateArgument(ModuleFile &F, 65627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 65637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 65647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 65657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Null: 65667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(); 65677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Type: 65687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(readType(F, Record, Idx)); 65697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Declaration: { 65707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 65717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool ForReferenceParam = Record[Idx++]; 65727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(D, ForReferenceParam); 65737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::NullPtr: 65757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 65767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Integral: { 65777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APSInt Value = ReadAPSInt(Record, Idx); 65787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = readType(F, Record, Idx); 65797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(Context, Value, T); 65807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Template: 65827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(ReadTemplateName(F, Record, Idx)); 65837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::TemplateExpansion: { 65847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName Name = ReadTemplateName(F, Record, Idx); 65857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::Optional<unsigned> NumTemplateExpansions; 65867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (unsigned NumExpansions = Record[Idx++]) 65877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumTemplateExpansions = NumExpansions - 1; 65887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(Name, NumTemplateExpansions); 65897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Expression: 65917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(ReadExpr(F)); 65927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Pack: { 65937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = Record[Idx++]; 65947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 65957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != NumArgs; ++I) 65967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Args[I] = ReadTemplateArgument(F, Record, Idx); 65977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateArgument(Args, NumArgs); 65987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 65997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 66007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Unhandled template argument kind!"); 66027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 66037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiTemplateParameterList * 66057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadTemplateParameterList(ModuleFile &F, 66067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 66077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 66087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 66097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 66107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumParams = Record[Idx++]; 66127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<NamedDecl *, 16> Params; 66137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Params.reserve(NumParams); 66147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumParams--) 66157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 66167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList* TemplateParams = 66187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 66197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Params.data(), Params.size(), RAngleLoc); 66207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TemplateParams; 66217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 66227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 66247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader:: 66257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiReadTemplateArgumentList(SmallVector<TemplateArgument, 8> &TemplArgs, 66267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ModuleFile &F, const RecordData &Record, 66277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 66287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs = Record[Idx++]; 66297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplArgs.reserve(NumTemplateArgs); 66307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumTemplateArgs--) 66317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx)); 66327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 66337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a UnresolvedSet structure. 66357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadUnresolvedSet(ModuleFile &F, ASTUnresolvedSet &Set, 66367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 66377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumDecls = Record[Idx++]; 66387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Set.reserve(Context, NumDecls); 66397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (NumDecls--) { 66407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *D = ReadDeclAs<NamedDecl>(F, Record, Idx); 66417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 66427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Set.addDecl(Context, D, AS); 66437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 66447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 66457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXXBaseSpecifier 66477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 66487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 66497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isVirtual = static_cast<bool>(Record[Idx++]); 66507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 66517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 66527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool inheritConstructors = static_cast<bool>(Record[Idx++]); 66537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 66547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 66557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 66567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 66577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei EllipsisLoc); 66587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Result.setInheritConstructors(inheritConstructors); 66597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 66607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 66617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::pair<CXXCtorInitializer **, unsigned> 66637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 66647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 66657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXCtorInitializer **CtorInitializers = 0; 66667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumInitializers = Record[Idx++]; 66677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumInitializers) { 66687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CtorInitializers 66697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = new (Context) CXXCtorInitializer*[NumInitializers]; 66707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i=0; i != NumInitializers; ++i) { 66717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeSourceInfo *TInfo = 0; 66727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsBaseVirtual = false; 66737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FieldDecl *Member = 0; 66747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IndirectFieldDecl *IndirectMember = 0; 66757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 66777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Type) { 66787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_BASE: 66797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TInfo = GetTypeSourceInfo(F, Record, Idx); 66807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsBaseVirtual = Record[Idx++]; 66817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 66827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_DELEGATING: 66847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TInfo = GetTypeSourceInfo(F, Record, Idx); 66857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 66867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_MEMBER: 66887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 66897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 66907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case CTOR_INITIALIZER_INDIRECT_MEMBER: 66927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 66937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 66947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 66957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 66967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 66977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Expr *Init = ReadExpr(F); 66987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 66997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 67007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsWritten = Record[Idx++]; 67017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned SourceOrderOrNumArrayIndices; 67027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallVector<VarDecl *, 8> Indices; 67037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsWritten) { 67047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceOrderOrNumArrayIndices = Record[Idx++]; 67057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 67067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceOrderOrNumArrayIndices = Record[Idx++]; 67077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Indices.reserve(SourceOrderOrNumArrayIndices); 67087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 67097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 67107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXCtorInitializer *BOMInit; 67137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Type == CTOR_INITIALIZER_BASE) { 67147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual, 67157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LParenLoc, Init, RParenLoc, 67167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MemberOrEllipsisLoc); 67177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (Type == CTOR_INITIALIZER_DELEGATING) { 67187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc, 67197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Init, RParenLoc); 67207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (IsWritten) { 67217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Member) 67227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, 67237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LParenLoc, Init, RParenLoc); 67247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 67257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 67267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MemberOrEllipsisLoc, LParenLoc, 67277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Init, RParenLoc); 67287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 67297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc, 67307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LParenLoc, Init, RParenLoc, 67317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Indices.data(), Indices.size()); 67327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IsWritten) 67357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 67367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CtorInitializers[i] = BOMInit; 67377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return std::make_pair(CtorInitializers, NumInitializers); 67417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 67427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiNestedNameSpecifier * 67447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadNestedNameSpecifier(ModuleFile &F, 67457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, unsigned &Idx) { 67467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = Record[Idx++]; 67477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *NNS = 0, *Prev = 0; 67487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != N; ++I) { 67497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier::SpecifierKind Kind 67507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 67517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 67527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Identifier: { 67537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 67547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, II); 67557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 67567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Namespace: { 67597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 67607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, NS); 67617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 67627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::NamespaceAlias: { 67657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 67667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 67677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 67687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpec: 67717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpecWithTemplate: { 67727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 67737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!T) 67747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return 0; 67757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Template = Record[Idx++]; 67777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 67787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 67797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Global: { 67827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NNS = NestedNameSpecifier::GlobalSpecifier(Context); 67837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No associated value, and there can't be a prefix. 67847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 67857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Prev = NNS; 67887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 67897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NNS; 67907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 67917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 67927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiNestedNameSpecifierLoc 67937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 67947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 67957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = Record[Idx++]; 67967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifierLocBuilder Builder; 67977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != N; ++I) { 67987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier::SpecifierKind Kind 67997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 68007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Kind) { 68017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Identifier: { 68027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 68037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 68047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 68057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 68067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Namespace: { 68097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 68107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 68117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 68127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 68137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::NamespaceAlias: { 68167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 68177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange Range = ReadSourceRange(F, Record, Idx); 68187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 68197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 68207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpec: 68237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpecWithTemplate: { 68247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool Template = Record[Idx++]; 68257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 68267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!T) 68277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NestedNameSpecifierLoc(); 68287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 68297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: 'template' keyword location not saved anywhere, so we fake it. 68317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.Extend(Context, 68327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 68337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T->getTypeLoc(), ColonColonLoc); 68347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 68357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Global: { 68387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 68397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Builder.MakeGlobal(Context, ColonColonLoc); 68407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 68417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 68447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Builder.getWithLocInContext(Context); 68467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSourceRange 68497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 68507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 68517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation beg = ReadSourceLocation(F, Record, Idx); 68527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceLocation end = ReadSourceLocation(F, Record, Idx); 68537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SourceRange(beg, end); 68547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read an integral value 68577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 68587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BitWidth = Record[Idx++]; 68597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 68607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 68617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += NumWords; 68627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 68637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a signed integral value 68667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeillvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 68677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isUnsigned = Record[Idx++]; 68687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 68697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Read a floating-point value 68729ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northoverllvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 68739ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northover const llvm::fltSemantics &Sem, 68749ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northover unsigned &Idx) { 68759ec55f24b8f848bb37a9971100cf2fca379d5572Tim Northover return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 68767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// \brief Read a string 68797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistd::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 68807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Len = Record[Idx++]; 68817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 68827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Idx += Len; 68837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Result; 68847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiVersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 68877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 68887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Major = Record[Idx++]; 68897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Minor = Record[Idx++]; 68907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Subminor = Record[Idx++]; 68917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Minor == 0) 68927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionTuple(Major); 68937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Subminor == 0) 68947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionTuple(Major, Minor - 1); 68957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return VersionTuple(Major, Minor - 1, Subminor - 1); 68967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 68977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 68987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 68997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordData &Record, 69007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &Idx) { 69017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 69027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return CXXTemporary::Create(Context, Decl); 69037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 69067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Diag(SourceLocation(), DiagID); 69077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiDiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 69107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Diags.Report(Loc, DiagID); 69117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieve the identifier table associated with the 69147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// preprocessor. 69157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiIdentifierTable &ASTReader::getIdentifierTable() { 69167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return PP.getIdentifierTable(); 69177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Record that the given ID maps to the given switch-case 69207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// statement. 69217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 69227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert((*CurrSwitchCaseStmts)[ID] == 0 && 69237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Already have a SwitchCase with this ID"); 69247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (*CurrSwitchCaseStmts)[ID] = SC; 69257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieve the switch-case statement with the given ID. 69287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiSwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 69297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID"); 69307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return (*CurrSwitchCaseStmts)[ID]; 69317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ClearSwitchCaseIDs() { 69347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrSwitchCaseStmts->clear(); 69357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::ReadComments() { 69387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei std::vector<RawComment *> Comments; 69398f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner for (SmallVectorImpl<std::pair<BitstreamCursor, 69407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei serialization::ModuleFile *> >::iterator 69417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = CommentsCursors.begin(), 69427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = CommentsCursors.end(); 69437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 69448f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner BitstreamCursor &Cursor = I->first; 69457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei serialization::ModuleFile &F = *I->second; 69467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SavedStreamPosition SavedPosition(Cursor); 69477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RecordData Record; 69497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (true) { 69508f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner llvm::BitstreamEntry Entry = 69518f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 69528f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner 69538f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner switch (Entry.Kind) { 69548f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::SubBlock: // Handled for us already. 69558f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Error: 69568f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner Error("malformed block record in AST file"); 69578f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner return; 69588f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::EndBlock: 69598f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner goto NextCursor; 69608f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner case llvm::BitstreamEntry::Record: 69618f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner // The interesting case. 69627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 69637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Read a record. 69667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Record.clear(); 6967b3ce35764adcc5749e8729709b1f3737227d90ecChris Lattner switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 69687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case COMMENTS_RAW_COMMENT: { 69697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Idx = 0; 69707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceRange SR = ReadSourceRange(F, Record, Idx); 69717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RawComment::CommentKind Kind = 69727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (RawComment::CommentKind) Record[Idx++]; 69737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsTrailingComment = Record[Idx++]; 69747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool IsAlmostTrailingComment = Record[Idx++]; 69757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Comments.push_back(new (Context) RawComment(SR, Kind, 69767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsTrailingComment, 69777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei IsAlmostTrailingComment)); 69787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 69797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69828f9a1eb6dd35737c6b3ff63a19c6c1a07c06111eChris Lattner NextCursor:; 69837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.Comments.addCommentsToFront(Comments); 69857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 69867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::finishPendingActions() { 69887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty() || 69897640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty()) { 69907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If any identifiers with corresponding top-level declarations have 69917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // been loaded, load those declarations now. 69927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!PendingIdentifierInfos.empty()) { 69937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SetGloballyVisibleDecls(PendingIdentifierInfos.front().II, 69947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingIdentifierInfos.front().DeclIDs, true); 69957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingIdentifierInfos.pop_front(); 69967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 69977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 69987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load pending declaration chains. 69997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != PendingDeclChains.size(); ++I) { 70007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei loadPendingDeclChain(PendingDeclChains[I]); 70017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingDeclChainsKnown.erase(PendingDeclChains[I]); 70027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingDeclChains.clear(); 70047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load any pending macro definitions. 70067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 7007dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis // FIXME: std::move here 7008dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second; 7009dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis MacroInfo *Hint = 0; 7010dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 7011dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis ++IDIdx) { 7012dc1088f6201c3fb8f3f97f54c343f7d163fbec06Argyrios Kyrtzidis Hint = getMacro(GlobalIDs[IDIdx], Hint); 70137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingMacroIDs.clear(); 70167640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis 70177640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis // Wire up the DeclContexts for Decls that we delayed setting until 70187640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis // recursive loading is completed. 70197640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis while (!PendingDeclContextInfos.empty()) { 70207640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 70217640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis PendingDeclContextInfos.pop_front(); 70227640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 70237640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 70247640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 70257640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis } 70267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we deserialized any C++ or Objective-C class definitions, any 70297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Objective-C protocol definitions, or any redeclarable templates, make sure 70307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // that all redeclarations point to the definitions. Note that this can only 70317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // happen now, after the redeclaration chains have been fully wired. 70327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(), 70337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DEnd = PendingDefinitions.end(); 70347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei D != DEnd; ++D) { 70357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TagDecl *TD = dyn_cast<TagDecl>(*D)) { 70367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TagType *TagT = dyn_cast<TagType>(TD->TypeForDecl)) { 70377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Make sure that the TagType points at the definition. 70387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<TagType*>(TagT)->decl = TD; 70397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(*D)) { 70427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXRecordDecl::redecl_iterator R = RD->redecls_begin(), 70437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei REnd = RD->redecls_end(); 70447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R != REnd; ++R) 70457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<CXXRecordDecl>(*R)->DefinitionData = RD->DefinitionData; 70467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 70507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(*D)) { 70537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Make sure that the ObjCInterfaceType points at the definition. 70547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 70557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->Decl = ID; 70567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCInterfaceDecl::redecl_iterator R = ID->redecls_begin(), 70587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei REnd = ID->redecls_end(); 70597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R != REnd; ++R) 70607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R->Data = ID->Data; 70617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 70637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(*D)) { 70667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (ObjCProtocolDecl::redecl_iterator R = PD->redecls_begin(), 70677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei REnd = PD->redecls_end(); 70687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R != REnd; ++R) 70697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R->Data = PD->Data; 70707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 70727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei RedeclarableTemplateDecl *RTD 70757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl(); 70767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (RedeclarableTemplateDecl::redecl_iterator R = RTD->redecls_begin(), 70777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei REnd = RTD->redecls_end(); 70787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R != REnd; ++R) 70797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R->Common = RTD->Common; 70807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingDefinitions.clear(); 70827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Load the bodies of any functions or methods we've encountered. We do 70847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this now (delayed) so that we can be sure that the declaration chains 70857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // have been fully wired up. 70867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 70877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PBEnd = PendingBodies.end(); 70887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PB != PBEnd; ++PB) { 70897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 70907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Check for =delete/=default? 70917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: Complain about ODR violations here? 70927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getContext().getLangOpts().Modules || !FD->hasBody()) 70937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD->setLazyBody(PB->second); 70947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei continue; 70957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 70967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 70977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 70987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getContext().getLangOpts().Modules || !MD->hasBody()) 70997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MD->setLazyBody(PB->second); 71007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PendingBodies.clear(); 71027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid ASTReader::FinishedDeserializing() { 71057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(NumCurrentElementsDeserializing && 71067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "FinishedDeserializing not paired with StartedDeserializing"); 71077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumCurrentElementsDeserializing == 1) { 71087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We decrease NumCurrentElementsDeserializing only after pending actions 71097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // are finished, to avoid recursively re-calling finishPendingActions(). 71107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei finishPendingActions(); 71117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei --NumCurrentElementsDeserializing; 71137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NumCurrentElementsDeserializing == 0 && 71157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Consumer && !PassingDeclsToConsumer) { 71167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Guard variable to avoid recursively redoing the process of passing 71177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // decls to consumer. 71187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 71197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei true); 71207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!InterestingDecls.empty()) { 71227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We are not in recursive loading, so it's safe to pass the "interesting" 71237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // decls to the consumer. 71247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Decl *D = InterestingDecls.front(); 71257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei InterestingDecls.pop_front(); 71267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassInterestingDeclToConsumer(D); 71277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, 71327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef isysroot, bool DisableValidation, 7133f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor bool AllowASTWithCompilerErrors, bool UseGlobalIndex) 71347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Listener(new PCHValidator(PP, *this)), DeserializationListener(0), 71357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 71367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags(PP.getDiagnostics()), SemaObj(0), PP(PP), Context(Context), 71377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Consumer(0), ModuleMgr(PP.getFileManager()), 71387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isysroot(isysroot), DisableValidation(DisableValidation), 7139e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 7140f575d6e7c3b887ea4c5394d2c7e322c7a929a57eDouglas Gregor UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 71417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts), 71427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumSLocEntriesRead(0), TotalNumSLocEntries(0), 7143e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0), 7144e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor TotalNumMacros(0), NumIdentifierLookups(0), NumIdentifierLookupHits(0), 7145e169807aaea2464cbe68305f013ec7b41625af30Douglas Gregor NumSelectorsRead(0), NumMethodPoolEntriesRead(0), 714695fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor NumMethodPoolLookups(0), NumMethodPoolHits(0), 714795fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor NumMethodPoolTableLookups(0), NumMethodPoolTableHits(0), 714895fb36ebddcbdcd6b801c5d3d2d85dac315b4127Douglas Gregor TotalNumMethodPoolEntries(0), 71497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 71507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 71517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 71527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PassingDeclsToConsumer(false), 71537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NumCXXBaseSpecifiersLoaded(0) 71547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei{ 71557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SourceMgr.setExternalSLocEntrySource(this); 71567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 71577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 71587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTReader::~ASTReader() { 71597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (DeclContextVisibleUpdatesPending::iterator 71607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I = PendingVisibleUpdates.begin(), 71617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = PendingVisibleUpdates.end(); 71627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) { 71637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (DeclContextVisibleUpdates::iterator J = I->second.begin(), 71647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei F = I->second.end(); 71657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei J != F; ++J) 71667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei delete J->first; 71677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 71687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7169