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