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