ASTReader.cpp revision 906d66acc5cf2679453e10a4f0a67feedd765b21
1//===--- ASTReader.cpp - AST File Reader ----------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file defines the ASTReader class, which reads AST files.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Serialization/ASTReader.h"
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
17#include "clang/AST/ASTConsumer.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/DeclTemplate.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExprCXX.h"
22#include "clang/AST/NestedNameSpecifier.h"
23#include "clang/AST/Type.h"
24#include "clang/AST/TypeLocVisitor.h"
25#include "clang/Basic/FileManager.h"
26#include "clang/Basic/SourceManager.h"
27#include "clang/Basic/SourceManagerInternals.h"
28#include "clang/Basic/TargetInfo.h"
29#include "clang/Basic/TargetOptions.h"
30#include "clang/Basic/Version.h"
31#include "clang/Basic/VersionTuple.h"
32#include "clang/Lex/HeaderSearch.h"
33#include "clang/Lex/HeaderSearchOptions.h"
34#include "clang/Lex/MacroInfo.h"
35#include "clang/Lex/PreprocessingRecord.h"
36#include "clang/Lex/Preprocessor.h"
37#include "clang/Lex/PreprocessorOptions.h"
38#include "clang/Sema/Scope.h"
39#include "clang/Sema/Sema.h"
40#include "clang/Serialization/ASTDeserializationListener.h"
41#include "clang/Serialization/GlobalModuleIndex.h"
42#include "clang/Serialization/ModuleManager.h"
43#include "clang/Serialization/SerializationDiagnostic.h"
44#include "llvm/ADT/Hashing.h"
45#include "llvm/ADT/StringExtras.h"
46#include "llvm/Bitcode/BitstreamReader.h"
47#include "llvm/Support/ErrorHandling.h"
48#include "llvm/Support/FileSystem.h"
49#include "llvm/Support/MemoryBuffer.h"
50#include "llvm/Support/Path.h"
51#include "llvm/Support/SaveAndRestore.h"
52#include "llvm/Support/system_error.h"
53#include <algorithm>
54#include <cstdio>
55#include <iterator>
56
57using namespace clang;
58using namespace clang::serialization;
59using namespace clang::serialization::reader;
60using llvm::BitstreamCursor;
61
62//===----------------------------------------------------------------------===//
63// PCH validator implementation
64//===----------------------------------------------------------------------===//
65
66ASTReaderListener::~ASTReaderListener() {}
67
68/// \brief Compare the given set of language options against an existing set of
69/// language options.
70///
71/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
72///
73/// \returns true if the languagae options mis-match, false otherwise.
74static bool checkLanguageOptions(const LangOptions &LangOpts,
75                                 const LangOptions &ExistingLangOpts,
76                                 DiagnosticsEngine *Diags) {
77#define LANGOPT(Name, Bits, Default, Description)                 \
78  if (ExistingLangOpts.Name != LangOpts.Name) {                   \
79    if (Diags)                                                    \
80      Diags->Report(diag::err_pch_langopt_mismatch)               \
81        << Description << LangOpts.Name << ExistingLangOpts.Name; \
82    return true;                                                  \
83  }
84
85#define VALUE_LANGOPT(Name, Bits, Default, Description)   \
86  if (ExistingLangOpts.Name != LangOpts.Name) {           \
87    if (Diags)                                            \
88      Diags->Report(diag::err_pch_langopt_value_mismatch) \
89        << Description;                                   \
90    return true;                                          \
91  }
92
93#define ENUM_LANGOPT(Name, Type, Bits, Default, Description)   \
94  if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) {  \
95    if (Diags)                                                 \
96      Diags->Report(diag::err_pch_langopt_value_mismatch)      \
97        << Description;                                        \
98    return true;                                               \
99  }
100
101#define BENIGN_LANGOPT(Name, Bits, Default, Description)
102#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
103#include "clang/Basic/LangOptions.def"
104
105  if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
106    if (Diags)
107      Diags->Report(diag::err_pch_langopt_value_mismatch)
108      << "target Objective-C runtime";
109    return true;
110  }
111
112  if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
113      LangOpts.CommentOpts.BlockCommandNames) {
114    if (Diags)
115      Diags->Report(diag::err_pch_langopt_value_mismatch)
116        << "block command names";
117    return true;
118  }
119
120  return false;
121}
122
123/// \brief Compare the given set of target options against an existing set of
124/// target options.
125///
126/// \param Diags If non-NULL, diagnostics will be emitted via this engine.
127///
128/// \returns true if the target options mis-match, false otherwise.
129static bool checkTargetOptions(const TargetOptions &TargetOpts,
130                               const TargetOptions &ExistingTargetOpts,
131                               DiagnosticsEngine *Diags) {
132#define CHECK_TARGET_OPT(Field, Name)                             \
133  if (TargetOpts.Field != ExistingTargetOpts.Field) {             \
134    if (Diags)                                                    \
135      Diags->Report(diag::err_pch_targetopt_mismatch)             \
136        << Name << TargetOpts.Field << ExistingTargetOpts.Field;  \
137    return true;                                                  \
138  }
139
140  CHECK_TARGET_OPT(Triple, "target");
141  CHECK_TARGET_OPT(CPU, "target CPU");
142  CHECK_TARGET_OPT(ABI, "target ABI");
143  CHECK_TARGET_OPT(CXXABI, "target C++ ABI");
144  CHECK_TARGET_OPT(LinkerVersion, "target linker version");
145#undef CHECK_TARGET_OPT
146
147  // Compare feature sets.
148  SmallVector<StringRef, 4> ExistingFeatures(
149                                             ExistingTargetOpts.FeaturesAsWritten.begin(),
150                                             ExistingTargetOpts.FeaturesAsWritten.end());
151  SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
152                                         TargetOpts.FeaturesAsWritten.end());
153  std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
154  std::sort(ReadFeatures.begin(), ReadFeatures.end());
155
156  unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
157  unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
158  while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
159    if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
160      ++ExistingIdx;
161      ++ReadIdx;
162      continue;
163    }
164
165    if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
166      if (Diags)
167        Diags->Report(diag::err_pch_targetopt_feature_mismatch)
168          << false << ReadFeatures[ReadIdx];
169      return true;
170    }
171
172    if (Diags)
173      Diags->Report(diag::err_pch_targetopt_feature_mismatch)
174        << true << ExistingFeatures[ExistingIdx];
175    return true;
176  }
177
178  if (ExistingIdx < ExistingN) {
179    if (Diags)
180      Diags->Report(diag::err_pch_targetopt_feature_mismatch)
181        << true << ExistingFeatures[ExistingIdx];
182    return true;
183  }
184
185  if (ReadIdx < ReadN) {
186    if (Diags)
187      Diags->Report(diag::err_pch_targetopt_feature_mismatch)
188        << false << ReadFeatures[ReadIdx];
189    return true;
190  }
191
192  return false;
193}
194
195bool
196PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
197                                  bool Complain) {
198  const LangOptions &ExistingLangOpts = PP.getLangOpts();
199  return checkLanguageOptions(LangOpts, ExistingLangOpts,
200                              Complain? &Reader.Diags : 0);
201}
202
203bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
204                                     bool Complain) {
205  const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
206  return checkTargetOptions(TargetOpts, ExistingTargetOpts,
207                            Complain? &Reader.Diags : 0);
208}
209
210namespace {
211  typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
212    MacroDefinitionsMap;
213}
214
215/// \brief Collect the macro definitions provided by the given preprocessor
216/// options.
217static void collectMacroDefinitions(const PreprocessorOptions &PPOpts,
218                                    MacroDefinitionsMap &Macros,
219                                    SmallVectorImpl<StringRef> *MacroNames = 0){
220  for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
221    StringRef Macro = PPOpts.Macros[I].first;
222    bool IsUndef = PPOpts.Macros[I].second;
223
224    std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
225    StringRef MacroName = MacroPair.first;
226    StringRef MacroBody = MacroPair.second;
227
228    // For an #undef'd macro, we only care about the name.
229    if (IsUndef) {
230      if (MacroNames && !Macros.count(MacroName))
231        MacroNames->push_back(MacroName);
232
233      Macros[MacroName] = std::make_pair("", true);
234      continue;
235    }
236
237    // For a #define'd macro, figure out the actual definition.
238    if (MacroName.size() == Macro.size())
239      MacroBody = "1";
240    else {
241      // Note: GCC drops anything following an end-of-line character.
242      StringRef::size_type End = MacroBody.find_first_of("\n\r");
243      MacroBody = MacroBody.substr(0, End);
244    }
245
246    if (MacroNames && !Macros.count(MacroName))
247      MacroNames->push_back(MacroName);
248    Macros[MacroName] = std::make_pair(MacroBody, false);
249  }
250}
251
252/// \brief Check the preprocessor options deserialized from the control block
253/// against the preprocessor options in an existing preprocessor.
254///
255/// \param Diags If non-null, produce diagnostics for any mismatches incurred.
256static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
257                                     const PreprocessorOptions &ExistingPPOpts,
258                                     DiagnosticsEngine *Diags,
259                                     FileManager &FileMgr,
260                                     std::string &SuggestedPredefines) {
261  // Check macro definitions.
262  MacroDefinitionsMap ASTFileMacros;
263  collectMacroDefinitions(PPOpts, ASTFileMacros);
264  MacroDefinitionsMap ExistingMacros;
265  SmallVector<StringRef, 4> ExistingMacroNames;
266  collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
267
268  for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
269    // Dig out the macro definition in the existing preprocessor options.
270    StringRef MacroName = ExistingMacroNames[I];
271    std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
272
273    // Check whether we know anything about this macro name or not.
274    llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
275      = ASTFileMacros.find(MacroName);
276    if (Known == ASTFileMacros.end()) {
277      // FIXME: Check whether this identifier was referenced anywhere in the
278      // AST file. If so, we should reject the AST file. Unfortunately, this
279      // information isn't in the control block. What shall we do about it?
280
281      if (Existing.second) {
282        SuggestedPredefines += "#undef ";
283        SuggestedPredefines += MacroName.str();
284        SuggestedPredefines += '\n';
285      } else {
286        SuggestedPredefines += "#define ";
287        SuggestedPredefines += MacroName.str();
288        SuggestedPredefines += ' ';
289        SuggestedPredefines += Existing.first.str();
290        SuggestedPredefines += '\n';
291      }
292      continue;
293    }
294
295    // If the macro was defined in one but undef'd in the other, we have a
296    // conflict.
297    if (Existing.second != Known->second.second) {
298      if (Diags) {
299        Diags->Report(diag::err_pch_macro_def_undef)
300          << MacroName << Known->second.second;
301      }
302      return true;
303    }
304
305    // If the macro was #undef'd in both, or if the macro bodies are identical,
306    // it's fine.
307    if (Existing.second || Existing.first == Known->second.first)
308      continue;
309
310    // The macro bodies differ; complain.
311    if (Diags) {
312      Diags->Report(diag::err_pch_macro_def_conflict)
313        << MacroName << Known->second.first << Existing.first;
314    }
315    return true;
316  }
317
318  // Check whether we're using predefines.
319  if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
320    if (Diags) {
321      Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
322    }
323    return true;
324  }
325
326  // Compute the #include and #include_macros lines we need.
327  for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
328    StringRef File = ExistingPPOpts.Includes[I];
329    if (File == ExistingPPOpts.ImplicitPCHInclude)
330      continue;
331
332    if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
333          != PPOpts.Includes.end())
334      continue;
335
336    SuggestedPredefines += "#include \"";
337    SuggestedPredefines +=
338      HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
339    SuggestedPredefines += "\"\n";
340  }
341
342  for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
343    StringRef File = ExistingPPOpts.MacroIncludes[I];
344    if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
345                  File)
346        != PPOpts.MacroIncludes.end())
347      continue;
348
349    SuggestedPredefines += "#__include_macros \"";
350    SuggestedPredefines +=
351      HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
352    SuggestedPredefines += "\"\n##\n";
353  }
354
355  return false;
356}
357
358bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
359                                           bool Complain,
360                                           std::string &SuggestedPredefines) {
361  const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
362
363  return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
364                                  Complain? &Reader.Diags : 0,
365                                  PP.getFileManager(),
366                                  SuggestedPredefines);
367}
368
369void PCHValidator::ReadHeaderFileInfo(const HeaderFileInfo &HFI,
370                                      unsigned ID) {
371  PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, ID);
372  ++NumHeaderInfos;
373}
374
375void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
376  PP.setCounterValue(Value);
377}
378
379//===----------------------------------------------------------------------===//
380// AST reader implementation
381//===----------------------------------------------------------------------===//
382
383void
384ASTReader::setDeserializationListener(ASTDeserializationListener *Listener) {
385  DeserializationListener = Listener;
386}
387
388
389
390unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
391  return serialization::ComputeHash(Sel);
392}
393
394
395std::pair<unsigned, unsigned>
396ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
397  using namespace clang::io;
398  unsigned KeyLen = ReadUnalignedLE16(d);
399  unsigned DataLen = ReadUnalignedLE16(d);
400  return std::make_pair(KeyLen, DataLen);
401}
402
403ASTSelectorLookupTrait::internal_key_type
404ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
405  using namespace clang::io;
406  SelectorTable &SelTable = Reader.getContext().Selectors;
407  unsigned N = ReadUnalignedLE16(d);
408  IdentifierInfo *FirstII
409    = Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
410  if (N == 0)
411    return SelTable.getNullarySelector(FirstII);
412  else if (N == 1)
413    return SelTable.getUnarySelector(FirstII);
414
415  SmallVector<IdentifierInfo *, 16> Args;
416  Args.push_back(FirstII);
417  for (unsigned I = 1; I != N; ++I)
418    Args.push_back(Reader.getLocalIdentifier(F, ReadUnalignedLE32(d)));
419
420  return SelTable.getSelector(N, Args.data());
421}
422
423ASTSelectorLookupTrait::data_type
424ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
425                                 unsigned DataLen) {
426  using namespace clang::io;
427
428  data_type Result;
429
430  Result.ID = Reader.getGlobalSelectorID(F, ReadUnalignedLE32(d));
431  unsigned NumInstanceMethods = ReadUnalignedLE16(d);
432  unsigned NumFactoryMethods = ReadUnalignedLE16(d);
433
434  // Load instance methods
435  for (unsigned I = 0; I != NumInstanceMethods; ++I) {
436    if (ObjCMethodDecl *Method
437          = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d)))
438      Result.Instance.push_back(Method);
439  }
440
441  // Load factory methods
442  for (unsigned I = 0; I != NumFactoryMethods; ++I) {
443    if (ObjCMethodDecl *Method
444          = Reader.GetLocalDeclAs<ObjCMethodDecl>(F, ReadUnalignedLE32(d)))
445      Result.Factory.push_back(Method);
446  }
447
448  return Result;
449}
450
451unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
452  return llvm::HashString(a);
453}
454
455std::pair<unsigned, unsigned>
456ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
457  using namespace clang::io;
458  unsigned DataLen = ReadUnalignedLE16(d);
459  unsigned KeyLen = ReadUnalignedLE16(d);
460  return std::make_pair(KeyLen, DataLen);
461}
462
463ASTIdentifierLookupTraitBase::internal_key_type
464ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
465  assert(n >= 2 && d[n-1] == '\0');
466  return StringRef((const char*) d, n-1);
467}
468
469/// \brief Whether the given identifier is "interesting".
470static bool isInterestingIdentifier(IdentifierInfo &II) {
471  return II.isPoisoned() ||
472         II.isExtensionToken() ||
473         II.getObjCOrBuiltinID() ||
474         II.hasRevertedTokenIDToIdentifier() ||
475         II.hadMacroDefinition() ||
476         II.getFETokenInfo<void>();
477}
478
479IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
480                                                   const unsigned char* d,
481                                                   unsigned DataLen) {
482  using namespace clang::io;
483  unsigned RawID = ReadUnalignedLE32(d);
484  bool IsInteresting = RawID & 0x01;
485
486  // Wipe out the "is interesting" bit.
487  RawID = RawID >> 1;
488
489  IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
490  if (!IsInteresting) {
491    // For uninteresting identifiers, just build the IdentifierInfo
492    // and associate it with the persistent ID.
493    IdentifierInfo *II = KnownII;
494    if (!II) {
495      II = &Reader.getIdentifierTable().getOwn(k);
496      KnownII = II;
497    }
498    Reader.SetIdentifierInfo(ID, II);
499    if (!II->isFromAST()) {
500      bool WasInteresting = isInterestingIdentifier(*II);
501      II->setIsFromAST();
502      if (WasInteresting)
503        II->setChangedSinceDeserialization();
504    }
505    Reader.markIdentifierUpToDate(II);
506    return II;
507  }
508
509  unsigned ObjCOrBuiltinID = ReadUnalignedLE16(d);
510  unsigned Bits = ReadUnalignedLE16(d);
511  bool CPlusPlusOperatorKeyword = Bits & 0x01;
512  Bits >>= 1;
513  bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
514  Bits >>= 1;
515  bool Poisoned = Bits & 0x01;
516  Bits >>= 1;
517  bool ExtensionToken = Bits & 0x01;
518  Bits >>= 1;
519  bool hadMacroDefinition = Bits & 0x01;
520  Bits >>= 1;
521
522  assert(Bits == 0 && "Extra bits in the identifier?");
523  DataLen -= 8;
524
525  // Build the IdentifierInfo itself and link the identifier ID with
526  // the new IdentifierInfo.
527  IdentifierInfo *II = KnownII;
528  if (!II) {
529    II = &Reader.getIdentifierTable().getOwn(StringRef(k));
530    KnownII = II;
531  }
532  Reader.markIdentifierUpToDate(II);
533  if (!II->isFromAST()) {
534    bool WasInteresting = isInterestingIdentifier(*II);
535    II->setIsFromAST();
536    if (WasInteresting)
537      II->setChangedSinceDeserialization();
538  }
539
540  // Set or check the various bits in the IdentifierInfo structure.
541  // Token IDs are read-only.
542  if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
543    II->RevertTokenIDToIdentifier();
544  II->setObjCOrBuiltinID(ObjCOrBuiltinID);
545  assert(II->isExtensionToken() == ExtensionToken &&
546         "Incorrect extension token flag");
547  (void)ExtensionToken;
548  if (Poisoned)
549    II->setIsPoisoned(true);
550  assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
551         "Incorrect C++ operator keyword flag");
552  (void)CPlusPlusOperatorKeyword;
553
554  // If this identifier is a macro, deserialize the macro
555  // definition.
556  if (hadMacroDefinition) {
557    SmallVector<MacroID, 4> MacroIDs;
558    while (uint32_t LocalID = ReadUnalignedLE32(d)) {
559      MacroIDs.push_back(Reader.getGlobalMacroID(F, LocalID));
560      DataLen -= 4;
561    }
562    DataLen -= 4;
563    Reader.setIdentifierIsMacro(II, MacroIDs);
564  }
565
566  Reader.SetIdentifierInfo(ID, II);
567
568  // Read all of the declarations visible at global scope with this
569  // name.
570  if (DataLen > 0) {
571    SmallVector<uint32_t, 4> DeclIDs;
572    for (; DataLen > 0; DataLen -= 4)
573      DeclIDs.push_back(Reader.getGlobalDeclID(F, ReadUnalignedLE32(d)));
574    Reader.SetGloballyVisibleDecls(II, DeclIDs);
575  }
576
577  return II;
578}
579
580unsigned
581ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
582  llvm::FoldingSetNodeID ID;
583  ID.AddInteger(Key.Kind);
584
585  switch (Key.Kind) {
586  case DeclarationName::Identifier:
587  case DeclarationName::CXXLiteralOperatorName:
588    ID.AddString(((IdentifierInfo*)Key.Data)->getName());
589    break;
590  case DeclarationName::ObjCZeroArgSelector:
591  case DeclarationName::ObjCOneArgSelector:
592  case DeclarationName::ObjCMultiArgSelector:
593    ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
594    break;
595  case DeclarationName::CXXOperatorName:
596    ID.AddInteger((OverloadedOperatorKind)Key.Data);
597    break;
598  case DeclarationName::CXXConstructorName:
599  case DeclarationName::CXXDestructorName:
600  case DeclarationName::CXXConversionFunctionName:
601  case DeclarationName::CXXUsingDirective:
602    break;
603  }
604
605  return ID.ComputeHash();
606}
607
608ASTDeclContextNameLookupTrait::internal_key_type
609ASTDeclContextNameLookupTrait::GetInternalKey(
610                                          const external_key_type& Name) const {
611  DeclNameKey Key;
612  Key.Kind = Name.getNameKind();
613  switch (Name.getNameKind()) {
614  case DeclarationName::Identifier:
615    Key.Data = (uint64_t)Name.getAsIdentifierInfo();
616    break;
617  case DeclarationName::ObjCZeroArgSelector:
618  case DeclarationName::ObjCOneArgSelector:
619  case DeclarationName::ObjCMultiArgSelector:
620    Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
621    break;
622  case DeclarationName::CXXOperatorName:
623    Key.Data = Name.getCXXOverloadedOperator();
624    break;
625  case DeclarationName::CXXLiteralOperatorName:
626    Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
627    break;
628  case DeclarationName::CXXConstructorName:
629  case DeclarationName::CXXDestructorName:
630  case DeclarationName::CXXConversionFunctionName:
631  case DeclarationName::CXXUsingDirective:
632    Key.Data = 0;
633    break;
634  }
635
636  return Key;
637}
638
639std::pair<unsigned, unsigned>
640ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
641  using namespace clang::io;
642  unsigned KeyLen = ReadUnalignedLE16(d);
643  unsigned DataLen = ReadUnalignedLE16(d);
644  return std::make_pair(KeyLen, DataLen);
645}
646
647ASTDeclContextNameLookupTrait::internal_key_type
648ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
649  using namespace clang::io;
650
651  DeclNameKey Key;
652  Key.Kind = (DeclarationName::NameKind)*d++;
653  switch (Key.Kind) {
654  case DeclarationName::Identifier:
655    Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
656    break;
657  case DeclarationName::ObjCZeroArgSelector:
658  case DeclarationName::ObjCOneArgSelector:
659  case DeclarationName::ObjCMultiArgSelector:
660    Key.Data =
661       (uint64_t)Reader.getLocalSelector(F, ReadUnalignedLE32(d))
662                   .getAsOpaquePtr();
663    break;
664  case DeclarationName::CXXOperatorName:
665    Key.Data = *d++; // OverloadedOperatorKind
666    break;
667  case DeclarationName::CXXLiteralOperatorName:
668    Key.Data = (uint64_t)Reader.getLocalIdentifier(F, ReadUnalignedLE32(d));
669    break;
670  case DeclarationName::CXXConstructorName:
671  case DeclarationName::CXXDestructorName:
672  case DeclarationName::CXXConversionFunctionName:
673  case DeclarationName::CXXUsingDirective:
674    Key.Data = 0;
675    break;
676  }
677
678  return Key;
679}
680
681ASTDeclContextNameLookupTrait::data_type
682ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
683                                        const unsigned char* d,
684                                        unsigned DataLen) {
685  using namespace clang::io;
686  unsigned NumDecls = ReadUnalignedLE16(d);
687  LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
688                        const_cast<unsigned char *>(d));
689  return std::make_pair(Start, Start + NumDecls);
690}
691
692bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
693                                       BitstreamCursor &Cursor,
694                                   const std::pair<uint64_t, uint64_t> &Offsets,
695                                       DeclContextInfo &Info) {
696  SavedStreamPosition SavedPosition(Cursor);
697  // First the lexical decls.
698  if (Offsets.first != 0) {
699    Cursor.JumpToBit(Offsets.first);
700
701    RecordData Record;
702    StringRef Blob;
703    unsigned Code = Cursor.ReadCode();
704    unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
705    if (RecCode != DECL_CONTEXT_LEXICAL) {
706      Error("Expected lexical block");
707      return true;
708    }
709
710    Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
711    Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
712  }
713
714  // Now the lookup table.
715  if (Offsets.second != 0) {
716    Cursor.JumpToBit(Offsets.second);
717
718    RecordData Record;
719    StringRef Blob;
720    unsigned Code = Cursor.ReadCode();
721    unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
722    if (RecCode != DECL_CONTEXT_VISIBLE) {
723      Error("Expected visible lookup table block");
724      return true;
725    }
726    Info.NameLookupTableData
727      = ASTDeclContextNameLookupTable::Create(
728                    (const unsigned char *)Blob.data() + Record[0],
729                    (const unsigned char *)Blob.data(),
730                    ASTDeclContextNameLookupTrait(*this, M));
731  }
732
733  return false;
734}
735
736void ASTReader::Error(StringRef Msg) {
737  Error(diag::err_fe_pch_malformed, Msg);
738}
739
740void ASTReader::Error(unsigned DiagID,
741                      StringRef Arg1, StringRef Arg2) {
742  if (Diags.isDiagnosticInFlight())
743    Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
744  else
745    Diag(DiagID) << Arg1 << Arg2;
746}
747
748//===----------------------------------------------------------------------===//
749// Source Manager Deserialization
750//===----------------------------------------------------------------------===//
751
752/// \brief Read the line table in the source manager block.
753/// \returns true if there was an error.
754bool ASTReader::ParseLineTable(ModuleFile &F,
755                               SmallVectorImpl<uint64_t> &Record) {
756  unsigned Idx = 0;
757  LineTableInfo &LineTable = SourceMgr.getLineTable();
758
759  // Parse the file names
760  std::map<int, int> FileIDs;
761  for (int I = 0, N = Record[Idx++]; I != N; ++I) {
762    // Extract the file name
763    unsigned FilenameLen = Record[Idx++];
764    std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
765    Idx += FilenameLen;
766    MaybeAddSystemRootToFilename(F, Filename);
767    FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
768  }
769
770  // Parse the line entries
771  std::vector<LineEntry> Entries;
772  while (Idx < Record.size()) {
773    int FID = Record[Idx++];
774    assert(FID >= 0 && "Serialized line entries for non-local file.");
775    // Remap FileID from 1-based old view.
776    FID += F.SLocEntryBaseID - 1;
777
778    // Extract the line entries
779    unsigned NumEntries = Record[Idx++];
780    assert(NumEntries && "Numentries is 00000");
781    Entries.clear();
782    Entries.reserve(NumEntries);
783    for (unsigned I = 0; I != NumEntries; ++I) {
784      unsigned FileOffset = Record[Idx++];
785      unsigned LineNo = Record[Idx++];
786      int FilenameID = FileIDs[Record[Idx++]];
787      SrcMgr::CharacteristicKind FileKind
788        = (SrcMgr::CharacteristicKind)Record[Idx++];
789      unsigned IncludeOffset = Record[Idx++];
790      Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
791                                       FileKind, IncludeOffset));
792    }
793    LineTable.AddEntry(FileID::get(FID), Entries);
794  }
795
796  return false;
797}
798
799/// \brief Read a source manager block
800bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
801  using namespace SrcMgr;
802
803  BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
804
805  // Set the source-location entry cursor to the current position in
806  // the stream. This cursor will be used to read the contents of the
807  // source manager block initially, and then lazily read
808  // source-location entries as needed.
809  SLocEntryCursor = F.Stream;
810
811  // The stream itself is going to skip over the source manager block.
812  if (F.Stream.SkipBlock()) {
813    Error("malformed block record in AST file");
814    return true;
815  }
816
817  // Enter the source manager block.
818  if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
819    Error("malformed source manager block record in AST file");
820    return true;
821  }
822
823  RecordData Record;
824  while (true) {
825    llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
826
827    switch (E.Kind) {
828    case llvm::BitstreamEntry::SubBlock: // Handled for us already.
829    case llvm::BitstreamEntry::Error:
830      Error("malformed block record in AST file");
831      return true;
832    case llvm::BitstreamEntry::EndBlock:
833      return false;
834    case llvm::BitstreamEntry::Record:
835      // The interesting case.
836      break;
837    }
838
839    // Read a record.
840    Record.clear();
841    StringRef Blob;
842    switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
843    default:  // Default behavior: ignore.
844      break;
845
846    case SM_SLOC_FILE_ENTRY:
847    case SM_SLOC_BUFFER_ENTRY:
848    case SM_SLOC_EXPANSION_ENTRY:
849      // Once we hit one of the source location entries, we're done.
850      return false;
851    }
852  }
853}
854
855/// \brief If a header file is not found at the path that we expect it to be
856/// and the PCH file was moved from its original location, try to resolve the
857/// file by assuming that header+PCH were moved together and the header is in
858/// the same place relative to the PCH.
859static std::string
860resolveFileRelativeToOriginalDir(const std::string &Filename,
861                                 const std::string &OriginalDir,
862                                 const std::string &CurrDir) {
863  assert(OriginalDir != CurrDir &&
864         "No point trying to resolve the file if the PCH dir didn't change");
865  using namespace llvm::sys;
866  SmallString<128> filePath(Filename);
867  fs::make_absolute(filePath);
868  assert(path::is_absolute(OriginalDir));
869  SmallString<128> currPCHPath(CurrDir);
870
871  path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
872                       fileDirE = path::end(path::parent_path(filePath));
873  path::const_iterator origDirI = path::begin(OriginalDir),
874                       origDirE = path::end(OriginalDir);
875  // Skip the common path components from filePath and OriginalDir.
876  while (fileDirI != fileDirE && origDirI != origDirE &&
877         *fileDirI == *origDirI) {
878    ++fileDirI;
879    ++origDirI;
880  }
881  for (; origDirI != origDirE; ++origDirI)
882    path::append(currPCHPath, "..");
883  path::append(currPCHPath, fileDirI, fileDirE);
884  path::append(currPCHPath, path::filename(Filename));
885  return currPCHPath.str();
886}
887
888bool ASTReader::ReadSLocEntry(int ID) {
889  if (ID == 0)
890    return false;
891
892  if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
893    Error("source location entry ID out-of-range for AST file");
894    return true;
895  }
896
897  ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
898  F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
899  BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
900  unsigned BaseOffset = F->SLocEntryBaseOffset;
901
902  ++NumSLocEntriesRead;
903  llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
904  if (Entry.Kind != llvm::BitstreamEntry::Record) {
905    Error("incorrectly-formatted source location entry in AST file");
906    return true;
907  }
908
909  RecordData Record;
910  StringRef Blob;
911  switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
912  default:
913    Error("incorrectly-formatted source location entry in AST file");
914    return true;
915
916  case SM_SLOC_FILE_ENTRY: {
917    // We will detect whether a file changed and return 'Failure' for it, but
918    // we will also try to fail gracefully by setting up the SLocEntry.
919    unsigned InputID = Record[4];
920    InputFile IF = getInputFile(*F, InputID);
921    const FileEntry *File = IF.getFile();
922    bool OverriddenBuffer = IF.isOverridden();
923
924    // Note that we only check if a File was returned. If it was out-of-date
925    // we have complained but we will continue creating a FileID to recover
926    // gracefully.
927    if (!File)
928      return true;
929
930    SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
931    if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
932      // This is the module's main file.
933      IncludeLoc = getImportLocation(F);
934    }
935    SrcMgr::CharacteristicKind
936      FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
937    FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
938                                        ID, BaseOffset + Record[0]);
939    SrcMgr::FileInfo &FileInfo =
940          const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
941    FileInfo.NumCreatedFIDs = Record[5];
942    if (Record[3])
943      FileInfo.setHasLineDirectives();
944
945    const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
946    unsigned NumFileDecls = Record[7];
947    if (NumFileDecls) {
948      assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
949      FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
950                                                             NumFileDecls));
951    }
952
953    const SrcMgr::ContentCache *ContentCache
954      = SourceMgr.getOrCreateContentCache(File,
955                              /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
956    if (OverriddenBuffer && !ContentCache->BufferOverridden &&
957        ContentCache->ContentsEntry == ContentCache->OrigEntry) {
958      unsigned Code = SLocEntryCursor.ReadCode();
959      Record.clear();
960      unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
961
962      if (RecCode != SM_SLOC_BUFFER_BLOB) {
963        Error("AST record has invalid code");
964        return true;
965      }
966
967      llvm::MemoryBuffer *Buffer
968        = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
969      SourceMgr.overrideFileContents(File, Buffer);
970    }
971
972    break;
973  }
974
975  case SM_SLOC_BUFFER_ENTRY: {
976    const char *Name = Blob.data();
977    unsigned Offset = Record[0];
978    SrcMgr::CharacteristicKind
979      FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
980    SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
981    if (IncludeLoc.isInvalid() && F->Kind == MK_Module) {
982      IncludeLoc = getImportLocation(F);
983    }
984    unsigned Code = SLocEntryCursor.ReadCode();
985    Record.clear();
986    unsigned RecCode
987      = SLocEntryCursor.readRecord(Code, Record, &Blob);
988
989    if (RecCode != SM_SLOC_BUFFER_BLOB) {
990      Error("AST record has invalid code");
991      return true;
992    }
993
994    llvm::MemoryBuffer *Buffer
995      = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
996    SourceMgr.createFileIDForMemBuffer(Buffer, FileCharacter, ID,
997                                       BaseOffset + Offset, IncludeLoc);
998    break;
999  }
1000
1001  case SM_SLOC_EXPANSION_ENTRY: {
1002    SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1003    SourceMgr.createExpansionLoc(SpellingLoc,
1004                                     ReadSourceLocation(*F, Record[2]),
1005                                     ReadSourceLocation(*F, Record[3]),
1006                                     Record[4],
1007                                     ID,
1008                                     BaseOffset + Record[0]);
1009    break;
1010  }
1011  }
1012
1013  return false;
1014}
1015
1016std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1017  if (ID == 0)
1018    return std::make_pair(SourceLocation(), "");
1019
1020  if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1021    Error("source location entry ID out-of-range for AST file");
1022    return std::make_pair(SourceLocation(), "");
1023  }
1024
1025  // Find which module file this entry lands in.
1026  ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1027  if (M->Kind != MK_Module)
1028    return std::make_pair(SourceLocation(), "");
1029
1030  // FIXME: Can we map this down to a particular submodule? That would be
1031  // ideal.
1032  return std::make_pair(M->ImportLoc, llvm::sys::path::stem(M->FileName));
1033}
1034
1035/// \brief Find the location where the module F is imported.
1036SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1037  if (F->ImportLoc.isValid())
1038    return F->ImportLoc;
1039
1040  // Otherwise we have a PCH. It's considered to be "imported" at the first
1041  // location of its includer.
1042  if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1043    // Main file is the importer. We assume that it is the first entry in the
1044    // entry table. We can't ask the manager, because at the time of PCH loading
1045    // the main file entry doesn't exist yet.
1046    // The very first entry is the invalid instantiation loc, which takes up
1047    // offsets 0 and 1.
1048    return SourceLocation::getFromRawEncoding(2U);
1049  }
1050  //return F->Loaders[0]->FirstLoc;
1051  return F->ImportedBy[0]->FirstLoc;
1052}
1053
1054/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1055/// specified cursor.  Read the abbreviations that are at the top of the block
1056/// and then leave the cursor pointing into the block.
1057bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1058  if (Cursor.EnterSubBlock(BlockID)) {
1059    Error("malformed block record in AST file");
1060    return Failure;
1061  }
1062
1063  while (true) {
1064    uint64_t Offset = Cursor.GetCurrentBitNo();
1065    unsigned Code = Cursor.ReadCode();
1066
1067    // We expect all abbrevs to be at the start of the block.
1068    if (Code != llvm::bitc::DEFINE_ABBREV) {
1069      Cursor.JumpToBit(Offset);
1070      return false;
1071    }
1072    Cursor.ReadAbbrevRecord();
1073  }
1074}
1075
1076void ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset,
1077                                MacroDirective *Hint) {
1078  BitstreamCursor &Stream = F.MacroCursor;
1079
1080  // Keep track of where we are in the stream, then jump back there
1081  // after reading this macro.
1082  SavedStreamPosition SavedPosition(Stream);
1083
1084  Stream.JumpToBit(Offset);
1085  RecordData Record;
1086  SmallVector<IdentifierInfo*, 16> MacroArgs;
1087  MacroInfo *Macro = 0;
1088
1089  // RAII object to add the loaded macro information once we're done
1090  // adding tokens.
1091  struct AddLoadedMacroInfoRAII {
1092    Preprocessor &PP;
1093    MacroDirective *Hint;
1094    MacroDirective *MD;
1095    IdentifierInfo *II;
1096
1097    AddLoadedMacroInfoRAII(Preprocessor &PP, MacroDirective *Hint)
1098      : PP(PP), Hint(Hint), MD(), II() { }
1099    ~AddLoadedMacroInfoRAII( ) {
1100      if (MD) {
1101        // Finally, install the macro.
1102        PP.addLoadedMacroInfo(II, MD, Hint);
1103      }
1104    }
1105  } AddLoadedMacroInfo(PP, Hint);
1106
1107  while (true) {
1108    // Advance to the next record, but if we get to the end of the block, don't
1109    // pop it (removing all the abbreviations from the cursor) since we want to
1110    // be able to reseek within the block and read entries.
1111    unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1112    llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1113
1114    switch (Entry.Kind) {
1115    case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1116    case llvm::BitstreamEntry::Error:
1117      Error("malformed block record in AST file");
1118      return;
1119    case llvm::BitstreamEntry::EndBlock:
1120      return;
1121    case llvm::BitstreamEntry::Record:
1122      // The interesting case.
1123      break;
1124    }
1125
1126    // Read a record.
1127    Record.clear();
1128    PreprocessorRecordTypes RecType =
1129      (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1130    switch (RecType) {
1131    case PP_MACRO_OBJECT_LIKE:
1132    case PP_MACRO_FUNCTION_LIKE: {
1133      // If we already have a macro, that means that we've hit the end
1134      // of the definition of the macro we were looking for. We're
1135      // done.
1136      if (Macro)
1137        return;
1138
1139      IdentifierInfo *II = getLocalIdentifier(F, Record[0]);
1140      if (II == 0) {
1141        Error("macro must have a name in AST file");
1142        return;
1143      }
1144
1145      unsigned GlobalID = getGlobalMacroID(F, Record[1]);
1146
1147      // If this macro has already been loaded, don't do so again.
1148      if (MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS])
1149        return;
1150
1151      SubmoduleID GlobalSubmoduleID = getGlobalSubmoduleID(F, Record[2]);
1152      unsigned NextIndex = 3;
1153      SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1154      MacroInfo *MI = PP.AllocateMacroInfo(Loc);
1155      // FIXME: Location should be import location in case of module.
1156      MacroDirective *MD = PP.AllocateMacroDirective(MI, Loc,
1157                                                     /*isImported=*/true);
1158      MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1159
1160      // Record this macro.
1161      MacrosLoaded[GlobalID - NUM_PREDEF_MACRO_IDS] = MD;
1162
1163      SourceLocation UndefLoc = ReadSourceLocation(F, Record, NextIndex);
1164      if (UndefLoc.isValid())
1165        MD->setUndefLoc(UndefLoc);
1166
1167      MI->setIsUsed(Record[NextIndex++]);
1168
1169      bool IsPublic = Record[NextIndex++];
1170      MD->setVisibility(IsPublic, ReadSourceLocation(F, Record, NextIndex));
1171
1172      if (RecType == PP_MACRO_FUNCTION_LIKE) {
1173        // Decode function-like macro info.
1174        bool isC99VarArgs = Record[NextIndex++];
1175        bool isGNUVarArgs = Record[NextIndex++];
1176        bool hasCommaPasting = Record[NextIndex++];
1177        MacroArgs.clear();
1178        unsigned NumArgs = Record[NextIndex++];
1179        for (unsigned i = 0; i != NumArgs; ++i)
1180          MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1181
1182        // Install function-like macro info.
1183        MI->setIsFunctionLike();
1184        if (isC99VarArgs) MI->setIsC99Varargs();
1185        if (isGNUVarArgs) MI->setIsGNUVarargs();
1186        if (hasCommaPasting) MI->setHasCommaPasting();
1187        MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1188                            PP.getPreprocessorAllocator());
1189      }
1190
1191      if (DeserializationListener)
1192        DeserializationListener->MacroRead(GlobalID, MD);
1193
1194      // If an update record marked this as undefined, do so now.
1195      // FIXME: Only if the submodule this update came from is visible?
1196      MacroUpdatesMap::iterator Update = MacroUpdates.find(GlobalID);
1197      if (Update != MacroUpdates.end()) {
1198        if (MD->getUndefLoc().isInvalid()) {
1199          for (unsigned I = 0, N = Update->second.size(); I != N; ++I) {
1200            bool Hidden = false;
1201            if (unsigned SubmoduleID = Update->second[I].first) {
1202              if (Module *Owner = getSubmodule(SubmoduleID)) {
1203                if (Owner->NameVisibility == Module::Hidden) {
1204                  // Note that this #undef is hidden.
1205                  Hidden = true;
1206
1207                  // Record this hiding for later.
1208                  HiddenNamesMap[Owner].push_back(
1209                    HiddenName(II, MD, Update->second[I].second.UndefLoc));
1210                }
1211              }
1212            }
1213
1214            if (!Hidden) {
1215              MD->setUndefLoc(Update->second[I].second.UndefLoc);
1216              if (PPMutationListener *Listener = PP.getPPMutationListener())
1217                Listener->UndefinedMacro(MD);
1218              break;
1219            }
1220          }
1221        }
1222        MacroUpdates.erase(Update);
1223      }
1224
1225      // Determine whether this macro definition is visible.
1226      bool Hidden = !MD->isPublic();
1227      if (!Hidden && GlobalSubmoduleID) {
1228        if (Module *Owner = getSubmodule(GlobalSubmoduleID)) {
1229          if (Owner->NameVisibility == Module::Hidden) {
1230            // The owning module is not visible, and this macro definition
1231            // should not be, either.
1232            Hidden = true;
1233
1234            // Note that this macro definition was hidden because its owning
1235            // module is not yet visible.
1236            HiddenNamesMap[Owner].push_back(HiddenName(II, MD));
1237          }
1238        }
1239      }
1240      MD->setHidden(Hidden);
1241
1242      // Make sure we install the macro once we're done.
1243      AddLoadedMacroInfo.MD = MD;
1244      AddLoadedMacroInfo.II = II;
1245
1246      // Remember that we saw this macro last so that we add the tokens that
1247      // form its body to it.
1248      Macro = MI;
1249
1250      if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1251          Record[NextIndex]) {
1252        // We have a macro definition. Register the association
1253        PreprocessedEntityID
1254            GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1255        PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1256        PreprocessingRecord::PPEntityID
1257          PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1258        MacroDefinition *PPDef =
1259          cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1260        if (PPDef)
1261          PPRec.RegisterMacroDefinition(Macro, PPDef);
1262      }
1263
1264      ++NumMacrosRead;
1265      break;
1266    }
1267
1268    case PP_TOKEN: {
1269      // If we see a TOKEN before a PP_MACRO_*, then the file is
1270      // erroneous, just pretend we didn't see this.
1271      if (Macro == 0) break;
1272
1273      Token Tok;
1274      Tok.startToken();
1275      Tok.setLocation(ReadSourceLocation(F, Record[0]));
1276      Tok.setLength(Record[1]);
1277      if (IdentifierInfo *II = getLocalIdentifier(F, Record[2]))
1278        Tok.setIdentifierInfo(II);
1279      Tok.setKind((tok::TokenKind)Record[3]);
1280      Tok.setFlag((Token::TokenFlags)Record[4]);
1281      Macro->AddTokenToBody(Tok);
1282      break;
1283    }
1284    }
1285  }
1286}
1287
1288PreprocessedEntityID
1289ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1290  ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1291    I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1292  assert(I != M.PreprocessedEntityRemap.end()
1293         && "Invalid index into preprocessed entity index remap");
1294
1295  return LocalID + I->second;
1296}
1297
1298unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1299  return llvm::hash_combine(ikey.Size, ikey.ModTime);
1300}
1301
1302HeaderFileInfoTrait::internal_key_type
1303HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1304  internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
1305                             FE->getName() };
1306  return ikey;
1307}
1308
1309bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1310  if (a.Size != b.Size || a.ModTime != b.ModTime)
1311    return false;
1312
1313  if (strcmp(a.Filename, b.Filename) == 0)
1314    return true;
1315
1316  // Determine whether the actual files are equivalent.
1317  FileManager &FileMgr = Reader.getFileManager();
1318  const FileEntry *FEA = FileMgr.getFile(a.Filename);
1319  const FileEntry *FEB = FileMgr.getFile(b.Filename);
1320  return (FEA && FEA == FEB);
1321}
1322
1323std::pair<unsigned, unsigned>
1324HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1325  unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d);
1326  unsigned DataLen = (unsigned) *d++;
1327  return std::make_pair(KeyLen, DataLen);
1328}
1329
1330HeaderFileInfoTrait::internal_key_type
1331HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1332  internal_key_type ikey;
1333  ikey.Size = off_t(clang::io::ReadUnalignedLE64(d));
1334  ikey.ModTime = time_t(clang::io::ReadUnalignedLE64(d));
1335  ikey.Filename = (const char *)d;
1336  return ikey;
1337}
1338
1339HeaderFileInfoTrait::data_type
1340HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1341                              unsigned DataLen) {
1342  const unsigned char *End = d + DataLen;
1343  using namespace clang::io;
1344  HeaderFileInfo HFI;
1345  unsigned Flags = *d++;
1346  HFI.isImport = (Flags >> 5) & 0x01;
1347  HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1348  HFI.DirInfo = (Flags >> 2) & 0x03;
1349  HFI.Resolved = (Flags >> 1) & 0x01;
1350  HFI.IndexHeaderMapHeader = Flags & 0x01;
1351  HFI.NumIncludes = ReadUnalignedLE16(d);
1352  HFI.ControllingMacroID = Reader.getGlobalIdentifierID(M,
1353                                                        ReadUnalignedLE32(d));
1354  if (unsigned FrameworkOffset = ReadUnalignedLE32(d)) {
1355    // The framework offset is 1 greater than the actual offset,
1356    // since 0 is used as an indicator for "no framework name".
1357    StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1358    HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1359  }
1360
1361  if (d != End) {
1362    uint32_t LocalSMID = ReadUnalignedLE32(d);
1363    if (LocalSMID) {
1364      // This header is part of a module. Associate it with the module to enable
1365      // implicit module import.
1366      SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1367      Module *Mod = Reader.getSubmodule(GlobalSMID);
1368      HFI.isModuleHeader = true;
1369      FileManager &FileMgr = Reader.getFileManager();
1370      ModuleMap &ModMap =
1371          Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1372      ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), /*Excluded=*/false);
1373    }
1374  }
1375
1376  assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1377  (void)End;
1378
1379  // This HeaderFileInfo was externally loaded.
1380  HFI.External = true;
1381  return HFI;
1382}
1383
1384void ASTReader::setIdentifierIsMacro(IdentifierInfo *II, ArrayRef<MacroID> IDs){
1385  II->setHadMacroDefinition(true);
1386  assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1387  PendingMacroIDs[II].append(IDs.begin(), IDs.end());
1388}
1389
1390void ASTReader::ReadDefinedMacros() {
1391  // Note that we are loading defined macros.
1392  Deserializing Macros(this);
1393
1394  for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1395      E = ModuleMgr.rend(); I != E; ++I) {
1396    BitstreamCursor &MacroCursor = (*I)->MacroCursor;
1397
1398    // If there was no preprocessor block, skip this file.
1399    if (!MacroCursor.getBitStreamReader())
1400      continue;
1401
1402    BitstreamCursor Cursor = MacroCursor;
1403    Cursor.JumpToBit((*I)->MacroStartOffset);
1404
1405    RecordData Record;
1406    while (true) {
1407      llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1408
1409      switch (E.Kind) {
1410      case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1411      case llvm::BitstreamEntry::Error:
1412        Error("malformed block record in AST file");
1413        return;
1414      case llvm::BitstreamEntry::EndBlock:
1415        goto NextCursor;
1416
1417      case llvm::BitstreamEntry::Record:
1418        Record.clear();
1419        switch (Cursor.readRecord(E.ID, Record)) {
1420        default:  // Default behavior: ignore.
1421          break;
1422
1423        case PP_MACRO_OBJECT_LIKE:
1424        case PP_MACRO_FUNCTION_LIKE:
1425          getLocalIdentifier(**I, Record[0]);
1426          break;
1427
1428        case PP_TOKEN:
1429          // Ignore tokens.
1430          break;
1431        }
1432        break;
1433      }
1434    }
1435    NextCursor:  ;
1436  }
1437}
1438
1439namespace {
1440  /// \brief Visitor class used to look up identifirs in an AST file.
1441  class IdentifierLookupVisitor {
1442    StringRef Name;
1443    unsigned PriorGeneration;
1444    unsigned &NumIdentifierLookups;
1445    unsigned &NumIdentifierLookupHits;
1446    IdentifierInfo *Found;
1447
1448  public:
1449    IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1450                            unsigned &NumIdentifierLookups,
1451                            unsigned &NumIdentifierLookupHits)
1452      : Name(Name), PriorGeneration(PriorGeneration),
1453        NumIdentifierLookups(NumIdentifierLookups),
1454        NumIdentifierLookupHits(NumIdentifierLookupHits),
1455        Found()
1456    {
1457    }
1458
1459    static bool visit(ModuleFile &M, void *UserData) {
1460      IdentifierLookupVisitor *This
1461        = static_cast<IdentifierLookupVisitor *>(UserData);
1462
1463      // If we've already searched this module file, skip it now.
1464      if (M.Generation <= This->PriorGeneration)
1465        return true;
1466
1467      ASTIdentifierLookupTable *IdTable
1468        = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1469      if (!IdTable)
1470        return false;
1471
1472      ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1473                                     M, This->Found);
1474      ++This->NumIdentifierLookups;
1475      ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
1476      if (Pos == IdTable->end())
1477        return false;
1478
1479      // Dereferencing the iterator has the effect of building the
1480      // IdentifierInfo node and populating it with the various
1481      // declarations it needs.
1482      ++This->NumIdentifierLookupHits;
1483      This->Found = *Pos;
1484      return true;
1485    }
1486
1487    // \brief Retrieve the identifier info found within the module
1488    // files.
1489    IdentifierInfo *getIdentifierInfo() const { return Found; }
1490  };
1491}
1492
1493void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1494  // Note that we are loading an identifier.
1495  Deserializing AnIdentifier(this);
1496
1497  unsigned PriorGeneration = 0;
1498  if (getContext().getLangOpts().Modules)
1499    PriorGeneration = IdentifierGeneration[&II];
1500
1501  // If there is a global index, look there first to determine which modules
1502  // provably do not have any results for this identifier.
1503  GlobalModuleIndex::HitSet Hits;
1504  GlobalModuleIndex::HitSet *HitsPtr = 0;
1505  if (!loadGlobalIndex()) {
1506    if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1507      HitsPtr = &Hits;
1508    }
1509  }
1510
1511  IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1512                                  NumIdentifierLookups,
1513                                  NumIdentifierLookupHits);
1514  ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
1515  markIdentifierUpToDate(&II);
1516}
1517
1518void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1519  if (!II)
1520    return;
1521
1522  II->setOutOfDate(false);
1523
1524  // Update the generation for this identifier.
1525  if (getContext().getLangOpts().Modules)
1526    IdentifierGeneration[II] = CurrentGeneration;
1527}
1528
1529InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
1530  // If this ID is bogus, just return an empty input file.
1531  if (ID == 0 || ID > F.InputFilesLoaded.size())
1532    return InputFile();
1533
1534  // If we've already loaded this input file, return it.
1535  if (F.InputFilesLoaded[ID-1].getFile())
1536    return F.InputFilesLoaded[ID-1];
1537
1538  // Go find this input file.
1539  BitstreamCursor &Cursor = F.InputFilesCursor;
1540  SavedStreamPosition SavedPosition(Cursor);
1541  Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1542
1543  unsigned Code = Cursor.ReadCode();
1544  RecordData Record;
1545  StringRef Blob;
1546  switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
1547  case INPUT_FILE: {
1548    unsigned StoredID = Record[0];
1549    assert(ID == StoredID && "Bogus stored ID or offset");
1550    (void)StoredID;
1551    off_t StoredSize = (off_t)Record[1];
1552    time_t StoredTime = (time_t)Record[2];
1553    bool Overridden = (bool)Record[3];
1554
1555    // Get the file entry for this input file.
1556    StringRef OrigFilename = Blob;
1557    std::string Filename = OrigFilename;
1558    MaybeAddSystemRootToFilename(F, Filename);
1559    const FileEntry *File
1560      = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
1561                  : FileMgr.getFile(Filename, /*OpenFile=*/false);
1562
1563    // If we didn't find the file, resolve it relative to the
1564    // original directory from which this AST file was created.
1565    if (File == 0 && !F.OriginalDir.empty() && !CurrentDir.empty() &&
1566        F.OriginalDir != CurrentDir) {
1567      std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
1568                                                              F.OriginalDir,
1569                                                              CurrentDir);
1570      if (!Resolved.empty())
1571        File = FileMgr.getFile(Resolved);
1572    }
1573
1574    // For an overridden file, create a virtual file with the stored
1575    // size/timestamp.
1576    if (Overridden && File == 0) {
1577      File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
1578    }
1579
1580    if (File == 0) {
1581      if (Complain) {
1582        std::string ErrorStr = "could not find file '";
1583        ErrorStr += Filename;
1584        ErrorStr += "' referenced by AST file";
1585        Error(ErrorStr.c_str());
1586      }
1587      return InputFile();
1588    }
1589
1590    // Check if there was a request to override the contents of the file
1591    // that was part of the precompiled header. Overridding such a file
1592    // can lead to problems when lexing using the source locations from the
1593    // PCH.
1594    SourceManager &SM = getSourceManager();
1595    if (!Overridden && SM.isFileOverridden(File)) {
1596      if (Complain)
1597        Error(diag::err_fe_pch_file_overridden, Filename);
1598      // After emitting the diagnostic, recover by disabling the override so
1599      // that the original file will be used.
1600      SM.disableFileContentsOverride(File);
1601      // The FileEntry is a virtual file entry with the size of the contents
1602      // that would override the original contents. Set it to the original's
1603      // size/time.
1604      FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
1605                              StoredSize, StoredTime);
1606    }
1607
1608    bool IsOutOfDate = false;
1609
1610    // For an overridden file, there is nothing to validate.
1611    if (!Overridden && (StoredSize != File->getSize()
1612#if !defined(LLVM_ON_WIN32)
1613         // In our regression testing, the Windows file system seems to
1614         // have inconsistent modification times that sometimes
1615         // erroneously trigger this error-handling path.
1616         || StoredTime != File->getModificationTime()
1617#endif
1618         )) {
1619      if (Complain) {
1620        Error(diag::err_fe_pch_file_modified, Filename, F.FileName);
1621      }
1622
1623      IsOutOfDate = true;
1624    }
1625
1626    InputFile IF = InputFile(File, Overridden, IsOutOfDate);
1627
1628    // Note that we've loaded this input file.
1629    F.InputFilesLoaded[ID-1] = IF;
1630    return IF;
1631  }
1632  }
1633
1634  return InputFile();
1635}
1636
1637const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
1638  ModuleFile &M = ModuleMgr.getPrimaryModule();
1639  std::string Filename = filenameStrRef;
1640  MaybeAddSystemRootToFilename(M, Filename);
1641  const FileEntry *File = FileMgr.getFile(Filename);
1642  if (File == 0 && !M.OriginalDir.empty() && !CurrentDir.empty() &&
1643      M.OriginalDir != CurrentDir) {
1644    std::string resolved = resolveFileRelativeToOriginalDir(Filename,
1645                                                            M.OriginalDir,
1646                                                            CurrentDir);
1647    if (!resolved.empty())
1648      File = FileMgr.getFile(resolved);
1649  }
1650
1651  return File;
1652}
1653
1654/// \brief If we are loading a relocatable PCH file, and the filename is
1655/// not an absolute path, add the system root to the beginning of the file
1656/// name.
1657void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
1658                                             std::string &Filename) {
1659  // If this is not a relocatable PCH file, there's nothing to do.
1660  if (!M.RelocatablePCH)
1661    return;
1662
1663  if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
1664    return;
1665
1666  if (isysroot.empty()) {
1667    // If no system root was given, default to '/'
1668    Filename.insert(Filename.begin(), '/');
1669    return;
1670  }
1671
1672  unsigned Length = isysroot.size();
1673  if (isysroot[Length - 1] != '/')
1674    Filename.insert(Filename.begin(), '/');
1675
1676  Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
1677}
1678
1679ASTReader::ASTReadResult
1680ASTReader::ReadControlBlock(ModuleFile &F,
1681                            SmallVectorImpl<ImportedModule> &Loaded,
1682                            unsigned ClientLoadCapabilities) {
1683  BitstreamCursor &Stream = F.Stream;
1684
1685  if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
1686    Error("malformed block record in AST file");
1687    return Failure;
1688  }
1689
1690  // Read all of the records and blocks in the control block.
1691  RecordData Record;
1692  while (1) {
1693    llvm::BitstreamEntry Entry = Stream.advance();
1694
1695    switch (Entry.Kind) {
1696    case llvm::BitstreamEntry::Error:
1697      Error("malformed block record in AST file");
1698      return Failure;
1699    case llvm::BitstreamEntry::EndBlock:
1700      // Validate all of the non-system input files.
1701      if (!DisableValidation) {
1702        bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
1703        // All user input files reside at the index range [0, Record[1]).
1704        // Record is the one from INPUT_FILE_OFFSETS.
1705        for (unsigned I = 0, N = Record[1]; I < N; ++I) {
1706          InputFile IF = getInputFile(F, I+1, Complain);
1707          if (!IF.getFile() || IF.isOutOfDate())
1708            return OutOfDate;
1709        }
1710      }
1711      return Success;
1712
1713    case llvm::BitstreamEntry::SubBlock:
1714      switch (Entry.ID) {
1715      case INPUT_FILES_BLOCK_ID:
1716        F.InputFilesCursor = Stream;
1717        if (Stream.SkipBlock() || // Skip with the main cursor
1718            // Read the abbreviations
1719            ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
1720          Error("malformed block record in AST file");
1721          return Failure;
1722        }
1723        continue;
1724
1725      default:
1726        if (Stream.SkipBlock()) {
1727          Error("malformed block record in AST file");
1728          return Failure;
1729        }
1730        continue;
1731      }
1732
1733    case llvm::BitstreamEntry::Record:
1734      // The interesting case.
1735      break;
1736    }
1737
1738    // Read and process a record.
1739    Record.clear();
1740    StringRef Blob;
1741    switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
1742    case METADATA: {
1743      if (Record[0] != VERSION_MAJOR && !DisableValidation) {
1744        if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
1745          Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old
1746                                        : diag::warn_pch_version_too_new);
1747        return VersionMismatch;
1748      }
1749
1750      bool hasErrors = Record[5];
1751      if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
1752        Diag(diag::err_pch_with_compiler_errors);
1753        return HadErrors;
1754      }
1755
1756      F.RelocatablePCH = Record[4];
1757
1758      const std::string &CurBranch = getClangFullRepositoryVersion();
1759      StringRef ASTBranch = Blob;
1760      if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
1761        if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
1762          Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch;
1763        return VersionMismatch;
1764      }
1765      break;
1766    }
1767
1768    case IMPORTS: {
1769      // Load each of the imported PCH files.
1770      unsigned Idx = 0, N = Record.size();
1771      while (Idx < N) {
1772        // Read information about the AST file.
1773        ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
1774        // The import location will be the local one for now; we will adjust
1775        // all import locations of module imports after the global source
1776        // location info are setup.
1777        SourceLocation ImportLoc =
1778            SourceLocation::getFromRawEncoding(Record[Idx++]);
1779        off_t StoredSize = (off_t)Record[Idx++];
1780        time_t StoredModTime = (time_t)Record[Idx++];
1781        unsigned Length = Record[Idx++];
1782        SmallString<128> ImportedFile(Record.begin() + Idx,
1783                                      Record.begin() + Idx + Length);
1784        Idx += Length;
1785
1786        // Load the AST file.
1787        switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
1788                           StoredSize, StoredModTime,
1789                           ClientLoadCapabilities)) {
1790        case Failure: return Failure;
1791          // If we have to ignore the dependency, we'll have to ignore this too.
1792        case Missing:
1793        case OutOfDate: return OutOfDate;
1794        case VersionMismatch: return VersionMismatch;
1795        case ConfigurationMismatch: return ConfigurationMismatch;
1796        case HadErrors: return HadErrors;
1797        case Success: break;
1798        }
1799      }
1800      break;
1801    }
1802
1803    case LANGUAGE_OPTIONS: {
1804      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
1805      if (Listener && &F == *ModuleMgr.begin() &&
1806          ParseLanguageOptions(Record, Complain, *Listener) &&
1807          !DisableValidation)
1808        return ConfigurationMismatch;
1809      break;
1810    }
1811
1812    case TARGET_OPTIONS: {
1813      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1814      if (Listener && &F == *ModuleMgr.begin() &&
1815          ParseTargetOptions(Record, Complain, *Listener) &&
1816          !DisableValidation)
1817        return ConfigurationMismatch;
1818      break;
1819    }
1820
1821    case DIAGNOSTIC_OPTIONS: {
1822      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1823      if (Listener && &F == *ModuleMgr.begin() &&
1824          ParseDiagnosticOptions(Record, Complain, *Listener) &&
1825          !DisableValidation)
1826        return ConfigurationMismatch;
1827      break;
1828    }
1829
1830    case FILE_SYSTEM_OPTIONS: {
1831      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1832      if (Listener && &F == *ModuleMgr.begin() &&
1833          ParseFileSystemOptions(Record, Complain, *Listener) &&
1834          !DisableValidation)
1835        return ConfigurationMismatch;
1836      break;
1837    }
1838
1839    case HEADER_SEARCH_OPTIONS: {
1840      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1841      if (Listener && &F == *ModuleMgr.begin() &&
1842          ParseHeaderSearchOptions(Record, Complain, *Listener) &&
1843          !DisableValidation)
1844        return ConfigurationMismatch;
1845      break;
1846    }
1847
1848    case PREPROCESSOR_OPTIONS: {
1849      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
1850      if (Listener && &F == *ModuleMgr.begin() &&
1851          ParsePreprocessorOptions(Record, Complain, *Listener,
1852                                   SuggestedPredefines) &&
1853          !DisableValidation)
1854        return ConfigurationMismatch;
1855      break;
1856    }
1857
1858    case ORIGINAL_FILE:
1859      F.OriginalSourceFileID = FileID::get(Record[0]);
1860      F.ActualOriginalSourceFileName = Blob;
1861      F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
1862      MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
1863      break;
1864
1865    case ORIGINAL_FILE_ID:
1866      F.OriginalSourceFileID = FileID::get(Record[0]);
1867      break;
1868
1869    case ORIGINAL_PCH_DIR:
1870      F.OriginalDir = Blob;
1871      break;
1872
1873    case INPUT_FILE_OFFSETS:
1874      F.InputFileOffsets = (const uint32_t *)Blob.data();
1875      F.InputFilesLoaded.resize(Record[0]);
1876      break;
1877    }
1878  }
1879}
1880
1881bool ASTReader::ReadASTBlock(ModuleFile &F) {
1882  BitstreamCursor &Stream = F.Stream;
1883
1884  if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
1885    Error("malformed block record in AST file");
1886    return true;
1887  }
1888
1889  // Read all of the records and blocks for the AST file.
1890  RecordData Record;
1891  while (1) {
1892    llvm::BitstreamEntry Entry = Stream.advance();
1893
1894    switch (Entry.Kind) {
1895    case llvm::BitstreamEntry::Error:
1896      Error("error at end of module block in AST file");
1897      return true;
1898    case llvm::BitstreamEntry::EndBlock: {
1899      DeclContext *DC = Context.getTranslationUnitDecl();
1900      if (!DC->hasExternalVisibleStorage() && DC->hasExternalLexicalStorage())
1901        DC->setMustBuildLookupTable();
1902
1903      return false;
1904    }
1905    case llvm::BitstreamEntry::SubBlock:
1906      switch (Entry.ID) {
1907      case DECLTYPES_BLOCK_ID:
1908        // We lazily load the decls block, but we want to set up the
1909        // DeclsCursor cursor to point into it.  Clone our current bitcode
1910        // cursor to it, enter the block and read the abbrevs in that block.
1911        // With the main cursor, we just skip over it.
1912        F.DeclsCursor = Stream;
1913        if (Stream.SkipBlock() ||  // Skip with the main cursor.
1914            // Read the abbrevs.
1915            ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
1916          Error("malformed block record in AST file");
1917          return true;
1918        }
1919        break;
1920
1921      case DECL_UPDATES_BLOCK_ID:
1922        if (Stream.SkipBlock()) {
1923          Error("malformed block record in AST file");
1924          return true;
1925        }
1926        break;
1927
1928      case PREPROCESSOR_BLOCK_ID:
1929        F.MacroCursor = Stream;
1930        if (!PP.getExternalSource())
1931          PP.setExternalSource(this);
1932
1933        if (Stream.SkipBlock() ||
1934            ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
1935          Error("malformed block record in AST file");
1936          return true;
1937        }
1938        F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
1939        break;
1940
1941      case PREPROCESSOR_DETAIL_BLOCK_ID:
1942        F.PreprocessorDetailCursor = Stream;
1943        if (Stream.SkipBlock() ||
1944            ReadBlockAbbrevs(F.PreprocessorDetailCursor,
1945                             PREPROCESSOR_DETAIL_BLOCK_ID)) {
1946              Error("malformed preprocessor detail record in AST file");
1947              return true;
1948            }
1949        F.PreprocessorDetailStartOffset
1950        = F.PreprocessorDetailCursor.GetCurrentBitNo();
1951
1952        if (!PP.getPreprocessingRecord())
1953          PP.createPreprocessingRecord();
1954        if (!PP.getPreprocessingRecord()->getExternalSource())
1955          PP.getPreprocessingRecord()->SetExternalSource(*this);
1956        break;
1957
1958      case SOURCE_MANAGER_BLOCK_ID:
1959        if (ReadSourceManagerBlock(F))
1960          return true;
1961        break;
1962
1963      case SUBMODULE_BLOCK_ID:
1964        if (ReadSubmoduleBlock(F))
1965          return true;
1966        break;
1967
1968      case COMMENTS_BLOCK_ID: {
1969        BitstreamCursor C = Stream;
1970        if (Stream.SkipBlock() ||
1971            ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
1972          Error("malformed comments block in AST file");
1973          return true;
1974        }
1975        CommentsCursors.push_back(std::make_pair(C, &F));
1976        break;
1977      }
1978
1979      default:
1980        if (Stream.SkipBlock()) {
1981          Error("malformed block record in AST file");
1982          return true;
1983        }
1984        break;
1985      }
1986      continue;
1987
1988    case llvm::BitstreamEntry::Record:
1989      // The interesting case.
1990      break;
1991    }
1992
1993    // Read and process a record.
1994    Record.clear();
1995    StringRef Blob;
1996    switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
1997    default:  // Default behavior: ignore.
1998      break;
1999
2000    case TYPE_OFFSET: {
2001      if (F.LocalNumTypes != 0) {
2002        Error("duplicate TYPE_OFFSET record in AST file");
2003        return true;
2004      }
2005      F.TypeOffsets = (const uint32_t *)Blob.data();
2006      F.LocalNumTypes = Record[0];
2007      unsigned LocalBaseTypeIndex = Record[1];
2008      F.BaseTypeIndex = getTotalNumTypes();
2009
2010      if (F.LocalNumTypes > 0) {
2011        // Introduce the global -> local mapping for types within this module.
2012        GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2013
2014        // Introduce the local -> global mapping for types within this module.
2015        F.TypeRemap.insertOrReplace(
2016          std::make_pair(LocalBaseTypeIndex,
2017                         F.BaseTypeIndex - LocalBaseTypeIndex));
2018
2019        TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2020      }
2021      break;
2022    }
2023
2024    case DECL_OFFSET: {
2025      if (F.LocalNumDecls != 0) {
2026        Error("duplicate DECL_OFFSET record in AST file");
2027        return true;
2028      }
2029      F.DeclOffsets = (const DeclOffset *)Blob.data();
2030      F.LocalNumDecls = Record[0];
2031      unsigned LocalBaseDeclID = Record[1];
2032      F.BaseDeclID = getTotalNumDecls();
2033
2034      if (F.LocalNumDecls > 0) {
2035        // Introduce the global -> local mapping for declarations within this
2036        // module.
2037        GlobalDeclMap.insert(
2038          std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2039
2040        // Introduce the local -> global mapping for declarations within this
2041        // module.
2042        F.DeclRemap.insertOrReplace(
2043          std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2044
2045        // Introduce the global -> local mapping for declarations within this
2046        // module.
2047        F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2048
2049        DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2050      }
2051      break;
2052    }
2053
2054    case TU_UPDATE_LEXICAL: {
2055      DeclContext *TU = Context.getTranslationUnitDecl();
2056      DeclContextInfo &Info = F.DeclContextInfos[TU];
2057      Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
2058      Info.NumLexicalDecls
2059        = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
2060      TU->setHasExternalLexicalStorage(true);
2061      break;
2062    }
2063
2064    case UPDATE_VISIBLE: {
2065      unsigned Idx = 0;
2066      serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2067      ASTDeclContextNameLookupTable *Table =
2068        ASTDeclContextNameLookupTable::Create(
2069                        (const unsigned char *)Blob.data() + Record[Idx++],
2070                        (const unsigned char *)Blob.data(),
2071                        ASTDeclContextNameLookupTrait(*this, F));
2072      if (ID == PREDEF_DECL_TRANSLATION_UNIT_ID) { // Is it the TU?
2073        DeclContext *TU = Context.getTranslationUnitDecl();
2074        F.DeclContextInfos[TU].NameLookupTableData = Table;
2075        TU->setHasExternalVisibleStorage(true);
2076      } else
2077        PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2078      break;
2079    }
2080
2081    case IDENTIFIER_TABLE:
2082      F.IdentifierTableData = Blob.data();
2083      if (Record[0]) {
2084        F.IdentifierLookupTable
2085          = ASTIdentifierLookupTable::Create(
2086                       (const unsigned char *)F.IdentifierTableData + Record[0],
2087                       (const unsigned char *)F.IdentifierTableData,
2088                       ASTIdentifierLookupTrait(*this, F));
2089
2090        PP.getIdentifierTable().setExternalIdentifierLookup(this);
2091      }
2092      break;
2093
2094    case IDENTIFIER_OFFSET: {
2095      if (F.LocalNumIdentifiers != 0) {
2096        Error("duplicate IDENTIFIER_OFFSET record in AST file");
2097        return true;
2098      }
2099      F.IdentifierOffsets = (const uint32_t *)Blob.data();
2100      F.LocalNumIdentifiers = Record[0];
2101      unsigned LocalBaseIdentifierID = Record[1];
2102      F.BaseIdentifierID = getTotalNumIdentifiers();
2103
2104      if (F.LocalNumIdentifiers > 0) {
2105        // Introduce the global -> local mapping for identifiers within this
2106        // module.
2107        GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2108                                                  &F));
2109
2110        // Introduce the local -> global mapping for identifiers within this
2111        // module.
2112        F.IdentifierRemap.insertOrReplace(
2113          std::make_pair(LocalBaseIdentifierID,
2114                         F.BaseIdentifierID - LocalBaseIdentifierID));
2115
2116        IdentifiersLoaded.resize(IdentifiersLoaded.size()
2117                                 + F.LocalNumIdentifiers);
2118      }
2119      break;
2120    }
2121
2122    case EXTERNAL_DEFINITIONS:
2123      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2124        ExternalDefinitions.push_back(getGlobalDeclID(F, Record[I]));
2125      break;
2126
2127    case SPECIAL_TYPES:
2128      if (SpecialTypes.empty()) {
2129        for (unsigned I = 0, N = Record.size(); I != N; ++I)
2130          SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2131        break;
2132      }
2133
2134      if (SpecialTypes.size() != Record.size()) {
2135        Error("invalid special-types record");
2136        return true;
2137      }
2138
2139      for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2140        serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2141        if (!SpecialTypes[I])
2142          SpecialTypes[I] = ID;
2143        // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2144        // merge step?
2145      }
2146      break;
2147
2148    case STATISTICS:
2149      TotalNumStatements += Record[0];
2150      TotalNumMacros += Record[1];
2151      TotalLexicalDeclContexts += Record[2];
2152      TotalVisibleDeclContexts += Record[3];
2153      break;
2154
2155    case UNUSED_FILESCOPED_DECLS:
2156      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2157        UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2158      break;
2159
2160    case DELEGATING_CTORS:
2161      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2162        DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2163      break;
2164
2165    case WEAK_UNDECLARED_IDENTIFIERS:
2166      if (Record.size() % 4 != 0) {
2167        Error("invalid weak identifiers record");
2168        return true;
2169      }
2170
2171      // FIXME: Ignore weak undeclared identifiers from non-original PCH
2172      // files. This isn't the way to do it :)
2173      WeakUndeclaredIdentifiers.clear();
2174
2175      // Translate the weak, undeclared identifiers into global IDs.
2176      for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2177        WeakUndeclaredIdentifiers.push_back(
2178          getGlobalIdentifierID(F, Record[I++]));
2179        WeakUndeclaredIdentifiers.push_back(
2180          getGlobalIdentifierID(F, Record[I++]));
2181        WeakUndeclaredIdentifiers.push_back(
2182          ReadSourceLocation(F, Record, I).getRawEncoding());
2183        WeakUndeclaredIdentifiers.push_back(Record[I++]);
2184      }
2185      break;
2186
2187    case LOCALLY_SCOPED_EXTERN_C_DECLS:
2188      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2189        LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
2190      break;
2191
2192    case SELECTOR_OFFSETS: {
2193      F.SelectorOffsets = (const uint32_t *)Blob.data();
2194      F.LocalNumSelectors = Record[0];
2195      unsigned LocalBaseSelectorID = Record[1];
2196      F.BaseSelectorID = getTotalNumSelectors();
2197
2198      if (F.LocalNumSelectors > 0) {
2199        // Introduce the global -> local mapping for selectors within this
2200        // module.
2201        GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2202
2203        // Introduce the local -> global mapping for selectors within this
2204        // module.
2205        F.SelectorRemap.insertOrReplace(
2206          std::make_pair(LocalBaseSelectorID,
2207                         F.BaseSelectorID - LocalBaseSelectorID));
2208
2209        SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2210      }
2211      break;
2212    }
2213
2214    case METHOD_POOL:
2215      F.SelectorLookupTableData = (const unsigned char *)Blob.data();
2216      if (Record[0])
2217        F.SelectorLookupTable
2218          = ASTSelectorLookupTable::Create(
2219                        F.SelectorLookupTableData + Record[0],
2220                        F.SelectorLookupTableData,
2221                        ASTSelectorLookupTrait(*this, F));
2222      TotalNumMethodPoolEntries += Record[1];
2223      break;
2224
2225    case REFERENCED_SELECTOR_POOL:
2226      if (!Record.empty()) {
2227        for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2228          ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2229                                                                Record[Idx++]));
2230          ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2231                                              getRawEncoding());
2232        }
2233      }
2234      break;
2235
2236    case PP_COUNTER_VALUE:
2237      if (!Record.empty() && Listener)
2238        Listener->ReadCounter(F, Record[0]);
2239      break;
2240
2241    case FILE_SORTED_DECLS:
2242      F.FileSortedDecls = (const DeclID *)Blob.data();
2243      F.NumFileSortedDecls = Record[0];
2244      break;
2245
2246    case SOURCE_LOCATION_OFFSETS: {
2247      F.SLocEntryOffsets = (const uint32_t *)Blob.data();
2248      F.LocalNumSLocEntries = Record[0];
2249      unsigned SLocSpaceSize = Record[1];
2250      llvm::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2251          SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2252                                              SLocSpaceSize);
2253      // Make our entry in the range map. BaseID is negative and growing, so
2254      // we invert it. Because we invert it, though, we need the other end of
2255      // the range.
2256      unsigned RangeStart =
2257          unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2258      GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2259      F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2260
2261      // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2262      assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2263      GlobalSLocOffsetMap.insert(
2264          std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2265                           - SLocSpaceSize,&F));
2266
2267      // Initialize the remapping table.
2268      // Invalid stays invalid.
2269      F.SLocRemap.insert(std::make_pair(0U, 0));
2270      // This module. Base was 2 when being compiled.
2271      F.SLocRemap.insert(std::make_pair(2U,
2272                                  static_cast<int>(F.SLocEntryBaseOffset - 2)));
2273
2274      TotalNumSLocEntries += F.LocalNumSLocEntries;
2275      break;
2276    }
2277
2278    case MODULE_OFFSET_MAP: {
2279      // Additional remapping information.
2280      const unsigned char *Data = (const unsigned char*)Blob.data();
2281      const unsigned char *DataEnd = Data + Blob.size();
2282
2283      // Continuous range maps we may be updating in our module.
2284      ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
2285      ContinuousRangeMap<uint32_t, int, 2>::Builder
2286        IdentifierRemap(F.IdentifierRemap);
2287      ContinuousRangeMap<uint32_t, int, 2>::Builder
2288        MacroRemap(F.MacroRemap);
2289      ContinuousRangeMap<uint32_t, int, 2>::Builder
2290        PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2291      ContinuousRangeMap<uint32_t, int, 2>::Builder
2292        SubmoduleRemap(F.SubmoduleRemap);
2293      ContinuousRangeMap<uint32_t, int, 2>::Builder
2294        SelectorRemap(F.SelectorRemap);
2295      ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2296      ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2297
2298      while(Data < DataEnd) {
2299        uint16_t Len = io::ReadUnalignedLE16(Data);
2300        StringRef Name = StringRef((const char*)Data, Len);
2301        Data += Len;
2302        ModuleFile *OM = ModuleMgr.lookup(Name);
2303        if (!OM) {
2304          Error("SourceLocation remap refers to unknown module");
2305          return true;
2306        }
2307
2308        uint32_t SLocOffset = io::ReadUnalignedLE32(Data);
2309        uint32_t IdentifierIDOffset = io::ReadUnalignedLE32(Data);
2310        uint32_t MacroIDOffset = io::ReadUnalignedLE32(Data);
2311        uint32_t PreprocessedEntityIDOffset = io::ReadUnalignedLE32(Data);
2312        uint32_t SubmoduleIDOffset = io::ReadUnalignedLE32(Data);
2313        uint32_t SelectorIDOffset = io::ReadUnalignedLE32(Data);
2314        uint32_t DeclIDOffset = io::ReadUnalignedLE32(Data);
2315        uint32_t TypeIndexOffset = io::ReadUnalignedLE32(Data);
2316
2317        // Source location offset is mapped to OM->SLocEntryBaseOffset.
2318        SLocRemap.insert(std::make_pair(SLocOffset,
2319          static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
2320        IdentifierRemap.insert(
2321          std::make_pair(IdentifierIDOffset,
2322                         OM->BaseIdentifierID - IdentifierIDOffset));
2323        MacroRemap.insert(std::make_pair(MacroIDOffset,
2324                                         OM->BaseMacroID - MacroIDOffset));
2325        PreprocessedEntityRemap.insert(
2326          std::make_pair(PreprocessedEntityIDOffset,
2327            OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
2328        SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
2329                                      OM->BaseSubmoduleID - SubmoduleIDOffset));
2330        SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2331                               OM->BaseSelectorID - SelectorIDOffset));
2332        DeclRemap.insert(std::make_pair(DeclIDOffset,
2333                                        OM->BaseDeclID - DeclIDOffset));
2334
2335        TypeRemap.insert(std::make_pair(TypeIndexOffset,
2336                                    OM->BaseTypeIndex - TypeIndexOffset));
2337
2338        // Global -> local mappings.
2339        F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2340      }
2341      break;
2342    }
2343
2344    case SOURCE_MANAGER_LINE_TABLE:
2345      if (ParseLineTable(F, Record))
2346        return true;
2347      break;
2348
2349    case SOURCE_LOCATION_PRELOADS: {
2350      // Need to transform from the local view (1-based IDs) to the global view,
2351      // which is based off F.SLocEntryBaseID.
2352      if (!F.PreloadSLocEntries.empty()) {
2353        Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2354        return true;
2355      }
2356
2357      F.PreloadSLocEntries.swap(Record);
2358      break;
2359    }
2360
2361    case EXT_VECTOR_DECLS:
2362      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2363        ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2364      break;
2365
2366    case VTABLE_USES:
2367      if (Record.size() % 3 != 0) {
2368        Error("Invalid VTABLE_USES record");
2369        return true;
2370      }
2371
2372      // Later tables overwrite earlier ones.
2373      // FIXME: Modules will have some trouble with this. This is clearly not
2374      // the right way to do this.
2375      VTableUses.clear();
2376
2377      for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
2378        VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
2379        VTableUses.push_back(
2380          ReadSourceLocation(F, Record, Idx).getRawEncoding());
2381        VTableUses.push_back(Record[Idx++]);
2382      }
2383      break;
2384
2385    case DYNAMIC_CLASSES:
2386      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2387        DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
2388      break;
2389
2390    case PENDING_IMPLICIT_INSTANTIATIONS:
2391      if (PendingInstantiations.size() % 2 != 0) {
2392        Error("Invalid existing PendingInstantiations");
2393        return true;
2394      }
2395
2396      if (Record.size() % 2 != 0) {
2397        Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
2398        return true;
2399      }
2400
2401      for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2402        PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
2403        PendingInstantiations.push_back(
2404          ReadSourceLocation(F, Record, I).getRawEncoding());
2405      }
2406      break;
2407
2408    case SEMA_DECL_REFS:
2409      // Later tables overwrite earlier ones.
2410      // FIXME: Modules will have some trouble with this.
2411      SemaDeclRefs.clear();
2412      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2413        SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2414      break;
2415
2416    case PPD_ENTITIES_OFFSETS: {
2417      F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
2418      assert(Blob.size() % sizeof(PPEntityOffset) == 0);
2419      F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
2420
2421      unsigned LocalBasePreprocessedEntityID = Record[0];
2422
2423      unsigned StartingID;
2424      if (!PP.getPreprocessingRecord())
2425        PP.createPreprocessingRecord();
2426      if (!PP.getPreprocessingRecord()->getExternalSource())
2427        PP.getPreprocessingRecord()->SetExternalSource(*this);
2428      StartingID
2429        = PP.getPreprocessingRecord()
2430            ->allocateLoadedEntities(F.NumPreprocessedEntities);
2431      F.BasePreprocessedEntityID = StartingID;
2432
2433      if (F.NumPreprocessedEntities > 0) {
2434        // Introduce the global -> local mapping for preprocessed entities in
2435        // this module.
2436        GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
2437
2438        // Introduce the local -> global mapping for preprocessed entities in
2439        // this module.
2440        F.PreprocessedEntityRemap.insertOrReplace(
2441          std::make_pair(LocalBasePreprocessedEntityID,
2442            F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
2443      }
2444
2445      break;
2446    }
2447
2448    case DECL_UPDATE_OFFSETS: {
2449      if (Record.size() % 2 != 0) {
2450        Error("invalid DECL_UPDATE_OFFSETS block in AST file");
2451        return true;
2452      }
2453      for (unsigned I = 0, N = Record.size(); I != N; I += 2)
2454        DeclUpdateOffsets[getGlobalDeclID(F, Record[I])]
2455          .push_back(std::make_pair(&F, Record[I+1]));
2456      break;
2457    }
2458
2459    case DECL_REPLACEMENTS: {
2460      if (Record.size() % 3 != 0) {
2461        Error("invalid DECL_REPLACEMENTS block in AST file");
2462        return true;
2463      }
2464      for (unsigned I = 0, N = Record.size(); I != N; I += 3)
2465        ReplacedDecls[getGlobalDeclID(F, Record[I])]
2466          = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
2467      break;
2468    }
2469
2470    case OBJC_CATEGORIES_MAP: {
2471      if (F.LocalNumObjCCategoriesInMap != 0) {
2472        Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
2473        return true;
2474      }
2475
2476      F.LocalNumObjCCategoriesInMap = Record[0];
2477      F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
2478      break;
2479    }
2480
2481    case OBJC_CATEGORIES:
2482      F.ObjCCategories.swap(Record);
2483      break;
2484
2485    case CXX_BASE_SPECIFIER_OFFSETS: {
2486      if (F.LocalNumCXXBaseSpecifiers != 0) {
2487        Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
2488        return true;
2489      }
2490
2491      F.LocalNumCXXBaseSpecifiers = Record[0];
2492      F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
2493      NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
2494      break;
2495    }
2496
2497    case DIAG_PRAGMA_MAPPINGS:
2498      if (F.PragmaDiagMappings.empty())
2499        F.PragmaDiagMappings.swap(Record);
2500      else
2501        F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
2502                                    Record.begin(), Record.end());
2503      break;
2504
2505    case CUDA_SPECIAL_DECL_REFS:
2506      // Later tables overwrite earlier ones.
2507      // FIXME: Modules will have trouble with this.
2508      CUDASpecialDeclRefs.clear();
2509      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2510        CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2511      break;
2512
2513    case HEADER_SEARCH_TABLE: {
2514      F.HeaderFileInfoTableData = Blob.data();
2515      F.LocalNumHeaderFileInfos = Record[1];
2516      if (Record[0]) {
2517        F.HeaderFileInfoTable
2518          = HeaderFileInfoLookupTable::Create(
2519                   (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
2520                   (const unsigned char *)F.HeaderFileInfoTableData,
2521                   HeaderFileInfoTrait(*this, F,
2522                                       &PP.getHeaderSearchInfo(),
2523                                       Blob.data() + Record[2]));
2524
2525        PP.getHeaderSearchInfo().SetExternalSource(this);
2526        if (!PP.getHeaderSearchInfo().getExternalLookup())
2527          PP.getHeaderSearchInfo().SetExternalLookup(this);
2528      }
2529      break;
2530    }
2531
2532    case FP_PRAGMA_OPTIONS:
2533      // Later tables overwrite earlier ones.
2534      FPPragmaOptions.swap(Record);
2535      break;
2536
2537    case OPENCL_EXTENSIONS:
2538      // Later tables overwrite earlier ones.
2539      OpenCLExtensions.swap(Record);
2540      break;
2541
2542    case TENTATIVE_DEFINITIONS:
2543      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2544        TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
2545      break;
2546
2547    case KNOWN_NAMESPACES:
2548      for (unsigned I = 0, N = Record.size(); I != N; ++I)
2549        KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
2550      break;
2551
2552    case UNDEFINED_BUT_USED:
2553      if (UndefinedButUsed.size() % 2 != 0) {
2554        Error("Invalid existing UndefinedButUsed");
2555        return true;
2556      }
2557
2558      if (Record.size() % 2 != 0) {
2559        Error("invalid undefined-but-used record");
2560        return true;
2561      }
2562      for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2563        UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
2564        UndefinedButUsed.push_back(
2565            ReadSourceLocation(F, Record, I).getRawEncoding());
2566      }
2567      break;
2568
2569    case IMPORTED_MODULES: {
2570      if (F.Kind != MK_Module) {
2571        // If we aren't loading a module (which has its own exports), make
2572        // all of the imported modules visible.
2573        // FIXME: Deal with macros-only imports.
2574        for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2575          if (unsigned GlobalID = getGlobalSubmoduleID(F, Record[I]))
2576            ImportedModules.push_back(GlobalID);
2577        }
2578      }
2579      break;
2580    }
2581
2582    case LOCAL_REDECLARATIONS: {
2583      F.RedeclarationChains.swap(Record);
2584      break;
2585    }
2586
2587    case LOCAL_REDECLARATIONS_MAP: {
2588      if (F.LocalNumRedeclarationsInMap != 0) {
2589        Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
2590        return true;
2591      }
2592
2593      F.LocalNumRedeclarationsInMap = Record[0];
2594      F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
2595      break;
2596    }
2597
2598    case MERGED_DECLARATIONS: {
2599      for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
2600        GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
2601        SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
2602        for (unsigned N = Record[Idx++]; N > 0; --N)
2603          Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
2604      }
2605      break;
2606    }
2607
2608    case MACRO_OFFSET: {
2609      if (F.LocalNumMacros != 0) {
2610        Error("duplicate MACRO_OFFSET record in AST file");
2611        return true;
2612      }
2613      F.MacroOffsets = (const uint32_t *)Blob.data();
2614      F.LocalNumMacros = Record[0];
2615      unsigned LocalBaseMacroID = Record[1];
2616      F.BaseMacroID = getTotalNumMacros();
2617
2618      if (F.LocalNumMacros > 0) {
2619        // Introduce the global -> local mapping for macros within this module.
2620        GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
2621
2622        // Introduce the local -> global mapping for macros within this module.
2623        F.MacroRemap.insertOrReplace(
2624          std::make_pair(LocalBaseMacroID,
2625                         F.BaseMacroID - LocalBaseMacroID));
2626
2627        MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
2628      }
2629      break;
2630    }
2631
2632    case MACRO_UPDATES: {
2633      for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2634        MacroID ID = getGlobalMacroID(F, Record[I++]);
2635        if (I == N)
2636          break;
2637
2638        SourceLocation UndefLoc = ReadSourceLocation(F, Record, I);
2639        SubmoduleID SubmoduleID = getGlobalSubmoduleID(F, Record[I++]);;
2640        MacroUpdate Update;
2641        Update.UndefLoc = UndefLoc;
2642        MacroUpdates[ID].push_back(std::make_pair(SubmoduleID, Update));
2643      }
2644      break;
2645    }
2646    }
2647  }
2648}
2649
2650/// \brief Move the given method to the back of the global list of methods.
2651static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
2652  // Find the entry for this selector in the method pool.
2653  Sema::GlobalMethodPool::iterator Known
2654    = S.MethodPool.find(Method->getSelector());
2655  if (Known == S.MethodPool.end())
2656    return;
2657
2658  // Retrieve the appropriate method list.
2659  ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
2660                                                    : Known->second.second;
2661  bool Found = false;
2662  for (ObjCMethodList *List = &Start; List; List = List->Next) {
2663    if (!Found) {
2664      if (List->Method == Method) {
2665        Found = true;
2666      } else {
2667        // Keep searching.
2668        continue;
2669      }
2670    }
2671
2672    if (List->Next)
2673      List->Method = List->Next->Method;
2674    else
2675      List->Method = Method;
2676  }
2677}
2678
2679void ASTReader::makeNamesVisible(const HiddenNames &Names) {
2680  for (unsigned I = 0, N = Names.size(); I != N; ++I) {
2681    switch (Names[I].getKind()) {
2682    case HiddenName::Declaration: {
2683      Decl *D = Names[I].getDecl();
2684      bool wasHidden = D->Hidden;
2685      D->Hidden = false;
2686
2687      if (wasHidden && SemaObj) {
2688        if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
2689          moveMethodToBackOfGlobalList(*SemaObj, Method);
2690        }
2691      }
2692      break;
2693    }
2694    case HiddenName::MacroVisibility: {
2695      std::pair<IdentifierInfo *, MacroDirective *> Macro = Names[I].getMacro();
2696      Macro.second->setHidden(!Macro.second->isPublic());
2697      if (Macro.second->isDefined()) {
2698        PP.makeLoadedMacroInfoVisible(Macro.first, Macro.second);
2699      }
2700      break;
2701    }
2702
2703    case HiddenName::MacroUndef: {
2704      std::pair<IdentifierInfo *, MacroDirective *> Macro = Names[I].getMacro();
2705      if (Macro.second->isDefined()) {
2706        Macro.second->setUndefLoc(Names[I].getMacroUndefLoc());
2707        if (PPMutationListener *Listener = PP.getPPMutationListener())
2708          Listener->UndefinedMacro(Macro.second);
2709        PP.makeLoadedMacroInfoVisible(Macro.first, Macro.second);
2710      }
2711      break;
2712    }
2713    }
2714  }
2715}
2716
2717void ASTReader::makeModuleVisible(Module *Mod,
2718                                  Module::NameVisibilityKind NameVisibility,
2719                                  SourceLocation ImportLoc,
2720                                  bool Complain) {
2721  llvm::SmallPtrSet<Module *, 4> Visited;
2722  SmallVector<Module *, 4> Stack;
2723  Stack.push_back(Mod);
2724  while (!Stack.empty()) {
2725    Mod = Stack.back();
2726    Stack.pop_back();
2727
2728    if (NameVisibility <= Mod->NameVisibility) {
2729      // This module already has this level of visibility (or greater), so
2730      // there is nothing more to do.
2731      continue;
2732    }
2733
2734    if (!Mod->isAvailable()) {
2735      // Modules that aren't available cannot be made visible.
2736      continue;
2737    }
2738
2739    // Update the module's name visibility.
2740    Mod->NameVisibility = NameVisibility;
2741
2742    // If we've already deserialized any names from this module,
2743    // mark them as visible.
2744    HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
2745    if (Hidden != HiddenNamesMap.end()) {
2746      makeNamesVisible(Hidden->second);
2747      HiddenNamesMap.erase(Hidden);
2748    }
2749
2750    // Push any non-explicit submodules onto the stack to be marked as
2751    // visible.
2752    for (Module::submodule_iterator Sub = Mod->submodule_begin(),
2753                                 SubEnd = Mod->submodule_end();
2754         Sub != SubEnd; ++Sub) {
2755      if (!(*Sub)->IsExplicit && Visited.insert(*Sub))
2756        Stack.push_back(*Sub);
2757    }
2758
2759    // Push any exported modules onto the stack to be marked as visible.
2760    SmallVector<Module *, 16> Exports;
2761    Mod->getExportedModules(Exports);
2762    for (SmallVectorImpl<Module *>::iterator
2763           I = Exports.begin(), E = Exports.end(); I != E; ++I) {
2764      Module *Exported = *I;
2765      if (Visited.insert(Exported))
2766        Stack.push_back(Exported);
2767    }
2768
2769    // Detect any conflicts.
2770    if (Complain) {
2771      assert(ImportLoc.isValid() && "Missing import location");
2772      for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
2773        if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
2774          Diag(ImportLoc, diag::warn_module_conflict)
2775            << Mod->getFullModuleName()
2776            << Mod->Conflicts[I].Other->getFullModuleName()
2777            << Mod->Conflicts[I].Message;
2778          // FIXME: Need note where the other module was imported.
2779        }
2780      }
2781    }
2782  }
2783}
2784
2785bool ASTReader::loadGlobalIndex() {
2786  if (GlobalIndex)
2787    return false;
2788
2789  if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
2790      !Context.getLangOpts().Modules)
2791    return true;
2792
2793  // Try to load the global index.
2794  TriedLoadingGlobalIndex = true;
2795  StringRef ModuleCachePath
2796    = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
2797  std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
2798    = GlobalModuleIndex::readIndex(ModuleCachePath);
2799  if (!Result.first)
2800    return true;
2801
2802  GlobalIndex.reset(Result.first);
2803  ModuleMgr.setGlobalIndex(GlobalIndex.get());
2804  return false;
2805}
2806
2807bool ASTReader::isGlobalIndexUnavailable() const {
2808  return Context.getLangOpts().Modules && UseGlobalIndex &&
2809         !hasGlobalIndex() && TriedLoadingGlobalIndex;
2810}
2811
2812ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
2813                                            ModuleKind Type,
2814                                            SourceLocation ImportLoc,
2815                                            unsigned ClientLoadCapabilities) {
2816  // Bump the generation number.
2817  unsigned PreviousGeneration = CurrentGeneration++;
2818
2819  unsigned NumModules = ModuleMgr.size();
2820  SmallVector<ImportedModule, 4> Loaded;
2821  switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
2822                                                /*ImportedBy=*/0, Loaded,
2823                                                0, 0,
2824                                                ClientLoadCapabilities)) {
2825  case Failure:
2826  case Missing:
2827  case OutOfDate:
2828  case VersionMismatch:
2829  case ConfigurationMismatch:
2830  case HadErrors:
2831    ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
2832                            Context.getLangOpts().Modules
2833                              ? &PP.getHeaderSearchInfo().getModuleMap()
2834                              : 0);
2835
2836    // If we find that any modules are unusable, the global index is going
2837    // to be out-of-date. Just remove it.
2838    GlobalIndex.reset();
2839    ModuleMgr.setGlobalIndex(0);
2840    return ReadResult;
2841
2842  case Success:
2843    break;
2844  }
2845
2846  // Here comes stuff that we only do once the entire chain is loaded.
2847
2848  // Load the AST blocks of all of the modules that we loaded.
2849  for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
2850                                              MEnd = Loaded.end();
2851       M != MEnd; ++M) {
2852    ModuleFile &F = *M->Mod;
2853
2854    // Read the AST block.
2855    if (ReadASTBlock(F))
2856      return Failure;
2857
2858    // Once read, set the ModuleFile bit base offset and update the size in
2859    // bits of all files we've seen.
2860    F.GlobalBitOffset = TotalModulesSizeInBits;
2861    TotalModulesSizeInBits += F.SizeInBits;
2862    GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
2863
2864    // Preload SLocEntries.
2865    for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
2866      int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
2867      // Load it through the SourceManager and don't call ReadSLocEntry()
2868      // directly because the entry may have already been loaded in which case
2869      // calling ReadSLocEntry() directly would trigger an assertion in
2870      // SourceManager.
2871      SourceMgr.getLoadedSLocEntryByID(Index);
2872    }
2873  }
2874
2875  // Setup the import locations.
2876  for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
2877                                              MEnd = Loaded.end();
2878       M != MEnd; ++M) {
2879    ModuleFile &F = *M->Mod;
2880    F.DirectImportLoc = ImportLoc;
2881    if (!M->ImportedBy)
2882      F.ImportLoc = M->ImportLoc;
2883    else
2884      F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
2885                                       M->ImportLoc.getRawEncoding());
2886  }
2887
2888  // Mark all of the identifiers in the identifier table as being out of date,
2889  // so that various accessors know to check the loaded modules when the
2890  // identifier is used.
2891  for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
2892                              IdEnd = PP.getIdentifierTable().end();
2893       Id != IdEnd; ++Id)
2894    Id->second->setOutOfDate(true);
2895
2896  // Resolve any unresolved module exports.
2897  for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
2898    UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
2899    SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
2900    Module *ResolvedMod = getSubmodule(GlobalID);
2901
2902    switch (Unresolved.Kind) {
2903    case UnresolvedModuleRef::Conflict:
2904      if (ResolvedMod) {
2905        Module::Conflict Conflict;
2906        Conflict.Other = ResolvedMod;
2907        Conflict.Message = Unresolved.String.str();
2908        Unresolved.Mod->Conflicts.push_back(Conflict);
2909      }
2910      continue;
2911
2912    case UnresolvedModuleRef::Import:
2913      if (ResolvedMod)
2914        Unresolved.Mod->Imports.push_back(ResolvedMod);
2915      continue;
2916
2917    case UnresolvedModuleRef::Export:
2918      if (ResolvedMod || Unresolved.IsWildcard)
2919        Unresolved.Mod->Exports.push_back(
2920          Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
2921      continue;
2922    }
2923  }
2924  UnresolvedModuleRefs.clear();
2925
2926  InitializeContext();
2927
2928  if (DeserializationListener)
2929    DeserializationListener->ReaderInitialized(this);
2930
2931  ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
2932  if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
2933    PrimaryModule.OriginalSourceFileID
2934      = FileID::get(PrimaryModule.SLocEntryBaseID
2935                    + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
2936
2937    // If this AST file is a precompiled preamble, then set the
2938    // preamble file ID of the source manager to the file source file
2939    // from which the preamble was built.
2940    if (Type == MK_Preamble) {
2941      SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
2942    } else if (Type == MK_MainFile) {
2943      SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
2944    }
2945  }
2946
2947  // For any Objective-C class definitions we have already loaded, make sure
2948  // that we load any additional categories.
2949  for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
2950    loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
2951                       ObjCClassesLoaded[I],
2952                       PreviousGeneration);
2953  }
2954
2955  return Success;
2956}
2957
2958ASTReader::ASTReadResult
2959ASTReader::ReadASTCore(StringRef FileName,
2960                       ModuleKind Type,
2961                       SourceLocation ImportLoc,
2962                       ModuleFile *ImportedBy,
2963                       SmallVectorImpl<ImportedModule> &Loaded,
2964                       off_t ExpectedSize, time_t ExpectedModTime,
2965                       unsigned ClientLoadCapabilities) {
2966  ModuleFile *M;
2967  std::string ErrorStr;
2968  ModuleManager::AddModuleResult AddResult
2969    = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
2970                          CurrentGeneration, ExpectedSize, ExpectedModTime,
2971                          M, ErrorStr);
2972
2973  switch (AddResult) {
2974  case ModuleManager::AlreadyLoaded:
2975    return Success;
2976
2977  case ModuleManager::NewlyLoaded:
2978    // Load module file below.
2979    break;
2980
2981  case ModuleManager::Missing:
2982    // The module file was missing; if the client handle handle, that, return
2983    // it.
2984    if (ClientLoadCapabilities & ARR_Missing)
2985      return Missing;
2986
2987    // Otherwise, return an error.
2988    {
2989      std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
2990                      + ErrorStr;
2991      Error(Msg);
2992    }
2993    return Failure;
2994
2995  case ModuleManager::OutOfDate:
2996    // We couldn't load the module file because it is out-of-date. If the
2997    // client can handle out-of-date, return it.
2998    if (ClientLoadCapabilities & ARR_OutOfDate)
2999      return OutOfDate;
3000
3001    // Otherwise, return an error.
3002    {
3003      std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3004                      + ErrorStr;
3005      Error(Msg);
3006    }
3007    return Failure;
3008  }
3009
3010  assert(M && "Missing module file");
3011
3012  // FIXME: This seems rather a hack. Should CurrentDir be part of the
3013  // module?
3014  if (FileName != "-") {
3015    CurrentDir = llvm::sys::path::parent_path(FileName);
3016    if (CurrentDir.empty()) CurrentDir = ".";
3017  }
3018
3019  ModuleFile &F = *M;
3020  BitstreamCursor &Stream = F.Stream;
3021  Stream.init(F.StreamFile);
3022  F.SizeInBits = F.Buffer->getBufferSize() * 8;
3023
3024  // Sniff for the signature.
3025  if (Stream.Read(8) != 'C' ||
3026      Stream.Read(8) != 'P' ||
3027      Stream.Read(8) != 'C' ||
3028      Stream.Read(8) != 'H') {
3029    Diag(diag::err_not_a_pch_file) << FileName;
3030    return Failure;
3031  }
3032
3033  // This is used for compatibility with older PCH formats.
3034  bool HaveReadControlBlock = false;
3035
3036  while (1) {
3037    llvm::BitstreamEntry Entry = Stream.advance();
3038
3039    switch (Entry.Kind) {
3040    case llvm::BitstreamEntry::Error:
3041    case llvm::BitstreamEntry::EndBlock:
3042    case llvm::BitstreamEntry::Record:
3043      Error("invalid record at top-level of AST file");
3044      return Failure;
3045
3046    case llvm::BitstreamEntry::SubBlock:
3047      break;
3048    }
3049
3050    // We only know the control subblock ID.
3051    switch (Entry.ID) {
3052    case llvm::bitc::BLOCKINFO_BLOCK_ID:
3053      if (Stream.ReadBlockInfoBlock()) {
3054        Error("malformed BlockInfoBlock in AST file");
3055        return Failure;
3056      }
3057      break;
3058    case CONTROL_BLOCK_ID:
3059      HaveReadControlBlock = true;
3060      switch (ReadControlBlock(F, Loaded, ClientLoadCapabilities)) {
3061      case Success:
3062        break;
3063
3064      case Failure: return Failure;
3065      case Missing: return Missing;
3066      case OutOfDate: return OutOfDate;
3067      case VersionMismatch: return VersionMismatch;
3068      case ConfigurationMismatch: return ConfigurationMismatch;
3069      case HadErrors: return HadErrors;
3070      }
3071      break;
3072    case AST_BLOCK_ID:
3073      if (!HaveReadControlBlock) {
3074        if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3075          Diag(diag::warn_pch_version_too_old);
3076        return VersionMismatch;
3077      }
3078
3079      // Record that we've loaded this module.
3080      Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3081      return Success;
3082
3083    default:
3084      if (Stream.SkipBlock()) {
3085        Error("malformed block record in AST file");
3086        return Failure;
3087      }
3088      break;
3089    }
3090  }
3091
3092  return Success;
3093}
3094
3095void ASTReader::InitializeContext() {
3096  // If there's a listener, notify them that we "read" the translation unit.
3097  if (DeserializationListener)
3098    DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3099                                      Context.getTranslationUnitDecl());
3100
3101  // Make sure we load the declaration update records for the translation unit,
3102  // if there are any.
3103  loadDeclUpdateRecords(PREDEF_DECL_TRANSLATION_UNIT_ID,
3104                        Context.getTranslationUnitDecl());
3105
3106  // FIXME: Find a better way to deal with collisions between these
3107  // built-in types. Right now, we just ignore the problem.
3108
3109  // Load the special types.
3110  if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3111    if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3112      if (!Context.CFConstantStringTypeDecl)
3113        Context.setCFConstantStringType(GetType(String));
3114    }
3115
3116    if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3117      QualType FileType = GetType(File);
3118      if (FileType.isNull()) {
3119        Error("FILE type is NULL");
3120        return;
3121      }
3122
3123      if (!Context.FILEDecl) {
3124        if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3125          Context.setFILEDecl(Typedef->getDecl());
3126        else {
3127          const TagType *Tag = FileType->getAs<TagType>();
3128          if (!Tag) {
3129            Error("Invalid FILE type in AST file");
3130            return;
3131          }
3132          Context.setFILEDecl(Tag->getDecl());
3133        }
3134      }
3135    }
3136
3137    if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3138      QualType Jmp_bufType = GetType(Jmp_buf);
3139      if (Jmp_bufType.isNull()) {
3140        Error("jmp_buf type is NULL");
3141        return;
3142      }
3143
3144      if (!Context.jmp_bufDecl) {
3145        if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3146          Context.setjmp_bufDecl(Typedef->getDecl());
3147        else {
3148          const TagType *Tag = Jmp_bufType->getAs<TagType>();
3149          if (!Tag) {
3150            Error("Invalid jmp_buf type in AST file");
3151            return;
3152          }
3153          Context.setjmp_bufDecl(Tag->getDecl());
3154        }
3155      }
3156    }
3157
3158    if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3159      QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3160      if (Sigjmp_bufType.isNull()) {
3161        Error("sigjmp_buf type is NULL");
3162        return;
3163      }
3164
3165      if (!Context.sigjmp_bufDecl) {
3166        if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3167          Context.setsigjmp_bufDecl(Typedef->getDecl());
3168        else {
3169          const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3170          assert(Tag && "Invalid sigjmp_buf type in AST file");
3171          Context.setsigjmp_bufDecl(Tag->getDecl());
3172        }
3173      }
3174    }
3175
3176    if (unsigned ObjCIdRedef
3177          = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3178      if (Context.ObjCIdRedefinitionType.isNull())
3179        Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3180    }
3181
3182    if (unsigned ObjCClassRedef
3183          = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3184      if (Context.ObjCClassRedefinitionType.isNull())
3185        Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3186    }
3187
3188    if (unsigned ObjCSelRedef
3189          = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3190      if (Context.ObjCSelRedefinitionType.isNull())
3191        Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3192    }
3193
3194    if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3195      QualType Ucontext_tType = GetType(Ucontext_t);
3196      if (Ucontext_tType.isNull()) {
3197        Error("ucontext_t type is NULL");
3198        return;
3199      }
3200
3201      if (!Context.ucontext_tDecl) {
3202        if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3203          Context.setucontext_tDecl(Typedef->getDecl());
3204        else {
3205          const TagType *Tag = Ucontext_tType->getAs<TagType>();
3206          assert(Tag && "Invalid ucontext_t type in AST file");
3207          Context.setucontext_tDecl(Tag->getDecl());
3208        }
3209      }
3210    }
3211  }
3212
3213  ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3214
3215  // If there were any CUDA special declarations, deserialize them.
3216  if (!CUDASpecialDeclRefs.empty()) {
3217    assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3218    Context.setcudaConfigureCallDecl(
3219                           cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3220  }
3221
3222  // Re-export any modules that were imported by a non-module AST file.
3223  for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) {
3224    if (Module *Imported = getSubmodule(ImportedModules[I]))
3225      makeModuleVisible(Imported, Module::AllVisible,
3226                        /*ImportLoc=*/SourceLocation(),
3227                        /*Complain=*/false);
3228  }
3229  ImportedModules.clear();
3230}
3231
3232void ASTReader::finalizeForWriting() {
3233  for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(),
3234                                 HiddenEnd = HiddenNamesMap.end();
3235       Hidden != HiddenEnd; ++Hidden) {
3236    makeNamesVisible(Hidden->second);
3237  }
3238  HiddenNamesMap.clear();
3239}
3240
3241/// SkipCursorToControlBlock - Given a cursor at the start of an AST file, scan
3242/// ahead and drop the cursor into the start of the CONTROL_BLOCK, returning
3243/// false on success and true on failure.
3244static bool SkipCursorToControlBlock(BitstreamCursor &Cursor) {
3245  while (1) {
3246    llvm::BitstreamEntry Entry = Cursor.advance();
3247    switch (Entry.Kind) {
3248    case llvm::BitstreamEntry::Error:
3249    case llvm::BitstreamEntry::EndBlock:
3250      return true;
3251
3252    case llvm::BitstreamEntry::Record:
3253      // Ignore top-level records.
3254      Cursor.skipRecord(Entry.ID);
3255      break;
3256
3257    case llvm::BitstreamEntry::SubBlock:
3258      if (Entry.ID == CONTROL_BLOCK_ID) {
3259        if (Cursor.EnterSubBlock(CONTROL_BLOCK_ID))
3260          return true;
3261        // Found it!
3262        return false;
3263      }
3264
3265      if (Cursor.SkipBlock())
3266        return true;
3267    }
3268  }
3269}
3270
3271/// \brief Retrieve the name of the original source file name
3272/// directly from the AST file, without actually loading the AST
3273/// file.
3274std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3275                                             FileManager &FileMgr,
3276                                             DiagnosticsEngine &Diags) {
3277  // Open the AST file.
3278  std::string ErrStr;
3279  OwningPtr<llvm::MemoryBuffer> Buffer;
3280  Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
3281  if (!Buffer) {
3282    Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
3283    return std::string();
3284  }
3285
3286  // Initialize the stream
3287  llvm::BitstreamReader StreamFile;
3288  BitstreamCursor Stream;
3289  StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3290                  (const unsigned char *)Buffer->getBufferEnd());
3291  Stream.init(StreamFile);
3292
3293  // Sniff for the signature.
3294  if (Stream.Read(8) != 'C' ||
3295      Stream.Read(8) != 'P' ||
3296      Stream.Read(8) != 'C' ||
3297      Stream.Read(8) != 'H') {
3298    Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3299    return std::string();
3300  }
3301
3302  // Scan for the CONTROL_BLOCK_ID block.
3303  if (SkipCursorToControlBlock(Stream)) {
3304    Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3305    return std::string();
3306  }
3307
3308  // Scan for ORIGINAL_FILE inside the control block.
3309  RecordData Record;
3310  while (1) {
3311    llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3312    if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3313      return std::string();
3314
3315    if (Entry.Kind != llvm::BitstreamEntry::Record) {
3316      Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3317      return std::string();
3318    }
3319
3320    Record.clear();
3321    StringRef Blob;
3322    if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
3323      return Blob.str();
3324  }
3325}
3326
3327namespace {
3328  class SimplePCHValidator : public ASTReaderListener {
3329    const LangOptions &ExistingLangOpts;
3330    const TargetOptions &ExistingTargetOpts;
3331    const PreprocessorOptions &ExistingPPOpts;
3332    FileManager &FileMgr;
3333
3334  public:
3335    SimplePCHValidator(const LangOptions &ExistingLangOpts,
3336                       const TargetOptions &ExistingTargetOpts,
3337                       const PreprocessorOptions &ExistingPPOpts,
3338                       FileManager &FileMgr)
3339      : ExistingLangOpts(ExistingLangOpts),
3340        ExistingTargetOpts(ExistingTargetOpts),
3341        ExistingPPOpts(ExistingPPOpts),
3342        FileMgr(FileMgr)
3343    {
3344    }
3345
3346    virtual bool ReadLanguageOptions(const LangOptions &LangOpts,
3347                                     bool Complain) {
3348      return checkLanguageOptions(ExistingLangOpts, LangOpts, 0);
3349    }
3350    virtual bool ReadTargetOptions(const TargetOptions &TargetOpts,
3351                                   bool Complain) {
3352      return checkTargetOptions(ExistingTargetOpts, TargetOpts, 0);
3353    }
3354    virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
3355                                         bool Complain,
3356                                         std::string &SuggestedPredefines) {
3357      return checkPreprocessorOptions(ExistingPPOpts, PPOpts, 0, FileMgr,
3358                                      SuggestedPredefines);
3359    }
3360  };
3361}
3362
3363bool ASTReader::readASTFileControlBlock(StringRef Filename,
3364                                        FileManager &FileMgr,
3365                                        ASTReaderListener &Listener) {
3366  // Open the AST file.
3367  std::string ErrStr;
3368  OwningPtr<llvm::MemoryBuffer> Buffer;
3369  Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr));
3370  if (!Buffer) {
3371    return true;
3372  }
3373
3374  // Initialize the stream
3375  llvm::BitstreamReader StreamFile;
3376  BitstreamCursor Stream;
3377  StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3378                  (const unsigned char *)Buffer->getBufferEnd());
3379  Stream.init(StreamFile);
3380
3381  // Sniff for the signature.
3382  if (Stream.Read(8) != 'C' ||
3383      Stream.Read(8) != 'P' ||
3384      Stream.Read(8) != 'C' ||
3385      Stream.Read(8) != 'H') {
3386    return true;
3387  }
3388
3389  // Scan for the CONTROL_BLOCK_ID block.
3390  if (SkipCursorToControlBlock(Stream))
3391    return true;
3392
3393  // Scan for ORIGINAL_FILE inside the control block.
3394  RecordData Record;
3395  while (1) {
3396    llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3397    if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3398      return false;
3399
3400    if (Entry.Kind != llvm::BitstreamEntry::Record)
3401      return true;
3402
3403    Record.clear();
3404    StringRef Blob;
3405    unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
3406    switch ((ControlRecordTypes)RecCode) {
3407    case METADATA: {
3408      if (Record[0] != VERSION_MAJOR)
3409        return true;
3410
3411      const std::string &CurBranch = getClangFullRepositoryVersion();
3412      if (StringRef(CurBranch) != Blob)
3413        return true;
3414
3415      break;
3416    }
3417    case LANGUAGE_OPTIONS:
3418      if (ParseLanguageOptions(Record, false, Listener))
3419        return true;
3420      break;
3421
3422    case TARGET_OPTIONS:
3423      if (ParseTargetOptions(Record, false, Listener))
3424        return true;
3425      break;
3426
3427    case DIAGNOSTIC_OPTIONS:
3428      if (ParseDiagnosticOptions(Record, false, Listener))
3429        return true;
3430      break;
3431
3432    case FILE_SYSTEM_OPTIONS:
3433      if (ParseFileSystemOptions(Record, false, Listener))
3434        return true;
3435      break;
3436
3437    case HEADER_SEARCH_OPTIONS:
3438      if (ParseHeaderSearchOptions(Record, false, Listener))
3439        return true;
3440      break;
3441
3442    case PREPROCESSOR_OPTIONS: {
3443      std::string IgnoredSuggestedPredefines;
3444      if (ParsePreprocessorOptions(Record, false, Listener,
3445                                   IgnoredSuggestedPredefines))
3446        return true;
3447      break;
3448    }
3449
3450    default:
3451      // No other validation to perform.
3452      break;
3453    }
3454  }
3455}
3456
3457
3458bool ASTReader::isAcceptableASTFile(StringRef Filename,
3459                                    FileManager &FileMgr,
3460                                    const LangOptions &LangOpts,
3461                                    const TargetOptions &TargetOpts,
3462                                    const PreprocessorOptions &PPOpts) {
3463  SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
3464  return !readASTFileControlBlock(Filename, FileMgr, validator);
3465}
3466
3467bool ASTReader::ReadSubmoduleBlock(ModuleFile &F) {
3468  // Enter the submodule block.
3469  if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
3470    Error("malformed submodule block record in AST file");
3471    return true;
3472  }
3473
3474  ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
3475  bool First = true;
3476  Module *CurrentModule = 0;
3477  RecordData Record;
3478  while (true) {
3479    llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
3480
3481    switch (Entry.Kind) {
3482    case llvm::BitstreamEntry::SubBlock: // Handled for us already.
3483    case llvm::BitstreamEntry::Error:
3484      Error("malformed block record in AST file");
3485      return true;
3486    case llvm::BitstreamEntry::EndBlock:
3487      return false;
3488    case llvm::BitstreamEntry::Record:
3489      // The interesting case.
3490      break;
3491    }
3492
3493    // Read a record.
3494    StringRef Blob;
3495    Record.clear();
3496    switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
3497    default:  // Default behavior: ignore.
3498      break;
3499
3500    case SUBMODULE_DEFINITION: {
3501      if (First) {
3502        Error("missing submodule metadata record at beginning of block");
3503        return true;
3504      }
3505
3506      if (Record.size() < 8) {
3507        Error("malformed module definition");
3508        return true;
3509      }
3510
3511      StringRef Name = Blob;
3512      SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
3513      SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]);
3514      bool IsFramework = Record[2];
3515      bool IsExplicit = Record[3];
3516      bool IsSystem = Record[4];
3517      bool InferSubmodules = Record[5];
3518      bool InferExplicitSubmodules = Record[6];
3519      bool InferExportWildcard = Record[7];
3520      bool ConfigMacrosExhaustive = Record[8];
3521
3522      Module *ParentModule = 0;
3523      if (Parent)
3524        ParentModule = getSubmodule(Parent);
3525
3526      // Retrieve this (sub)module from the module map, creating it if
3527      // necessary.
3528      CurrentModule = ModMap.findOrCreateModule(Name, ParentModule,
3529                                                IsFramework,
3530                                                IsExplicit).first;
3531      SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
3532      if (GlobalIndex >= SubmodulesLoaded.size() ||
3533          SubmodulesLoaded[GlobalIndex]) {
3534        Error("too many submodules");
3535        return true;
3536      }
3537
3538      if (!ParentModule) {
3539        if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
3540          if (CurFile != F.File) {
3541            if (!Diags.isDiagnosticInFlight()) {
3542              Diag(diag::err_module_file_conflict)
3543                << CurrentModule->getTopLevelModuleName()
3544                << CurFile->getName()
3545                << F.File->getName();
3546            }
3547            return true;
3548          }
3549        }
3550
3551        CurrentModule->setASTFile(F.File);
3552      }
3553
3554      CurrentModule->IsFromModuleFile = true;
3555      CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
3556      CurrentModule->InferSubmodules = InferSubmodules;
3557      CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
3558      CurrentModule->InferExportWildcard = InferExportWildcard;
3559      CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
3560      if (DeserializationListener)
3561        DeserializationListener->ModuleRead(GlobalID, CurrentModule);
3562
3563      SubmodulesLoaded[GlobalIndex] = CurrentModule;
3564
3565      // Clear out data that will be replaced by what is the module file.
3566      CurrentModule->LinkLibraries.clear();
3567      CurrentModule->ConfigMacros.clear();
3568      CurrentModule->UnresolvedConflicts.clear();
3569      CurrentModule->Conflicts.clear();
3570      break;
3571    }
3572
3573    case SUBMODULE_UMBRELLA_HEADER: {
3574      if (First) {
3575        Error("missing submodule metadata record at beginning of block");
3576        return true;
3577      }
3578
3579      if (!CurrentModule)
3580        break;
3581
3582      if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
3583        if (!CurrentModule->getUmbrellaHeader())
3584          ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
3585        else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
3586          Error("mismatched umbrella headers in submodule");
3587          return true;
3588        }
3589      }
3590      break;
3591    }
3592
3593    case SUBMODULE_HEADER: {
3594      if (First) {
3595        Error("missing submodule metadata record at beginning of block");
3596        return true;
3597      }
3598
3599      if (!CurrentModule)
3600        break;
3601
3602      // We lazily associate headers with their modules via the HeaderInfoTable.
3603      // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
3604      // of complete filenames or remove it entirely.
3605      break;
3606    }
3607
3608    case SUBMODULE_EXCLUDED_HEADER: {
3609      if (First) {
3610        Error("missing submodule metadata record at beginning of block");
3611        return true;
3612      }
3613
3614      if (!CurrentModule)
3615        break;
3616
3617      // We lazily associate headers with their modules via the HeaderInfoTable.
3618      // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
3619      // of complete filenames or remove it entirely.
3620      break;
3621    }
3622
3623    case SUBMODULE_TOPHEADER: {
3624      if (First) {
3625        Error("missing submodule metadata record at beginning of block");
3626        return true;
3627      }
3628
3629      if (!CurrentModule)
3630        break;
3631
3632      CurrentModule->addTopHeaderFilename(Blob);
3633      break;
3634    }
3635
3636    case SUBMODULE_UMBRELLA_DIR: {
3637      if (First) {
3638        Error("missing submodule metadata record at beginning of block");
3639        return true;
3640      }
3641
3642      if (!CurrentModule)
3643        break;
3644
3645      if (const DirectoryEntry *Umbrella
3646                                  = PP.getFileManager().getDirectory(Blob)) {
3647        if (!CurrentModule->getUmbrellaDir())
3648          ModMap.setUmbrellaDir(CurrentModule, Umbrella);
3649        else if (CurrentModule->getUmbrellaDir() != Umbrella) {
3650          Error("mismatched umbrella directories in submodule");
3651          return true;
3652        }
3653      }
3654      break;
3655    }
3656
3657    case SUBMODULE_METADATA: {
3658      if (!First) {
3659        Error("submodule metadata record not at beginning of block");
3660        return true;
3661      }
3662      First = false;
3663
3664      F.BaseSubmoduleID = getTotalNumSubmodules();
3665      F.LocalNumSubmodules = Record[0];
3666      unsigned LocalBaseSubmoduleID = Record[1];
3667      if (F.LocalNumSubmodules > 0) {
3668        // Introduce the global -> local mapping for submodules within this
3669        // module.
3670        GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
3671
3672        // Introduce the local -> global mapping for submodules within this
3673        // module.
3674        F.SubmoduleRemap.insertOrReplace(
3675          std::make_pair(LocalBaseSubmoduleID,
3676                         F.BaseSubmoduleID - LocalBaseSubmoduleID));
3677
3678        SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
3679      }
3680      break;
3681    }
3682
3683    case SUBMODULE_IMPORTS: {
3684      if (First) {
3685        Error("missing submodule metadata record at beginning of block");
3686        return true;
3687      }
3688
3689      if (!CurrentModule)
3690        break;
3691
3692      for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
3693        UnresolvedModuleRef Unresolved;
3694        Unresolved.File = &F;
3695        Unresolved.Mod = CurrentModule;
3696        Unresolved.ID = Record[Idx];
3697        Unresolved.Kind = UnresolvedModuleRef::Import;
3698        Unresolved.IsWildcard = false;
3699        UnresolvedModuleRefs.push_back(Unresolved);
3700      }
3701      break;
3702    }
3703
3704    case SUBMODULE_EXPORTS: {
3705      if (First) {
3706        Error("missing submodule metadata record at beginning of block");
3707        return true;
3708      }
3709
3710      if (!CurrentModule)
3711        break;
3712
3713      for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
3714        UnresolvedModuleRef Unresolved;
3715        Unresolved.File = &F;
3716        Unresolved.Mod = CurrentModule;
3717        Unresolved.ID = Record[Idx];
3718        Unresolved.Kind = UnresolvedModuleRef::Export;
3719        Unresolved.IsWildcard = Record[Idx + 1];
3720        UnresolvedModuleRefs.push_back(Unresolved);
3721      }
3722
3723      // Once we've loaded the set of exports, there's no reason to keep
3724      // the parsed, unresolved exports around.
3725      CurrentModule->UnresolvedExports.clear();
3726      break;
3727    }
3728    case SUBMODULE_REQUIRES: {
3729      if (First) {
3730        Error("missing submodule metadata record at beginning of block");
3731        return true;
3732      }
3733
3734      if (!CurrentModule)
3735        break;
3736
3737      CurrentModule->addRequirement(Blob, Context.getLangOpts(),
3738                                    Context.getTargetInfo());
3739      break;
3740    }
3741
3742    case SUBMODULE_LINK_LIBRARY:
3743      if (First) {
3744        Error("missing submodule metadata record at beginning of block");
3745        return true;
3746      }
3747
3748      if (!CurrentModule)
3749        break;
3750
3751      CurrentModule->LinkLibraries.push_back(
3752                                         Module::LinkLibrary(Blob, Record[0]));
3753      break;
3754
3755    case SUBMODULE_CONFIG_MACRO:
3756      if (First) {
3757        Error("missing submodule metadata record at beginning of block");
3758        return true;
3759      }
3760
3761      if (!CurrentModule)
3762        break;
3763
3764      CurrentModule->ConfigMacros.push_back(Blob.str());
3765      break;
3766
3767    case SUBMODULE_CONFLICT: {
3768      if (First) {
3769        Error("missing submodule metadata record at beginning of block");
3770        return true;
3771      }
3772
3773      if (!CurrentModule)
3774        break;
3775
3776      UnresolvedModuleRef Unresolved;
3777      Unresolved.File = &F;
3778      Unresolved.Mod = CurrentModule;
3779      Unresolved.ID = Record[0];
3780      Unresolved.Kind = UnresolvedModuleRef::Conflict;
3781      Unresolved.IsWildcard = false;
3782      Unresolved.String = Blob;
3783      UnresolvedModuleRefs.push_back(Unresolved);
3784      break;
3785    }
3786    }
3787  }
3788}
3789
3790/// \brief Parse the record that corresponds to a LangOptions data
3791/// structure.
3792///
3793/// This routine parses the language options from the AST file and then gives
3794/// them to the AST listener if one is set.
3795///
3796/// \returns true if the listener deems the file unacceptable, false otherwise.
3797bool ASTReader::ParseLanguageOptions(const RecordData &Record,
3798                                     bool Complain,
3799                                     ASTReaderListener &Listener) {
3800  LangOptions LangOpts;
3801  unsigned Idx = 0;
3802#define LANGOPT(Name, Bits, Default, Description) \
3803  LangOpts.Name = Record[Idx++];
3804#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
3805  LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
3806#include "clang/Basic/LangOptions.def"
3807#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
3808#include "clang/Basic/Sanitizers.def"
3809
3810  ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
3811  VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
3812  LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
3813
3814  unsigned Length = Record[Idx++];
3815  LangOpts.CurrentModule.assign(Record.begin() + Idx,
3816                                Record.begin() + Idx + Length);
3817
3818  Idx += Length;
3819
3820  // Comment options.
3821  for (unsigned N = Record[Idx++]; N; --N) {
3822    LangOpts.CommentOpts.BlockCommandNames.push_back(
3823      ReadString(Record, Idx));
3824  }
3825
3826  return Listener.ReadLanguageOptions(LangOpts, Complain);
3827}
3828
3829bool ASTReader::ParseTargetOptions(const RecordData &Record,
3830                                   bool Complain,
3831                                   ASTReaderListener &Listener) {
3832  unsigned Idx = 0;
3833  TargetOptions TargetOpts;
3834  TargetOpts.Triple = ReadString(Record, Idx);
3835  TargetOpts.CPU = ReadString(Record, Idx);
3836  TargetOpts.ABI = ReadString(Record, Idx);
3837  TargetOpts.CXXABI = ReadString(Record, Idx);
3838  TargetOpts.LinkerVersion = ReadString(Record, Idx);
3839  for (unsigned N = Record[Idx++]; N; --N) {
3840    TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
3841  }
3842  for (unsigned N = Record[Idx++]; N; --N) {
3843    TargetOpts.Features.push_back(ReadString(Record, Idx));
3844  }
3845
3846  return Listener.ReadTargetOptions(TargetOpts, Complain);
3847}
3848
3849bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
3850                                       ASTReaderListener &Listener) {
3851  DiagnosticOptions DiagOpts;
3852  unsigned Idx = 0;
3853#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
3854#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
3855  DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
3856#include "clang/Basic/DiagnosticOptions.def"
3857
3858  for (unsigned N = Record[Idx++]; N; --N) {
3859    DiagOpts.Warnings.push_back(ReadString(Record, Idx));
3860  }
3861
3862  return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
3863}
3864
3865bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
3866                                       ASTReaderListener &Listener) {
3867  FileSystemOptions FSOpts;
3868  unsigned Idx = 0;
3869  FSOpts.WorkingDir = ReadString(Record, Idx);
3870  return Listener.ReadFileSystemOptions(FSOpts, Complain);
3871}
3872
3873bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
3874                                         bool Complain,
3875                                         ASTReaderListener &Listener) {
3876  HeaderSearchOptions HSOpts;
3877  unsigned Idx = 0;
3878  HSOpts.Sysroot = ReadString(Record, Idx);
3879
3880  // Include entries.
3881  for (unsigned N = Record[Idx++]; N; --N) {
3882    std::string Path = ReadString(Record, Idx);
3883    frontend::IncludeDirGroup Group
3884      = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
3885    bool IsFramework = Record[Idx++];
3886    bool IgnoreSysRoot = Record[Idx++];
3887    HSOpts.UserEntries.push_back(
3888      HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
3889  }
3890
3891  // System header prefixes.
3892  for (unsigned N = Record[Idx++]; N; --N) {
3893    std::string Prefix = ReadString(Record, Idx);
3894    bool IsSystemHeader = Record[Idx++];
3895    HSOpts.SystemHeaderPrefixes.push_back(
3896      HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
3897  }
3898
3899  HSOpts.ResourceDir = ReadString(Record, Idx);
3900  HSOpts.ModuleCachePath = ReadString(Record, Idx);
3901  HSOpts.DisableModuleHash = Record[Idx++];
3902  HSOpts.UseBuiltinIncludes = Record[Idx++];
3903  HSOpts.UseStandardSystemIncludes = Record[Idx++];
3904  HSOpts.UseStandardCXXIncludes = Record[Idx++];
3905  HSOpts.UseLibcxx = Record[Idx++];
3906
3907  return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
3908}
3909
3910bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
3911                                         bool Complain,
3912                                         ASTReaderListener &Listener,
3913                                         std::string &SuggestedPredefines) {
3914  PreprocessorOptions PPOpts;
3915  unsigned Idx = 0;
3916
3917  // Macro definitions/undefs
3918  for (unsigned N = Record[Idx++]; N; --N) {
3919    std::string Macro = ReadString(Record, Idx);
3920    bool IsUndef = Record[Idx++];
3921    PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
3922  }
3923
3924  // Includes
3925  for (unsigned N = Record[Idx++]; N; --N) {
3926    PPOpts.Includes.push_back(ReadString(Record, Idx));
3927  }
3928
3929  // Macro Includes
3930  for (unsigned N = Record[Idx++]; N; --N) {
3931    PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
3932  }
3933
3934  PPOpts.UsePredefines = Record[Idx++];
3935  PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
3936  PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
3937  PPOpts.ObjCXXARCStandardLibrary =
3938    static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
3939  SuggestedPredefines.clear();
3940  return Listener.ReadPreprocessorOptions(PPOpts, Complain,
3941                                          SuggestedPredefines);
3942}
3943
3944std::pair<ModuleFile *, unsigned>
3945ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
3946  GlobalPreprocessedEntityMapType::iterator
3947  I = GlobalPreprocessedEntityMap.find(GlobalIndex);
3948  assert(I != GlobalPreprocessedEntityMap.end() &&
3949         "Corrupted global preprocessed entity map");
3950  ModuleFile *M = I->second;
3951  unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
3952  return std::make_pair(M, LocalIndex);
3953}
3954
3955std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
3956ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
3957  if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
3958    return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
3959                                             Mod.NumPreprocessedEntities);
3960
3961  return std::make_pair(PreprocessingRecord::iterator(),
3962                        PreprocessingRecord::iterator());
3963}
3964
3965std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
3966ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
3967  return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
3968                        ModuleDeclIterator(this, &Mod,
3969                                 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
3970}
3971
3972PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
3973  PreprocessedEntityID PPID = Index+1;
3974  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
3975  ModuleFile &M = *PPInfo.first;
3976  unsigned LocalIndex = PPInfo.second;
3977  const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
3978
3979  if (!PP.getPreprocessingRecord()) {
3980    Error("no preprocessing record");
3981    return 0;
3982  }
3983
3984  SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
3985  M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
3986
3987  llvm::BitstreamEntry Entry =
3988    M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
3989  if (Entry.Kind != llvm::BitstreamEntry::Record)
3990    return 0;
3991
3992  // Read the record.
3993  SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
3994                    ReadSourceLocation(M, PPOffs.End));
3995  PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
3996  StringRef Blob;
3997  RecordData Record;
3998  PreprocessorDetailRecordTypes RecType =
3999    (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4000                                          Entry.ID, Record, &Blob);
4001  switch (RecType) {
4002  case PPD_MACRO_EXPANSION: {
4003    bool isBuiltin = Record[0];
4004    IdentifierInfo *Name = 0;
4005    MacroDefinition *Def = 0;
4006    if (isBuiltin)
4007      Name = getLocalIdentifier(M, Record[1]);
4008    else {
4009      PreprocessedEntityID
4010          GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4011      Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4012    }
4013
4014    MacroExpansion *ME;
4015    if (isBuiltin)
4016      ME = new (PPRec) MacroExpansion(Name, Range);
4017    else
4018      ME = new (PPRec) MacroExpansion(Def, Range);
4019
4020    return ME;
4021  }
4022
4023  case PPD_MACRO_DEFINITION: {
4024    // Decode the identifier info and then check again; if the macro is
4025    // still defined and associated with the identifier,
4026    IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4027    MacroDefinition *MD
4028      = new (PPRec) MacroDefinition(II, Range);
4029
4030    if (DeserializationListener)
4031      DeserializationListener->MacroDefinitionRead(PPID, MD);
4032
4033    return MD;
4034  }
4035
4036  case PPD_INCLUSION_DIRECTIVE: {
4037    const char *FullFileNameStart = Blob.data() + Record[0];
4038    StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
4039    const FileEntry *File = 0;
4040    if (!FullFileName.empty())
4041      File = PP.getFileManager().getFile(FullFileName);
4042
4043    // FIXME: Stable encoding
4044    InclusionDirective::InclusionKind Kind
4045      = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4046    InclusionDirective *ID
4047      = new (PPRec) InclusionDirective(PPRec, Kind,
4048                                       StringRef(Blob.data(), Record[0]),
4049                                       Record[1], Record[3],
4050                                       File,
4051                                       Range);
4052    return ID;
4053  }
4054  }
4055
4056  llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4057}
4058
4059/// \brief \arg SLocMapI points at a chunk of a module that contains no
4060/// preprocessed entities or the entities it contains are not the ones we are
4061/// looking for. Find the next module that contains entities and return the ID
4062/// of the first entry.
4063PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4064                       GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4065  ++SLocMapI;
4066  for (GlobalSLocOffsetMapType::const_iterator
4067         EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4068    ModuleFile &M = *SLocMapI->second;
4069    if (M.NumPreprocessedEntities)
4070      return M.BasePreprocessedEntityID;
4071  }
4072
4073  return getTotalNumPreprocessedEntities();
4074}
4075
4076namespace {
4077
4078template <unsigned PPEntityOffset::*PPLoc>
4079struct PPEntityComp {
4080  const ASTReader &Reader;
4081  ModuleFile &M;
4082
4083  PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4084
4085  bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4086    SourceLocation LHS = getLoc(L);
4087    SourceLocation RHS = getLoc(R);
4088    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4089  }
4090
4091  bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4092    SourceLocation LHS = getLoc(L);
4093    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4094  }
4095
4096  bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4097    SourceLocation RHS = getLoc(R);
4098    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4099  }
4100
4101  SourceLocation getLoc(const PPEntityOffset &PPE) const {
4102    return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4103  }
4104};
4105
4106}
4107
4108/// \brief Returns the first preprocessed entity ID that ends after \arg BLoc.
4109PreprocessedEntityID
4110ASTReader::findBeginPreprocessedEntity(SourceLocation BLoc) const {
4111  if (SourceMgr.isLocalSourceLocation(BLoc))
4112    return getTotalNumPreprocessedEntities();
4113
4114  GlobalSLocOffsetMapType::const_iterator
4115    SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
4116                                        BLoc.getOffset() - 1);
4117  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4118         "Corrupted global sloc offset map");
4119
4120  if (SLocMapI->second->NumPreprocessedEntities == 0)
4121    return findNextPreprocessedEntity(SLocMapI);
4122
4123  ModuleFile &M = *SLocMapI->second;
4124  typedef const PPEntityOffset *pp_iterator;
4125  pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4126  pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4127
4128  size_t Count = M.NumPreprocessedEntities;
4129  size_t Half;
4130  pp_iterator First = pp_begin;
4131  pp_iterator PPI;
4132
4133  // Do a binary search manually instead of using std::lower_bound because
4134  // The end locations of entities may be unordered (when a macro expansion
4135  // is inside another macro argument), but for this case it is not important
4136  // whether we get the first macro expansion or its containing macro.
4137  while (Count > 0) {
4138    Half = Count/2;
4139    PPI = First;
4140    std::advance(PPI, Half);
4141    if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4142                                            BLoc)){
4143      First = PPI;
4144      ++First;
4145      Count = Count - Half - 1;
4146    } else
4147      Count = Half;
4148  }
4149
4150  if (PPI == pp_end)
4151    return findNextPreprocessedEntity(SLocMapI);
4152
4153  return M.BasePreprocessedEntityID + (PPI - pp_begin);
4154}
4155
4156/// \brief Returns the first preprocessed entity ID that begins after \arg ELoc.
4157PreprocessedEntityID
4158ASTReader::findEndPreprocessedEntity(SourceLocation ELoc) const {
4159  if (SourceMgr.isLocalSourceLocation(ELoc))
4160    return getTotalNumPreprocessedEntities();
4161
4162  GlobalSLocOffsetMapType::const_iterator
4163    SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
4164                                        ELoc.getOffset() - 1);
4165  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4166         "Corrupted global sloc offset map");
4167
4168  if (SLocMapI->second->NumPreprocessedEntities == 0)
4169    return findNextPreprocessedEntity(SLocMapI);
4170
4171  ModuleFile &M = *SLocMapI->second;
4172  typedef const PPEntityOffset *pp_iterator;
4173  pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4174  pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4175  pp_iterator PPI =
4176      std::upper_bound(pp_begin, pp_end, ELoc,
4177                       PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4178
4179  if (PPI == pp_end)
4180    return findNextPreprocessedEntity(SLocMapI);
4181
4182  return M.BasePreprocessedEntityID + (PPI - pp_begin);
4183}
4184
4185/// \brief Returns a pair of [Begin, End) indices of preallocated
4186/// preprocessed entities that \arg Range encompasses.
4187std::pair<unsigned, unsigned>
4188    ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
4189  if (Range.isInvalid())
4190    return std::make_pair(0,0);
4191  assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
4192
4193  PreprocessedEntityID BeginID = findBeginPreprocessedEntity(Range.getBegin());
4194  PreprocessedEntityID EndID = findEndPreprocessedEntity(Range.getEnd());
4195  return std::make_pair(BeginID, EndID);
4196}
4197
4198/// \brief Optionally returns true or false if the preallocated preprocessed
4199/// entity with index \arg Index came from file \arg FID.
4200Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
4201                                                             FileID FID) {
4202  if (FID.isInvalid())
4203    return false;
4204
4205  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4206  ModuleFile &M = *PPInfo.first;
4207  unsigned LocalIndex = PPInfo.second;
4208  const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4209
4210  SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
4211  if (Loc.isInvalid())
4212    return false;
4213
4214  if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
4215    return true;
4216  else
4217    return false;
4218}
4219
4220namespace {
4221  /// \brief Visitor used to search for information about a header file.
4222  class HeaderFileInfoVisitor {
4223    const FileEntry *FE;
4224
4225    Optional<HeaderFileInfo> HFI;
4226
4227  public:
4228    explicit HeaderFileInfoVisitor(const FileEntry *FE)
4229      : FE(FE) { }
4230
4231    static bool visit(ModuleFile &M, void *UserData) {
4232      HeaderFileInfoVisitor *This
4233        = static_cast<HeaderFileInfoVisitor *>(UserData);
4234
4235      HeaderFileInfoLookupTable *Table
4236        = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
4237      if (!Table)
4238        return false;
4239
4240      // Look in the on-disk hash table for an entry for this file name.
4241      HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
4242      if (Pos == Table->end())
4243        return false;
4244
4245      This->HFI = *Pos;
4246      return true;
4247    }
4248
4249    Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
4250  };
4251}
4252
4253HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
4254  HeaderFileInfoVisitor Visitor(FE);
4255  ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
4256  if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) {
4257    if (Listener)
4258      Listener->ReadHeaderFileInfo(*HFI, FE->getUID());
4259    return *HFI;
4260  }
4261
4262  return HeaderFileInfo();
4263}
4264
4265void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
4266  // FIXME: Make it work properly with modules.
4267  SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
4268  for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
4269    ModuleFile &F = *(*I);
4270    unsigned Idx = 0;
4271    DiagStates.clear();
4272    assert(!Diag.DiagStates.empty());
4273    DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
4274    while (Idx < F.PragmaDiagMappings.size()) {
4275      SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
4276      unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
4277      if (DiagStateID != 0) {
4278        Diag.DiagStatePoints.push_back(
4279                    DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
4280                    FullSourceLoc(Loc, SourceMgr)));
4281        continue;
4282      }
4283
4284      assert(DiagStateID == 0);
4285      // A new DiagState was created here.
4286      Diag.DiagStates.push_back(*Diag.GetCurDiagState());
4287      DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
4288      DiagStates.push_back(NewState);
4289      Diag.DiagStatePoints.push_back(
4290          DiagnosticsEngine::DiagStatePoint(NewState,
4291                                            FullSourceLoc(Loc, SourceMgr)));
4292      while (1) {
4293        assert(Idx < F.PragmaDiagMappings.size() &&
4294               "Invalid data, didn't find '-1' marking end of diag/map pairs");
4295        if (Idx >= F.PragmaDiagMappings.size()) {
4296          break; // Something is messed up but at least avoid infinite loop in
4297                 // release build.
4298        }
4299        unsigned DiagID = F.PragmaDiagMappings[Idx++];
4300        if (DiagID == (unsigned)-1) {
4301          break; // no more diag/map pairs for this location.
4302        }
4303        diag::Mapping Map = (diag::Mapping)F.PragmaDiagMappings[Idx++];
4304        DiagnosticMappingInfo MappingInfo = Diag.makeMappingInfo(Map, Loc);
4305        Diag.GetCurDiagState()->setMappingInfo(DiagID, MappingInfo);
4306      }
4307    }
4308  }
4309}
4310
4311/// \brief Get the correct cursor and offset for loading a type.
4312ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
4313  GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
4314  assert(I != GlobalTypeMap.end() && "Corrupted global type map");
4315  ModuleFile *M = I->second;
4316  return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
4317}
4318
4319/// \brief Read and return the type with the given index..
4320///
4321/// The index is the type ID, shifted and minus the number of predefs. This
4322/// routine actually reads the record corresponding to the type at the given
4323/// location. It is a helper routine for GetType, which deals with reading type
4324/// IDs.
4325QualType ASTReader::readTypeRecord(unsigned Index) {
4326  RecordLocation Loc = TypeCursorForIndex(Index);
4327  BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
4328
4329  // Keep track of where we are in the stream, then jump back there
4330  // after reading this type.
4331  SavedStreamPosition SavedPosition(DeclsCursor);
4332
4333  ReadingKindTracker ReadingKind(Read_Type, *this);
4334
4335  // Note that we are loading a type record.
4336  Deserializing AType(this);
4337
4338  unsigned Idx = 0;
4339  DeclsCursor.JumpToBit(Loc.Offset);
4340  RecordData Record;
4341  unsigned Code = DeclsCursor.ReadCode();
4342  switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
4343  case TYPE_EXT_QUAL: {
4344    if (Record.size() != 2) {
4345      Error("Incorrect encoding of extended qualifier type");
4346      return QualType();
4347    }
4348    QualType Base = readType(*Loc.F, Record, Idx);
4349    Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
4350    return Context.getQualifiedType(Base, Quals);
4351  }
4352
4353  case TYPE_COMPLEX: {
4354    if (Record.size() != 1) {
4355      Error("Incorrect encoding of complex type");
4356      return QualType();
4357    }
4358    QualType ElemType = readType(*Loc.F, Record, Idx);
4359    return Context.getComplexType(ElemType);
4360  }
4361
4362  case TYPE_POINTER: {
4363    if (Record.size() != 1) {
4364      Error("Incorrect encoding of pointer type");
4365      return QualType();
4366    }
4367    QualType PointeeType = readType(*Loc.F, Record, Idx);
4368    return Context.getPointerType(PointeeType);
4369  }
4370
4371  case TYPE_BLOCK_POINTER: {
4372    if (Record.size() != 1) {
4373      Error("Incorrect encoding of block pointer type");
4374      return QualType();
4375    }
4376    QualType PointeeType = readType(*Loc.F, Record, Idx);
4377    return Context.getBlockPointerType(PointeeType);
4378  }
4379
4380  case TYPE_LVALUE_REFERENCE: {
4381    if (Record.size() != 2) {
4382      Error("Incorrect encoding of lvalue reference type");
4383      return QualType();
4384    }
4385    QualType PointeeType = readType(*Loc.F, Record, Idx);
4386    return Context.getLValueReferenceType(PointeeType, Record[1]);
4387  }
4388
4389  case TYPE_RVALUE_REFERENCE: {
4390    if (Record.size() != 1) {
4391      Error("Incorrect encoding of rvalue reference type");
4392      return QualType();
4393    }
4394    QualType PointeeType = readType(*Loc.F, Record, Idx);
4395    return Context.getRValueReferenceType(PointeeType);
4396  }
4397
4398  case TYPE_MEMBER_POINTER: {
4399    if (Record.size() != 2) {
4400      Error("Incorrect encoding of member pointer type");
4401      return QualType();
4402    }
4403    QualType PointeeType = readType(*Loc.F, Record, Idx);
4404    QualType ClassType = readType(*Loc.F, Record, Idx);
4405    if (PointeeType.isNull() || ClassType.isNull())
4406      return QualType();
4407
4408    return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
4409  }
4410
4411  case TYPE_CONSTANT_ARRAY: {
4412    QualType ElementType = readType(*Loc.F, Record, Idx);
4413    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4414    unsigned IndexTypeQuals = Record[2];
4415    unsigned Idx = 3;
4416    llvm::APInt Size = ReadAPInt(Record, Idx);
4417    return Context.getConstantArrayType(ElementType, Size,
4418                                         ASM, IndexTypeQuals);
4419  }
4420
4421  case TYPE_INCOMPLETE_ARRAY: {
4422    QualType ElementType = readType(*Loc.F, Record, Idx);
4423    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4424    unsigned IndexTypeQuals = Record[2];
4425    return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
4426  }
4427
4428  case TYPE_VARIABLE_ARRAY: {
4429    QualType ElementType = readType(*Loc.F, Record, Idx);
4430    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4431    unsigned IndexTypeQuals = Record[2];
4432    SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
4433    SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
4434    return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
4435                                         ASM, IndexTypeQuals,
4436                                         SourceRange(LBLoc, RBLoc));
4437  }
4438
4439  case TYPE_VECTOR: {
4440    if (Record.size() != 3) {
4441      Error("incorrect encoding of vector type in AST file");
4442      return QualType();
4443    }
4444
4445    QualType ElementType = readType(*Loc.F, Record, Idx);
4446    unsigned NumElements = Record[1];
4447    unsigned VecKind = Record[2];
4448    return Context.getVectorType(ElementType, NumElements,
4449                                  (VectorType::VectorKind)VecKind);
4450  }
4451
4452  case TYPE_EXT_VECTOR: {
4453    if (Record.size() != 3) {
4454      Error("incorrect encoding of extended vector type in AST file");
4455      return QualType();
4456    }
4457
4458    QualType ElementType = readType(*Loc.F, Record, Idx);
4459    unsigned NumElements = Record[1];
4460    return Context.getExtVectorType(ElementType, NumElements);
4461  }
4462
4463  case TYPE_FUNCTION_NO_PROTO: {
4464    if (Record.size() != 6) {
4465      Error("incorrect encoding of no-proto function type");
4466      return QualType();
4467    }
4468    QualType ResultType = readType(*Loc.F, Record, Idx);
4469    FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
4470                               (CallingConv)Record[4], Record[5]);
4471    return Context.getFunctionNoProtoType(ResultType, Info);
4472  }
4473
4474  case TYPE_FUNCTION_PROTO: {
4475    QualType ResultType = readType(*Loc.F, Record, Idx);
4476
4477    FunctionProtoType::ExtProtoInfo EPI;
4478    EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
4479                                        /*hasregparm*/ Record[2],
4480                                        /*regparm*/ Record[3],
4481                                        static_cast<CallingConv>(Record[4]),
4482                                        /*produces*/ Record[5]);
4483
4484    unsigned Idx = 6;
4485    unsigned NumParams = Record[Idx++];
4486    SmallVector<QualType, 16> ParamTypes;
4487    for (unsigned I = 0; I != NumParams; ++I)
4488      ParamTypes.push_back(readType(*Loc.F, Record, Idx));
4489
4490    EPI.Variadic = Record[Idx++];
4491    EPI.HasTrailingReturn = Record[Idx++];
4492    EPI.TypeQuals = Record[Idx++];
4493    EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
4494    ExceptionSpecificationType EST =
4495        static_cast<ExceptionSpecificationType>(Record[Idx++]);
4496    EPI.ExceptionSpecType = EST;
4497    SmallVector<QualType, 2> Exceptions;
4498    if (EST == EST_Dynamic) {
4499      EPI.NumExceptions = Record[Idx++];
4500      for (unsigned I = 0; I != EPI.NumExceptions; ++I)
4501        Exceptions.push_back(readType(*Loc.F, Record, Idx));
4502      EPI.Exceptions = Exceptions.data();
4503    } else if (EST == EST_ComputedNoexcept) {
4504      EPI.NoexceptExpr = ReadExpr(*Loc.F);
4505    } else if (EST == EST_Uninstantiated) {
4506      EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4507      EPI.ExceptionSpecTemplate = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4508    } else if (EST == EST_Unevaluated) {
4509      EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4510    }
4511    return Context.getFunctionType(ResultType, ParamTypes, EPI);
4512  }
4513
4514  case TYPE_UNRESOLVED_USING: {
4515    unsigned Idx = 0;
4516    return Context.getTypeDeclType(
4517                  ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
4518  }
4519
4520  case TYPE_TYPEDEF: {
4521    if (Record.size() != 2) {
4522      Error("incorrect encoding of typedef type");
4523      return QualType();
4524    }
4525    unsigned Idx = 0;
4526    TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
4527    QualType Canonical = readType(*Loc.F, Record, Idx);
4528    if (!Canonical.isNull())
4529      Canonical = Context.getCanonicalType(Canonical);
4530    return Context.getTypedefType(Decl, Canonical);
4531  }
4532
4533  case TYPE_TYPEOF_EXPR:
4534    return Context.getTypeOfExprType(ReadExpr(*Loc.F));
4535
4536  case TYPE_TYPEOF: {
4537    if (Record.size() != 1) {
4538      Error("incorrect encoding of typeof(type) in AST file");
4539      return QualType();
4540    }
4541    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4542    return Context.getTypeOfType(UnderlyingType);
4543  }
4544
4545  case TYPE_DECLTYPE: {
4546    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4547    return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
4548  }
4549
4550  case TYPE_UNARY_TRANSFORM: {
4551    QualType BaseType = readType(*Loc.F, Record, Idx);
4552    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4553    UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
4554    return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
4555  }
4556
4557  case TYPE_AUTO:
4558    return Context.getAutoType(readType(*Loc.F, Record, Idx));
4559
4560  case TYPE_RECORD: {
4561    if (Record.size() != 2) {
4562      Error("incorrect encoding of record type");
4563      return QualType();
4564    }
4565    unsigned Idx = 0;
4566    bool IsDependent = Record[Idx++];
4567    RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
4568    RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
4569    QualType T = Context.getRecordType(RD);
4570    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4571    return T;
4572  }
4573
4574  case TYPE_ENUM: {
4575    if (Record.size() != 2) {
4576      Error("incorrect encoding of enum type");
4577      return QualType();
4578    }
4579    unsigned Idx = 0;
4580    bool IsDependent = Record[Idx++];
4581    QualType T
4582      = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
4583    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4584    return T;
4585  }
4586
4587  case TYPE_ATTRIBUTED: {
4588    if (Record.size() != 3) {
4589      Error("incorrect encoding of attributed type");
4590      return QualType();
4591    }
4592    QualType modifiedType = readType(*Loc.F, Record, Idx);
4593    QualType equivalentType = readType(*Loc.F, Record, Idx);
4594    AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
4595    return Context.getAttributedType(kind, modifiedType, equivalentType);
4596  }
4597
4598  case TYPE_PAREN: {
4599    if (Record.size() != 1) {
4600      Error("incorrect encoding of paren type");
4601      return QualType();
4602    }
4603    QualType InnerType = readType(*Loc.F, Record, Idx);
4604    return Context.getParenType(InnerType);
4605  }
4606
4607  case TYPE_PACK_EXPANSION: {
4608    if (Record.size() != 2) {
4609      Error("incorrect encoding of pack expansion type");
4610      return QualType();
4611    }
4612    QualType Pattern = readType(*Loc.F, Record, Idx);
4613    if (Pattern.isNull())
4614      return QualType();
4615    Optional<unsigned> NumExpansions;
4616    if (Record[1])
4617      NumExpansions = Record[1] - 1;
4618    return Context.getPackExpansionType(Pattern, NumExpansions);
4619  }
4620
4621  case TYPE_ELABORATED: {
4622    unsigned Idx = 0;
4623    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4624    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4625    QualType NamedType = readType(*Loc.F, Record, Idx);
4626    return Context.getElaboratedType(Keyword, NNS, NamedType);
4627  }
4628
4629  case TYPE_OBJC_INTERFACE: {
4630    unsigned Idx = 0;
4631    ObjCInterfaceDecl *ItfD
4632      = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
4633    return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
4634  }
4635
4636  case TYPE_OBJC_OBJECT: {
4637    unsigned Idx = 0;
4638    QualType Base = readType(*Loc.F, Record, Idx);
4639    unsigned NumProtos = Record[Idx++];
4640    SmallVector<ObjCProtocolDecl*, 4> Protos;
4641    for (unsigned I = 0; I != NumProtos; ++I)
4642      Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
4643    return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
4644  }
4645
4646  case TYPE_OBJC_OBJECT_POINTER: {
4647    unsigned Idx = 0;
4648    QualType Pointee = readType(*Loc.F, Record, Idx);
4649    return Context.getObjCObjectPointerType(Pointee);
4650  }
4651
4652  case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
4653    unsigned Idx = 0;
4654    QualType Parm = readType(*Loc.F, Record, Idx);
4655    QualType Replacement = readType(*Loc.F, Record, Idx);
4656    return
4657      Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm),
4658                                            Replacement);
4659  }
4660
4661  case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
4662    unsigned Idx = 0;
4663    QualType Parm = readType(*Loc.F, Record, Idx);
4664    TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
4665    return Context.getSubstTemplateTypeParmPackType(
4666                                               cast<TemplateTypeParmType>(Parm),
4667                                                     ArgPack);
4668  }
4669
4670  case TYPE_INJECTED_CLASS_NAME: {
4671    CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
4672    QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
4673    // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
4674    // for AST reading, too much interdependencies.
4675    return
4676      QualType(new (Context, TypeAlignment) InjectedClassNameType(D, TST), 0);
4677  }
4678
4679  case TYPE_TEMPLATE_TYPE_PARM: {
4680    unsigned Idx = 0;
4681    unsigned Depth = Record[Idx++];
4682    unsigned Index = Record[Idx++];
4683    bool Pack = Record[Idx++];
4684    TemplateTypeParmDecl *D
4685      = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
4686    return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
4687  }
4688
4689  case TYPE_DEPENDENT_NAME: {
4690    unsigned Idx = 0;
4691    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4692    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4693    const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
4694    QualType Canon = readType(*Loc.F, Record, Idx);
4695    if (!Canon.isNull())
4696      Canon = Context.getCanonicalType(Canon);
4697    return Context.getDependentNameType(Keyword, NNS, Name, Canon);
4698  }
4699
4700  case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
4701    unsigned Idx = 0;
4702    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4703    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4704    const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
4705    unsigned NumArgs = Record[Idx++];
4706    SmallVector<TemplateArgument, 8> Args;
4707    Args.reserve(NumArgs);
4708    while (NumArgs--)
4709      Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
4710    return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
4711                                                      Args.size(), Args.data());
4712  }
4713
4714  case TYPE_DEPENDENT_SIZED_ARRAY: {
4715    unsigned Idx = 0;
4716
4717    // ArrayType
4718    QualType ElementType = readType(*Loc.F, Record, Idx);
4719    ArrayType::ArraySizeModifier ASM
4720      = (ArrayType::ArraySizeModifier)Record[Idx++];
4721    unsigned IndexTypeQuals = Record[Idx++];
4722
4723    // DependentSizedArrayType
4724    Expr *NumElts = ReadExpr(*Loc.F);
4725    SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
4726
4727    return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
4728                                               IndexTypeQuals, Brackets);
4729  }
4730
4731  case TYPE_TEMPLATE_SPECIALIZATION: {
4732    unsigned Idx = 0;
4733    bool IsDependent = Record[Idx++];
4734    TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
4735    SmallVector<TemplateArgument, 8> Args;
4736    ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
4737    QualType Underlying = readType(*Loc.F, Record, Idx);
4738    QualType T;
4739    if (Underlying.isNull())
4740      T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
4741                                                          Args.size());
4742    else
4743      T = Context.getTemplateSpecializationType(Name, Args.data(),
4744                                                 Args.size(), Underlying);
4745    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4746    return T;
4747  }
4748
4749  case TYPE_ATOMIC: {
4750    if (Record.size() != 1) {
4751      Error("Incorrect encoding of atomic type");
4752      return QualType();
4753    }
4754    QualType ValueType = readType(*Loc.F, Record, Idx);
4755    return Context.getAtomicType(ValueType);
4756  }
4757  }
4758  llvm_unreachable("Invalid TypeCode!");
4759}
4760
4761class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
4762  ASTReader &Reader;
4763  ModuleFile &F;
4764  const ASTReader::RecordData &Record;
4765  unsigned &Idx;
4766
4767  SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
4768                                    unsigned &I) {
4769    return Reader.ReadSourceLocation(F, R, I);
4770  }
4771
4772  template<typename T>
4773  T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
4774    return Reader.ReadDeclAs<T>(F, Record, Idx);
4775  }
4776
4777public:
4778  TypeLocReader(ASTReader &Reader, ModuleFile &F,
4779                const ASTReader::RecordData &Record, unsigned &Idx)
4780    : Reader(Reader), F(F), Record(Record), Idx(Idx)
4781  { }
4782
4783  // We want compile-time assurance that we've enumerated all of
4784  // these, so unfortunately we have to declare them first, then
4785  // define them out-of-line.
4786#define ABSTRACT_TYPELOC(CLASS, PARENT)
4787#define TYPELOC(CLASS, PARENT) \
4788  void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
4789#include "clang/AST/TypeLocNodes.def"
4790
4791  void VisitFunctionTypeLoc(FunctionTypeLoc);
4792  void VisitArrayTypeLoc(ArrayTypeLoc);
4793};
4794
4795void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
4796  // nothing to do
4797}
4798void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
4799  TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
4800  if (TL.needsExtraLocalData()) {
4801    TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
4802    TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
4803    TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
4804    TL.setModeAttr(Record[Idx++]);
4805  }
4806}
4807void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
4808  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4809}
4810void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
4811  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4812}
4813void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
4814  TL.setCaretLoc(ReadSourceLocation(Record, Idx));
4815}
4816void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
4817  TL.setAmpLoc(ReadSourceLocation(Record, Idx));
4818}
4819void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
4820  TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
4821}
4822void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
4823  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4824  TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4825}
4826void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
4827  TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
4828  TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
4829  if (Record[Idx++])
4830    TL.setSizeExpr(Reader.ReadExpr(F));
4831  else
4832    TL.setSizeExpr(0);
4833}
4834void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
4835  VisitArrayTypeLoc(TL);
4836}
4837void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
4838  VisitArrayTypeLoc(TL);
4839}
4840void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
4841  VisitArrayTypeLoc(TL);
4842}
4843void TypeLocReader::VisitDependentSizedArrayTypeLoc(
4844                                            DependentSizedArrayTypeLoc TL) {
4845  VisitArrayTypeLoc(TL);
4846}
4847void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
4848                                        DependentSizedExtVectorTypeLoc TL) {
4849  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4850}
4851void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
4852  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4853}
4854void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
4855  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4856}
4857void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
4858  TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
4859  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4860  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4861  TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
4862  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
4863    TL.setArg(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
4864  }
4865}
4866void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
4867  VisitFunctionTypeLoc(TL);
4868}
4869void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
4870  VisitFunctionTypeLoc(TL);
4871}
4872void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
4873  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4874}
4875void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
4876  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4877}
4878void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
4879  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4880  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4881  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4882}
4883void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
4884  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4885  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4886  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4887  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4888}
4889void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
4890  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4891}
4892void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
4893  TL.setKWLoc(ReadSourceLocation(Record, Idx));
4894  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4895  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4896  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4897}
4898void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
4899  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4900}
4901void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
4902  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4903}
4904void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
4905  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4906}
4907void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
4908  TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
4909  if (TL.hasAttrOperand()) {
4910    SourceRange range;
4911    range.setBegin(ReadSourceLocation(Record, Idx));
4912    range.setEnd(ReadSourceLocation(Record, Idx));
4913    TL.setAttrOperandParensRange(range);
4914  }
4915  if (TL.hasAttrExprOperand()) {
4916    if (Record[Idx++])
4917      TL.setAttrExprOperand(Reader.ReadExpr(F));
4918    else
4919      TL.setAttrExprOperand(0);
4920  } else if (TL.hasAttrEnumOperand())
4921    TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
4922}
4923void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
4924  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4925}
4926void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
4927                                            SubstTemplateTypeParmTypeLoc TL) {
4928  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4929}
4930void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
4931                                          SubstTemplateTypeParmPackTypeLoc TL) {
4932  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4933}
4934void TypeLocReader::VisitTemplateSpecializationTypeLoc(
4935                                           TemplateSpecializationTypeLoc TL) {
4936  TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
4937  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4938  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4939  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4940  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
4941    TL.setArgLocInfo(i,
4942        Reader.GetTemplateArgumentLocInfo(F,
4943                                          TL.getTypePtr()->getArg(i).getKind(),
4944                                          Record, Idx));
4945}
4946void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
4947  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4948  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4949}
4950void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
4951  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4952  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4953}
4954void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
4955  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4956}
4957void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
4958  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4959  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4960  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4961}
4962void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
4963       DependentTemplateSpecializationTypeLoc TL) {
4964  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4965  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4966  TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
4967  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4968  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4969  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4970  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
4971    TL.setArgLocInfo(I,
4972        Reader.GetTemplateArgumentLocInfo(F,
4973                                          TL.getTypePtr()->getArg(I).getKind(),
4974                                          Record, Idx));
4975}
4976void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
4977  TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
4978}
4979void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
4980  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4981}
4982void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
4983  TL.setHasBaseTypeAsWritten(Record[Idx++]);
4984  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4985  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4986  for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
4987    TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
4988}
4989void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
4990  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4991}
4992void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
4993  TL.setKWLoc(ReadSourceLocation(Record, Idx));
4994  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4995  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4996}
4997
4998TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
4999                                             const RecordData &Record,
5000                                             unsigned &Idx) {
5001  QualType InfoTy = readType(F, Record, Idx);
5002  if (InfoTy.isNull())
5003    return 0;
5004
5005  TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5006  TypeLocReader TLR(*this, F, Record, Idx);
5007  for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5008    TLR.Visit(TL);
5009  return TInfo;
5010}
5011
5012QualType ASTReader::GetType(TypeID ID) {
5013  unsigned FastQuals = ID & Qualifiers::FastMask;
5014  unsigned Index = ID >> Qualifiers::FastWidth;
5015
5016  if (Index < NUM_PREDEF_TYPE_IDS) {
5017    QualType T;
5018    switch ((PredefinedTypeIDs)Index) {
5019    case PREDEF_TYPE_NULL_ID: return QualType();
5020    case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5021    case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5022
5023    case PREDEF_TYPE_CHAR_U_ID:
5024    case PREDEF_TYPE_CHAR_S_ID:
5025      // FIXME: Check that the signedness of CharTy is correct!
5026      T = Context.CharTy;
5027      break;
5028
5029    case PREDEF_TYPE_UCHAR_ID:      T = Context.UnsignedCharTy;     break;
5030    case PREDEF_TYPE_USHORT_ID:     T = Context.UnsignedShortTy;    break;
5031    case PREDEF_TYPE_UINT_ID:       T = Context.UnsignedIntTy;      break;
5032    case PREDEF_TYPE_ULONG_ID:      T = Context.UnsignedLongTy;     break;
5033    case PREDEF_TYPE_ULONGLONG_ID:  T = Context.UnsignedLongLongTy; break;
5034    case PREDEF_TYPE_UINT128_ID:    T = Context.UnsignedInt128Ty;   break;
5035    case PREDEF_TYPE_SCHAR_ID:      T = Context.SignedCharTy;       break;
5036    case PREDEF_TYPE_WCHAR_ID:      T = Context.WCharTy;            break;
5037    case PREDEF_TYPE_SHORT_ID:      T = Context.ShortTy;            break;
5038    case PREDEF_TYPE_INT_ID:        T = Context.IntTy;              break;
5039    case PREDEF_TYPE_LONG_ID:       T = Context.LongTy;             break;
5040    case PREDEF_TYPE_LONGLONG_ID:   T = Context.LongLongTy;         break;
5041    case PREDEF_TYPE_INT128_ID:     T = Context.Int128Ty;           break;
5042    case PREDEF_TYPE_HALF_ID:       T = Context.HalfTy;             break;
5043    case PREDEF_TYPE_FLOAT_ID:      T = Context.FloatTy;            break;
5044    case PREDEF_TYPE_DOUBLE_ID:     T = Context.DoubleTy;           break;
5045    case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy;       break;
5046    case PREDEF_TYPE_OVERLOAD_ID:   T = Context.OverloadTy;         break;
5047    case PREDEF_TYPE_BOUND_MEMBER:  T = Context.BoundMemberTy;      break;
5048    case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy;     break;
5049    case PREDEF_TYPE_DEPENDENT_ID:  T = Context.DependentTy;        break;
5050    case PREDEF_TYPE_UNKNOWN_ANY:   T = Context.UnknownAnyTy;       break;
5051    case PREDEF_TYPE_NULLPTR_ID:    T = Context.NullPtrTy;          break;
5052    case PREDEF_TYPE_CHAR16_ID:     T = Context.Char16Ty;           break;
5053    case PREDEF_TYPE_CHAR32_ID:     T = Context.Char32Ty;           break;
5054    case PREDEF_TYPE_OBJC_ID:       T = Context.ObjCBuiltinIdTy;    break;
5055    case PREDEF_TYPE_OBJC_CLASS:    T = Context.ObjCBuiltinClassTy; break;
5056    case PREDEF_TYPE_OBJC_SEL:      T = Context.ObjCBuiltinSelTy;   break;
5057    case PREDEF_TYPE_IMAGE1D_ID:    T = Context.OCLImage1dTy;       break;
5058    case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5059    case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5060    case PREDEF_TYPE_IMAGE2D_ID:    T = Context.OCLImage2dTy;       break;
5061    case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5062    case PREDEF_TYPE_IMAGE3D_ID:    T = Context.OCLImage3dTy;       break;
5063    case PREDEF_TYPE_SAMPLER_ID:    T = Context.OCLSamplerTy;       break;
5064    case PREDEF_TYPE_EVENT_ID:      T = Context.OCLEventTy;         break;
5065    case PREDEF_TYPE_AUTO_DEDUCT:   T = Context.getAutoDeductType(); break;
5066
5067    case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5068      T = Context.getAutoRRefDeductType();
5069      break;
5070
5071    case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5072      T = Context.ARCUnbridgedCastTy;
5073      break;
5074
5075    case PREDEF_TYPE_VA_LIST_TAG:
5076      T = Context.getVaListTagType();
5077      break;
5078
5079    case PREDEF_TYPE_BUILTIN_FN:
5080      T = Context.BuiltinFnTy;
5081      break;
5082    }
5083
5084    assert(!T.isNull() && "Unknown predefined type");
5085    return T.withFastQualifiers(FastQuals);
5086  }
5087
5088  Index -= NUM_PREDEF_TYPE_IDS;
5089  assert(Index < TypesLoaded.size() && "Type index out-of-range");
5090  if (TypesLoaded[Index].isNull()) {
5091    TypesLoaded[Index] = readTypeRecord(Index);
5092    if (TypesLoaded[Index].isNull())
5093      return QualType();
5094
5095    TypesLoaded[Index]->setFromAST();
5096    if (DeserializationListener)
5097      DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5098                                        TypesLoaded[Index]);
5099  }
5100
5101  return TypesLoaded[Index].withFastQualifiers(FastQuals);
5102}
5103
5104QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5105  return GetType(getGlobalTypeID(F, LocalID));
5106}
5107
5108serialization::TypeID
5109ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5110  unsigned FastQuals = LocalID & Qualifiers::FastMask;
5111  unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5112
5113  if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5114    return LocalID;
5115
5116  ContinuousRangeMap<uint32_t, int, 2>::iterator I
5117    = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5118  assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5119
5120  unsigned GlobalIndex = LocalIndex + I->second;
5121  return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5122}
5123
5124TemplateArgumentLocInfo
5125ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5126                                      TemplateArgument::ArgKind Kind,
5127                                      const RecordData &Record,
5128                                      unsigned &Index) {
5129  switch (Kind) {
5130  case TemplateArgument::Expression:
5131    return ReadExpr(F);
5132  case TemplateArgument::Type:
5133    return GetTypeSourceInfo(F, Record, Index);
5134  case TemplateArgument::Template: {
5135    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5136                                                                     Index);
5137    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5138    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5139                                   SourceLocation());
5140  }
5141  case TemplateArgument::TemplateExpansion: {
5142    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5143                                                                     Index);
5144    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5145    SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
5146    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5147                                   EllipsisLoc);
5148  }
5149  case TemplateArgument::Null:
5150  case TemplateArgument::Integral:
5151  case TemplateArgument::Declaration:
5152  case TemplateArgument::NullPtr:
5153  case TemplateArgument::Pack:
5154    // FIXME: Is this right?
5155    return TemplateArgumentLocInfo();
5156  }
5157  llvm_unreachable("unexpected template argument loc");
5158}
5159
5160TemplateArgumentLoc
5161ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
5162                                   const RecordData &Record, unsigned &Index) {
5163  TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
5164
5165  if (Arg.getKind() == TemplateArgument::Expression) {
5166    if (Record[Index++]) // bool InfoHasSameExpr.
5167      return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
5168  }
5169  return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
5170                                                             Record, Index));
5171}
5172
5173Decl *ASTReader::GetExternalDecl(uint32_t ID) {
5174  return GetDecl(ID);
5175}
5176
5177uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, const RecordData &Record,
5178                                          unsigned &Idx){
5179  if (Idx >= Record.size())
5180    return 0;
5181
5182  unsigned LocalID = Record[Idx++];
5183  return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
5184}
5185
5186CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
5187  RecordLocation Loc = getLocalBitOffset(Offset);
5188  BitstreamCursor &Cursor = Loc.F->DeclsCursor;
5189  SavedStreamPosition SavedPosition(Cursor);
5190  Cursor.JumpToBit(Loc.Offset);
5191  ReadingKindTracker ReadingKind(Read_Decl, *this);
5192  RecordData Record;
5193  unsigned Code = Cursor.ReadCode();
5194  unsigned RecCode = Cursor.readRecord(Code, Record);
5195  if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
5196    Error("Malformed AST file: missing C++ base specifiers");
5197    return 0;
5198  }
5199
5200  unsigned Idx = 0;
5201  unsigned NumBases = Record[Idx++];
5202  void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
5203  CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
5204  for (unsigned I = 0; I != NumBases; ++I)
5205    Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
5206  return Bases;
5207}
5208
5209serialization::DeclID
5210ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
5211  if (LocalID < NUM_PREDEF_DECL_IDS)
5212    return LocalID;
5213
5214  ContinuousRangeMap<uint32_t, int, 2>::iterator I
5215    = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
5216  assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
5217
5218  return LocalID + I->second;
5219}
5220
5221bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
5222                                   ModuleFile &M) const {
5223  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
5224  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5225  return &M == I->second;
5226}
5227
5228ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
5229  if (!D->isFromASTFile())
5230    return 0;
5231  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
5232  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5233  return I->second;
5234}
5235
5236SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
5237  if (ID < NUM_PREDEF_DECL_IDS)
5238    return SourceLocation();
5239
5240  unsigned Index = ID - NUM_PREDEF_DECL_IDS;
5241
5242  if (Index > DeclsLoaded.size()) {
5243    Error("declaration ID out-of-range for AST file");
5244    return SourceLocation();
5245  }
5246
5247  if (Decl *D = DeclsLoaded[Index])
5248    return D->getLocation();
5249
5250  unsigned RawLocation = 0;
5251  RecordLocation Rec = DeclCursorForID(ID, RawLocation);
5252  return ReadSourceLocation(*Rec.F, RawLocation);
5253}
5254
5255Decl *ASTReader::GetDecl(DeclID ID) {
5256  if (ID < NUM_PREDEF_DECL_IDS) {
5257    switch ((PredefinedDeclIDs)ID) {
5258    case PREDEF_DECL_NULL_ID:
5259      return 0;
5260
5261    case PREDEF_DECL_TRANSLATION_UNIT_ID:
5262      return Context.getTranslationUnitDecl();
5263
5264    case PREDEF_DECL_OBJC_ID_ID:
5265      return Context.getObjCIdDecl();
5266
5267    case PREDEF_DECL_OBJC_SEL_ID:
5268      return Context.getObjCSelDecl();
5269
5270    case PREDEF_DECL_OBJC_CLASS_ID:
5271      return Context.getObjCClassDecl();
5272
5273    case PREDEF_DECL_OBJC_PROTOCOL_ID:
5274      return Context.getObjCProtocolDecl();
5275
5276    case PREDEF_DECL_INT_128_ID:
5277      return Context.getInt128Decl();
5278
5279    case PREDEF_DECL_UNSIGNED_INT_128_ID:
5280      return Context.getUInt128Decl();
5281
5282    case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
5283      return Context.getObjCInstanceTypeDecl();
5284
5285    case PREDEF_DECL_BUILTIN_VA_LIST_ID:
5286      return Context.getBuiltinVaListDecl();
5287    }
5288  }
5289
5290  unsigned Index = ID - NUM_PREDEF_DECL_IDS;
5291
5292  if (Index >= DeclsLoaded.size()) {
5293    assert(0 && "declaration ID out-of-range for AST file");
5294    Error("declaration ID out-of-range for AST file");
5295    return 0;
5296  }
5297
5298  if (!DeclsLoaded[Index]) {
5299    ReadDeclRecord(ID);
5300    if (DeserializationListener)
5301      DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
5302  }
5303
5304  return DeclsLoaded[Index];
5305}
5306
5307DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
5308                                                  DeclID GlobalID) {
5309  if (GlobalID < NUM_PREDEF_DECL_IDS)
5310    return GlobalID;
5311
5312  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
5313  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5314  ModuleFile *Owner = I->second;
5315
5316  llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
5317    = M.GlobalToLocalDeclIDs.find(Owner);
5318  if (Pos == M.GlobalToLocalDeclIDs.end())
5319    return 0;
5320
5321  return GlobalID - Owner->BaseDeclID + Pos->second;
5322}
5323
5324serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
5325                                            const RecordData &Record,
5326                                            unsigned &Idx) {
5327  if (Idx >= Record.size()) {
5328    Error("Corrupted AST file");
5329    return 0;
5330  }
5331
5332  return getGlobalDeclID(F, Record[Idx++]);
5333}
5334
5335/// \brief Resolve the offset of a statement into a statement.
5336///
5337/// This operation will read a new statement from the external
5338/// source each time it is called, and is meant to be used via a
5339/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
5340Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
5341  // Switch case IDs are per Decl.
5342  ClearSwitchCaseIDs();
5343
5344  // Offset here is a global offset across the entire chain.
5345  RecordLocation Loc = getLocalBitOffset(Offset);
5346  Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
5347  return ReadStmtFromStream(*Loc.F);
5348}
5349
5350namespace {
5351  class FindExternalLexicalDeclsVisitor {
5352    ASTReader &Reader;
5353    const DeclContext *DC;
5354    bool (*isKindWeWant)(Decl::Kind);
5355
5356    SmallVectorImpl<Decl*> &Decls;
5357    bool PredefsVisited[NUM_PREDEF_DECL_IDS];
5358
5359  public:
5360    FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
5361                                    bool (*isKindWeWant)(Decl::Kind),
5362                                    SmallVectorImpl<Decl*> &Decls)
5363      : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
5364    {
5365      for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
5366        PredefsVisited[I] = false;
5367    }
5368
5369    static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
5370      if (Preorder)
5371        return false;
5372
5373      FindExternalLexicalDeclsVisitor *This
5374        = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
5375
5376      ModuleFile::DeclContextInfosMap::iterator Info
5377        = M.DeclContextInfos.find(This->DC);
5378      if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
5379        return false;
5380
5381      // Load all of the declaration IDs
5382      for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
5383                               *IDE = ID + Info->second.NumLexicalDecls;
5384           ID != IDE; ++ID) {
5385        if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
5386          continue;
5387
5388        // Don't add predefined declarations to the lexical context more
5389        // than once.
5390        if (ID->second < NUM_PREDEF_DECL_IDS) {
5391          if (This->PredefsVisited[ID->second])
5392            continue;
5393
5394          This->PredefsVisited[ID->second] = true;
5395        }
5396
5397        if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
5398          if (!This->DC->isDeclInLexicalTraversal(D))
5399            This->Decls.push_back(D);
5400        }
5401      }
5402
5403      return false;
5404    }
5405  };
5406}
5407
5408ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
5409                                         bool (*isKindWeWant)(Decl::Kind),
5410                                         SmallVectorImpl<Decl*> &Decls) {
5411  // There might be lexical decls in multiple modules, for the TU at
5412  // least. Walk all of the modules in the order they were loaded.
5413  FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
5414  ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
5415  ++NumLexicalDeclContextsRead;
5416  return ELR_Success;
5417}
5418
5419namespace {
5420
5421class DeclIDComp {
5422  ASTReader &Reader;
5423  ModuleFile &Mod;
5424
5425public:
5426  DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
5427
5428  bool operator()(LocalDeclID L, LocalDeclID R) const {
5429    SourceLocation LHS = getLocation(L);
5430    SourceLocation RHS = getLocation(R);
5431    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5432  }
5433
5434  bool operator()(SourceLocation LHS, LocalDeclID R) const {
5435    SourceLocation RHS = getLocation(R);
5436    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5437  }
5438
5439  bool operator()(LocalDeclID L, SourceLocation RHS) const {
5440    SourceLocation LHS = getLocation(L);
5441    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5442  }
5443
5444  SourceLocation getLocation(LocalDeclID ID) const {
5445    return Reader.getSourceManager().getFileLoc(
5446            Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
5447  }
5448};
5449
5450}
5451
5452void ASTReader::FindFileRegionDecls(FileID File,
5453                                    unsigned Offset, unsigned Length,
5454                                    SmallVectorImpl<Decl *> &Decls) {
5455  SourceManager &SM = getSourceManager();
5456
5457  llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
5458  if (I == FileDeclIDs.end())
5459    return;
5460
5461  FileDeclsInfo &DInfo = I->second;
5462  if (DInfo.Decls.empty())
5463    return;
5464
5465  SourceLocation
5466    BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
5467  SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
5468
5469  DeclIDComp DIDComp(*this, *DInfo.Mod);
5470  ArrayRef<serialization::LocalDeclID>::iterator
5471    BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
5472                               BeginLoc, DIDComp);
5473  if (BeginIt != DInfo.Decls.begin())
5474    --BeginIt;
5475
5476  // If we are pointing at a top-level decl inside an objc container, we need
5477  // to backtrack until we find it otherwise we will fail to report that the
5478  // region overlaps with an objc container.
5479  while (BeginIt != DInfo.Decls.begin() &&
5480         GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
5481             ->isTopLevelDeclInObjCContainer())
5482    --BeginIt;
5483
5484  ArrayRef<serialization::LocalDeclID>::iterator
5485    EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
5486                             EndLoc, DIDComp);
5487  if (EndIt != DInfo.Decls.end())
5488    ++EndIt;
5489
5490  for (ArrayRef<serialization::LocalDeclID>::iterator
5491         DIt = BeginIt; DIt != EndIt; ++DIt)
5492    Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
5493}
5494
5495namespace {
5496  /// \brief ModuleFile visitor used to perform name lookup into a
5497  /// declaration context.
5498  class DeclContextNameLookupVisitor {
5499    ASTReader &Reader;
5500    SmallVectorImpl<const DeclContext *> &Contexts;
5501    DeclarationName Name;
5502    SmallVectorImpl<NamedDecl *> &Decls;
5503
5504  public:
5505    DeclContextNameLookupVisitor(ASTReader &Reader,
5506                                 SmallVectorImpl<const DeclContext *> &Contexts,
5507                                 DeclarationName Name,
5508                                 SmallVectorImpl<NamedDecl *> &Decls)
5509      : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
5510
5511    static bool visit(ModuleFile &M, void *UserData) {
5512      DeclContextNameLookupVisitor *This
5513        = static_cast<DeclContextNameLookupVisitor *>(UserData);
5514
5515      // Check whether we have any visible declaration information for
5516      // this context in this module.
5517      ModuleFile::DeclContextInfosMap::iterator Info;
5518      bool FoundInfo = false;
5519      for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
5520        Info = M.DeclContextInfos.find(This->Contexts[I]);
5521        if (Info != M.DeclContextInfos.end() &&
5522            Info->second.NameLookupTableData) {
5523          FoundInfo = true;
5524          break;
5525        }
5526      }
5527
5528      if (!FoundInfo)
5529        return false;
5530
5531      // Look for this name within this module.
5532      ASTDeclContextNameLookupTable *LookupTable =
5533        Info->second.NameLookupTableData;
5534      ASTDeclContextNameLookupTable::iterator Pos
5535        = LookupTable->find(This->Name);
5536      if (Pos == LookupTable->end())
5537        return false;
5538
5539      bool FoundAnything = false;
5540      ASTDeclContextNameLookupTrait::data_type Data = *Pos;
5541      for (; Data.first != Data.second; ++Data.first) {
5542        NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
5543        if (!ND)
5544          continue;
5545
5546        if (ND->getDeclName() != This->Name) {
5547          // A name might be null because the decl's redeclarable part is
5548          // currently read before reading its name. The lookup is triggered by
5549          // building that decl (likely indirectly), and so it is later in the
5550          // sense of "already existing" and can be ignored here.
5551          continue;
5552        }
5553
5554        // Record this declaration.
5555        FoundAnything = true;
5556        This->Decls.push_back(ND);
5557      }
5558
5559      return FoundAnything;
5560    }
5561  };
5562}
5563
5564/// \brief Retrieve the "definitive" module file for the definition of the
5565/// given declaration context, if there is one.
5566///
5567/// The "definitive" module file is the only place where we need to look to
5568/// find information about the declarations within the given declaration
5569/// context. For example, C++ and Objective-C classes, C structs/unions, and
5570/// Objective-C protocols, categories, and extensions are all defined in a
5571/// single place in the source code, so they have definitive module files
5572/// associated with them. C++ namespaces, on the other hand, can have
5573/// definitions in multiple different module files.
5574///
5575/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
5576/// NDEBUG checking.
5577static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
5578                                              ASTReader &Reader) {
5579  if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
5580    return Reader.getOwningModuleFile(cast<Decl>(DefDC));
5581
5582  return 0;
5583}
5584
5585bool
5586ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
5587                                          DeclarationName Name) {
5588  assert(DC->hasExternalVisibleStorage() &&
5589         "DeclContext has no visible decls in storage");
5590  if (!Name)
5591    return false;
5592
5593  SmallVector<NamedDecl *, 64> Decls;
5594
5595  // Compute the declaration contexts we need to look into. Multiple such
5596  // declaration contexts occur when two declaration contexts from disjoint
5597  // modules get merged, e.g., when two namespaces with the same name are
5598  // independently defined in separate modules.
5599  SmallVector<const DeclContext *, 2> Contexts;
5600  Contexts.push_back(DC);
5601
5602  if (DC->isNamespace()) {
5603    MergedDeclsMap::iterator Merged
5604      = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
5605    if (Merged != MergedDecls.end()) {
5606      for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
5607        Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
5608    }
5609  }
5610
5611  DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
5612
5613  // If we can definitively determine which module file to look into,
5614  // only look there. Otherwise, look in all module files.
5615  ModuleFile *Definitive;
5616  if (Contexts.size() == 1 &&
5617      (Definitive = getDefinitiveModuleFileFor(DC, *this))) {
5618    DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
5619  } else {
5620    ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
5621  }
5622  ++NumVisibleDeclContextsRead;
5623  SetExternalVisibleDeclsForName(DC, Name, Decls);
5624  return !Decls.empty();
5625}
5626
5627namespace {
5628  /// \brief ModuleFile visitor used to retrieve all visible names in a
5629  /// declaration context.
5630  class DeclContextAllNamesVisitor {
5631    ASTReader &Reader;
5632    SmallVectorImpl<const DeclContext *> &Contexts;
5633    llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > &Decls;
5634    bool VisitAll;
5635
5636  public:
5637    DeclContextAllNamesVisitor(ASTReader &Reader,
5638                               SmallVectorImpl<const DeclContext *> &Contexts,
5639                               llvm::DenseMap<DeclarationName,
5640                                           SmallVector<NamedDecl *, 8> > &Decls,
5641                                bool VisitAll)
5642      : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
5643
5644    static bool visit(ModuleFile &M, void *UserData) {
5645      DeclContextAllNamesVisitor *This
5646        = static_cast<DeclContextAllNamesVisitor *>(UserData);
5647
5648      // Check whether we have any visible declaration information for
5649      // this context in this module.
5650      ModuleFile::DeclContextInfosMap::iterator Info;
5651      bool FoundInfo = false;
5652      for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
5653        Info = M.DeclContextInfos.find(This->Contexts[I]);
5654        if (Info != M.DeclContextInfos.end() &&
5655            Info->second.NameLookupTableData) {
5656          FoundInfo = true;
5657          break;
5658        }
5659      }
5660
5661      if (!FoundInfo)
5662        return false;
5663
5664      ASTDeclContextNameLookupTable *LookupTable =
5665        Info->second.NameLookupTableData;
5666      bool FoundAnything = false;
5667      for (ASTDeclContextNameLookupTable::data_iterator
5668             I = LookupTable->data_begin(), E = LookupTable->data_end();
5669           I != E;
5670           ++I) {
5671        ASTDeclContextNameLookupTrait::data_type Data = *I;
5672        for (; Data.first != Data.second; ++Data.first) {
5673          NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
5674                                                                 *Data.first);
5675          if (!ND)
5676            continue;
5677
5678          // Record this declaration.
5679          FoundAnything = true;
5680          This->Decls[ND->getDeclName()].push_back(ND);
5681        }
5682      }
5683
5684      return FoundAnything && !This->VisitAll;
5685    }
5686  };
5687}
5688
5689void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
5690  if (!DC->hasExternalVisibleStorage())
5691    return;
5692  llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > Decls;
5693
5694  // Compute the declaration contexts we need to look into. Multiple such
5695  // declaration contexts occur when two declaration contexts from disjoint
5696  // modules get merged, e.g., when two namespaces with the same name are
5697  // independently defined in separate modules.
5698  SmallVector<const DeclContext *, 2> Contexts;
5699  Contexts.push_back(DC);
5700
5701  if (DC->isNamespace()) {
5702    MergedDeclsMap::iterator Merged
5703      = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
5704    if (Merged != MergedDecls.end()) {
5705      for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
5706        Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
5707    }
5708  }
5709
5710  DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
5711                                     /*VisitAll=*/DC->isFileContext());
5712  ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
5713  ++NumVisibleDeclContextsRead;
5714
5715  for (llvm::DenseMap<DeclarationName,
5716                      SmallVector<NamedDecl *, 8> >::iterator
5717         I = Decls.begin(), E = Decls.end(); I != E; ++I) {
5718    SetExternalVisibleDeclsForName(DC, I->first, I->second);
5719  }
5720  const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
5721}
5722
5723/// \brief Under non-PCH compilation the consumer receives the objc methods
5724/// before receiving the implementation, and codegen depends on this.
5725/// We simulate this by deserializing and passing to consumer the methods of the
5726/// implementation before passing the deserialized implementation decl.
5727static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
5728                                       ASTConsumer *Consumer) {
5729  assert(ImplD && Consumer);
5730
5731  for (ObjCImplDecl::method_iterator
5732         I = ImplD->meth_begin(), E = ImplD->meth_end(); I != E; ++I)
5733    Consumer->HandleInterestingDecl(DeclGroupRef(*I));
5734
5735  Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
5736}
5737
5738void ASTReader::PassInterestingDeclsToConsumer() {
5739  assert(Consumer);
5740  while (!InterestingDecls.empty()) {
5741    Decl *D = InterestingDecls.front();
5742    InterestingDecls.pop_front();
5743
5744    PassInterestingDeclToConsumer(D);
5745  }
5746}
5747
5748void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
5749  if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
5750    PassObjCImplDeclToConsumer(ImplD, Consumer);
5751  else
5752    Consumer->HandleInterestingDecl(DeclGroupRef(D));
5753}
5754
5755void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
5756  this->Consumer = Consumer;
5757
5758  if (!Consumer)
5759    return;
5760
5761  for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) {
5762    // Force deserialization of this decl, which will cause it to be queued for
5763    // passing to the consumer.
5764    GetDecl(ExternalDefinitions[I]);
5765  }
5766  ExternalDefinitions.clear();
5767
5768  PassInterestingDeclsToConsumer();
5769}
5770
5771void ASTReader::PrintStats() {
5772  std::fprintf(stderr, "*** AST File Statistics:\n");
5773
5774  unsigned NumTypesLoaded
5775    = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
5776                                      QualType());
5777  unsigned NumDeclsLoaded
5778    = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
5779                                      (Decl *)0);
5780  unsigned NumIdentifiersLoaded
5781    = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
5782                                            IdentifiersLoaded.end(),
5783                                            (IdentifierInfo *)0);
5784  unsigned NumMacrosLoaded
5785    = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
5786                                       MacrosLoaded.end(),
5787                                       (MacroDirective *)0);
5788  unsigned NumSelectorsLoaded
5789    = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
5790                                          SelectorsLoaded.end(),
5791                                          Selector());
5792
5793  if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
5794    std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
5795                 NumSLocEntriesRead, TotalNumSLocEntries,
5796                 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
5797  if (!TypesLoaded.empty())
5798    std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
5799                 NumTypesLoaded, (unsigned)TypesLoaded.size(),
5800                 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
5801  if (!DeclsLoaded.empty())
5802    std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
5803                 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
5804                 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
5805  if (!IdentifiersLoaded.empty())
5806    std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
5807                 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
5808                 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
5809  if (!MacrosLoaded.empty())
5810    std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
5811                 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
5812                 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
5813  if (!SelectorsLoaded.empty())
5814    std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
5815                 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
5816                 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
5817  if (TotalNumStatements)
5818    std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
5819                 NumStatementsRead, TotalNumStatements,
5820                 ((float)NumStatementsRead/TotalNumStatements * 100));
5821  if (TotalNumMacros)
5822    std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
5823                 NumMacrosRead, TotalNumMacros,
5824                 ((float)NumMacrosRead/TotalNumMacros * 100));
5825  if (TotalLexicalDeclContexts)
5826    std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
5827                 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
5828                 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
5829                  * 100));
5830  if (TotalVisibleDeclContexts)
5831    std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
5832                 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
5833                 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
5834                  * 100));
5835  if (TotalNumMethodPoolEntries) {
5836    std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
5837                 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
5838                 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
5839                  * 100));
5840  }
5841  if (NumMethodPoolLookups) {
5842    std::fprintf(stderr, "  %u/%u method pool lookups succeeded (%f%%)\n",
5843                 NumMethodPoolHits, NumMethodPoolLookups,
5844                 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
5845  }
5846  if (NumMethodPoolTableLookups) {
5847    std::fprintf(stderr, "  %u/%u method pool table lookups succeeded (%f%%)\n",
5848                 NumMethodPoolTableHits, NumMethodPoolTableLookups,
5849                 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
5850                  * 100.0));
5851  }
5852
5853  if (NumIdentifierLookupHits) {
5854    std::fprintf(stderr,
5855                 "  %u / %u identifier table lookups succeeded (%f%%)\n",
5856                 NumIdentifierLookupHits, NumIdentifierLookups,
5857                 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
5858  }
5859
5860  if (GlobalIndex) {
5861    std::fprintf(stderr, "\n");
5862    GlobalIndex->printStats();
5863  }
5864
5865  std::fprintf(stderr, "\n");
5866  dump();
5867  std::fprintf(stderr, "\n");
5868}
5869
5870template<typename Key, typename ModuleFile, unsigned InitialCapacity>
5871static void
5872dumpModuleIDMap(StringRef Name,
5873                const ContinuousRangeMap<Key, ModuleFile *,
5874                                         InitialCapacity> &Map) {
5875  if (Map.begin() == Map.end())
5876    return;
5877
5878  typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
5879  llvm::errs() << Name << ":\n";
5880  for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
5881       I != IEnd; ++I) {
5882    llvm::errs() << "  " << I->first << " -> " << I->second->FileName
5883      << "\n";
5884  }
5885}
5886
5887void ASTReader::dump() {
5888  llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
5889  dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
5890  dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
5891  dumpModuleIDMap("Global type map", GlobalTypeMap);
5892  dumpModuleIDMap("Global declaration map", GlobalDeclMap);
5893  dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
5894  dumpModuleIDMap("Global macro map", GlobalMacroMap);
5895  dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
5896  dumpModuleIDMap("Global selector map", GlobalSelectorMap);
5897  dumpModuleIDMap("Global preprocessed entity map",
5898                  GlobalPreprocessedEntityMap);
5899
5900  llvm::errs() << "\n*** PCH/Modules Loaded:";
5901  for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
5902                                       MEnd = ModuleMgr.end();
5903       M != MEnd; ++M)
5904    (*M)->dump();
5905}
5906
5907/// Return the amount of memory used by memory buffers, breaking down
5908/// by heap-backed versus mmap'ed memory.
5909void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
5910  for (ModuleConstIterator I = ModuleMgr.begin(),
5911      E = ModuleMgr.end(); I != E; ++I) {
5912    if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
5913      size_t bytes = buf->getBufferSize();
5914      switch (buf->getBufferKind()) {
5915        case llvm::MemoryBuffer::MemoryBuffer_Malloc:
5916          sizes.malloc_bytes += bytes;
5917          break;
5918        case llvm::MemoryBuffer::MemoryBuffer_MMap:
5919          sizes.mmap_bytes += bytes;
5920          break;
5921      }
5922    }
5923  }
5924}
5925
5926void ASTReader::InitializeSema(Sema &S) {
5927  SemaObj = &S;
5928  S.addExternalSource(this);
5929
5930  // Makes sure any declarations that were deserialized "too early"
5931  // still get added to the identifier's declaration chains.
5932  for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
5933    NamedDecl *ND = cast<NamedDecl>(PreloadedDecls[I]->getMostRecentDecl());
5934    SemaObj->pushExternalDeclIntoScope(ND, PreloadedDecls[I]->getDeclName());
5935  }
5936  PreloadedDecls.clear();
5937
5938  // Load the offsets of the declarations that Sema references.
5939  // They will be lazily deserialized when needed.
5940  if (!SemaDeclRefs.empty()) {
5941    assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!");
5942    if (!SemaObj->StdNamespace)
5943      SemaObj->StdNamespace = SemaDeclRefs[0];
5944    if (!SemaObj->StdBadAlloc)
5945      SemaObj->StdBadAlloc = SemaDeclRefs[1];
5946  }
5947
5948  if (!FPPragmaOptions.empty()) {
5949    assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
5950    SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
5951  }
5952
5953  if (!OpenCLExtensions.empty()) {
5954    unsigned I = 0;
5955#define OPENCLEXT(nm)  SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
5956#include "clang/Basic/OpenCLExtensions.def"
5957
5958    assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
5959  }
5960}
5961
5962IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
5963  // Note that we are loading an identifier.
5964  Deserializing AnIdentifier(this);
5965  StringRef Name(NameStart, NameEnd - NameStart);
5966
5967  // If there is a global index, look there first to determine which modules
5968  // provably do not have any results for this identifier.
5969  GlobalModuleIndex::HitSet Hits;
5970  GlobalModuleIndex::HitSet *HitsPtr = 0;
5971  if (!loadGlobalIndex()) {
5972    if (GlobalIndex->lookupIdentifier(Name, Hits)) {
5973      HitsPtr = &Hits;
5974    }
5975  }
5976  IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
5977                                  NumIdentifierLookups,
5978                                  NumIdentifierLookupHits);
5979  ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
5980  IdentifierInfo *II = Visitor.getIdentifierInfo();
5981  markIdentifierUpToDate(II);
5982  return II;
5983}
5984
5985namespace clang {
5986  /// \brief An identifier-lookup iterator that enumerates all of the
5987  /// identifiers stored within a set of AST files.
5988  class ASTIdentifierIterator : public IdentifierIterator {
5989    /// \brief The AST reader whose identifiers are being enumerated.
5990    const ASTReader &Reader;
5991
5992    /// \brief The current index into the chain of AST files stored in
5993    /// the AST reader.
5994    unsigned Index;
5995
5996    /// \brief The current position within the identifier lookup table
5997    /// of the current AST file.
5998    ASTIdentifierLookupTable::key_iterator Current;
5999
6000    /// \brief The end position within the identifier lookup table of
6001    /// the current AST file.
6002    ASTIdentifierLookupTable::key_iterator End;
6003
6004  public:
6005    explicit ASTIdentifierIterator(const ASTReader &Reader);
6006
6007    virtual StringRef Next();
6008  };
6009}
6010
6011ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6012  : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6013  ASTIdentifierLookupTable *IdTable
6014    = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6015  Current = IdTable->key_begin();
6016  End = IdTable->key_end();
6017}
6018
6019StringRef ASTIdentifierIterator::Next() {
6020  while (Current == End) {
6021    // If we have exhausted all of our AST files, we're done.
6022    if (Index == 0)
6023      return StringRef();
6024
6025    --Index;
6026    ASTIdentifierLookupTable *IdTable
6027      = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
6028        IdentifierLookupTable;
6029    Current = IdTable->key_begin();
6030    End = IdTable->key_end();
6031  }
6032
6033  // We have any identifiers remaining in the current AST file; return
6034  // the next one.
6035  StringRef Result = *Current;
6036  ++Current;
6037  return Result;
6038}
6039
6040IdentifierIterator *ASTReader::getIdentifiers() const {
6041  return new ASTIdentifierIterator(*this);
6042}
6043
6044namespace clang { namespace serialization {
6045  class ReadMethodPoolVisitor {
6046    ASTReader &Reader;
6047    Selector Sel;
6048    unsigned PriorGeneration;
6049    SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
6050    SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
6051
6052  public:
6053    ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
6054                          unsigned PriorGeneration)
6055      : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) { }
6056
6057    static bool visit(ModuleFile &M, void *UserData) {
6058      ReadMethodPoolVisitor *This
6059        = static_cast<ReadMethodPoolVisitor *>(UserData);
6060
6061      if (!M.SelectorLookupTable)
6062        return false;
6063
6064      // If we've already searched this module file, skip it now.
6065      if (M.Generation <= This->PriorGeneration)
6066        return true;
6067
6068      ++This->Reader.NumMethodPoolTableLookups;
6069      ASTSelectorLookupTable *PoolTable
6070        = (ASTSelectorLookupTable*)M.SelectorLookupTable;
6071      ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
6072      if (Pos == PoolTable->end())
6073        return false;
6074
6075      ++This->Reader.NumMethodPoolTableHits;
6076      ++This->Reader.NumSelectorsRead;
6077      // FIXME: Not quite happy with the statistics here. We probably should
6078      // disable this tracking when called via LoadSelector.
6079      // Also, should entries without methods count as misses?
6080      ++This->Reader.NumMethodPoolEntriesRead;
6081      ASTSelectorLookupTrait::data_type Data = *Pos;
6082      if (This->Reader.DeserializationListener)
6083        This->Reader.DeserializationListener->SelectorRead(Data.ID,
6084                                                           This->Sel);
6085
6086      This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
6087      This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
6088      return true;
6089    }
6090
6091    /// \brief Retrieve the instance methods found by this visitor.
6092    ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
6093      return InstanceMethods;
6094    }
6095
6096    /// \brief Retrieve the instance methods found by this visitor.
6097    ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
6098      return FactoryMethods;
6099    }
6100  };
6101} } // end namespace clang::serialization
6102
6103/// \brief Add the given set of methods to the method list.
6104static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
6105                             ObjCMethodList &List) {
6106  for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
6107    S.addMethodToGlobalList(&List, Methods[I]);
6108  }
6109}
6110
6111void ASTReader::ReadMethodPool(Selector Sel) {
6112  // Get the selector generation and update it to the current generation.
6113  unsigned &Generation = SelectorGeneration[Sel];
6114  unsigned PriorGeneration = Generation;
6115  Generation = CurrentGeneration;
6116
6117  // Search for methods defined with this selector.
6118  ++NumMethodPoolLookups;
6119  ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
6120  ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
6121
6122  if (Visitor.getInstanceMethods().empty() &&
6123      Visitor.getFactoryMethods().empty())
6124    return;
6125
6126  ++NumMethodPoolHits;
6127
6128  if (!getSema())
6129    return;
6130
6131  Sema &S = *getSema();
6132  Sema::GlobalMethodPool::iterator Pos
6133    = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
6134
6135  addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
6136  addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
6137}
6138
6139void ASTReader::ReadKnownNamespaces(
6140                          SmallVectorImpl<NamespaceDecl *> &Namespaces) {
6141  Namespaces.clear();
6142
6143  for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
6144    if (NamespaceDecl *Namespace
6145                = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
6146      Namespaces.push_back(Namespace);
6147  }
6148}
6149
6150void ASTReader::ReadUndefinedButUsed(
6151                        llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
6152  for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
6153    NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
6154    SourceLocation Loc =
6155        SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
6156    Undefined.insert(std::make_pair(D, Loc));
6157  }
6158}
6159
6160void ASTReader::ReadTentativeDefinitions(
6161                  SmallVectorImpl<VarDecl *> &TentativeDefs) {
6162  for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
6163    VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
6164    if (Var)
6165      TentativeDefs.push_back(Var);
6166  }
6167  TentativeDefinitions.clear();
6168}
6169
6170void ASTReader::ReadUnusedFileScopedDecls(
6171                               SmallVectorImpl<const DeclaratorDecl *> &Decls) {
6172  for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
6173    DeclaratorDecl *D
6174      = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
6175    if (D)
6176      Decls.push_back(D);
6177  }
6178  UnusedFileScopedDecls.clear();
6179}
6180
6181void ASTReader::ReadDelegatingConstructors(
6182                                 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
6183  for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
6184    CXXConstructorDecl *D
6185      = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
6186    if (D)
6187      Decls.push_back(D);
6188  }
6189  DelegatingCtorDecls.clear();
6190}
6191
6192void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
6193  for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
6194    TypedefNameDecl *D
6195      = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
6196    if (D)
6197      Decls.push_back(D);
6198  }
6199  ExtVectorDecls.clear();
6200}
6201
6202void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
6203  for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
6204    CXXRecordDecl *D
6205      = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
6206    if (D)
6207      Decls.push_back(D);
6208  }
6209  DynamicClasses.clear();
6210}
6211
6212void
6213ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
6214  for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
6215    NamedDecl *D
6216      = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
6217    if (D)
6218      Decls.push_back(D);
6219  }
6220  LocallyScopedExternCDecls.clear();
6221}
6222
6223void ASTReader::ReadReferencedSelectors(
6224       SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
6225  if (ReferencedSelectorsData.empty())
6226    return;
6227
6228  // If there are @selector references added them to its pool. This is for
6229  // implementation of -Wselector.
6230  unsigned int DataSize = ReferencedSelectorsData.size()-1;
6231  unsigned I = 0;
6232  while (I < DataSize) {
6233    Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
6234    SourceLocation SelLoc
6235      = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
6236    Sels.push_back(std::make_pair(Sel, SelLoc));
6237  }
6238  ReferencedSelectorsData.clear();
6239}
6240
6241void ASTReader::ReadWeakUndeclaredIdentifiers(
6242       SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
6243  if (WeakUndeclaredIdentifiers.empty())
6244    return;
6245
6246  for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
6247    IdentifierInfo *WeakId
6248      = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
6249    IdentifierInfo *AliasId
6250      = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
6251    SourceLocation Loc
6252      = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
6253    bool Used = WeakUndeclaredIdentifiers[I++];
6254    WeakInfo WI(AliasId, Loc);
6255    WI.setUsed(Used);
6256    WeakIDs.push_back(std::make_pair(WeakId, WI));
6257  }
6258  WeakUndeclaredIdentifiers.clear();
6259}
6260
6261void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
6262  for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
6263    ExternalVTableUse VT;
6264    VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
6265    VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
6266    VT.DefinitionRequired = VTableUses[Idx++];
6267    VTables.push_back(VT);
6268  }
6269
6270  VTableUses.clear();
6271}
6272
6273void ASTReader::ReadPendingInstantiations(
6274       SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
6275  for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
6276    ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
6277    SourceLocation Loc
6278      = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
6279
6280    Pending.push_back(std::make_pair(D, Loc));
6281  }
6282  PendingInstantiations.clear();
6283}
6284
6285void ASTReader::LoadSelector(Selector Sel) {
6286  // It would be complicated to avoid reading the methods anyway. So don't.
6287  ReadMethodPool(Sel);
6288}
6289
6290void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
6291  assert(ID && "Non-zero identifier ID required");
6292  assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
6293  IdentifiersLoaded[ID - 1] = II;
6294  if (DeserializationListener)
6295    DeserializationListener->IdentifierRead(ID, II);
6296}
6297
6298/// \brief Set the globally-visible declarations associated with the given
6299/// identifier.
6300///
6301/// If the AST reader is currently in a state where the given declaration IDs
6302/// cannot safely be resolved, they are queued until it is safe to resolve
6303/// them.
6304///
6305/// \param II an IdentifierInfo that refers to one or more globally-visible
6306/// declarations.
6307///
6308/// \param DeclIDs the set of declaration IDs with the name @p II that are
6309/// visible at global scope.
6310///
6311/// \param Decls if non-null, this vector will be populated with the set of
6312/// deserialized declarations. These declarations will not be pushed into
6313/// scope.
6314void
6315ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
6316                              const SmallVectorImpl<uint32_t> &DeclIDs,
6317                                   SmallVectorImpl<Decl *> *Decls) {
6318  if (NumCurrentElementsDeserializing && !Decls) {
6319    PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
6320    return;
6321  }
6322
6323  for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
6324    NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
6325    if (SemaObj) {
6326      // If we're simply supposed to record the declarations, do so now.
6327      if (Decls) {
6328        Decls->push_back(D);
6329        continue;
6330      }
6331
6332      // Introduce this declaration into the translation-unit scope
6333      // and add it to the declaration chain for this identifier, so
6334      // that (unqualified) name lookup will find it.
6335      NamedDecl *ND = cast<NamedDecl>(D->getMostRecentDecl());
6336      SemaObj->pushExternalDeclIntoScope(ND, II);
6337    } else {
6338      // Queue this declaration so that it will be added to the
6339      // translation unit scope and identifier's declaration chain
6340      // once a Sema object is known.
6341      PreloadedDecls.push_back(D);
6342    }
6343  }
6344}
6345
6346IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
6347  if (ID == 0)
6348    return 0;
6349
6350  if (IdentifiersLoaded.empty()) {
6351    Error("no identifier table in AST file");
6352    return 0;
6353  }
6354
6355  ID -= 1;
6356  if (!IdentifiersLoaded[ID]) {
6357    GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
6358    assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
6359    ModuleFile *M = I->second;
6360    unsigned Index = ID - M->BaseIdentifierID;
6361    const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
6362
6363    // All of the strings in the AST file are preceded by a 16-bit length.
6364    // Extract that 16-bit length to avoid having to execute strlen().
6365    // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
6366    //  unsigned integers.  This is important to avoid integer overflow when
6367    //  we cast them to 'unsigned'.
6368    const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
6369    unsigned StrLen = (((unsigned) StrLenPtr[0])
6370                       | (((unsigned) StrLenPtr[1]) << 8)) - 1;
6371    IdentifiersLoaded[ID]
6372      = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
6373    if (DeserializationListener)
6374      DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
6375  }
6376
6377  return IdentifiersLoaded[ID];
6378}
6379
6380IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
6381  return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
6382}
6383
6384IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
6385  if (LocalID < NUM_PREDEF_IDENT_IDS)
6386    return LocalID;
6387
6388  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6389    = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
6390  assert(I != M.IdentifierRemap.end()
6391         && "Invalid index into identifier index remap");
6392
6393  return LocalID + I->second;
6394}
6395
6396MacroDirective *ASTReader::getMacro(MacroID ID, MacroDirective *Hint) {
6397  if (ID == 0)
6398    return 0;
6399
6400  if (MacrosLoaded.empty()) {
6401    Error("no macro table in AST file");
6402    return 0;
6403  }
6404
6405  ID -= NUM_PREDEF_MACRO_IDS;
6406  if (!MacrosLoaded[ID]) {
6407    GlobalMacroMapType::iterator I
6408      = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
6409    assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
6410    ModuleFile *M = I->second;
6411    unsigned Index = ID - M->BaseMacroID;
6412    ReadMacroRecord(*M, M->MacroOffsets[Index], Hint);
6413  }
6414
6415  return MacrosLoaded[ID];
6416}
6417
6418MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
6419  if (LocalID < NUM_PREDEF_MACRO_IDS)
6420    return LocalID;
6421
6422  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6423    = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
6424  assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
6425
6426  return LocalID + I->second;
6427}
6428
6429serialization::SubmoduleID
6430ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
6431  if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
6432    return LocalID;
6433
6434  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6435    = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
6436  assert(I != M.SubmoduleRemap.end()
6437         && "Invalid index into submodule index remap");
6438
6439  return LocalID + I->second;
6440}
6441
6442Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
6443  if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
6444    assert(GlobalID == 0 && "Unhandled global submodule ID");
6445    return 0;
6446  }
6447
6448  if (GlobalID > SubmodulesLoaded.size()) {
6449    Error("submodule ID out of range in AST file");
6450    return 0;
6451  }
6452
6453  return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
6454}
6455
6456Module *ASTReader::getModule(unsigned ID) {
6457  return getSubmodule(ID);
6458}
6459
6460Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
6461  return DecodeSelector(getGlobalSelectorID(M, LocalID));
6462}
6463
6464Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
6465  if (ID == 0)
6466    return Selector();
6467
6468  if (ID > SelectorsLoaded.size()) {
6469    Error("selector ID out of range in AST file");
6470    return Selector();
6471  }
6472
6473  if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) {
6474    // Load this selector from the selector table.
6475    GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
6476    assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
6477    ModuleFile &M = *I->second;
6478    ASTSelectorLookupTrait Trait(*this, M);
6479    unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
6480    SelectorsLoaded[ID - 1] =
6481      Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
6482    if (DeserializationListener)
6483      DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
6484  }
6485
6486  return SelectorsLoaded[ID - 1];
6487}
6488
6489Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
6490  return DecodeSelector(ID);
6491}
6492
6493uint32_t ASTReader::GetNumExternalSelectors() {
6494  // ID 0 (the null selector) is considered an external selector.
6495  return getTotalNumSelectors() + 1;
6496}
6497
6498serialization::SelectorID
6499ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
6500  if (LocalID < NUM_PREDEF_SELECTOR_IDS)
6501    return LocalID;
6502
6503  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6504    = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
6505  assert(I != M.SelectorRemap.end()
6506         && "Invalid index into selector index remap");
6507
6508  return LocalID + I->second;
6509}
6510
6511DeclarationName
6512ASTReader::ReadDeclarationName(ModuleFile &F,
6513                               const RecordData &Record, unsigned &Idx) {
6514  DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
6515  switch (Kind) {
6516  case DeclarationName::Identifier:
6517    return DeclarationName(GetIdentifierInfo(F, Record, Idx));
6518
6519  case DeclarationName::ObjCZeroArgSelector:
6520  case DeclarationName::ObjCOneArgSelector:
6521  case DeclarationName::ObjCMultiArgSelector:
6522    return DeclarationName(ReadSelector(F, Record, Idx));
6523
6524  case DeclarationName::CXXConstructorName:
6525    return Context.DeclarationNames.getCXXConstructorName(
6526                          Context.getCanonicalType(readType(F, Record, Idx)));
6527
6528  case DeclarationName::CXXDestructorName:
6529    return Context.DeclarationNames.getCXXDestructorName(
6530                          Context.getCanonicalType(readType(F, Record, Idx)));
6531
6532  case DeclarationName::CXXConversionFunctionName:
6533    return Context.DeclarationNames.getCXXConversionFunctionName(
6534                          Context.getCanonicalType(readType(F, Record, Idx)));
6535
6536  case DeclarationName::CXXOperatorName:
6537    return Context.DeclarationNames.getCXXOperatorName(
6538                                       (OverloadedOperatorKind)Record[Idx++]);
6539
6540  case DeclarationName::CXXLiteralOperatorName:
6541    return Context.DeclarationNames.getCXXLiteralOperatorName(
6542                                       GetIdentifierInfo(F, Record, Idx));
6543
6544  case DeclarationName::CXXUsingDirective:
6545    return DeclarationName::getUsingDirectiveName();
6546  }
6547
6548  llvm_unreachable("Invalid NameKind!");
6549}
6550
6551void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
6552                                       DeclarationNameLoc &DNLoc,
6553                                       DeclarationName Name,
6554                                      const RecordData &Record, unsigned &Idx) {
6555  switch (Name.getNameKind()) {
6556  case DeclarationName::CXXConstructorName:
6557  case DeclarationName::CXXDestructorName:
6558  case DeclarationName::CXXConversionFunctionName:
6559    DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
6560    break;
6561
6562  case DeclarationName::CXXOperatorName:
6563    DNLoc.CXXOperatorName.BeginOpNameLoc
6564        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6565    DNLoc.CXXOperatorName.EndOpNameLoc
6566        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6567    break;
6568
6569  case DeclarationName::CXXLiteralOperatorName:
6570    DNLoc.CXXLiteralOperatorName.OpNameLoc
6571        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6572    break;
6573
6574  case DeclarationName::Identifier:
6575  case DeclarationName::ObjCZeroArgSelector:
6576  case DeclarationName::ObjCOneArgSelector:
6577  case DeclarationName::ObjCMultiArgSelector:
6578  case DeclarationName::CXXUsingDirective:
6579    break;
6580  }
6581}
6582
6583void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
6584                                        DeclarationNameInfo &NameInfo,
6585                                      const RecordData &Record, unsigned &Idx) {
6586  NameInfo.setName(ReadDeclarationName(F, Record, Idx));
6587  NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
6588  DeclarationNameLoc DNLoc;
6589  ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
6590  NameInfo.setInfo(DNLoc);
6591}
6592
6593void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
6594                                  const RecordData &Record, unsigned &Idx) {
6595  Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
6596  unsigned NumTPLists = Record[Idx++];
6597  Info.NumTemplParamLists = NumTPLists;
6598  if (NumTPLists) {
6599    Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
6600    for (unsigned i=0; i != NumTPLists; ++i)
6601      Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
6602  }
6603}
6604
6605TemplateName
6606ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
6607                            unsigned &Idx) {
6608  TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
6609  switch (Kind) {
6610  case TemplateName::Template:
6611      return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
6612
6613  case TemplateName::OverloadedTemplate: {
6614    unsigned size = Record[Idx++];
6615    UnresolvedSet<8> Decls;
6616    while (size--)
6617      Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
6618
6619    return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
6620  }
6621
6622  case TemplateName::QualifiedTemplate: {
6623    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
6624    bool hasTemplKeyword = Record[Idx++];
6625    TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
6626    return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
6627  }
6628
6629  case TemplateName::DependentTemplate: {
6630    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
6631    if (Record[Idx++])  // isIdentifier
6632      return Context.getDependentTemplateName(NNS,
6633                                               GetIdentifierInfo(F, Record,
6634                                                                 Idx));
6635    return Context.getDependentTemplateName(NNS,
6636                                         (OverloadedOperatorKind)Record[Idx++]);
6637  }
6638
6639  case TemplateName::SubstTemplateTemplateParm: {
6640    TemplateTemplateParmDecl *param
6641      = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
6642    if (!param) return TemplateName();
6643    TemplateName replacement = ReadTemplateName(F, Record, Idx);
6644    return Context.getSubstTemplateTemplateParm(param, replacement);
6645  }
6646
6647  case TemplateName::SubstTemplateTemplateParmPack: {
6648    TemplateTemplateParmDecl *Param
6649      = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
6650    if (!Param)
6651      return TemplateName();
6652
6653    TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
6654    if (ArgPack.getKind() != TemplateArgument::Pack)
6655      return TemplateName();
6656
6657    return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
6658  }
6659  }
6660
6661  llvm_unreachable("Unhandled template name kind!");
6662}
6663
6664TemplateArgument
6665ASTReader::ReadTemplateArgument(ModuleFile &F,
6666                                const RecordData &Record, unsigned &Idx) {
6667  TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
6668  switch (Kind) {
6669  case TemplateArgument::Null:
6670    return TemplateArgument();
6671  case TemplateArgument::Type:
6672    return TemplateArgument(readType(F, Record, Idx));
6673  case TemplateArgument::Declaration: {
6674    ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
6675    bool ForReferenceParam = Record[Idx++];
6676    return TemplateArgument(D, ForReferenceParam);
6677  }
6678  case TemplateArgument::NullPtr:
6679    return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
6680  case TemplateArgument::Integral: {
6681    llvm::APSInt Value = ReadAPSInt(Record, Idx);
6682    QualType T = readType(F, Record, Idx);
6683    return TemplateArgument(Context, Value, T);
6684  }
6685  case TemplateArgument::Template:
6686    return TemplateArgument(ReadTemplateName(F, Record, Idx));
6687  case TemplateArgument::TemplateExpansion: {
6688    TemplateName Name = ReadTemplateName(F, Record, Idx);
6689    Optional<unsigned> NumTemplateExpansions;
6690    if (unsigned NumExpansions = Record[Idx++])
6691      NumTemplateExpansions = NumExpansions - 1;
6692    return TemplateArgument(Name, NumTemplateExpansions);
6693  }
6694  case TemplateArgument::Expression:
6695    return TemplateArgument(ReadExpr(F));
6696  case TemplateArgument::Pack: {
6697    unsigned NumArgs = Record[Idx++];
6698    TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
6699    for (unsigned I = 0; I != NumArgs; ++I)
6700      Args[I] = ReadTemplateArgument(F, Record, Idx);
6701    return TemplateArgument(Args, NumArgs);
6702  }
6703  }
6704
6705  llvm_unreachable("Unhandled template argument kind!");
6706}
6707
6708TemplateParameterList *
6709ASTReader::ReadTemplateParameterList(ModuleFile &F,
6710                                     const RecordData &Record, unsigned &Idx) {
6711  SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
6712  SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
6713  SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
6714
6715  unsigned NumParams = Record[Idx++];
6716  SmallVector<NamedDecl *, 16> Params;
6717  Params.reserve(NumParams);
6718  while (NumParams--)
6719    Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
6720
6721  TemplateParameterList* TemplateParams =
6722    TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
6723                                  Params.data(), Params.size(), RAngleLoc);
6724  return TemplateParams;
6725}
6726
6727void
6728ASTReader::
6729ReadTemplateArgumentList(SmallVector<TemplateArgument, 8> &TemplArgs,
6730                         ModuleFile &F, const RecordData &Record,
6731                         unsigned &Idx) {
6732  unsigned NumTemplateArgs = Record[Idx++];
6733  TemplArgs.reserve(NumTemplateArgs);
6734  while (NumTemplateArgs--)
6735    TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
6736}
6737
6738/// \brief Read a UnresolvedSet structure.
6739void ASTReader::ReadUnresolvedSet(ModuleFile &F, ASTUnresolvedSet &Set,
6740                                  const RecordData &Record, unsigned &Idx) {
6741  unsigned NumDecls = Record[Idx++];
6742  Set.reserve(Context, NumDecls);
6743  while (NumDecls--) {
6744    NamedDecl *D = ReadDeclAs<NamedDecl>(F, Record, Idx);
6745    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
6746    Set.addDecl(Context, D, AS);
6747  }
6748}
6749
6750CXXBaseSpecifier
6751ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
6752                                const RecordData &Record, unsigned &Idx) {
6753  bool isVirtual = static_cast<bool>(Record[Idx++]);
6754  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
6755  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
6756  bool inheritConstructors = static_cast<bool>(Record[Idx++]);
6757  TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
6758  SourceRange Range = ReadSourceRange(F, Record, Idx);
6759  SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
6760  CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
6761                          EllipsisLoc);
6762  Result.setInheritConstructors(inheritConstructors);
6763  return Result;
6764}
6765
6766std::pair<CXXCtorInitializer **, unsigned>
6767ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
6768                                   unsigned &Idx) {
6769  CXXCtorInitializer **CtorInitializers = 0;
6770  unsigned NumInitializers = Record[Idx++];
6771  if (NumInitializers) {
6772    CtorInitializers
6773        = new (Context) CXXCtorInitializer*[NumInitializers];
6774    for (unsigned i=0; i != NumInitializers; ++i) {
6775      TypeSourceInfo *TInfo = 0;
6776      bool IsBaseVirtual = false;
6777      FieldDecl *Member = 0;
6778      IndirectFieldDecl *IndirectMember = 0;
6779
6780      CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
6781      switch (Type) {
6782      case CTOR_INITIALIZER_BASE:
6783        TInfo = GetTypeSourceInfo(F, Record, Idx);
6784        IsBaseVirtual = Record[Idx++];
6785        break;
6786
6787      case CTOR_INITIALIZER_DELEGATING:
6788        TInfo = GetTypeSourceInfo(F, Record, Idx);
6789        break;
6790
6791       case CTOR_INITIALIZER_MEMBER:
6792        Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
6793        break;
6794
6795       case CTOR_INITIALIZER_INDIRECT_MEMBER:
6796        IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
6797        break;
6798      }
6799
6800      SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
6801      Expr *Init = ReadExpr(F);
6802      SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
6803      SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
6804      bool IsWritten = Record[Idx++];
6805      unsigned SourceOrderOrNumArrayIndices;
6806      SmallVector<VarDecl *, 8> Indices;
6807      if (IsWritten) {
6808        SourceOrderOrNumArrayIndices = Record[Idx++];
6809      } else {
6810        SourceOrderOrNumArrayIndices = Record[Idx++];
6811        Indices.reserve(SourceOrderOrNumArrayIndices);
6812        for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
6813          Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
6814      }
6815
6816      CXXCtorInitializer *BOMInit;
6817      if (Type == CTOR_INITIALIZER_BASE) {
6818        BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
6819                                             LParenLoc, Init, RParenLoc,
6820                                             MemberOrEllipsisLoc);
6821      } else if (Type == CTOR_INITIALIZER_DELEGATING) {
6822        BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
6823                                                   Init, RParenLoc);
6824      } else if (IsWritten) {
6825        if (Member)
6826          BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
6827                                               LParenLoc, Init, RParenLoc);
6828        else
6829          BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
6830                                               MemberOrEllipsisLoc, LParenLoc,
6831                                               Init, RParenLoc);
6832      } else {
6833        BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
6834                                             LParenLoc, Init, RParenLoc,
6835                                             Indices.data(), Indices.size());
6836      }
6837
6838      if (IsWritten)
6839        BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
6840      CtorInitializers[i] = BOMInit;
6841    }
6842  }
6843
6844  return std::make_pair(CtorInitializers, NumInitializers);
6845}
6846
6847NestedNameSpecifier *
6848ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
6849                                   const RecordData &Record, unsigned &Idx) {
6850  unsigned N = Record[Idx++];
6851  NestedNameSpecifier *NNS = 0, *Prev = 0;
6852  for (unsigned I = 0; I != N; ++I) {
6853    NestedNameSpecifier::SpecifierKind Kind
6854      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
6855    switch (Kind) {
6856    case NestedNameSpecifier::Identifier: {
6857      IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6858      NNS = NestedNameSpecifier::Create(Context, Prev, II);
6859      break;
6860    }
6861
6862    case NestedNameSpecifier::Namespace: {
6863      NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6864      NNS = NestedNameSpecifier::Create(Context, Prev, NS);
6865      break;
6866    }
6867
6868    case NestedNameSpecifier::NamespaceAlias: {
6869      NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6870      NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
6871      break;
6872    }
6873
6874    case NestedNameSpecifier::TypeSpec:
6875    case NestedNameSpecifier::TypeSpecWithTemplate: {
6876      const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
6877      if (!T)
6878        return 0;
6879
6880      bool Template = Record[Idx++];
6881      NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
6882      break;
6883    }
6884
6885    case NestedNameSpecifier::Global: {
6886      NNS = NestedNameSpecifier::GlobalSpecifier(Context);
6887      // No associated value, and there can't be a prefix.
6888      break;
6889    }
6890    }
6891    Prev = NNS;
6892  }
6893  return NNS;
6894}
6895
6896NestedNameSpecifierLoc
6897ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
6898                                      unsigned &Idx) {
6899  unsigned N = Record[Idx++];
6900  NestedNameSpecifierLocBuilder Builder;
6901  for (unsigned I = 0; I != N; ++I) {
6902    NestedNameSpecifier::SpecifierKind Kind
6903      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
6904    switch (Kind) {
6905    case NestedNameSpecifier::Identifier: {
6906      IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6907      SourceRange Range = ReadSourceRange(F, Record, Idx);
6908      Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
6909      break;
6910    }
6911
6912    case NestedNameSpecifier::Namespace: {
6913      NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6914      SourceRange Range = ReadSourceRange(F, Record, Idx);
6915      Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
6916      break;
6917    }
6918
6919    case NestedNameSpecifier::NamespaceAlias: {
6920      NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6921      SourceRange Range = ReadSourceRange(F, Record, Idx);
6922      Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
6923      break;
6924    }
6925
6926    case NestedNameSpecifier::TypeSpec:
6927    case NestedNameSpecifier::TypeSpecWithTemplate: {
6928      bool Template = Record[Idx++];
6929      TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
6930      if (!T)
6931        return NestedNameSpecifierLoc();
6932      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
6933
6934      // FIXME: 'template' keyword location not saved anywhere, so we fake it.
6935      Builder.Extend(Context,
6936                     Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
6937                     T->getTypeLoc(), ColonColonLoc);
6938      break;
6939    }
6940
6941    case NestedNameSpecifier::Global: {
6942      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
6943      Builder.MakeGlobal(Context, ColonColonLoc);
6944      break;
6945    }
6946    }
6947  }
6948
6949  return Builder.getWithLocInContext(Context);
6950}
6951
6952SourceRange
6953ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
6954                           unsigned &Idx) {
6955  SourceLocation beg = ReadSourceLocation(F, Record, Idx);
6956  SourceLocation end = ReadSourceLocation(F, Record, Idx);
6957  return SourceRange(beg, end);
6958}
6959
6960/// \brief Read an integral value
6961llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
6962  unsigned BitWidth = Record[Idx++];
6963  unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
6964  llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
6965  Idx += NumWords;
6966  return Result;
6967}
6968
6969/// \brief Read a signed integral value
6970llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
6971  bool isUnsigned = Record[Idx++];
6972  return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
6973}
6974
6975/// \brief Read a floating-point value
6976llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
6977                                     const llvm::fltSemantics &Sem,
6978                                     unsigned &Idx) {
6979  return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
6980}
6981
6982// \brief Read a string
6983std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
6984  unsigned Len = Record[Idx++];
6985  std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
6986  Idx += Len;
6987  return Result;
6988}
6989
6990VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
6991                                         unsigned &Idx) {
6992  unsigned Major = Record[Idx++];
6993  unsigned Minor = Record[Idx++];
6994  unsigned Subminor = Record[Idx++];
6995  if (Minor == 0)
6996    return VersionTuple(Major);
6997  if (Subminor == 0)
6998    return VersionTuple(Major, Minor - 1);
6999  return VersionTuple(Major, Minor - 1, Subminor - 1);
7000}
7001
7002CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
7003                                          const RecordData &Record,
7004                                          unsigned &Idx) {
7005  CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
7006  return CXXTemporary::Create(Context, Decl);
7007}
7008
7009DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
7010  return Diag(SourceLocation(), DiagID);
7011}
7012
7013DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
7014  return Diags.Report(Loc, DiagID);
7015}
7016
7017/// \brief Retrieve the identifier table associated with the
7018/// preprocessor.
7019IdentifierTable &ASTReader::getIdentifierTable() {
7020  return PP.getIdentifierTable();
7021}
7022
7023/// \brief Record that the given ID maps to the given switch-case
7024/// statement.
7025void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
7026  assert((*CurrSwitchCaseStmts)[ID] == 0 &&
7027         "Already have a SwitchCase with this ID");
7028  (*CurrSwitchCaseStmts)[ID] = SC;
7029}
7030
7031/// \brief Retrieve the switch-case statement with the given ID.
7032SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
7033  assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID");
7034  return (*CurrSwitchCaseStmts)[ID];
7035}
7036
7037void ASTReader::ClearSwitchCaseIDs() {
7038  CurrSwitchCaseStmts->clear();
7039}
7040
7041void ASTReader::ReadComments() {
7042  std::vector<RawComment *> Comments;
7043  for (SmallVectorImpl<std::pair<BitstreamCursor,
7044                                 serialization::ModuleFile *> >::iterator
7045       I = CommentsCursors.begin(),
7046       E = CommentsCursors.end();
7047       I != E; ++I) {
7048    BitstreamCursor &Cursor = I->first;
7049    serialization::ModuleFile &F = *I->second;
7050    SavedStreamPosition SavedPosition(Cursor);
7051
7052    RecordData Record;
7053    while (true) {
7054      llvm::BitstreamEntry Entry =
7055        Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
7056
7057      switch (Entry.Kind) {
7058      case llvm::BitstreamEntry::SubBlock: // Handled for us already.
7059      case llvm::BitstreamEntry::Error:
7060        Error("malformed block record in AST file");
7061        return;
7062      case llvm::BitstreamEntry::EndBlock:
7063        goto NextCursor;
7064      case llvm::BitstreamEntry::Record:
7065        // The interesting case.
7066        break;
7067      }
7068
7069      // Read a record.
7070      Record.clear();
7071      switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
7072      case COMMENTS_RAW_COMMENT: {
7073        unsigned Idx = 0;
7074        SourceRange SR = ReadSourceRange(F, Record, Idx);
7075        RawComment::CommentKind Kind =
7076            (RawComment::CommentKind) Record[Idx++];
7077        bool IsTrailingComment = Record[Idx++];
7078        bool IsAlmostTrailingComment = Record[Idx++];
7079        Comments.push_back(new (Context) RawComment(SR, Kind,
7080                                                    IsTrailingComment,
7081                                                    IsAlmostTrailingComment));
7082        break;
7083      }
7084      }
7085    }
7086  NextCursor:;
7087  }
7088  Context.Comments.addCommentsToFront(Comments);
7089}
7090
7091void ASTReader::finishPendingActions() {
7092  while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty() ||
7093         !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty()) {
7094    // If any identifiers with corresponding top-level declarations have
7095    // been loaded, load those declarations now.
7096    llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > TopLevelDecls;
7097    while (!PendingIdentifierInfos.empty()) {
7098      // FIXME: std::move
7099      IdentifierInfo *II = PendingIdentifierInfos.back().first;
7100      SmallVector<uint32_t, 4> DeclIDs = PendingIdentifierInfos.back().second;
7101      PendingIdentifierInfos.pop_back();
7102
7103      SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
7104    }
7105
7106    // Load pending declaration chains.
7107    for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
7108      loadPendingDeclChain(PendingDeclChains[I]);
7109      PendingDeclChainsKnown.erase(PendingDeclChains[I]);
7110    }
7111    PendingDeclChains.clear();
7112
7113    // Make the most recent of the top-level declarations visible.
7114    for (llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >::iterator
7115           TLD = TopLevelDecls.begin(), TLDEnd = TopLevelDecls.end();
7116         TLD != TLDEnd; ++TLD) {
7117      IdentifierInfo *II = TLD->first;
7118      for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
7119        NamedDecl *ND = cast<NamedDecl>(TLD->second[I]->getMostRecentDecl());
7120        SemaObj->pushExternalDeclIntoScope(ND, II);
7121      }
7122    }
7123
7124    // Load any pending macro definitions.
7125    for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
7126      // FIXME: std::move here
7127      SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second;
7128      MacroDirective *Hint = 0;
7129      for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx !=  NumIDs;
7130           ++IDIdx) {
7131        Hint = getMacro(GlobalIDs[IDIdx], Hint);
7132      }
7133    }
7134    PendingMacroIDs.clear();
7135
7136    // Wire up the DeclContexts for Decls that we delayed setting until
7137    // recursive loading is completed.
7138    while (!PendingDeclContextInfos.empty()) {
7139      PendingDeclContextInfo Info = PendingDeclContextInfos.front();
7140      PendingDeclContextInfos.pop_front();
7141      DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
7142      DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
7143      Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
7144    }
7145  }
7146
7147  // If we deserialized any C++ or Objective-C class definitions, any
7148  // Objective-C protocol definitions, or any redeclarable templates, make sure
7149  // that all redeclarations point to the definitions. Note that this can only
7150  // happen now, after the redeclaration chains have been fully wired.
7151  for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
7152                                           DEnd = PendingDefinitions.end();
7153       D != DEnd; ++D) {
7154    if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
7155      if (const TagType *TagT = dyn_cast<TagType>(TD->TypeForDecl)) {
7156        // Make sure that the TagType points at the definition.
7157        const_cast<TagType*>(TagT)->decl = TD;
7158      }
7159
7160      if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(*D)) {
7161        for (CXXRecordDecl::redecl_iterator R = RD->redecls_begin(),
7162                                         REnd = RD->redecls_end();
7163             R != REnd; ++R)
7164          cast<CXXRecordDecl>(*R)->DefinitionData = RD->DefinitionData;
7165
7166      }
7167
7168      continue;
7169    }
7170
7171    if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
7172      // Make sure that the ObjCInterfaceType points at the definition.
7173      const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
7174        ->Decl = ID;
7175
7176      for (ObjCInterfaceDecl::redecl_iterator R = ID->redecls_begin(),
7177                                           REnd = ID->redecls_end();
7178           R != REnd; ++R)
7179        R->Data = ID->Data;
7180
7181      continue;
7182    }
7183
7184    if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(*D)) {
7185      for (ObjCProtocolDecl::redecl_iterator R = PD->redecls_begin(),
7186                                          REnd = PD->redecls_end();
7187           R != REnd; ++R)
7188        R->Data = PD->Data;
7189
7190      continue;
7191    }
7192
7193    RedeclarableTemplateDecl *RTD
7194      = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
7195    for (RedeclarableTemplateDecl::redecl_iterator R = RTD->redecls_begin(),
7196                                                REnd = RTD->redecls_end();
7197         R != REnd; ++R)
7198      R->Common = RTD->Common;
7199  }
7200  PendingDefinitions.clear();
7201
7202  // Load the bodies of any functions or methods we've encountered. We do
7203  // this now (delayed) so that we can be sure that the declaration chains
7204  // have been fully wired up.
7205  for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
7206                               PBEnd = PendingBodies.end();
7207       PB != PBEnd; ++PB) {
7208    if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
7209      // FIXME: Check for =delete/=default?
7210      // FIXME: Complain about ODR violations here?
7211      if (!getContext().getLangOpts().Modules || !FD->hasBody())
7212        FD->setLazyBody(PB->second);
7213      continue;
7214    }
7215
7216    ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
7217    if (!getContext().getLangOpts().Modules || !MD->hasBody())
7218      MD->setLazyBody(PB->second);
7219  }
7220  PendingBodies.clear();
7221}
7222
7223void ASTReader::FinishedDeserializing() {
7224  assert(NumCurrentElementsDeserializing &&
7225         "FinishedDeserializing not paired with StartedDeserializing");
7226  if (NumCurrentElementsDeserializing == 1) {
7227    // We decrease NumCurrentElementsDeserializing only after pending actions
7228    // are finished, to avoid recursively re-calling finishPendingActions().
7229    finishPendingActions();
7230  }
7231  --NumCurrentElementsDeserializing;
7232
7233  if (NumCurrentElementsDeserializing == 0 &&
7234      Consumer && !PassingDeclsToConsumer) {
7235    // Guard variable to avoid recursively redoing the process of passing
7236    // decls to consumer.
7237    SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
7238                                                     true);
7239
7240    while (!InterestingDecls.empty()) {
7241      // We are not in recursive loading, so it's safe to pass the "interesting"
7242      // decls to the consumer.
7243      Decl *D = InterestingDecls.front();
7244      InterestingDecls.pop_front();
7245      PassInterestingDeclToConsumer(D);
7246    }
7247  }
7248}
7249
7250ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context,
7251                     StringRef isysroot, bool DisableValidation,
7252                     bool AllowASTWithCompilerErrors, bool UseGlobalIndex)
7253  : Listener(new PCHValidator(PP, *this)), DeserializationListener(0),
7254    SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
7255    Diags(PP.getDiagnostics()), SemaObj(0), PP(PP), Context(Context),
7256    Consumer(0), ModuleMgr(PP.getFileManager()),
7257    isysroot(isysroot), DisableValidation(DisableValidation),
7258    AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
7259    UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
7260    CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts),
7261    NumSLocEntriesRead(0), TotalNumSLocEntries(0),
7262    NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0),
7263    TotalNumMacros(0), NumIdentifierLookups(0), NumIdentifierLookupHits(0),
7264    NumSelectorsRead(0), NumMethodPoolEntriesRead(0),
7265    NumMethodPoolLookups(0), NumMethodPoolHits(0),
7266    NumMethodPoolTableLookups(0), NumMethodPoolTableHits(0),
7267    TotalNumMethodPoolEntries(0),
7268    NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
7269    NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
7270    TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
7271    PassingDeclsToConsumer(false),
7272    NumCXXBaseSpecifiersLoaded(0)
7273{
7274  SourceMgr.setExternalSLocEntrySource(this);
7275}
7276
7277ASTReader::~ASTReader() {
7278  for (DeclContextVisibleUpdatesPending::iterator
7279           I = PendingVisibleUpdates.begin(),
7280           E = PendingVisibleUpdates.end();
7281       I != E; ++I) {
7282    for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
7283                                             F = I->second.end();
7284         J != F; ++J)
7285      delete J->first;
7286  }
7287}
7288