ASTReader.cpp revision 63a726870b486e0470c3a4b11cf62bab8be00b73
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  llvm::SmallPtrSet<Module *, 4> Visited;
2721  SmallVector<Module *, 4> Stack;
2722  Stack.push_back(Mod);
2723  while (!Stack.empty()) {
2724    Mod = Stack.back();
2725    Stack.pop_back();
2726
2727    if (NameVisibility <= Mod->NameVisibility) {
2728      // This module already has this level of visibility (or greater), so
2729      // there is nothing more to do.
2730      continue;
2731    }
2732
2733    if (!Mod->isAvailable()) {
2734      // Modules that aren't available cannot be made visible.
2735      continue;
2736    }
2737
2738    // Update the module's name visibility.
2739    Mod->NameVisibility = NameVisibility;
2740
2741    // If we've already deserialized any names from this module,
2742    // mark them as visible.
2743    HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
2744    if (Hidden != HiddenNamesMap.end()) {
2745      makeNamesVisible(Hidden->second);
2746      HiddenNamesMap.erase(Hidden);
2747    }
2748
2749    // Push any non-explicit submodules onto the stack to be marked as
2750    // visible.
2751    for (Module::submodule_iterator Sub = Mod->submodule_begin(),
2752                                 SubEnd = Mod->submodule_end();
2753         Sub != SubEnd; ++Sub) {
2754      if (!(*Sub)->IsExplicit && Visited.insert(*Sub))
2755        Stack.push_back(*Sub);
2756    }
2757
2758    // Push any exported modules onto the stack to be marked as visible.
2759    SmallVector<Module *, 16> Exports;
2760    Mod->getExportedModules(Exports);
2761    for (SmallVectorImpl<Module *>::iterator
2762           I = Exports.begin(), E = Exports.end(); I != E; ++I) {
2763      Module *Exported = *I;
2764      if (Visited.insert(Exported))
2765        Stack.push_back(Exported);
2766    }
2767  }
2768}
2769
2770bool ASTReader::loadGlobalIndex() {
2771  if (GlobalIndex)
2772    return false;
2773
2774  if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
2775      !Context.getLangOpts().Modules)
2776    return true;
2777
2778  // Try to load the global index.
2779  TriedLoadingGlobalIndex = true;
2780  StringRef ModuleCachePath
2781    = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
2782  std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
2783    = GlobalModuleIndex::readIndex(ModuleCachePath);
2784  if (!Result.first)
2785    return true;
2786
2787  GlobalIndex.reset(Result.first);
2788  ModuleMgr.setGlobalIndex(GlobalIndex.get());
2789  return false;
2790}
2791
2792bool ASTReader::isGlobalIndexUnavailable() const {
2793  return Context.getLangOpts().Modules && UseGlobalIndex &&
2794         !hasGlobalIndex() && TriedLoadingGlobalIndex;
2795}
2796
2797ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
2798                                            ModuleKind Type,
2799                                            SourceLocation ImportLoc,
2800                                            unsigned ClientLoadCapabilities) {
2801  // Bump the generation number.
2802  unsigned PreviousGeneration = CurrentGeneration++;
2803
2804  unsigned NumModules = ModuleMgr.size();
2805  SmallVector<ImportedModule, 4> Loaded;
2806  switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
2807                                                /*ImportedBy=*/0, Loaded,
2808                                                0, 0,
2809                                                ClientLoadCapabilities)) {
2810  case Failure:
2811  case Missing:
2812  case OutOfDate:
2813  case VersionMismatch:
2814  case ConfigurationMismatch:
2815  case HadErrors:
2816    ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
2817                            Context.getLangOpts().Modules
2818                              ? &PP.getHeaderSearchInfo().getModuleMap()
2819                              : 0);
2820
2821    // If we find that any modules are unusable, the global index is going
2822    // to be out-of-date. Just remove it.
2823    GlobalIndex.reset();
2824    ModuleMgr.setGlobalIndex(0);
2825    return ReadResult;
2826
2827  case Success:
2828    break;
2829  }
2830
2831  // Here comes stuff that we only do once the entire chain is loaded.
2832
2833  // Load the AST blocks of all of the modules that we loaded.
2834  for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
2835                                              MEnd = Loaded.end();
2836       M != MEnd; ++M) {
2837    ModuleFile &F = *M->Mod;
2838
2839    // Read the AST block.
2840    if (ReadASTBlock(F))
2841      return Failure;
2842
2843    // Once read, set the ModuleFile bit base offset and update the size in
2844    // bits of all files we've seen.
2845    F.GlobalBitOffset = TotalModulesSizeInBits;
2846    TotalModulesSizeInBits += F.SizeInBits;
2847    GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
2848
2849    // Preload SLocEntries.
2850    for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
2851      int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
2852      // Load it through the SourceManager and don't call ReadSLocEntry()
2853      // directly because the entry may have already been loaded in which case
2854      // calling ReadSLocEntry() directly would trigger an assertion in
2855      // SourceManager.
2856      SourceMgr.getLoadedSLocEntryByID(Index);
2857    }
2858  }
2859
2860  // Setup the import locations.
2861  for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
2862                                              MEnd = Loaded.end();
2863       M != MEnd; ++M) {
2864    ModuleFile &F = *M->Mod;
2865    F.DirectImportLoc = ImportLoc;
2866    if (!M->ImportedBy)
2867      F.ImportLoc = M->ImportLoc;
2868    else
2869      F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
2870                                       M->ImportLoc.getRawEncoding());
2871  }
2872
2873  // Mark all of the identifiers in the identifier table as being out of date,
2874  // so that various accessors know to check the loaded modules when the
2875  // identifier is used.
2876  for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
2877                              IdEnd = PP.getIdentifierTable().end();
2878       Id != IdEnd; ++Id)
2879    Id->second->setOutOfDate(true);
2880
2881  // Resolve any unresolved module exports.
2882  for (unsigned I = 0, N = UnresolvedModuleImportExports.size(); I != N; ++I) {
2883    UnresolvedModuleImportExport &Unresolved = UnresolvedModuleImportExports[I];
2884    SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
2885    Module *ResolvedMod = getSubmodule(GlobalID);
2886
2887    if (Unresolved.IsImport) {
2888      if (ResolvedMod)
2889        Unresolved.Mod->Imports.push_back(ResolvedMod);
2890      continue;
2891    }
2892
2893    if (ResolvedMod || Unresolved.IsWildcard)
2894      Unresolved.Mod->Exports.push_back(
2895        Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
2896  }
2897  UnresolvedModuleImportExports.clear();
2898
2899  InitializeContext();
2900
2901  if (DeserializationListener)
2902    DeserializationListener->ReaderInitialized(this);
2903
2904  ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
2905  if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
2906    PrimaryModule.OriginalSourceFileID
2907      = FileID::get(PrimaryModule.SLocEntryBaseID
2908                    + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
2909
2910    // If this AST file is a precompiled preamble, then set the
2911    // preamble file ID of the source manager to the file source file
2912    // from which the preamble was built.
2913    if (Type == MK_Preamble) {
2914      SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
2915    } else if (Type == MK_MainFile) {
2916      SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
2917    }
2918  }
2919
2920  // For any Objective-C class definitions we have already loaded, make sure
2921  // that we load any additional categories.
2922  for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
2923    loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
2924                       ObjCClassesLoaded[I],
2925                       PreviousGeneration);
2926  }
2927
2928  return Success;
2929}
2930
2931ASTReader::ASTReadResult
2932ASTReader::ReadASTCore(StringRef FileName,
2933                       ModuleKind Type,
2934                       SourceLocation ImportLoc,
2935                       ModuleFile *ImportedBy,
2936                       SmallVectorImpl<ImportedModule> &Loaded,
2937                       off_t ExpectedSize, time_t ExpectedModTime,
2938                       unsigned ClientLoadCapabilities) {
2939  ModuleFile *M;
2940  std::string ErrorStr;
2941  ModuleManager::AddModuleResult AddResult
2942    = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
2943                          CurrentGeneration, ExpectedSize, ExpectedModTime,
2944                          M, ErrorStr);
2945
2946  switch (AddResult) {
2947  case ModuleManager::AlreadyLoaded:
2948    return Success;
2949
2950  case ModuleManager::NewlyLoaded:
2951    // Load module file below.
2952    break;
2953
2954  case ModuleManager::Missing:
2955    // The module file was missing; if the client handle handle, that, return
2956    // it.
2957    if (ClientLoadCapabilities & ARR_Missing)
2958      return Missing;
2959
2960    // Otherwise, return an error.
2961    {
2962      std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
2963                      + ErrorStr;
2964      Error(Msg);
2965    }
2966    return Failure;
2967
2968  case ModuleManager::OutOfDate:
2969    // We couldn't load the module file because it is out-of-date. If the
2970    // client can handle out-of-date, return it.
2971    if (ClientLoadCapabilities & ARR_OutOfDate)
2972      return OutOfDate;
2973
2974    // Otherwise, return an error.
2975    {
2976      std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
2977                      + ErrorStr;
2978      Error(Msg);
2979    }
2980    return Failure;
2981  }
2982
2983  assert(M && "Missing module file");
2984
2985  // FIXME: This seems rather a hack. Should CurrentDir be part of the
2986  // module?
2987  if (FileName != "-") {
2988    CurrentDir = llvm::sys::path::parent_path(FileName);
2989    if (CurrentDir.empty()) CurrentDir = ".";
2990  }
2991
2992  ModuleFile &F = *M;
2993  BitstreamCursor &Stream = F.Stream;
2994  Stream.init(F.StreamFile);
2995  F.SizeInBits = F.Buffer->getBufferSize() * 8;
2996
2997  // Sniff for the signature.
2998  if (Stream.Read(8) != 'C' ||
2999      Stream.Read(8) != 'P' ||
3000      Stream.Read(8) != 'C' ||
3001      Stream.Read(8) != 'H') {
3002    Diag(diag::err_not_a_pch_file) << FileName;
3003    return Failure;
3004  }
3005
3006  // This is used for compatibility with older PCH formats.
3007  bool HaveReadControlBlock = false;
3008
3009  while (1) {
3010    llvm::BitstreamEntry Entry = Stream.advance();
3011
3012    switch (Entry.Kind) {
3013    case llvm::BitstreamEntry::Error:
3014    case llvm::BitstreamEntry::EndBlock:
3015    case llvm::BitstreamEntry::Record:
3016      Error("invalid record at top-level of AST file");
3017      return Failure;
3018
3019    case llvm::BitstreamEntry::SubBlock:
3020      break;
3021    }
3022
3023    // We only know the control subblock ID.
3024    switch (Entry.ID) {
3025    case llvm::bitc::BLOCKINFO_BLOCK_ID:
3026      if (Stream.ReadBlockInfoBlock()) {
3027        Error("malformed BlockInfoBlock in AST file");
3028        return Failure;
3029      }
3030      break;
3031    case CONTROL_BLOCK_ID:
3032      HaveReadControlBlock = true;
3033      switch (ReadControlBlock(F, Loaded, ClientLoadCapabilities)) {
3034      case Success:
3035        break;
3036
3037      case Failure: return Failure;
3038      case Missing: return Missing;
3039      case OutOfDate: return OutOfDate;
3040      case VersionMismatch: return VersionMismatch;
3041      case ConfigurationMismatch: return ConfigurationMismatch;
3042      case HadErrors: return HadErrors;
3043      }
3044      break;
3045    case AST_BLOCK_ID:
3046      if (!HaveReadControlBlock) {
3047        if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3048          Diag(diag::warn_pch_version_too_old);
3049        return VersionMismatch;
3050      }
3051
3052      // Record that we've loaded this module.
3053      Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3054      return Success;
3055
3056    default:
3057      if (Stream.SkipBlock()) {
3058        Error("malformed block record in AST file");
3059        return Failure;
3060      }
3061      break;
3062    }
3063  }
3064
3065  return Success;
3066}
3067
3068void ASTReader::InitializeContext() {
3069  // If there's a listener, notify them that we "read" the translation unit.
3070  if (DeserializationListener)
3071    DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3072                                      Context.getTranslationUnitDecl());
3073
3074  // Make sure we load the declaration update records for the translation unit,
3075  // if there are any.
3076  loadDeclUpdateRecords(PREDEF_DECL_TRANSLATION_UNIT_ID,
3077                        Context.getTranslationUnitDecl());
3078
3079  // FIXME: Find a better way to deal with collisions between these
3080  // built-in types. Right now, we just ignore the problem.
3081
3082  // Load the special types.
3083  if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3084    if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3085      if (!Context.CFConstantStringTypeDecl)
3086        Context.setCFConstantStringType(GetType(String));
3087    }
3088
3089    if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3090      QualType FileType = GetType(File);
3091      if (FileType.isNull()) {
3092        Error("FILE type is NULL");
3093        return;
3094      }
3095
3096      if (!Context.FILEDecl) {
3097        if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3098          Context.setFILEDecl(Typedef->getDecl());
3099        else {
3100          const TagType *Tag = FileType->getAs<TagType>();
3101          if (!Tag) {
3102            Error("Invalid FILE type in AST file");
3103            return;
3104          }
3105          Context.setFILEDecl(Tag->getDecl());
3106        }
3107      }
3108    }
3109
3110    if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3111      QualType Jmp_bufType = GetType(Jmp_buf);
3112      if (Jmp_bufType.isNull()) {
3113        Error("jmp_buf type is NULL");
3114        return;
3115      }
3116
3117      if (!Context.jmp_bufDecl) {
3118        if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3119          Context.setjmp_bufDecl(Typedef->getDecl());
3120        else {
3121          const TagType *Tag = Jmp_bufType->getAs<TagType>();
3122          if (!Tag) {
3123            Error("Invalid jmp_buf type in AST file");
3124            return;
3125          }
3126          Context.setjmp_bufDecl(Tag->getDecl());
3127        }
3128      }
3129    }
3130
3131    if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3132      QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3133      if (Sigjmp_bufType.isNull()) {
3134        Error("sigjmp_buf type is NULL");
3135        return;
3136      }
3137
3138      if (!Context.sigjmp_bufDecl) {
3139        if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3140          Context.setsigjmp_bufDecl(Typedef->getDecl());
3141        else {
3142          const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3143          assert(Tag && "Invalid sigjmp_buf type in AST file");
3144          Context.setsigjmp_bufDecl(Tag->getDecl());
3145        }
3146      }
3147    }
3148
3149    if (unsigned ObjCIdRedef
3150          = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3151      if (Context.ObjCIdRedefinitionType.isNull())
3152        Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3153    }
3154
3155    if (unsigned ObjCClassRedef
3156          = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3157      if (Context.ObjCClassRedefinitionType.isNull())
3158        Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3159    }
3160
3161    if (unsigned ObjCSelRedef
3162          = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3163      if (Context.ObjCSelRedefinitionType.isNull())
3164        Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3165    }
3166
3167    if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3168      QualType Ucontext_tType = GetType(Ucontext_t);
3169      if (Ucontext_tType.isNull()) {
3170        Error("ucontext_t type is NULL");
3171        return;
3172      }
3173
3174      if (!Context.ucontext_tDecl) {
3175        if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3176          Context.setucontext_tDecl(Typedef->getDecl());
3177        else {
3178          const TagType *Tag = Ucontext_tType->getAs<TagType>();
3179          assert(Tag && "Invalid ucontext_t type in AST file");
3180          Context.setucontext_tDecl(Tag->getDecl());
3181        }
3182      }
3183    }
3184  }
3185
3186  ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3187
3188  // If there were any CUDA special declarations, deserialize them.
3189  if (!CUDASpecialDeclRefs.empty()) {
3190    assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3191    Context.setcudaConfigureCallDecl(
3192                           cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3193  }
3194
3195  // Re-export any modules that were imported by a non-module AST file.
3196  for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) {
3197    if (Module *Imported = getSubmodule(ImportedModules[I]))
3198      makeModuleVisible(Imported, Module::AllVisible,
3199                        /*ImportLoc=*/SourceLocation());
3200  }
3201  ImportedModules.clear();
3202}
3203
3204void ASTReader::finalizeForWriting() {
3205  for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(),
3206                                 HiddenEnd = HiddenNamesMap.end();
3207       Hidden != HiddenEnd; ++Hidden) {
3208    makeNamesVisible(Hidden->second);
3209  }
3210  HiddenNamesMap.clear();
3211}
3212
3213/// SkipCursorToControlBlock - Given a cursor at the start of an AST file, scan
3214/// ahead and drop the cursor into the start of the CONTROL_BLOCK, returning
3215/// false on success and true on failure.
3216static bool SkipCursorToControlBlock(BitstreamCursor &Cursor) {
3217  while (1) {
3218    llvm::BitstreamEntry Entry = Cursor.advance();
3219    switch (Entry.Kind) {
3220    case llvm::BitstreamEntry::Error:
3221    case llvm::BitstreamEntry::EndBlock:
3222      return true;
3223
3224    case llvm::BitstreamEntry::Record:
3225      // Ignore top-level records.
3226      Cursor.skipRecord(Entry.ID);
3227      break;
3228
3229    case llvm::BitstreamEntry::SubBlock:
3230      if (Entry.ID == CONTROL_BLOCK_ID) {
3231        if (Cursor.EnterSubBlock(CONTROL_BLOCK_ID))
3232          return true;
3233        // Found it!
3234        return false;
3235      }
3236
3237      if (Cursor.SkipBlock())
3238        return true;
3239    }
3240  }
3241}
3242
3243/// \brief Retrieve the name of the original source file name
3244/// directly from the AST file, without actually loading the AST
3245/// file.
3246std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3247                                             FileManager &FileMgr,
3248                                             DiagnosticsEngine &Diags) {
3249  // Open the AST file.
3250  std::string ErrStr;
3251  OwningPtr<llvm::MemoryBuffer> Buffer;
3252  Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
3253  if (!Buffer) {
3254    Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
3255    return std::string();
3256  }
3257
3258  // Initialize the stream
3259  llvm::BitstreamReader StreamFile;
3260  BitstreamCursor Stream;
3261  StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3262                  (const unsigned char *)Buffer->getBufferEnd());
3263  Stream.init(StreamFile);
3264
3265  // Sniff for the signature.
3266  if (Stream.Read(8) != 'C' ||
3267      Stream.Read(8) != 'P' ||
3268      Stream.Read(8) != 'C' ||
3269      Stream.Read(8) != 'H') {
3270    Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3271    return std::string();
3272  }
3273
3274  // Scan for the CONTROL_BLOCK_ID block.
3275  if (SkipCursorToControlBlock(Stream)) {
3276    Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3277    return std::string();
3278  }
3279
3280  // Scan for ORIGINAL_FILE inside the control block.
3281  RecordData Record;
3282  while (1) {
3283    llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3284    if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3285      return std::string();
3286
3287    if (Entry.Kind != llvm::BitstreamEntry::Record) {
3288      Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3289      return std::string();
3290    }
3291
3292    Record.clear();
3293    StringRef Blob;
3294    if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
3295      return Blob.str();
3296  }
3297}
3298
3299namespace {
3300  class SimplePCHValidator : public ASTReaderListener {
3301    const LangOptions &ExistingLangOpts;
3302    const TargetOptions &ExistingTargetOpts;
3303    const PreprocessorOptions &ExistingPPOpts;
3304    FileManager &FileMgr;
3305
3306  public:
3307    SimplePCHValidator(const LangOptions &ExistingLangOpts,
3308                       const TargetOptions &ExistingTargetOpts,
3309                       const PreprocessorOptions &ExistingPPOpts,
3310                       FileManager &FileMgr)
3311      : ExistingLangOpts(ExistingLangOpts),
3312        ExistingTargetOpts(ExistingTargetOpts),
3313        ExistingPPOpts(ExistingPPOpts),
3314        FileMgr(FileMgr)
3315    {
3316    }
3317
3318    virtual bool ReadLanguageOptions(const LangOptions &LangOpts,
3319                                     bool Complain) {
3320      return checkLanguageOptions(ExistingLangOpts, LangOpts, 0);
3321    }
3322    virtual bool ReadTargetOptions(const TargetOptions &TargetOpts,
3323                                   bool Complain) {
3324      return checkTargetOptions(ExistingTargetOpts, TargetOpts, 0);
3325    }
3326    virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
3327                                         bool Complain,
3328                                         std::string &SuggestedPredefines) {
3329      return checkPreprocessorOptions(ExistingPPOpts, PPOpts, 0, FileMgr,
3330                                      SuggestedPredefines);
3331    }
3332  };
3333}
3334
3335bool ASTReader::readASTFileControlBlock(StringRef Filename,
3336                                        FileManager &FileMgr,
3337                                        ASTReaderListener &Listener) {
3338  // Open the AST file.
3339  std::string ErrStr;
3340  OwningPtr<llvm::MemoryBuffer> Buffer;
3341  Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr));
3342  if (!Buffer) {
3343    return true;
3344  }
3345
3346  // Initialize the stream
3347  llvm::BitstreamReader StreamFile;
3348  BitstreamCursor Stream;
3349  StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3350                  (const unsigned char *)Buffer->getBufferEnd());
3351  Stream.init(StreamFile);
3352
3353  // Sniff for the signature.
3354  if (Stream.Read(8) != 'C' ||
3355      Stream.Read(8) != 'P' ||
3356      Stream.Read(8) != 'C' ||
3357      Stream.Read(8) != 'H') {
3358    return true;
3359  }
3360
3361  // Scan for the CONTROL_BLOCK_ID block.
3362  if (SkipCursorToControlBlock(Stream))
3363    return true;
3364
3365  // Scan for ORIGINAL_FILE inside the control block.
3366  RecordData Record;
3367  while (1) {
3368    llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3369    if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3370      return false;
3371
3372    if (Entry.Kind != llvm::BitstreamEntry::Record)
3373      return true;
3374
3375    Record.clear();
3376    StringRef Blob;
3377    unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
3378    switch ((ControlRecordTypes)RecCode) {
3379    case METADATA: {
3380      if (Record[0] != VERSION_MAJOR)
3381        return true;
3382
3383      const std::string &CurBranch = getClangFullRepositoryVersion();
3384      if (StringRef(CurBranch) != Blob)
3385        return true;
3386
3387      break;
3388    }
3389    case LANGUAGE_OPTIONS:
3390      if (ParseLanguageOptions(Record, false, Listener))
3391        return true;
3392      break;
3393
3394    case TARGET_OPTIONS:
3395      if (ParseTargetOptions(Record, false, Listener))
3396        return true;
3397      break;
3398
3399    case DIAGNOSTIC_OPTIONS:
3400      if (ParseDiagnosticOptions(Record, false, Listener))
3401        return true;
3402      break;
3403
3404    case FILE_SYSTEM_OPTIONS:
3405      if (ParseFileSystemOptions(Record, false, Listener))
3406        return true;
3407      break;
3408
3409    case HEADER_SEARCH_OPTIONS:
3410      if (ParseHeaderSearchOptions(Record, false, Listener))
3411        return true;
3412      break;
3413
3414    case PREPROCESSOR_OPTIONS: {
3415      std::string IgnoredSuggestedPredefines;
3416      if (ParsePreprocessorOptions(Record, false, Listener,
3417                                   IgnoredSuggestedPredefines))
3418        return true;
3419      break;
3420    }
3421
3422    default:
3423      // No other validation to perform.
3424      break;
3425    }
3426  }
3427}
3428
3429
3430bool ASTReader::isAcceptableASTFile(StringRef Filename,
3431                                    FileManager &FileMgr,
3432                                    const LangOptions &LangOpts,
3433                                    const TargetOptions &TargetOpts,
3434                                    const PreprocessorOptions &PPOpts) {
3435  SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
3436  return !readASTFileControlBlock(Filename, FileMgr, validator);
3437}
3438
3439bool ASTReader::ReadSubmoduleBlock(ModuleFile &F) {
3440  // Enter the submodule block.
3441  if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
3442    Error("malformed submodule block record in AST file");
3443    return true;
3444  }
3445
3446  ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
3447  bool First = true;
3448  Module *CurrentModule = 0;
3449  RecordData Record;
3450  while (true) {
3451    llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
3452
3453    switch (Entry.Kind) {
3454    case llvm::BitstreamEntry::SubBlock: // Handled for us already.
3455    case llvm::BitstreamEntry::Error:
3456      Error("malformed block record in AST file");
3457      return true;
3458    case llvm::BitstreamEntry::EndBlock:
3459      return false;
3460    case llvm::BitstreamEntry::Record:
3461      // The interesting case.
3462      break;
3463    }
3464
3465    // Read a record.
3466    StringRef Blob;
3467    Record.clear();
3468    switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
3469    default:  // Default behavior: ignore.
3470      break;
3471
3472    case SUBMODULE_DEFINITION: {
3473      if (First) {
3474        Error("missing submodule metadata record at beginning of block");
3475        return true;
3476      }
3477
3478      if (Record.size() < 7) {
3479        Error("malformed module definition");
3480        return true;
3481      }
3482
3483      StringRef Name = Blob;
3484      SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
3485      SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]);
3486      bool IsFramework = Record[2];
3487      bool IsExplicit = Record[3];
3488      bool IsSystem = Record[4];
3489      bool InferSubmodules = Record[5];
3490      bool InferExplicitSubmodules = Record[6];
3491      bool InferExportWildcard = Record[7];
3492
3493      Module *ParentModule = 0;
3494      if (Parent)
3495        ParentModule = getSubmodule(Parent);
3496
3497      // Retrieve this (sub)module from the module map, creating it if
3498      // necessary.
3499      CurrentModule = ModMap.findOrCreateModule(Name, ParentModule,
3500                                                IsFramework,
3501                                                IsExplicit).first;
3502      SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
3503      if (GlobalIndex >= SubmodulesLoaded.size() ||
3504          SubmodulesLoaded[GlobalIndex]) {
3505        Error("too many submodules");
3506        return true;
3507      }
3508
3509      if (!ParentModule) {
3510        if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
3511          if (CurFile != F.File) {
3512            if (!Diags.isDiagnosticInFlight()) {
3513              Diag(diag::err_module_file_conflict)
3514                << CurrentModule->getTopLevelModuleName()
3515                << CurFile->getName()
3516                << F.File->getName();
3517            }
3518            return true;
3519          }
3520        }
3521
3522        CurrentModule->setASTFile(F.File);
3523      }
3524
3525      CurrentModule->IsFromModuleFile = true;
3526      CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
3527      CurrentModule->InferSubmodules = InferSubmodules;
3528      CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
3529      CurrentModule->InferExportWildcard = InferExportWildcard;
3530      if (DeserializationListener)
3531        DeserializationListener->ModuleRead(GlobalID, CurrentModule);
3532
3533      SubmodulesLoaded[GlobalIndex] = CurrentModule;
3534
3535      // Clear out link libraries; the module file has them.
3536      CurrentModule->LinkLibraries.clear();
3537      break;
3538    }
3539
3540    case SUBMODULE_UMBRELLA_HEADER: {
3541      if (First) {
3542        Error("missing submodule metadata record at beginning of block");
3543        return true;
3544      }
3545
3546      if (!CurrentModule)
3547        break;
3548
3549      if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
3550        if (!CurrentModule->getUmbrellaHeader())
3551          ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
3552        else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
3553          Error("mismatched umbrella headers in submodule");
3554          return true;
3555        }
3556      }
3557      break;
3558    }
3559
3560    case SUBMODULE_HEADER: {
3561      if (First) {
3562        Error("missing submodule metadata record at beginning of block");
3563        return true;
3564      }
3565
3566      if (!CurrentModule)
3567        break;
3568
3569      // We lazily associate headers with their modules via the HeaderInfoTable.
3570      // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
3571      // of complete filenames or remove it entirely.
3572      break;
3573    }
3574
3575    case SUBMODULE_EXCLUDED_HEADER: {
3576      if (First) {
3577        Error("missing submodule metadata record at beginning of block");
3578        return true;
3579      }
3580
3581      if (!CurrentModule)
3582        break;
3583
3584      // We lazily associate headers with their modules via the HeaderInfoTable.
3585      // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
3586      // of complete filenames or remove it entirely.
3587      break;
3588    }
3589
3590    case SUBMODULE_TOPHEADER: {
3591      if (First) {
3592        Error("missing submodule metadata record at beginning of block");
3593        return true;
3594      }
3595
3596      if (!CurrentModule)
3597        break;
3598
3599      CurrentModule->addTopHeaderFilename(Blob);
3600      break;
3601    }
3602
3603    case SUBMODULE_UMBRELLA_DIR: {
3604      if (First) {
3605        Error("missing submodule metadata record at beginning of block");
3606        return true;
3607      }
3608
3609      if (!CurrentModule)
3610        break;
3611
3612      if (const DirectoryEntry *Umbrella
3613                                  = PP.getFileManager().getDirectory(Blob)) {
3614        if (!CurrentModule->getUmbrellaDir())
3615          ModMap.setUmbrellaDir(CurrentModule, Umbrella);
3616        else if (CurrentModule->getUmbrellaDir() != Umbrella) {
3617          Error("mismatched umbrella directories in submodule");
3618          return true;
3619        }
3620      }
3621      break;
3622    }
3623
3624    case SUBMODULE_METADATA: {
3625      if (!First) {
3626        Error("submodule metadata record not at beginning of block");
3627        return true;
3628      }
3629      First = false;
3630
3631      F.BaseSubmoduleID = getTotalNumSubmodules();
3632      F.LocalNumSubmodules = Record[0];
3633      unsigned LocalBaseSubmoduleID = Record[1];
3634      if (F.LocalNumSubmodules > 0) {
3635        // Introduce the global -> local mapping for submodules within this
3636        // module.
3637        GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
3638
3639        // Introduce the local -> global mapping for submodules within this
3640        // module.
3641        F.SubmoduleRemap.insertOrReplace(
3642          std::make_pair(LocalBaseSubmoduleID,
3643                         F.BaseSubmoduleID - LocalBaseSubmoduleID));
3644
3645        SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
3646      }
3647      break;
3648    }
3649
3650    case SUBMODULE_IMPORTS: {
3651      if (First) {
3652        Error("missing submodule metadata record at beginning of block");
3653        return true;
3654      }
3655
3656      if (!CurrentModule)
3657        break;
3658
3659      for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
3660        UnresolvedModuleImportExport Unresolved;
3661        Unresolved.File = &F;
3662        Unresolved.Mod = CurrentModule;
3663        Unresolved.ID = Record[Idx];
3664        Unresolved.IsImport = true;
3665        Unresolved.IsWildcard = false;
3666        UnresolvedModuleImportExports.push_back(Unresolved);
3667      }
3668      break;
3669    }
3670
3671    case SUBMODULE_EXPORTS: {
3672      if (First) {
3673        Error("missing submodule metadata record at beginning of block");
3674        return true;
3675      }
3676
3677      if (!CurrentModule)
3678        break;
3679
3680      for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
3681        UnresolvedModuleImportExport Unresolved;
3682        Unresolved.File = &F;
3683        Unresolved.Mod = CurrentModule;
3684        Unresolved.ID = Record[Idx];
3685        Unresolved.IsImport = false;
3686        Unresolved.IsWildcard = Record[Idx + 1];
3687        UnresolvedModuleImportExports.push_back(Unresolved);
3688      }
3689
3690      // Once we've loaded the set of exports, there's no reason to keep
3691      // the parsed, unresolved exports around.
3692      CurrentModule->UnresolvedExports.clear();
3693      break;
3694    }
3695    case SUBMODULE_REQUIRES: {
3696      if (First) {
3697        Error("missing submodule metadata record at beginning of block");
3698        return true;
3699      }
3700
3701      if (!CurrentModule)
3702        break;
3703
3704      CurrentModule->addRequirement(Blob, Context.getLangOpts(),
3705                                    Context.getTargetInfo());
3706      break;
3707    }
3708
3709    case SUBMODULE_LINK_LIBRARY:
3710      if (First) {
3711        Error("missing submodule metadata record at beginning of block");
3712        return true;
3713      }
3714
3715      if (!CurrentModule)
3716        break;
3717
3718      CurrentModule->LinkLibraries.push_back(
3719                                         Module::LinkLibrary(Blob, Record[0]));
3720      break;
3721
3722    case SUBMODULE_CONFIG_MACRO:
3723      if (First) {
3724        Error("missing submodule metadata record at beginning of block");
3725        return true;
3726      }
3727
3728      if (!CurrentModule)
3729        break;
3730
3731      CurrentModule->ConfigMacros.push_back(Blob.str());
3732      break;
3733    }
3734  }
3735}
3736
3737/// \brief Parse the record that corresponds to a LangOptions data
3738/// structure.
3739///
3740/// This routine parses the language options from the AST file and then gives
3741/// them to the AST listener if one is set.
3742///
3743/// \returns true if the listener deems the file unacceptable, false otherwise.
3744bool ASTReader::ParseLanguageOptions(const RecordData &Record,
3745                                     bool Complain,
3746                                     ASTReaderListener &Listener) {
3747  LangOptions LangOpts;
3748  unsigned Idx = 0;
3749#define LANGOPT(Name, Bits, Default, Description) \
3750  LangOpts.Name = Record[Idx++];
3751#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
3752  LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
3753#include "clang/Basic/LangOptions.def"
3754#define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
3755#include "clang/Basic/Sanitizers.def"
3756
3757  ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
3758  VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
3759  LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
3760
3761  unsigned Length = Record[Idx++];
3762  LangOpts.CurrentModule.assign(Record.begin() + Idx,
3763                                Record.begin() + Idx + Length);
3764
3765  Idx += Length;
3766
3767  // Comment options.
3768  for (unsigned N = Record[Idx++]; N; --N) {
3769    LangOpts.CommentOpts.BlockCommandNames.push_back(
3770      ReadString(Record, Idx));
3771  }
3772
3773  return Listener.ReadLanguageOptions(LangOpts, Complain);
3774}
3775
3776bool ASTReader::ParseTargetOptions(const RecordData &Record,
3777                                   bool Complain,
3778                                   ASTReaderListener &Listener) {
3779  unsigned Idx = 0;
3780  TargetOptions TargetOpts;
3781  TargetOpts.Triple = ReadString(Record, Idx);
3782  TargetOpts.CPU = ReadString(Record, Idx);
3783  TargetOpts.ABI = ReadString(Record, Idx);
3784  TargetOpts.CXXABI = ReadString(Record, Idx);
3785  TargetOpts.LinkerVersion = ReadString(Record, Idx);
3786  for (unsigned N = Record[Idx++]; N; --N) {
3787    TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
3788  }
3789  for (unsigned N = Record[Idx++]; N; --N) {
3790    TargetOpts.Features.push_back(ReadString(Record, Idx));
3791  }
3792
3793  return Listener.ReadTargetOptions(TargetOpts, Complain);
3794}
3795
3796bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
3797                                       ASTReaderListener &Listener) {
3798  DiagnosticOptions DiagOpts;
3799  unsigned Idx = 0;
3800#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
3801#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
3802  DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
3803#include "clang/Basic/DiagnosticOptions.def"
3804
3805  for (unsigned N = Record[Idx++]; N; --N) {
3806    DiagOpts.Warnings.push_back(ReadString(Record, Idx));
3807  }
3808
3809  return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
3810}
3811
3812bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
3813                                       ASTReaderListener &Listener) {
3814  FileSystemOptions FSOpts;
3815  unsigned Idx = 0;
3816  FSOpts.WorkingDir = ReadString(Record, Idx);
3817  return Listener.ReadFileSystemOptions(FSOpts, Complain);
3818}
3819
3820bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
3821                                         bool Complain,
3822                                         ASTReaderListener &Listener) {
3823  HeaderSearchOptions HSOpts;
3824  unsigned Idx = 0;
3825  HSOpts.Sysroot = ReadString(Record, Idx);
3826
3827  // Include entries.
3828  for (unsigned N = Record[Idx++]; N; --N) {
3829    std::string Path = ReadString(Record, Idx);
3830    frontend::IncludeDirGroup Group
3831      = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
3832    bool IsFramework = Record[Idx++];
3833    bool IgnoreSysRoot = Record[Idx++];
3834    HSOpts.UserEntries.push_back(
3835      HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
3836  }
3837
3838  // System header prefixes.
3839  for (unsigned N = Record[Idx++]; N; --N) {
3840    std::string Prefix = ReadString(Record, Idx);
3841    bool IsSystemHeader = Record[Idx++];
3842    HSOpts.SystemHeaderPrefixes.push_back(
3843      HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
3844  }
3845
3846  HSOpts.ResourceDir = ReadString(Record, Idx);
3847  HSOpts.ModuleCachePath = ReadString(Record, Idx);
3848  HSOpts.DisableModuleHash = Record[Idx++];
3849  HSOpts.UseBuiltinIncludes = Record[Idx++];
3850  HSOpts.UseStandardSystemIncludes = Record[Idx++];
3851  HSOpts.UseStandardCXXIncludes = Record[Idx++];
3852  HSOpts.UseLibcxx = Record[Idx++];
3853
3854  return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
3855}
3856
3857bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
3858                                         bool Complain,
3859                                         ASTReaderListener &Listener,
3860                                         std::string &SuggestedPredefines) {
3861  PreprocessorOptions PPOpts;
3862  unsigned Idx = 0;
3863
3864  // Macro definitions/undefs
3865  for (unsigned N = Record[Idx++]; N; --N) {
3866    std::string Macro = ReadString(Record, Idx);
3867    bool IsUndef = Record[Idx++];
3868    PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
3869  }
3870
3871  // Includes
3872  for (unsigned N = Record[Idx++]; N; --N) {
3873    PPOpts.Includes.push_back(ReadString(Record, Idx));
3874  }
3875
3876  // Macro Includes
3877  for (unsigned N = Record[Idx++]; N; --N) {
3878    PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
3879  }
3880
3881  PPOpts.UsePredefines = Record[Idx++];
3882  PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
3883  PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
3884  PPOpts.ObjCXXARCStandardLibrary =
3885    static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
3886  SuggestedPredefines.clear();
3887  return Listener.ReadPreprocessorOptions(PPOpts, Complain,
3888                                          SuggestedPredefines);
3889}
3890
3891std::pair<ModuleFile *, unsigned>
3892ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
3893  GlobalPreprocessedEntityMapType::iterator
3894  I = GlobalPreprocessedEntityMap.find(GlobalIndex);
3895  assert(I != GlobalPreprocessedEntityMap.end() &&
3896         "Corrupted global preprocessed entity map");
3897  ModuleFile *M = I->second;
3898  unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
3899  return std::make_pair(M, LocalIndex);
3900}
3901
3902std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
3903ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
3904  if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
3905    return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
3906                                             Mod.NumPreprocessedEntities);
3907
3908  return std::make_pair(PreprocessingRecord::iterator(),
3909                        PreprocessingRecord::iterator());
3910}
3911
3912std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
3913ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
3914  return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
3915                        ModuleDeclIterator(this, &Mod,
3916                                 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
3917}
3918
3919PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
3920  PreprocessedEntityID PPID = Index+1;
3921  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
3922  ModuleFile &M = *PPInfo.first;
3923  unsigned LocalIndex = PPInfo.second;
3924  const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
3925
3926  if (!PP.getPreprocessingRecord()) {
3927    Error("no preprocessing record");
3928    return 0;
3929  }
3930
3931  SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
3932  M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
3933
3934  llvm::BitstreamEntry Entry =
3935    M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
3936  if (Entry.Kind != llvm::BitstreamEntry::Record)
3937    return 0;
3938
3939  // Read the record.
3940  SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
3941                    ReadSourceLocation(M, PPOffs.End));
3942  PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
3943  StringRef Blob;
3944  RecordData Record;
3945  PreprocessorDetailRecordTypes RecType =
3946    (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
3947                                          Entry.ID, Record, &Blob);
3948  switch (RecType) {
3949  case PPD_MACRO_EXPANSION: {
3950    bool isBuiltin = Record[0];
3951    IdentifierInfo *Name = 0;
3952    MacroDefinition *Def = 0;
3953    if (isBuiltin)
3954      Name = getLocalIdentifier(M, Record[1]);
3955    else {
3956      PreprocessedEntityID
3957          GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
3958      Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
3959    }
3960
3961    MacroExpansion *ME;
3962    if (isBuiltin)
3963      ME = new (PPRec) MacroExpansion(Name, Range);
3964    else
3965      ME = new (PPRec) MacroExpansion(Def, Range);
3966
3967    return ME;
3968  }
3969
3970  case PPD_MACRO_DEFINITION: {
3971    // Decode the identifier info and then check again; if the macro is
3972    // still defined and associated with the identifier,
3973    IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
3974    MacroDefinition *MD
3975      = new (PPRec) MacroDefinition(II, Range);
3976
3977    if (DeserializationListener)
3978      DeserializationListener->MacroDefinitionRead(PPID, MD);
3979
3980    return MD;
3981  }
3982
3983  case PPD_INCLUSION_DIRECTIVE: {
3984    const char *FullFileNameStart = Blob.data() + Record[0];
3985    StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
3986    const FileEntry *File = 0;
3987    if (!FullFileName.empty())
3988      File = PP.getFileManager().getFile(FullFileName);
3989
3990    // FIXME: Stable encoding
3991    InclusionDirective::InclusionKind Kind
3992      = static_cast<InclusionDirective::InclusionKind>(Record[2]);
3993    InclusionDirective *ID
3994      = new (PPRec) InclusionDirective(PPRec, Kind,
3995                                       StringRef(Blob.data(), Record[0]),
3996                                       Record[1], Record[3],
3997                                       File,
3998                                       Range);
3999    return ID;
4000  }
4001  }
4002
4003  llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4004}
4005
4006/// \brief \arg SLocMapI points at a chunk of a module that contains no
4007/// preprocessed entities or the entities it contains are not the ones we are
4008/// looking for. Find the next module that contains entities and return the ID
4009/// of the first entry.
4010PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4011                       GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4012  ++SLocMapI;
4013  for (GlobalSLocOffsetMapType::const_iterator
4014         EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4015    ModuleFile &M = *SLocMapI->second;
4016    if (M.NumPreprocessedEntities)
4017      return M.BasePreprocessedEntityID;
4018  }
4019
4020  return getTotalNumPreprocessedEntities();
4021}
4022
4023namespace {
4024
4025template <unsigned PPEntityOffset::*PPLoc>
4026struct PPEntityComp {
4027  const ASTReader &Reader;
4028  ModuleFile &M;
4029
4030  PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4031
4032  bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4033    SourceLocation LHS = getLoc(L);
4034    SourceLocation RHS = getLoc(R);
4035    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4036  }
4037
4038  bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4039    SourceLocation LHS = getLoc(L);
4040    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4041  }
4042
4043  bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4044    SourceLocation RHS = getLoc(R);
4045    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4046  }
4047
4048  SourceLocation getLoc(const PPEntityOffset &PPE) const {
4049    return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4050  }
4051};
4052
4053}
4054
4055/// \brief Returns the first preprocessed entity ID that ends after \arg BLoc.
4056PreprocessedEntityID
4057ASTReader::findBeginPreprocessedEntity(SourceLocation BLoc) const {
4058  if (SourceMgr.isLocalSourceLocation(BLoc))
4059    return getTotalNumPreprocessedEntities();
4060
4061  GlobalSLocOffsetMapType::const_iterator
4062    SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
4063                                        BLoc.getOffset() - 1);
4064  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4065         "Corrupted global sloc offset map");
4066
4067  if (SLocMapI->second->NumPreprocessedEntities == 0)
4068    return findNextPreprocessedEntity(SLocMapI);
4069
4070  ModuleFile &M = *SLocMapI->second;
4071  typedef const PPEntityOffset *pp_iterator;
4072  pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4073  pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4074
4075  size_t Count = M.NumPreprocessedEntities;
4076  size_t Half;
4077  pp_iterator First = pp_begin;
4078  pp_iterator PPI;
4079
4080  // Do a binary search manually instead of using std::lower_bound because
4081  // The end locations of entities may be unordered (when a macro expansion
4082  // is inside another macro argument), but for this case it is not important
4083  // whether we get the first macro expansion or its containing macro.
4084  while (Count > 0) {
4085    Half = Count/2;
4086    PPI = First;
4087    std::advance(PPI, Half);
4088    if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4089                                            BLoc)){
4090      First = PPI;
4091      ++First;
4092      Count = Count - Half - 1;
4093    } else
4094      Count = Half;
4095  }
4096
4097  if (PPI == pp_end)
4098    return findNextPreprocessedEntity(SLocMapI);
4099
4100  return M.BasePreprocessedEntityID + (PPI - pp_begin);
4101}
4102
4103/// \brief Returns the first preprocessed entity ID that begins after \arg ELoc.
4104PreprocessedEntityID
4105ASTReader::findEndPreprocessedEntity(SourceLocation ELoc) const {
4106  if (SourceMgr.isLocalSourceLocation(ELoc))
4107    return getTotalNumPreprocessedEntities();
4108
4109  GlobalSLocOffsetMapType::const_iterator
4110    SLocMapI = GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset -
4111                                        ELoc.getOffset() - 1);
4112  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4113         "Corrupted global sloc offset map");
4114
4115  if (SLocMapI->second->NumPreprocessedEntities == 0)
4116    return findNextPreprocessedEntity(SLocMapI);
4117
4118  ModuleFile &M = *SLocMapI->second;
4119  typedef const PPEntityOffset *pp_iterator;
4120  pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4121  pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4122  pp_iterator PPI =
4123      std::upper_bound(pp_begin, pp_end, ELoc,
4124                       PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4125
4126  if (PPI == pp_end)
4127    return findNextPreprocessedEntity(SLocMapI);
4128
4129  return M.BasePreprocessedEntityID + (PPI - pp_begin);
4130}
4131
4132/// \brief Returns a pair of [Begin, End) indices of preallocated
4133/// preprocessed entities that \arg Range encompasses.
4134std::pair<unsigned, unsigned>
4135    ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
4136  if (Range.isInvalid())
4137    return std::make_pair(0,0);
4138  assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
4139
4140  PreprocessedEntityID BeginID = findBeginPreprocessedEntity(Range.getBegin());
4141  PreprocessedEntityID EndID = findEndPreprocessedEntity(Range.getEnd());
4142  return std::make_pair(BeginID, EndID);
4143}
4144
4145/// \brief Optionally returns true or false if the preallocated preprocessed
4146/// entity with index \arg Index came from file \arg FID.
4147Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
4148                                                             FileID FID) {
4149  if (FID.isInvalid())
4150    return false;
4151
4152  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4153  ModuleFile &M = *PPInfo.first;
4154  unsigned LocalIndex = PPInfo.second;
4155  const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4156
4157  SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
4158  if (Loc.isInvalid())
4159    return false;
4160
4161  if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
4162    return true;
4163  else
4164    return false;
4165}
4166
4167namespace {
4168  /// \brief Visitor used to search for information about a header file.
4169  class HeaderFileInfoVisitor {
4170    const FileEntry *FE;
4171
4172    Optional<HeaderFileInfo> HFI;
4173
4174  public:
4175    explicit HeaderFileInfoVisitor(const FileEntry *FE)
4176      : FE(FE) { }
4177
4178    static bool visit(ModuleFile &M, void *UserData) {
4179      HeaderFileInfoVisitor *This
4180        = static_cast<HeaderFileInfoVisitor *>(UserData);
4181
4182      HeaderFileInfoLookupTable *Table
4183        = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
4184      if (!Table)
4185        return false;
4186
4187      // Look in the on-disk hash table for an entry for this file name.
4188      HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
4189      if (Pos == Table->end())
4190        return false;
4191
4192      This->HFI = *Pos;
4193      return true;
4194    }
4195
4196    Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
4197  };
4198}
4199
4200HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
4201  HeaderFileInfoVisitor Visitor(FE);
4202  ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
4203  if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) {
4204    if (Listener)
4205      Listener->ReadHeaderFileInfo(*HFI, FE->getUID());
4206    return *HFI;
4207  }
4208
4209  return HeaderFileInfo();
4210}
4211
4212void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
4213  // FIXME: Make it work properly with modules.
4214  SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
4215  for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
4216    ModuleFile &F = *(*I);
4217    unsigned Idx = 0;
4218    DiagStates.clear();
4219    assert(!Diag.DiagStates.empty());
4220    DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
4221    while (Idx < F.PragmaDiagMappings.size()) {
4222      SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
4223      unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
4224      if (DiagStateID != 0) {
4225        Diag.DiagStatePoints.push_back(
4226                    DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
4227                    FullSourceLoc(Loc, SourceMgr)));
4228        continue;
4229      }
4230
4231      assert(DiagStateID == 0);
4232      // A new DiagState was created here.
4233      Diag.DiagStates.push_back(*Diag.GetCurDiagState());
4234      DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
4235      DiagStates.push_back(NewState);
4236      Diag.DiagStatePoints.push_back(
4237          DiagnosticsEngine::DiagStatePoint(NewState,
4238                                            FullSourceLoc(Loc, SourceMgr)));
4239      while (1) {
4240        assert(Idx < F.PragmaDiagMappings.size() &&
4241               "Invalid data, didn't find '-1' marking end of diag/map pairs");
4242        if (Idx >= F.PragmaDiagMappings.size()) {
4243          break; // Something is messed up but at least avoid infinite loop in
4244                 // release build.
4245        }
4246        unsigned DiagID = F.PragmaDiagMappings[Idx++];
4247        if (DiagID == (unsigned)-1) {
4248          break; // no more diag/map pairs for this location.
4249        }
4250        diag::Mapping Map = (diag::Mapping)F.PragmaDiagMappings[Idx++];
4251        DiagnosticMappingInfo MappingInfo = Diag.makeMappingInfo(Map, Loc);
4252        Diag.GetCurDiagState()->setMappingInfo(DiagID, MappingInfo);
4253      }
4254    }
4255  }
4256}
4257
4258/// \brief Get the correct cursor and offset for loading a type.
4259ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
4260  GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
4261  assert(I != GlobalTypeMap.end() && "Corrupted global type map");
4262  ModuleFile *M = I->second;
4263  return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
4264}
4265
4266/// \brief Read and return the type with the given index..
4267///
4268/// The index is the type ID, shifted and minus the number of predefs. This
4269/// routine actually reads the record corresponding to the type at the given
4270/// location. It is a helper routine for GetType, which deals with reading type
4271/// IDs.
4272QualType ASTReader::readTypeRecord(unsigned Index) {
4273  RecordLocation Loc = TypeCursorForIndex(Index);
4274  BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
4275
4276  // Keep track of where we are in the stream, then jump back there
4277  // after reading this type.
4278  SavedStreamPosition SavedPosition(DeclsCursor);
4279
4280  ReadingKindTracker ReadingKind(Read_Type, *this);
4281
4282  // Note that we are loading a type record.
4283  Deserializing AType(this);
4284
4285  unsigned Idx = 0;
4286  DeclsCursor.JumpToBit(Loc.Offset);
4287  RecordData Record;
4288  unsigned Code = DeclsCursor.ReadCode();
4289  switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
4290  case TYPE_EXT_QUAL: {
4291    if (Record.size() != 2) {
4292      Error("Incorrect encoding of extended qualifier type");
4293      return QualType();
4294    }
4295    QualType Base = readType(*Loc.F, Record, Idx);
4296    Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
4297    return Context.getQualifiedType(Base, Quals);
4298  }
4299
4300  case TYPE_COMPLEX: {
4301    if (Record.size() != 1) {
4302      Error("Incorrect encoding of complex type");
4303      return QualType();
4304    }
4305    QualType ElemType = readType(*Loc.F, Record, Idx);
4306    return Context.getComplexType(ElemType);
4307  }
4308
4309  case TYPE_POINTER: {
4310    if (Record.size() != 1) {
4311      Error("Incorrect encoding of pointer type");
4312      return QualType();
4313    }
4314    QualType PointeeType = readType(*Loc.F, Record, Idx);
4315    return Context.getPointerType(PointeeType);
4316  }
4317
4318  case TYPE_BLOCK_POINTER: {
4319    if (Record.size() != 1) {
4320      Error("Incorrect encoding of block pointer type");
4321      return QualType();
4322    }
4323    QualType PointeeType = readType(*Loc.F, Record, Idx);
4324    return Context.getBlockPointerType(PointeeType);
4325  }
4326
4327  case TYPE_LVALUE_REFERENCE: {
4328    if (Record.size() != 2) {
4329      Error("Incorrect encoding of lvalue reference type");
4330      return QualType();
4331    }
4332    QualType PointeeType = readType(*Loc.F, Record, Idx);
4333    return Context.getLValueReferenceType(PointeeType, Record[1]);
4334  }
4335
4336  case TYPE_RVALUE_REFERENCE: {
4337    if (Record.size() != 1) {
4338      Error("Incorrect encoding of rvalue reference type");
4339      return QualType();
4340    }
4341    QualType PointeeType = readType(*Loc.F, Record, Idx);
4342    return Context.getRValueReferenceType(PointeeType);
4343  }
4344
4345  case TYPE_MEMBER_POINTER: {
4346    if (Record.size() != 2) {
4347      Error("Incorrect encoding of member pointer type");
4348      return QualType();
4349    }
4350    QualType PointeeType = readType(*Loc.F, Record, Idx);
4351    QualType ClassType = readType(*Loc.F, Record, Idx);
4352    if (PointeeType.isNull() || ClassType.isNull())
4353      return QualType();
4354
4355    return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
4356  }
4357
4358  case TYPE_CONSTANT_ARRAY: {
4359    QualType ElementType = readType(*Loc.F, Record, Idx);
4360    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4361    unsigned IndexTypeQuals = Record[2];
4362    unsigned Idx = 3;
4363    llvm::APInt Size = ReadAPInt(Record, Idx);
4364    return Context.getConstantArrayType(ElementType, Size,
4365                                         ASM, IndexTypeQuals);
4366  }
4367
4368  case TYPE_INCOMPLETE_ARRAY: {
4369    QualType ElementType = readType(*Loc.F, Record, Idx);
4370    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4371    unsigned IndexTypeQuals = Record[2];
4372    return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
4373  }
4374
4375  case TYPE_VARIABLE_ARRAY: {
4376    QualType ElementType = readType(*Loc.F, Record, Idx);
4377    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
4378    unsigned IndexTypeQuals = Record[2];
4379    SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
4380    SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
4381    return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
4382                                         ASM, IndexTypeQuals,
4383                                         SourceRange(LBLoc, RBLoc));
4384  }
4385
4386  case TYPE_VECTOR: {
4387    if (Record.size() != 3) {
4388      Error("incorrect encoding of vector type in AST file");
4389      return QualType();
4390    }
4391
4392    QualType ElementType = readType(*Loc.F, Record, Idx);
4393    unsigned NumElements = Record[1];
4394    unsigned VecKind = Record[2];
4395    return Context.getVectorType(ElementType, NumElements,
4396                                  (VectorType::VectorKind)VecKind);
4397  }
4398
4399  case TYPE_EXT_VECTOR: {
4400    if (Record.size() != 3) {
4401      Error("incorrect encoding of extended vector type in AST file");
4402      return QualType();
4403    }
4404
4405    QualType ElementType = readType(*Loc.F, Record, Idx);
4406    unsigned NumElements = Record[1];
4407    return Context.getExtVectorType(ElementType, NumElements);
4408  }
4409
4410  case TYPE_FUNCTION_NO_PROTO: {
4411    if (Record.size() != 6) {
4412      Error("incorrect encoding of no-proto function type");
4413      return QualType();
4414    }
4415    QualType ResultType = readType(*Loc.F, Record, Idx);
4416    FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
4417                               (CallingConv)Record[4], Record[5]);
4418    return Context.getFunctionNoProtoType(ResultType, Info);
4419  }
4420
4421  case TYPE_FUNCTION_PROTO: {
4422    QualType ResultType = readType(*Loc.F, Record, Idx);
4423
4424    FunctionProtoType::ExtProtoInfo EPI;
4425    EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
4426                                        /*hasregparm*/ Record[2],
4427                                        /*regparm*/ Record[3],
4428                                        static_cast<CallingConv>(Record[4]),
4429                                        /*produces*/ Record[5]);
4430
4431    unsigned Idx = 6;
4432    unsigned NumParams = Record[Idx++];
4433    SmallVector<QualType, 16> ParamTypes;
4434    for (unsigned I = 0; I != NumParams; ++I)
4435      ParamTypes.push_back(readType(*Loc.F, Record, Idx));
4436
4437    EPI.Variadic = Record[Idx++];
4438    EPI.HasTrailingReturn = Record[Idx++];
4439    EPI.TypeQuals = Record[Idx++];
4440    EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
4441    ExceptionSpecificationType EST =
4442        static_cast<ExceptionSpecificationType>(Record[Idx++]);
4443    EPI.ExceptionSpecType = EST;
4444    SmallVector<QualType, 2> Exceptions;
4445    if (EST == EST_Dynamic) {
4446      EPI.NumExceptions = Record[Idx++];
4447      for (unsigned I = 0; I != EPI.NumExceptions; ++I)
4448        Exceptions.push_back(readType(*Loc.F, Record, Idx));
4449      EPI.Exceptions = Exceptions.data();
4450    } else if (EST == EST_ComputedNoexcept) {
4451      EPI.NoexceptExpr = ReadExpr(*Loc.F);
4452    } else if (EST == EST_Uninstantiated) {
4453      EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4454      EPI.ExceptionSpecTemplate = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4455    } else if (EST == EST_Unevaluated) {
4456      EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(*Loc.F, Record, Idx);
4457    }
4458    return Context.getFunctionType(ResultType, ParamTypes, EPI);
4459  }
4460
4461  case TYPE_UNRESOLVED_USING: {
4462    unsigned Idx = 0;
4463    return Context.getTypeDeclType(
4464                  ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
4465  }
4466
4467  case TYPE_TYPEDEF: {
4468    if (Record.size() != 2) {
4469      Error("incorrect encoding of typedef type");
4470      return QualType();
4471    }
4472    unsigned Idx = 0;
4473    TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
4474    QualType Canonical = readType(*Loc.F, Record, Idx);
4475    if (!Canonical.isNull())
4476      Canonical = Context.getCanonicalType(Canonical);
4477    return Context.getTypedefType(Decl, Canonical);
4478  }
4479
4480  case TYPE_TYPEOF_EXPR:
4481    return Context.getTypeOfExprType(ReadExpr(*Loc.F));
4482
4483  case TYPE_TYPEOF: {
4484    if (Record.size() != 1) {
4485      Error("incorrect encoding of typeof(type) in AST file");
4486      return QualType();
4487    }
4488    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4489    return Context.getTypeOfType(UnderlyingType);
4490  }
4491
4492  case TYPE_DECLTYPE: {
4493    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4494    return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
4495  }
4496
4497  case TYPE_UNARY_TRANSFORM: {
4498    QualType BaseType = readType(*Loc.F, Record, Idx);
4499    QualType UnderlyingType = readType(*Loc.F, Record, Idx);
4500    UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
4501    return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
4502  }
4503
4504  case TYPE_AUTO:
4505    return Context.getAutoType(readType(*Loc.F, Record, Idx));
4506
4507  case TYPE_RECORD: {
4508    if (Record.size() != 2) {
4509      Error("incorrect encoding of record type");
4510      return QualType();
4511    }
4512    unsigned Idx = 0;
4513    bool IsDependent = Record[Idx++];
4514    RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
4515    RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
4516    QualType T = Context.getRecordType(RD);
4517    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4518    return T;
4519  }
4520
4521  case TYPE_ENUM: {
4522    if (Record.size() != 2) {
4523      Error("incorrect encoding of enum type");
4524      return QualType();
4525    }
4526    unsigned Idx = 0;
4527    bool IsDependent = Record[Idx++];
4528    QualType T
4529      = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
4530    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4531    return T;
4532  }
4533
4534  case TYPE_ATTRIBUTED: {
4535    if (Record.size() != 3) {
4536      Error("incorrect encoding of attributed type");
4537      return QualType();
4538    }
4539    QualType modifiedType = readType(*Loc.F, Record, Idx);
4540    QualType equivalentType = readType(*Loc.F, Record, Idx);
4541    AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
4542    return Context.getAttributedType(kind, modifiedType, equivalentType);
4543  }
4544
4545  case TYPE_PAREN: {
4546    if (Record.size() != 1) {
4547      Error("incorrect encoding of paren type");
4548      return QualType();
4549    }
4550    QualType InnerType = readType(*Loc.F, Record, Idx);
4551    return Context.getParenType(InnerType);
4552  }
4553
4554  case TYPE_PACK_EXPANSION: {
4555    if (Record.size() != 2) {
4556      Error("incorrect encoding of pack expansion type");
4557      return QualType();
4558    }
4559    QualType Pattern = readType(*Loc.F, Record, Idx);
4560    if (Pattern.isNull())
4561      return QualType();
4562    Optional<unsigned> NumExpansions;
4563    if (Record[1])
4564      NumExpansions = Record[1] - 1;
4565    return Context.getPackExpansionType(Pattern, NumExpansions);
4566  }
4567
4568  case TYPE_ELABORATED: {
4569    unsigned Idx = 0;
4570    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4571    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4572    QualType NamedType = readType(*Loc.F, Record, Idx);
4573    return Context.getElaboratedType(Keyword, NNS, NamedType);
4574  }
4575
4576  case TYPE_OBJC_INTERFACE: {
4577    unsigned Idx = 0;
4578    ObjCInterfaceDecl *ItfD
4579      = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
4580    return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
4581  }
4582
4583  case TYPE_OBJC_OBJECT: {
4584    unsigned Idx = 0;
4585    QualType Base = readType(*Loc.F, Record, Idx);
4586    unsigned NumProtos = Record[Idx++];
4587    SmallVector<ObjCProtocolDecl*, 4> Protos;
4588    for (unsigned I = 0; I != NumProtos; ++I)
4589      Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
4590    return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
4591  }
4592
4593  case TYPE_OBJC_OBJECT_POINTER: {
4594    unsigned Idx = 0;
4595    QualType Pointee = readType(*Loc.F, Record, Idx);
4596    return Context.getObjCObjectPointerType(Pointee);
4597  }
4598
4599  case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
4600    unsigned Idx = 0;
4601    QualType Parm = readType(*Loc.F, Record, Idx);
4602    QualType Replacement = readType(*Loc.F, Record, Idx);
4603    return
4604      Context.getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm),
4605                                            Replacement);
4606  }
4607
4608  case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
4609    unsigned Idx = 0;
4610    QualType Parm = readType(*Loc.F, Record, Idx);
4611    TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
4612    return Context.getSubstTemplateTypeParmPackType(
4613                                               cast<TemplateTypeParmType>(Parm),
4614                                                     ArgPack);
4615  }
4616
4617  case TYPE_INJECTED_CLASS_NAME: {
4618    CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
4619    QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
4620    // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
4621    // for AST reading, too much interdependencies.
4622    return
4623      QualType(new (Context, TypeAlignment) InjectedClassNameType(D, TST), 0);
4624  }
4625
4626  case TYPE_TEMPLATE_TYPE_PARM: {
4627    unsigned Idx = 0;
4628    unsigned Depth = Record[Idx++];
4629    unsigned Index = Record[Idx++];
4630    bool Pack = Record[Idx++];
4631    TemplateTypeParmDecl *D
4632      = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
4633    return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
4634  }
4635
4636  case TYPE_DEPENDENT_NAME: {
4637    unsigned Idx = 0;
4638    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4639    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4640    const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
4641    QualType Canon = readType(*Loc.F, Record, Idx);
4642    if (!Canon.isNull())
4643      Canon = Context.getCanonicalType(Canon);
4644    return Context.getDependentNameType(Keyword, NNS, Name, Canon);
4645  }
4646
4647  case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
4648    unsigned Idx = 0;
4649    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
4650    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
4651    const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
4652    unsigned NumArgs = Record[Idx++];
4653    SmallVector<TemplateArgument, 8> Args;
4654    Args.reserve(NumArgs);
4655    while (NumArgs--)
4656      Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
4657    return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
4658                                                      Args.size(), Args.data());
4659  }
4660
4661  case TYPE_DEPENDENT_SIZED_ARRAY: {
4662    unsigned Idx = 0;
4663
4664    // ArrayType
4665    QualType ElementType = readType(*Loc.F, Record, Idx);
4666    ArrayType::ArraySizeModifier ASM
4667      = (ArrayType::ArraySizeModifier)Record[Idx++];
4668    unsigned IndexTypeQuals = Record[Idx++];
4669
4670    // DependentSizedArrayType
4671    Expr *NumElts = ReadExpr(*Loc.F);
4672    SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
4673
4674    return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
4675                                               IndexTypeQuals, Brackets);
4676  }
4677
4678  case TYPE_TEMPLATE_SPECIALIZATION: {
4679    unsigned Idx = 0;
4680    bool IsDependent = Record[Idx++];
4681    TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
4682    SmallVector<TemplateArgument, 8> Args;
4683    ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
4684    QualType Underlying = readType(*Loc.F, Record, Idx);
4685    QualType T;
4686    if (Underlying.isNull())
4687      T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
4688                                                          Args.size());
4689    else
4690      T = Context.getTemplateSpecializationType(Name, Args.data(),
4691                                                 Args.size(), Underlying);
4692    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
4693    return T;
4694  }
4695
4696  case TYPE_ATOMIC: {
4697    if (Record.size() != 1) {
4698      Error("Incorrect encoding of atomic type");
4699      return QualType();
4700    }
4701    QualType ValueType = readType(*Loc.F, Record, Idx);
4702    return Context.getAtomicType(ValueType);
4703  }
4704  }
4705  llvm_unreachable("Invalid TypeCode!");
4706}
4707
4708class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
4709  ASTReader &Reader;
4710  ModuleFile &F;
4711  const ASTReader::RecordData &Record;
4712  unsigned &Idx;
4713
4714  SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
4715                                    unsigned &I) {
4716    return Reader.ReadSourceLocation(F, R, I);
4717  }
4718
4719  template<typename T>
4720  T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
4721    return Reader.ReadDeclAs<T>(F, Record, Idx);
4722  }
4723
4724public:
4725  TypeLocReader(ASTReader &Reader, ModuleFile &F,
4726                const ASTReader::RecordData &Record, unsigned &Idx)
4727    : Reader(Reader), F(F), Record(Record), Idx(Idx)
4728  { }
4729
4730  // We want compile-time assurance that we've enumerated all of
4731  // these, so unfortunately we have to declare them first, then
4732  // define them out-of-line.
4733#define ABSTRACT_TYPELOC(CLASS, PARENT)
4734#define TYPELOC(CLASS, PARENT) \
4735  void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
4736#include "clang/AST/TypeLocNodes.def"
4737
4738  void VisitFunctionTypeLoc(FunctionTypeLoc);
4739  void VisitArrayTypeLoc(ArrayTypeLoc);
4740};
4741
4742void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
4743  // nothing to do
4744}
4745void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
4746  TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
4747  if (TL.needsExtraLocalData()) {
4748    TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
4749    TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
4750    TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
4751    TL.setModeAttr(Record[Idx++]);
4752  }
4753}
4754void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
4755  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4756}
4757void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
4758  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4759}
4760void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
4761  TL.setCaretLoc(ReadSourceLocation(Record, Idx));
4762}
4763void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
4764  TL.setAmpLoc(ReadSourceLocation(Record, Idx));
4765}
4766void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
4767  TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
4768}
4769void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
4770  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4771  TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4772}
4773void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
4774  TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
4775  TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
4776  if (Record[Idx++])
4777    TL.setSizeExpr(Reader.ReadExpr(F));
4778  else
4779    TL.setSizeExpr(0);
4780}
4781void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
4782  VisitArrayTypeLoc(TL);
4783}
4784void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
4785  VisitArrayTypeLoc(TL);
4786}
4787void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
4788  VisitArrayTypeLoc(TL);
4789}
4790void TypeLocReader::VisitDependentSizedArrayTypeLoc(
4791                                            DependentSizedArrayTypeLoc TL) {
4792  VisitArrayTypeLoc(TL);
4793}
4794void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
4795                                        DependentSizedExtVectorTypeLoc TL) {
4796  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4797}
4798void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
4799  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4800}
4801void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
4802  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4803}
4804void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
4805  TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
4806  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4807  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4808  TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
4809  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
4810    TL.setArg(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
4811  }
4812}
4813void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
4814  VisitFunctionTypeLoc(TL);
4815}
4816void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
4817  VisitFunctionTypeLoc(TL);
4818}
4819void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
4820  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4821}
4822void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
4823  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4824}
4825void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
4826  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4827  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4828  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4829}
4830void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
4831  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
4832  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4833  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4834  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4835}
4836void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
4837  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4838}
4839void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
4840  TL.setKWLoc(ReadSourceLocation(Record, Idx));
4841  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4842  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4843  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
4844}
4845void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
4846  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4847}
4848void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
4849  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4850}
4851void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
4852  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4853}
4854void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
4855  TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
4856  if (TL.hasAttrOperand()) {
4857    SourceRange range;
4858    range.setBegin(ReadSourceLocation(Record, Idx));
4859    range.setEnd(ReadSourceLocation(Record, Idx));
4860    TL.setAttrOperandParensRange(range);
4861  }
4862  if (TL.hasAttrExprOperand()) {
4863    if (Record[Idx++])
4864      TL.setAttrExprOperand(Reader.ReadExpr(F));
4865    else
4866      TL.setAttrExprOperand(0);
4867  } else if (TL.hasAttrEnumOperand())
4868    TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
4869}
4870void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
4871  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4872}
4873void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
4874                                            SubstTemplateTypeParmTypeLoc TL) {
4875  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4876}
4877void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
4878                                          SubstTemplateTypeParmPackTypeLoc TL) {
4879  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4880}
4881void TypeLocReader::VisitTemplateSpecializationTypeLoc(
4882                                           TemplateSpecializationTypeLoc TL) {
4883  TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
4884  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4885  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4886  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4887  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
4888    TL.setArgLocInfo(i,
4889        Reader.GetTemplateArgumentLocInfo(F,
4890                                          TL.getTypePtr()->getArg(i).getKind(),
4891                                          Record, Idx));
4892}
4893void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
4894  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4895  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4896}
4897void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
4898  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4899  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4900}
4901void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
4902  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4903}
4904void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
4905  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4906  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4907  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4908}
4909void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
4910       DependentTemplateSpecializationTypeLoc TL) {
4911  TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
4912  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
4913  TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
4914  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
4915  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4916  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4917  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
4918    TL.setArgLocInfo(I,
4919        Reader.GetTemplateArgumentLocInfo(F,
4920                                          TL.getTypePtr()->getArg(I).getKind(),
4921                                          Record, Idx));
4922}
4923void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
4924  TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
4925}
4926void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
4927  TL.setNameLoc(ReadSourceLocation(Record, Idx));
4928}
4929void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
4930  TL.setHasBaseTypeAsWritten(Record[Idx++]);
4931  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
4932  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
4933  for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
4934    TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
4935}
4936void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
4937  TL.setStarLoc(ReadSourceLocation(Record, Idx));
4938}
4939void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
4940  TL.setKWLoc(ReadSourceLocation(Record, Idx));
4941  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
4942  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
4943}
4944
4945TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
4946                                             const RecordData &Record,
4947                                             unsigned &Idx) {
4948  QualType InfoTy = readType(F, Record, Idx);
4949  if (InfoTy.isNull())
4950    return 0;
4951
4952  TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
4953  TypeLocReader TLR(*this, F, Record, Idx);
4954  for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
4955    TLR.Visit(TL);
4956  return TInfo;
4957}
4958
4959QualType ASTReader::GetType(TypeID ID) {
4960  unsigned FastQuals = ID & Qualifiers::FastMask;
4961  unsigned Index = ID >> Qualifiers::FastWidth;
4962
4963  if (Index < NUM_PREDEF_TYPE_IDS) {
4964    QualType T;
4965    switch ((PredefinedTypeIDs)Index) {
4966    case PREDEF_TYPE_NULL_ID: return QualType();
4967    case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
4968    case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
4969
4970    case PREDEF_TYPE_CHAR_U_ID:
4971    case PREDEF_TYPE_CHAR_S_ID:
4972      // FIXME: Check that the signedness of CharTy is correct!
4973      T = Context.CharTy;
4974      break;
4975
4976    case PREDEF_TYPE_UCHAR_ID:      T = Context.UnsignedCharTy;     break;
4977    case PREDEF_TYPE_USHORT_ID:     T = Context.UnsignedShortTy;    break;
4978    case PREDEF_TYPE_UINT_ID:       T = Context.UnsignedIntTy;      break;
4979    case PREDEF_TYPE_ULONG_ID:      T = Context.UnsignedLongTy;     break;
4980    case PREDEF_TYPE_ULONGLONG_ID:  T = Context.UnsignedLongLongTy; break;
4981    case PREDEF_TYPE_UINT128_ID:    T = Context.UnsignedInt128Ty;   break;
4982    case PREDEF_TYPE_SCHAR_ID:      T = Context.SignedCharTy;       break;
4983    case PREDEF_TYPE_WCHAR_ID:      T = Context.WCharTy;            break;
4984    case PREDEF_TYPE_SHORT_ID:      T = Context.ShortTy;            break;
4985    case PREDEF_TYPE_INT_ID:        T = Context.IntTy;              break;
4986    case PREDEF_TYPE_LONG_ID:       T = Context.LongTy;             break;
4987    case PREDEF_TYPE_LONGLONG_ID:   T = Context.LongLongTy;         break;
4988    case PREDEF_TYPE_INT128_ID:     T = Context.Int128Ty;           break;
4989    case PREDEF_TYPE_HALF_ID:       T = Context.HalfTy;             break;
4990    case PREDEF_TYPE_FLOAT_ID:      T = Context.FloatTy;            break;
4991    case PREDEF_TYPE_DOUBLE_ID:     T = Context.DoubleTy;           break;
4992    case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy;       break;
4993    case PREDEF_TYPE_OVERLOAD_ID:   T = Context.OverloadTy;         break;
4994    case PREDEF_TYPE_BOUND_MEMBER:  T = Context.BoundMemberTy;      break;
4995    case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy;     break;
4996    case PREDEF_TYPE_DEPENDENT_ID:  T = Context.DependentTy;        break;
4997    case PREDEF_TYPE_UNKNOWN_ANY:   T = Context.UnknownAnyTy;       break;
4998    case PREDEF_TYPE_NULLPTR_ID:    T = Context.NullPtrTy;          break;
4999    case PREDEF_TYPE_CHAR16_ID:     T = Context.Char16Ty;           break;
5000    case PREDEF_TYPE_CHAR32_ID:     T = Context.Char32Ty;           break;
5001    case PREDEF_TYPE_OBJC_ID:       T = Context.ObjCBuiltinIdTy;    break;
5002    case PREDEF_TYPE_OBJC_CLASS:    T = Context.ObjCBuiltinClassTy; break;
5003    case PREDEF_TYPE_OBJC_SEL:      T = Context.ObjCBuiltinSelTy;   break;
5004    case PREDEF_TYPE_IMAGE1D_ID:    T = Context.OCLImage1dTy;       break;
5005    case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5006    case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5007    case PREDEF_TYPE_IMAGE2D_ID:    T = Context.OCLImage2dTy;       break;
5008    case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5009    case PREDEF_TYPE_IMAGE3D_ID:    T = Context.OCLImage3dTy;       break;
5010    case PREDEF_TYPE_SAMPLER_ID:    T = Context.OCLSamplerTy;       break;
5011    case PREDEF_TYPE_EVENT_ID:      T = Context.OCLEventTy;         break;
5012    case PREDEF_TYPE_AUTO_DEDUCT:   T = Context.getAutoDeductType(); break;
5013
5014    case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5015      T = Context.getAutoRRefDeductType();
5016      break;
5017
5018    case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5019      T = Context.ARCUnbridgedCastTy;
5020      break;
5021
5022    case PREDEF_TYPE_VA_LIST_TAG:
5023      T = Context.getVaListTagType();
5024      break;
5025
5026    case PREDEF_TYPE_BUILTIN_FN:
5027      T = Context.BuiltinFnTy;
5028      break;
5029    }
5030
5031    assert(!T.isNull() && "Unknown predefined type");
5032    return T.withFastQualifiers(FastQuals);
5033  }
5034
5035  Index -= NUM_PREDEF_TYPE_IDS;
5036  assert(Index < TypesLoaded.size() && "Type index out-of-range");
5037  if (TypesLoaded[Index].isNull()) {
5038    TypesLoaded[Index] = readTypeRecord(Index);
5039    if (TypesLoaded[Index].isNull())
5040      return QualType();
5041
5042    TypesLoaded[Index]->setFromAST();
5043    if (DeserializationListener)
5044      DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5045                                        TypesLoaded[Index]);
5046  }
5047
5048  return TypesLoaded[Index].withFastQualifiers(FastQuals);
5049}
5050
5051QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5052  return GetType(getGlobalTypeID(F, LocalID));
5053}
5054
5055serialization::TypeID
5056ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5057  unsigned FastQuals = LocalID & Qualifiers::FastMask;
5058  unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5059
5060  if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5061    return LocalID;
5062
5063  ContinuousRangeMap<uint32_t, int, 2>::iterator I
5064    = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5065  assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5066
5067  unsigned GlobalIndex = LocalIndex + I->second;
5068  return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5069}
5070
5071TemplateArgumentLocInfo
5072ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5073                                      TemplateArgument::ArgKind Kind,
5074                                      const RecordData &Record,
5075                                      unsigned &Index) {
5076  switch (Kind) {
5077  case TemplateArgument::Expression:
5078    return ReadExpr(F);
5079  case TemplateArgument::Type:
5080    return GetTypeSourceInfo(F, Record, Index);
5081  case TemplateArgument::Template: {
5082    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5083                                                                     Index);
5084    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5085    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5086                                   SourceLocation());
5087  }
5088  case TemplateArgument::TemplateExpansion: {
5089    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5090                                                                     Index);
5091    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5092    SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
5093    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5094                                   EllipsisLoc);
5095  }
5096  case TemplateArgument::Null:
5097  case TemplateArgument::Integral:
5098  case TemplateArgument::Declaration:
5099  case TemplateArgument::NullPtr:
5100  case TemplateArgument::Pack:
5101    // FIXME: Is this right?
5102    return TemplateArgumentLocInfo();
5103  }
5104  llvm_unreachable("unexpected template argument loc");
5105}
5106
5107TemplateArgumentLoc
5108ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
5109                                   const RecordData &Record, unsigned &Index) {
5110  TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
5111
5112  if (Arg.getKind() == TemplateArgument::Expression) {
5113    if (Record[Index++]) // bool InfoHasSameExpr.
5114      return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
5115  }
5116  return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
5117                                                             Record, Index));
5118}
5119
5120Decl *ASTReader::GetExternalDecl(uint32_t ID) {
5121  return GetDecl(ID);
5122}
5123
5124uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, const RecordData &Record,
5125                                          unsigned &Idx){
5126  if (Idx >= Record.size())
5127    return 0;
5128
5129  unsigned LocalID = Record[Idx++];
5130  return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
5131}
5132
5133CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
5134  RecordLocation Loc = getLocalBitOffset(Offset);
5135  BitstreamCursor &Cursor = Loc.F->DeclsCursor;
5136  SavedStreamPosition SavedPosition(Cursor);
5137  Cursor.JumpToBit(Loc.Offset);
5138  ReadingKindTracker ReadingKind(Read_Decl, *this);
5139  RecordData Record;
5140  unsigned Code = Cursor.ReadCode();
5141  unsigned RecCode = Cursor.readRecord(Code, Record);
5142  if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
5143    Error("Malformed AST file: missing C++ base specifiers");
5144    return 0;
5145  }
5146
5147  unsigned Idx = 0;
5148  unsigned NumBases = Record[Idx++];
5149  void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
5150  CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
5151  for (unsigned I = 0; I != NumBases; ++I)
5152    Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
5153  return Bases;
5154}
5155
5156serialization::DeclID
5157ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
5158  if (LocalID < NUM_PREDEF_DECL_IDS)
5159    return LocalID;
5160
5161  ContinuousRangeMap<uint32_t, int, 2>::iterator I
5162    = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
5163  assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
5164
5165  return LocalID + I->second;
5166}
5167
5168bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
5169                                   ModuleFile &M) const {
5170  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
5171  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5172  return &M == I->second;
5173}
5174
5175ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
5176  if (!D->isFromASTFile())
5177    return 0;
5178  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
5179  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5180  return I->second;
5181}
5182
5183SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
5184  if (ID < NUM_PREDEF_DECL_IDS)
5185    return SourceLocation();
5186
5187  unsigned Index = ID - NUM_PREDEF_DECL_IDS;
5188
5189  if (Index > DeclsLoaded.size()) {
5190    Error("declaration ID out-of-range for AST file");
5191    return SourceLocation();
5192  }
5193
5194  if (Decl *D = DeclsLoaded[Index])
5195    return D->getLocation();
5196
5197  unsigned RawLocation = 0;
5198  RecordLocation Rec = DeclCursorForID(ID, RawLocation);
5199  return ReadSourceLocation(*Rec.F, RawLocation);
5200}
5201
5202Decl *ASTReader::GetDecl(DeclID ID) {
5203  if (ID < NUM_PREDEF_DECL_IDS) {
5204    switch ((PredefinedDeclIDs)ID) {
5205    case PREDEF_DECL_NULL_ID:
5206      return 0;
5207
5208    case PREDEF_DECL_TRANSLATION_UNIT_ID:
5209      return Context.getTranslationUnitDecl();
5210
5211    case PREDEF_DECL_OBJC_ID_ID:
5212      return Context.getObjCIdDecl();
5213
5214    case PREDEF_DECL_OBJC_SEL_ID:
5215      return Context.getObjCSelDecl();
5216
5217    case PREDEF_DECL_OBJC_CLASS_ID:
5218      return Context.getObjCClassDecl();
5219
5220    case PREDEF_DECL_OBJC_PROTOCOL_ID:
5221      return Context.getObjCProtocolDecl();
5222
5223    case PREDEF_DECL_INT_128_ID:
5224      return Context.getInt128Decl();
5225
5226    case PREDEF_DECL_UNSIGNED_INT_128_ID:
5227      return Context.getUInt128Decl();
5228
5229    case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
5230      return Context.getObjCInstanceTypeDecl();
5231
5232    case PREDEF_DECL_BUILTIN_VA_LIST_ID:
5233      return Context.getBuiltinVaListDecl();
5234    }
5235  }
5236
5237  unsigned Index = ID - NUM_PREDEF_DECL_IDS;
5238
5239  if (Index >= DeclsLoaded.size()) {
5240    assert(0 && "declaration ID out-of-range for AST file");
5241    Error("declaration ID out-of-range for AST file");
5242    return 0;
5243  }
5244
5245  if (!DeclsLoaded[Index]) {
5246    ReadDeclRecord(ID);
5247    if (DeserializationListener)
5248      DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
5249  }
5250
5251  return DeclsLoaded[Index];
5252}
5253
5254DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
5255                                                  DeclID GlobalID) {
5256  if (GlobalID < NUM_PREDEF_DECL_IDS)
5257    return GlobalID;
5258
5259  GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
5260  assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
5261  ModuleFile *Owner = I->second;
5262
5263  llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
5264    = M.GlobalToLocalDeclIDs.find(Owner);
5265  if (Pos == M.GlobalToLocalDeclIDs.end())
5266    return 0;
5267
5268  return GlobalID - Owner->BaseDeclID + Pos->second;
5269}
5270
5271serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
5272                                            const RecordData &Record,
5273                                            unsigned &Idx) {
5274  if (Idx >= Record.size()) {
5275    Error("Corrupted AST file");
5276    return 0;
5277  }
5278
5279  return getGlobalDeclID(F, Record[Idx++]);
5280}
5281
5282/// \brief Resolve the offset of a statement into a statement.
5283///
5284/// This operation will read a new statement from the external
5285/// source each time it is called, and is meant to be used via a
5286/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
5287Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
5288  // Switch case IDs are per Decl.
5289  ClearSwitchCaseIDs();
5290
5291  // Offset here is a global offset across the entire chain.
5292  RecordLocation Loc = getLocalBitOffset(Offset);
5293  Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
5294  return ReadStmtFromStream(*Loc.F);
5295}
5296
5297namespace {
5298  class FindExternalLexicalDeclsVisitor {
5299    ASTReader &Reader;
5300    const DeclContext *DC;
5301    bool (*isKindWeWant)(Decl::Kind);
5302
5303    SmallVectorImpl<Decl*> &Decls;
5304    bool PredefsVisited[NUM_PREDEF_DECL_IDS];
5305
5306  public:
5307    FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
5308                                    bool (*isKindWeWant)(Decl::Kind),
5309                                    SmallVectorImpl<Decl*> &Decls)
5310      : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
5311    {
5312      for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
5313        PredefsVisited[I] = false;
5314    }
5315
5316    static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
5317      if (Preorder)
5318        return false;
5319
5320      FindExternalLexicalDeclsVisitor *This
5321        = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
5322
5323      ModuleFile::DeclContextInfosMap::iterator Info
5324        = M.DeclContextInfos.find(This->DC);
5325      if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
5326        return false;
5327
5328      // Load all of the declaration IDs
5329      for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
5330                               *IDE = ID + Info->second.NumLexicalDecls;
5331           ID != IDE; ++ID) {
5332        if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
5333          continue;
5334
5335        // Don't add predefined declarations to the lexical context more
5336        // than once.
5337        if (ID->second < NUM_PREDEF_DECL_IDS) {
5338          if (This->PredefsVisited[ID->second])
5339            continue;
5340
5341          This->PredefsVisited[ID->second] = true;
5342        }
5343
5344        if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
5345          if (!This->DC->isDeclInLexicalTraversal(D))
5346            This->Decls.push_back(D);
5347        }
5348      }
5349
5350      return false;
5351    }
5352  };
5353}
5354
5355ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
5356                                         bool (*isKindWeWant)(Decl::Kind),
5357                                         SmallVectorImpl<Decl*> &Decls) {
5358  // There might be lexical decls in multiple modules, for the TU at
5359  // least. Walk all of the modules in the order they were loaded.
5360  FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
5361  ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
5362  ++NumLexicalDeclContextsRead;
5363  return ELR_Success;
5364}
5365
5366namespace {
5367
5368class DeclIDComp {
5369  ASTReader &Reader;
5370  ModuleFile &Mod;
5371
5372public:
5373  DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
5374
5375  bool operator()(LocalDeclID L, LocalDeclID R) const {
5376    SourceLocation LHS = getLocation(L);
5377    SourceLocation RHS = getLocation(R);
5378    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5379  }
5380
5381  bool operator()(SourceLocation LHS, LocalDeclID R) const {
5382    SourceLocation RHS = getLocation(R);
5383    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5384  }
5385
5386  bool operator()(LocalDeclID L, SourceLocation RHS) const {
5387    SourceLocation LHS = getLocation(L);
5388    return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5389  }
5390
5391  SourceLocation getLocation(LocalDeclID ID) const {
5392    return Reader.getSourceManager().getFileLoc(
5393            Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
5394  }
5395};
5396
5397}
5398
5399void ASTReader::FindFileRegionDecls(FileID File,
5400                                    unsigned Offset, unsigned Length,
5401                                    SmallVectorImpl<Decl *> &Decls) {
5402  SourceManager &SM = getSourceManager();
5403
5404  llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
5405  if (I == FileDeclIDs.end())
5406    return;
5407
5408  FileDeclsInfo &DInfo = I->second;
5409  if (DInfo.Decls.empty())
5410    return;
5411
5412  SourceLocation
5413    BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
5414  SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
5415
5416  DeclIDComp DIDComp(*this, *DInfo.Mod);
5417  ArrayRef<serialization::LocalDeclID>::iterator
5418    BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
5419                               BeginLoc, DIDComp);
5420  if (BeginIt != DInfo.Decls.begin())
5421    --BeginIt;
5422
5423  // If we are pointing at a top-level decl inside an objc container, we need
5424  // to backtrack until we find it otherwise we will fail to report that the
5425  // region overlaps with an objc container.
5426  while (BeginIt != DInfo.Decls.begin() &&
5427         GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
5428             ->isTopLevelDeclInObjCContainer())
5429    --BeginIt;
5430
5431  ArrayRef<serialization::LocalDeclID>::iterator
5432    EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
5433                             EndLoc, DIDComp);
5434  if (EndIt != DInfo.Decls.end())
5435    ++EndIt;
5436
5437  for (ArrayRef<serialization::LocalDeclID>::iterator
5438         DIt = BeginIt; DIt != EndIt; ++DIt)
5439    Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
5440}
5441
5442namespace {
5443  /// \brief ModuleFile visitor used to perform name lookup into a
5444  /// declaration context.
5445  class DeclContextNameLookupVisitor {
5446    ASTReader &Reader;
5447    SmallVectorImpl<const DeclContext *> &Contexts;
5448    DeclarationName Name;
5449    SmallVectorImpl<NamedDecl *> &Decls;
5450
5451  public:
5452    DeclContextNameLookupVisitor(ASTReader &Reader,
5453                                 SmallVectorImpl<const DeclContext *> &Contexts,
5454                                 DeclarationName Name,
5455                                 SmallVectorImpl<NamedDecl *> &Decls)
5456      : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
5457
5458    static bool visit(ModuleFile &M, void *UserData) {
5459      DeclContextNameLookupVisitor *This
5460        = static_cast<DeclContextNameLookupVisitor *>(UserData);
5461
5462      // Check whether we have any visible declaration information for
5463      // this context in this module.
5464      ModuleFile::DeclContextInfosMap::iterator Info;
5465      bool FoundInfo = false;
5466      for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
5467        Info = M.DeclContextInfos.find(This->Contexts[I]);
5468        if (Info != M.DeclContextInfos.end() &&
5469            Info->second.NameLookupTableData) {
5470          FoundInfo = true;
5471          break;
5472        }
5473      }
5474
5475      if (!FoundInfo)
5476        return false;
5477
5478      // Look for this name within this module.
5479      ASTDeclContextNameLookupTable *LookupTable =
5480        Info->second.NameLookupTableData;
5481      ASTDeclContextNameLookupTable::iterator Pos
5482        = LookupTable->find(This->Name);
5483      if (Pos == LookupTable->end())
5484        return false;
5485
5486      bool FoundAnything = false;
5487      ASTDeclContextNameLookupTrait::data_type Data = *Pos;
5488      for (; Data.first != Data.second; ++Data.first) {
5489        NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
5490        if (!ND)
5491          continue;
5492
5493        if (ND->getDeclName() != This->Name) {
5494          // A name might be null because the decl's redeclarable part is
5495          // currently read before reading its name. The lookup is triggered by
5496          // building that decl (likely indirectly), and so it is later in the
5497          // sense of "already existing" and can be ignored here.
5498          continue;
5499        }
5500
5501        // Record this declaration.
5502        FoundAnything = true;
5503        This->Decls.push_back(ND);
5504      }
5505
5506      return FoundAnything;
5507    }
5508  };
5509}
5510
5511/// \brief Retrieve the "definitive" module file for the definition of the
5512/// given declaration context, if there is one.
5513///
5514/// The "definitive" module file is the only place where we need to look to
5515/// find information about the declarations within the given declaration
5516/// context. For example, C++ and Objective-C classes, C structs/unions, and
5517/// Objective-C protocols, categories, and extensions are all defined in a
5518/// single place in the source code, so they have definitive module files
5519/// associated with them. C++ namespaces, on the other hand, can have
5520/// definitions in multiple different module files.
5521///
5522/// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
5523/// NDEBUG checking.
5524static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
5525                                              ASTReader &Reader) {
5526  if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
5527    return Reader.getOwningModuleFile(cast<Decl>(DefDC));
5528
5529  return 0;
5530}
5531
5532bool
5533ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
5534                                          DeclarationName Name) {
5535  assert(DC->hasExternalVisibleStorage() &&
5536         "DeclContext has no visible decls in storage");
5537  if (!Name)
5538    return false;
5539
5540  SmallVector<NamedDecl *, 64> Decls;
5541
5542  // Compute the declaration contexts we need to look into. Multiple such
5543  // declaration contexts occur when two declaration contexts from disjoint
5544  // modules get merged, e.g., when two namespaces with the same name are
5545  // independently defined in separate modules.
5546  SmallVector<const DeclContext *, 2> Contexts;
5547  Contexts.push_back(DC);
5548
5549  if (DC->isNamespace()) {
5550    MergedDeclsMap::iterator Merged
5551      = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
5552    if (Merged != MergedDecls.end()) {
5553      for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
5554        Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
5555    }
5556  }
5557
5558  DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
5559
5560  // If we can definitively determine which module file to look into,
5561  // only look there. Otherwise, look in all module files.
5562  ModuleFile *Definitive;
5563  if (Contexts.size() == 1 &&
5564      (Definitive = getDefinitiveModuleFileFor(DC, *this))) {
5565    DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
5566  } else {
5567    ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
5568  }
5569  ++NumVisibleDeclContextsRead;
5570  SetExternalVisibleDeclsForName(DC, Name, Decls);
5571  return !Decls.empty();
5572}
5573
5574namespace {
5575  /// \brief ModuleFile visitor used to retrieve all visible names in a
5576  /// declaration context.
5577  class DeclContextAllNamesVisitor {
5578    ASTReader &Reader;
5579    SmallVectorImpl<const DeclContext *> &Contexts;
5580    llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > &Decls;
5581    bool VisitAll;
5582
5583  public:
5584    DeclContextAllNamesVisitor(ASTReader &Reader,
5585                               SmallVectorImpl<const DeclContext *> &Contexts,
5586                               llvm::DenseMap<DeclarationName,
5587                                           SmallVector<NamedDecl *, 8> > &Decls,
5588                                bool VisitAll)
5589      : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
5590
5591    static bool visit(ModuleFile &M, void *UserData) {
5592      DeclContextAllNamesVisitor *This
5593        = static_cast<DeclContextAllNamesVisitor *>(UserData);
5594
5595      // Check whether we have any visible declaration information for
5596      // this context in this module.
5597      ModuleFile::DeclContextInfosMap::iterator Info;
5598      bool FoundInfo = false;
5599      for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
5600        Info = M.DeclContextInfos.find(This->Contexts[I]);
5601        if (Info != M.DeclContextInfos.end() &&
5602            Info->second.NameLookupTableData) {
5603          FoundInfo = true;
5604          break;
5605        }
5606      }
5607
5608      if (!FoundInfo)
5609        return false;
5610
5611      ASTDeclContextNameLookupTable *LookupTable =
5612        Info->second.NameLookupTableData;
5613      bool FoundAnything = false;
5614      for (ASTDeclContextNameLookupTable::data_iterator
5615             I = LookupTable->data_begin(), E = LookupTable->data_end();
5616           I != E;
5617           ++I) {
5618        ASTDeclContextNameLookupTrait::data_type Data = *I;
5619        for (; Data.first != Data.second; ++Data.first) {
5620          NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
5621                                                                 *Data.first);
5622          if (!ND)
5623            continue;
5624
5625          // Record this declaration.
5626          FoundAnything = true;
5627          This->Decls[ND->getDeclName()].push_back(ND);
5628        }
5629      }
5630
5631      return FoundAnything && !This->VisitAll;
5632    }
5633  };
5634}
5635
5636void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
5637  if (!DC->hasExternalVisibleStorage())
5638    return;
5639  llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> > Decls;
5640
5641  // Compute the declaration contexts we need to look into. Multiple such
5642  // declaration contexts occur when two declaration contexts from disjoint
5643  // modules get merged, e.g., when two namespaces with the same name are
5644  // independently defined in separate modules.
5645  SmallVector<const DeclContext *, 2> Contexts;
5646  Contexts.push_back(DC);
5647
5648  if (DC->isNamespace()) {
5649    MergedDeclsMap::iterator Merged
5650      = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
5651    if (Merged != MergedDecls.end()) {
5652      for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
5653        Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
5654    }
5655  }
5656
5657  DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
5658                                     /*VisitAll=*/DC->isFileContext());
5659  ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
5660  ++NumVisibleDeclContextsRead;
5661
5662  for (llvm::DenseMap<DeclarationName,
5663                      SmallVector<NamedDecl *, 8> >::iterator
5664         I = Decls.begin(), E = Decls.end(); I != E; ++I) {
5665    SetExternalVisibleDeclsForName(DC, I->first, I->second);
5666  }
5667  const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
5668}
5669
5670/// \brief Under non-PCH compilation the consumer receives the objc methods
5671/// before receiving the implementation, and codegen depends on this.
5672/// We simulate this by deserializing and passing to consumer the methods of the
5673/// implementation before passing the deserialized implementation decl.
5674static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
5675                                       ASTConsumer *Consumer) {
5676  assert(ImplD && Consumer);
5677
5678  for (ObjCImplDecl::method_iterator
5679         I = ImplD->meth_begin(), E = ImplD->meth_end(); I != E; ++I)
5680    Consumer->HandleInterestingDecl(DeclGroupRef(*I));
5681
5682  Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
5683}
5684
5685void ASTReader::PassInterestingDeclsToConsumer() {
5686  assert(Consumer);
5687  while (!InterestingDecls.empty()) {
5688    Decl *D = InterestingDecls.front();
5689    InterestingDecls.pop_front();
5690
5691    PassInterestingDeclToConsumer(D);
5692  }
5693}
5694
5695void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
5696  if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
5697    PassObjCImplDeclToConsumer(ImplD, Consumer);
5698  else
5699    Consumer->HandleInterestingDecl(DeclGroupRef(D));
5700}
5701
5702void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
5703  this->Consumer = Consumer;
5704
5705  if (!Consumer)
5706    return;
5707
5708  for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) {
5709    // Force deserialization of this decl, which will cause it to be queued for
5710    // passing to the consumer.
5711    GetDecl(ExternalDefinitions[I]);
5712  }
5713  ExternalDefinitions.clear();
5714
5715  PassInterestingDeclsToConsumer();
5716}
5717
5718void ASTReader::PrintStats() {
5719  std::fprintf(stderr, "*** AST File Statistics:\n");
5720
5721  unsigned NumTypesLoaded
5722    = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
5723                                      QualType());
5724  unsigned NumDeclsLoaded
5725    = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
5726                                      (Decl *)0);
5727  unsigned NumIdentifiersLoaded
5728    = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
5729                                            IdentifiersLoaded.end(),
5730                                            (IdentifierInfo *)0);
5731  unsigned NumMacrosLoaded
5732    = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
5733                                       MacrosLoaded.end(),
5734                                       (MacroDirective *)0);
5735  unsigned NumSelectorsLoaded
5736    = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
5737                                          SelectorsLoaded.end(),
5738                                          Selector());
5739
5740  if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
5741    std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
5742                 NumSLocEntriesRead, TotalNumSLocEntries,
5743                 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
5744  if (!TypesLoaded.empty())
5745    std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
5746                 NumTypesLoaded, (unsigned)TypesLoaded.size(),
5747                 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
5748  if (!DeclsLoaded.empty())
5749    std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
5750                 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
5751                 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
5752  if (!IdentifiersLoaded.empty())
5753    std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
5754                 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
5755                 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
5756  if (!MacrosLoaded.empty())
5757    std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
5758                 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
5759                 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
5760  if (!SelectorsLoaded.empty())
5761    std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
5762                 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
5763                 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
5764  if (TotalNumStatements)
5765    std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
5766                 NumStatementsRead, TotalNumStatements,
5767                 ((float)NumStatementsRead/TotalNumStatements * 100));
5768  if (TotalNumMacros)
5769    std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
5770                 NumMacrosRead, TotalNumMacros,
5771                 ((float)NumMacrosRead/TotalNumMacros * 100));
5772  if (TotalLexicalDeclContexts)
5773    std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
5774                 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
5775                 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
5776                  * 100));
5777  if (TotalVisibleDeclContexts)
5778    std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
5779                 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
5780                 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
5781                  * 100));
5782  if (TotalNumMethodPoolEntries) {
5783    std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
5784                 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
5785                 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
5786                  * 100));
5787  }
5788  if (NumMethodPoolLookups) {
5789    std::fprintf(stderr, "  %u/%u method pool lookups succeeded (%f%%)\n",
5790                 NumMethodPoolHits, NumMethodPoolLookups,
5791                 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
5792  }
5793  if (NumMethodPoolTableLookups) {
5794    std::fprintf(stderr, "  %u/%u method pool table lookups succeeded (%f%%)\n",
5795                 NumMethodPoolTableHits, NumMethodPoolTableLookups,
5796                 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
5797                  * 100.0));
5798  }
5799
5800  if (NumIdentifierLookupHits) {
5801    std::fprintf(stderr,
5802                 "  %u / %u identifier table lookups succeeded (%f%%)\n",
5803                 NumIdentifierLookupHits, NumIdentifierLookups,
5804                 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
5805  }
5806
5807  if (GlobalIndex) {
5808    std::fprintf(stderr, "\n");
5809    GlobalIndex->printStats();
5810  }
5811
5812  std::fprintf(stderr, "\n");
5813  dump();
5814  std::fprintf(stderr, "\n");
5815}
5816
5817template<typename Key, typename ModuleFile, unsigned InitialCapacity>
5818static void
5819dumpModuleIDMap(StringRef Name,
5820                const ContinuousRangeMap<Key, ModuleFile *,
5821                                         InitialCapacity> &Map) {
5822  if (Map.begin() == Map.end())
5823    return;
5824
5825  typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
5826  llvm::errs() << Name << ":\n";
5827  for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
5828       I != IEnd; ++I) {
5829    llvm::errs() << "  " << I->first << " -> " << I->second->FileName
5830      << "\n";
5831  }
5832}
5833
5834void ASTReader::dump() {
5835  llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
5836  dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
5837  dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
5838  dumpModuleIDMap("Global type map", GlobalTypeMap);
5839  dumpModuleIDMap("Global declaration map", GlobalDeclMap);
5840  dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
5841  dumpModuleIDMap("Global macro map", GlobalMacroMap);
5842  dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
5843  dumpModuleIDMap("Global selector map", GlobalSelectorMap);
5844  dumpModuleIDMap("Global preprocessed entity map",
5845                  GlobalPreprocessedEntityMap);
5846
5847  llvm::errs() << "\n*** PCH/Modules Loaded:";
5848  for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
5849                                       MEnd = ModuleMgr.end();
5850       M != MEnd; ++M)
5851    (*M)->dump();
5852}
5853
5854/// Return the amount of memory used by memory buffers, breaking down
5855/// by heap-backed versus mmap'ed memory.
5856void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
5857  for (ModuleConstIterator I = ModuleMgr.begin(),
5858      E = ModuleMgr.end(); I != E; ++I) {
5859    if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
5860      size_t bytes = buf->getBufferSize();
5861      switch (buf->getBufferKind()) {
5862        case llvm::MemoryBuffer::MemoryBuffer_Malloc:
5863          sizes.malloc_bytes += bytes;
5864          break;
5865        case llvm::MemoryBuffer::MemoryBuffer_MMap:
5866          sizes.mmap_bytes += bytes;
5867          break;
5868      }
5869    }
5870  }
5871}
5872
5873void ASTReader::InitializeSema(Sema &S) {
5874  SemaObj = &S;
5875  S.addExternalSource(this);
5876
5877  // Makes sure any declarations that were deserialized "too early"
5878  // still get added to the identifier's declaration chains.
5879  for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
5880    NamedDecl *ND = cast<NamedDecl>(PreloadedDecls[I]->getMostRecentDecl());
5881    SemaObj->pushExternalDeclIntoScope(ND, PreloadedDecls[I]->getDeclName());
5882  }
5883  PreloadedDecls.clear();
5884
5885  // Load the offsets of the declarations that Sema references.
5886  // They will be lazily deserialized when needed.
5887  if (!SemaDeclRefs.empty()) {
5888    assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!");
5889    if (!SemaObj->StdNamespace)
5890      SemaObj->StdNamespace = SemaDeclRefs[0];
5891    if (!SemaObj->StdBadAlloc)
5892      SemaObj->StdBadAlloc = SemaDeclRefs[1];
5893  }
5894
5895  if (!FPPragmaOptions.empty()) {
5896    assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
5897    SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
5898  }
5899
5900  if (!OpenCLExtensions.empty()) {
5901    unsigned I = 0;
5902#define OPENCLEXT(nm)  SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
5903#include "clang/Basic/OpenCLExtensions.def"
5904
5905    assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
5906  }
5907}
5908
5909IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
5910  // Note that we are loading an identifier.
5911  Deserializing AnIdentifier(this);
5912  StringRef Name(NameStart, NameEnd - NameStart);
5913
5914  // If there is a global index, look there first to determine which modules
5915  // provably do not have any results for this identifier.
5916  GlobalModuleIndex::HitSet Hits;
5917  GlobalModuleIndex::HitSet *HitsPtr = 0;
5918  if (!loadGlobalIndex()) {
5919    if (GlobalIndex->lookupIdentifier(Name, Hits)) {
5920      HitsPtr = &Hits;
5921    }
5922  }
5923  IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
5924                                  NumIdentifierLookups,
5925                                  NumIdentifierLookupHits);
5926  ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
5927  IdentifierInfo *II = Visitor.getIdentifierInfo();
5928  markIdentifierUpToDate(II);
5929  return II;
5930}
5931
5932namespace clang {
5933  /// \brief An identifier-lookup iterator that enumerates all of the
5934  /// identifiers stored within a set of AST files.
5935  class ASTIdentifierIterator : public IdentifierIterator {
5936    /// \brief The AST reader whose identifiers are being enumerated.
5937    const ASTReader &Reader;
5938
5939    /// \brief The current index into the chain of AST files stored in
5940    /// the AST reader.
5941    unsigned Index;
5942
5943    /// \brief The current position within the identifier lookup table
5944    /// of the current AST file.
5945    ASTIdentifierLookupTable::key_iterator Current;
5946
5947    /// \brief The end position within the identifier lookup table of
5948    /// the current AST file.
5949    ASTIdentifierLookupTable::key_iterator End;
5950
5951  public:
5952    explicit ASTIdentifierIterator(const ASTReader &Reader);
5953
5954    virtual StringRef Next();
5955  };
5956}
5957
5958ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
5959  : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
5960  ASTIdentifierLookupTable *IdTable
5961    = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
5962  Current = IdTable->key_begin();
5963  End = IdTable->key_end();
5964}
5965
5966StringRef ASTIdentifierIterator::Next() {
5967  while (Current == End) {
5968    // If we have exhausted all of our AST files, we're done.
5969    if (Index == 0)
5970      return StringRef();
5971
5972    --Index;
5973    ASTIdentifierLookupTable *IdTable
5974      = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
5975        IdentifierLookupTable;
5976    Current = IdTable->key_begin();
5977    End = IdTable->key_end();
5978  }
5979
5980  // We have any identifiers remaining in the current AST file; return
5981  // the next one.
5982  StringRef Result = *Current;
5983  ++Current;
5984  return Result;
5985}
5986
5987IdentifierIterator *ASTReader::getIdentifiers() const {
5988  return new ASTIdentifierIterator(*this);
5989}
5990
5991namespace clang { namespace serialization {
5992  class ReadMethodPoolVisitor {
5993    ASTReader &Reader;
5994    Selector Sel;
5995    unsigned PriorGeneration;
5996    SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
5997    SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
5998
5999  public:
6000    ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
6001                          unsigned PriorGeneration)
6002      : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) { }
6003
6004    static bool visit(ModuleFile &M, void *UserData) {
6005      ReadMethodPoolVisitor *This
6006        = static_cast<ReadMethodPoolVisitor *>(UserData);
6007
6008      if (!M.SelectorLookupTable)
6009        return false;
6010
6011      // If we've already searched this module file, skip it now.
6012      if (M.Generation <= This->PriorGeneration)
6013        return true;
6014
6015      ++This->Reader.NumMethodPoolTableLookups;
6016      ASTSelectorLookupTable *PoolTable
6017        = (ASTSelectorLookupTable*)M.SelectorLookupTable;
6018      ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
6019      if (Pos == PoolTable->end())
6020        return false;
6021
6022      ++This->Reader.NumMethodPoolTableHits;
6023      ++This->Reader.NumSelectorsRead;
6024      // FIXME: Not quite happy with the statistics here. We probably should
6025      // disable this tracking when called via LoadSelector.
6026      // Also, should entries without methods count as misses?
6027      ++This->Reader.NumMethodPoolEntriesRead;
6028      ASTSelectorLookupTrait::data_type Data = *Pos;
6029      if (This->Reader.DeserializationListener)
6030        This->Reader.DeserializationListener->SelectorRead(Data.ID,
6031                                                           This->Sel);
6032
6033      This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
6034      This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
6035      return true;
6036    }
6037
6038    /// \brief Retrieve the instance methods found by this visitor.
6039    ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
6040      return InstanceMethods;
6041    }
6042
6043    /// \brief Retrieve the instance methods found by this visitor.
6044    ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
6045      return FactoryMethods;
6046    }
6047  };
6048} } // end namespace clang::serialization
6049
6050/// \brief Add the given set of methods to the method list.
6051static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
6052                             ObjCMethodList &List) {
6053  for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
6054    S.addMethodToGlobalList(&List, Methods[I]);
6055  }
6056}
6057
6058void ASTReader::ReadMethodPool(Selector Sel) {
6059  // Get the selector generation and update it to the current generation.
6060  unsigned &Generation = SelectorGeneration[Sel];
6061  unsigned PriorGeneration = Generation;
6062  Generation = CurrentGeneration;
6063
6064  // Search for methods defined with this selector.
6065  ++NumMethodPoolLookups;
6066  ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
6067  ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
6068
6069  if (Visitor.getInstanceMethods().empty() &&
6070      Visitor.getFactoryMethods().empty())
6071    return;
6072
6073  ++NumMethodPoolHits;
6074
6075  if (!getSema())
6076    return;
6077
6078  Sema &S = *getSema();
6079  Sema::GlobalMethodPool::iterator Pos
6080    = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
6081
6082  addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
6083  addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
6084}
6085
6086void ASTReader::ReadKnownNamespaces(
6087                          SmallVectorImpl<NamespaceDecl *> &Namespaces) {
6088  Namespaces.clear();
6089
6090  for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
6091    if (NamespaceDecl *Namespace
6092                = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
6093      Namespaces.push_back(Namespace);
6094  }
6095}
6096
6097void ASTReader::ReadUndefinedButUsed(
6098                        llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
6099  for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
6100    NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
6101    SourceLocation Loc =
6102        SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
6103    Undefined.insert(std::make_pair(D, Loc));
6104  }
6105}
6106
6107void ASTReader::ReadTentativeDefinitions(
6108                  SmallVectorImpl<VarDecl *> &TentativeDefs) {
6109  for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
6110    VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
6111    if (Var)
6112      TentativeDefs.push_back(Var);
6113  }
6114  TentativeDefinitions.clear();
6115}
6116
6117void ASTReader::ReadUnusedFileScopedDecls(
6118                               SmallVectorImpl<const DeclaratorDecl *> &Decls) {
6119  for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
6120    DeclaratorDecl *D
6121      = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
6122    if (D)
6123      Decls.push_back(D);
6124  }
6125  UnusedFileScopedDecls.clear();
6126}
6127
6128void ASTReader::ReadDelegatingConstructors(
6129                                 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
6130  for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
6131    CXXConstructorDecl *D
6132      = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
6133    if (D)
6134      Decls.push_back(D);
6135  }
6136  DelegatingCtorDecls.clear();
6137}
6138
6139void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
6140  for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
6141    TypedefNameDecl *D
6142      = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
6143    if (D)
6144      Decls.push_back(D);
6145  }
6146  ExtVectorDecls.clear();
6147}
6148
6149void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
6150  for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
6151    CXXRecordDecl *D
6152      = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
6153    if (D)
6154      Decls.push_back(D);
6155  }
6156  DynamicClasses.clear();
6157}
6158
6159void
6160ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
6161  for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
6162    NamedDecl *D
6163      = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
6164    if (D)
6165      Decls.push_back(D);
6166  }
6167  LocallyScopedExternCDecls.clear();
6168}
6169
6170void ASTReader::ReadReferencedSelectors(
6171       SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
6172  if (ReferencedSelectorsData.empty())
6173    return;
6174
6175  // If there are @selector references added them to its pool. This is for
6176  // implementation of -Wselector.
6177  unsigned int DataSize = ReferencedSelectorsData.size()-1;
6178  unsigned I = 0;
6179  while (I < DataSize) {
6180    Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
6181    SourceLocation SelLoc
6182      = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
6183    Sels.push_back(std::make_pair(Sel, SelLoc));
6184  }
6185  ReferencedSelectorsData.clear();
6186}
6187
6188void ASTReader::ReadWeakUndeclaredIdentifiers(
6189       SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
6190  if (WeakUndeclaredIdentifiers.empty())
6191    return;
6192
6193  for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
6194    IdentifierInfo *WeakId
6195      = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
6196    IdentifierInfo *AliasId
6197      = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
6198    SourceLocation Loc
6199      = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
6200    bool Used = WeakUndeclaredIdentifiers[I++];
6201    WeakInfo WI(AliasId, Loc);
6202    WI.setUsed(Used);
6203    WeakIDs.push_back(std::make_pair(WeakId, WI));
6204  }
6205  WeakUndeclaredIdentifiers.clear();
6206}
6207
6208void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
6209  for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
6210    ExternalVTableUse VT;
6211    VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
6212    VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
6213    VT.DefinitionRequired = VTableUses[Idx++];
6214    VTables.push_back(VT);
6215  }
6216
6217  VTableUses.clear();
6218}
6219
6220void ASTReader::ReadPendingInstantiations(
6221       SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
6222  for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
6223    ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
6224    SourceLocation Loc
6225      = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
6226
6227    Pending.push_back(std::make_pair(D, Loc));
6228  }
6229  PendingInstantiations.clear();
6230}
6231
6232void ASTReader::LoadSelector(Selector Sel) {
6233  // It would be complicated to avoid reading the methods anyway. So don't.
6234  ReadMethodPool(Sel);
6235}
6236
6237void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
6238  assert(ID && "Non-zero identifier ID required");
6239  assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
6240  IdentifiersLoaded[ID - 1] = II;
6241  if (DeserializationListener)
6242    DeserializationListener->IdentifierRead(ID, II);
6243}
6244
6245/// \brief Set the globally-visible declarations associated with the given
6246/// identifier.
6247///
6248/// If the AST reader is currently in a state where the given declaration IDs
6249/// cannot safely be resolved, they are queued until it is safe to resolve
6250/// them.
6251///
6252/// \param II an IdentifierInfo that refers to one or more globally-visible
6253/// declarations.
6254///
6255/// \param DeclIDs the set of declaration IDs with the name @p II that are
6256/// visible at global scope.
6257///
6258/// \param Decls if non-null, this vector will be populated with the set of
6259/// deserialized declarations. These declarations will not be pushed into
6260/// scope.
6261void
6262ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
6263                              const SmallVectorImpl<uint32_t> &DeclIDs,
6264                                   SmallVectorImpl<Decl *> *Decls) {
6265  if (NumCurrentElementsDeserializing && !Decls) {
6266    PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
6267    return;
6268  }
6269
6270  for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
6271    NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
6272    if (SemaObj) {
6273      // If we're simply supposed to record the declarations, do so now.
6274      if (Decls) {
6275        Decls->push_back(D);
6276        continue;
6277      }
6278
6279      // Introduce this declaration into the translation-unit scope
6280      // and add it to the declaration chain for this identifier, so
6281      // that (unqualified) name lookup will find it.
6282      NamedDecl *ND = cast<NamedDecl>(D->getMostRecentDecl());
6283      SemaObj->pushExternalDeclIntoScope(ND, II);
6284    } else {
6285      // Queue this declaration so that it will be added to the
6286      // translation unit scope and identifier's declaration chain
6287      // once a Sema object is known.
6288      PreloadedDecls.push_back(D);
6289    }
6290  }
6291}
6292
6293IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
6294  if (ID == 0)
6295    return 0;
6296
6297  if (IdentifiersLoaded.empty()) {
6298    Error("no identifier table in AST file");
6299    return 0;
6300  }
6301
6302  ID -= 1;
6303  if (!IdentifiersLoaded[ID]) {
6304    GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
6305    assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
6306    ModuleFile *M = I->second;
6307    unsigned Index = ID - M->BaseIdentifierID;
6308    const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
6309
6310    // All of the strings in the AST file are preceded by a 16-bit length.
6311    // Extract that 16-bit length to avoid having to execute strlen().
6312    // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
6313    //  unsigned integers.  This is important to avoid integer overflow when
6314    //  we cast them to 'unsigned'.
6315    const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
6316    unsigned StrLen = (((unsigned) StrLenPtr[0])
6317                       | (((unsigned) StrLenPtr[1]) << 8)) - 1;
6318    IdentifiersLoaded[ID]
6319      = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
6320    if (DeserializationListener)
6321      DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
6322  }
6323
6324  return IdentifiersLoaded[ID];
6325}
6326
6327IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
6328  return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
6329}
6330
6331IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
6332  if (LocalID < NUM_PREDEF_IDENT_IDS)
6333    return LocalID;
6334
6335  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6336    = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
6337  assert(I != M.IdentifierRemap.end()
6338         && "Invalid index into identifier index remap");
6339
6340  return LocalID + I->second;
6341}
6342
6343MacroDirective *ASTReader::getMacro(MacroID ID, MacroDirective *Hint) {
6344  if (ID == 0)
6345    return 0;
6346
6347  if (MacrosLoaded.empty()) {
6348    Error("no macro table in AST file");
6349    return 0;
6350  }
6351
6352  ID -= NUM_PREDEF_MACRO_IDS;
6353  if (!MacrosLoaded[ID]) {
6354    GlobalMacroMapType::iterator I
6355      = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
6356    assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
6357    ModuleFile *M = I->second;
6358    unsigned Index = ID - M->BaseMacroID;
6359    ReadMacroRecord(*M, M->MacroOffsets[Index], Hint);
6360  }
6361
6362  return MacrosLoaded[ID];
6363}
6364
6365MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
6366  if (LocalID < NUM_PREDEF_MACRO_IDS)
6367    return LocalID;
6368
6369  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6370    = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
6371  assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
6372
6373  return LocalID + I->second;
6374}
6375
6376serialization::SubmoduleID
6377ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
6378  if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
6379    return LocalID;
6380
6381  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6382    = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
6383  assert(I != M.SubmoduleRemap.end()
6384         && "Invalid index into submodule index remap");
6385
6386  return LocalID + I->second;
6387}
6388
6389Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
6390  if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
6391    assert(GlobalID == 0 && "Unhandled global submodule ID");
6392    return 0;
6393  }
6394
6395  if (GlobalID > SubmodulesLoaded.size()) {
6396    Error("submodule ID out of range in AST file");
6397    return 0;
6398  }
6399
6400  return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
6401}
6402
6403Module *ASTReader::getModule(unsigned ID) {
6404  return getSubmodule(ID);
6405}
6406
6407Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
6408  return DecodeSelector(getGlobalSelectorID(M, LocalID));
6409}
6410
6411Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
6412  if (ID == 0)
6413    return Selector();
6414
6415  if (ID > SelectorsLoaded.size()) {
6416    Error("selector ID out of range in AST file");
6417    return Selector();
6418  }
6419
6420  if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) {
6421    // Load this selector from the selector table.
6422    GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
6423    assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
6424    ModuleFile &M = *I->second;
6425    ASTSelectorLookupTrait Trait(*this, M);
6426    unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
6427    SelectorsLoaded[ID - 1] =
6428      Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
6429    if (DeserializationListener)
6430      DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
6431  }
6432
6433  return SelectorsLoaded[ID - 1];
6434}
6435
6436Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
6437  return DecodeSelector(ID);
6438}
6439
6440uint32_t ASTReader::GetNumExternalSelectors() {
6441  // ID 0 (the null selector) is considered an external selector.
6442  return getTotalNumSelectors() + 1;
6443}
6444
6445serialization::SelectorID
6446ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
6447  if (LocalID < NUM_PREDEF_SELECTOR_IDS)
6448    return LocalID;
6449
6450  ContinuousRangeMap<uint32_t, int, 2>::iterator I
6451    = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
6452  assert(I != M.SelectorRemap.end()
6453         && "Invalid index into selector index remap");
6454
6455  return LocalID + I->second;
6456}
6457
6458DeclarationName
6459ASTReader::ReadDeclarationName(ModuleFile &F,
6460                               const RecordData &Record, unsigned &Idx) {
6461  DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
6462  switch (Kind) {
6463  case DeclarationName::Identifier:
6464    return DeclarationName(GetIdentifierInfo(F, Record, Idx));
6465
6466  case DeclarationName::ObjCZeroArgSelector:
6467  case DeclarationName::ObjCOneArgSelector:
6468  case DeclarationName::ObjCMultiArgSelector:
6469    return DeclarationName(ReadSelector(F, Record, Idx));
6470
6471  case DeclarationName::CXXConstructorName:
6472    return Context.DeclarationNames.getCXXConstructorName(
6473                          Context.getCanonicalType(readType(F, Record, Idx)));
6474
6475  case DeclarationName::CXXDestructorName:
6476    return Context.DeclarationNames.getCXXDestructorName(
6477                          Context.getCanonicalType(readType(F, Record, Idx)));
6478
6479  case DeclarationName::CXXConversionFunctionName:
6480    return Context.DeclarationNames.getCXXConversionFunctionName(
6481                          Context.getCanonicalType(readType(F, Record, Idx)));
6482
6483  case DeclarationName::CXXOperatorName:
6484    return Context.DeclarationNames.getCXXOperatorName(
6485                                       (OverloadedOperatorKind)Record[Idx++]);
6486
6487  case DeclarationName::CXXLiteralOperatorName:
6488    return Context.DeclarationNames.getCXXLiteralOperatorName(
6489                                       GetIdentifierInfo(F, Record, Idx));
6490
6491  case DeclarationName::CXXUsingDirective:
6492    return DeclarationName::getUsingDirectiveName();
6493  }
6494
6495  llvm_unreachable("Invalid NameKind!");
6496}
6497
6498void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
6499                                       DeclarationNameLoc &DNLoc,
6500                                       DeclarationName Name,
6501                                      const RecordData &Record, unsigned &Idx) {
6502  switch (Name.getNameKind()) {
6503  case DeclarationName::CXXConstructorName:
6504  case DeclarationName::CXXDestructorName:
6505  case DeclarationName::CXXConversionFunctionName:
6506    DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
6507    break;
6508
6509  case DeclarationName::CXXOperatorName:
6510    DNLoc.CXXOperatorName.BeginOpNameLoc
6511        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6512    DNLoc.CXXOperatorName.EndOpNameLoc
6513        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6514    break;
6515
6516  case DeclarationName::CXXLiteralOperatorName:
6517    DNLoc.CXXLiteralOperatorName.OpNameLoc
6518        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
6519    break;
6520
6521  case DeclarationName::Identifier:
6522  case DeclarationName::ObjCZeroArgSelector:
6523  case DeclarationName::ObjCOneArgSelector:
6524  case DeclarationName::ObjCMultiArgSelector:
6525  case DeclarationName::CXXUsingDirective:
6526    break;
6527  }
6528}
6529
6530void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
6531                                        DeclarationNameInfo &NameInfo,
6532                                      const RecordData &Record, unsigned &Idx) {
6533  NameInfo.setName(ReadDeclarationName(F, Record, Idx));
6534  NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
6535  DeclarationNameLoc DNLoc;
6536  ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
6537  NameInfo.setInfo(DNLoc);
6538}
6539
6540void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
6541                                  const RecordData &Record, unsigned &Idx) {
6542  Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
6543  unsigned NumTPLists = Record[Idx++];
6544  Info.NumTemplParamLists = NumTPLists;
6545  if (NumTPLists) {
6546    Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
6547    for (unsigned i=0; i != NumTPLists; ++i)
6548      Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
6549  }
6550}
6551
6552TemplateName
6553ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
6554                            unsigned &Idx) {
6555  TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
6556  switch (Kind) {
6557  case TemplateName::Template:
6558      return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
6559
6560  case TemplateName::OverloadedTemplate: {
6561    unsigned size = Record[Idx++];
6562    UnresolvedSet<8> Decls;
6563    while (size--)
6564      Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
6565
6566    return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
6567  }
6568
6569  case TemplateName::QualifiedTemplate: {
6570    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
6571    bool hasTemplKeyword = Record[Idx++];
6572    TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
6573    return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
6574  }
6575
6576  case TemplateName::DependentTemplate: {
6577    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
6578    if (Record[Idx++])  // isIdentifier
6579      return Context.getDependentTemplateName(NNS,
6580                                               GetIdentifierInfo(F, Record,
6581                                                                 Idx));
6582    return Context.getDependentTemplateName(NNS,
6583                                         (OverloadedOperatorKind)Record[Idx++]);
6584  }
6585
6586  case TemplateName::SubstTemplateTemplateParm: {
6587    TemplateTemplateParmDecl *param
6588      = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
6589    if (!param) return TemplateName();
6590    TemplateName replacement = ReadTemplateName(F, Record, Idx);
6591    return Context.getSubstTemplateTemplateParm(param, replacement);
6592  }
6593
6594  case TemplateName::SubstTemplateTemplateParmPack: {
6595    TemplateTemplateParmDecl *Param
6596      = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
6597    if (!Param)
6598      return TemplateName();
6599
6600    TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
6601    if (ArgPack.getKind() != TemplateArgument::Pack)
6602      return TemplateName();
6603
6604    return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
6605  }
6606  }
6607
6608  llvm_unreachable("Unhandled template name kind!");
6609}
6610
6611TemplateArgument
6612ASTReader::ReadTemplateArgument(ModuleFile &F,
6613                                const RecordData &Record, unsigned &Idx) {
6614  TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
6615  switch (Kind) {
6616  case TemplateArgument::Null:
6617    return TemplateArgument();
6618  case TemplateArgument::Type:
6619    return TemplateArgument(readType(F, Record, Idx));
6620  case TemplateArgument::Declaration: {
6621    ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
6622    bool ForReferenceParam = Record[Idx++];
6623    return TemplateArgument(D, ForReferenceParam);
6624  }
6625  case TemplateArgument::NullPtr:
6626    return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
6627  case TemplateArgument::Integral: {
6628    llvm::APSInt Value = ReadAPSInt(Record, Idx);
6629    QualType T = readType(F, Record, Idx);
6630    return TemplateArgument(Context, Value, T);
6631  }
6632  case TemplateArgument::Template:
6633    return TemplateArgument(ReadTemplateName(F, Record, Idx));
6634  case TemplateArgument::TemplateExpansion: {
6635    TemplateName Name = ReadTemplateName(F, Record, Idx);
6636    Optional<unsigned> NumTemplateExpansions;
6637    if (unsigned NumExpansions = Record[Idx++])
6638      NumTemplateExpansions = NumExpansions - 1;
6639    return TemplateArgument(Name, NumTemplateExpansions);
6640  }
6641  case TemplateArgument::Expression:
6642    return TemplateArgument(ReadExpr(F));
6643  case TemplateArgument::Pack: {
6644    unsigned NumArgs = Record[Idx++];
6645    TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
6646    for (unsigned I = 0; I != NumArgs; ++I)
6647      Args[I] = ReadTemplateArgument(F, Record, Idx);
6648    return TemplateArgument(Args, NumArgs);
6649  }
6650  }
6651
6652  llvm_unreachable("Unhandled template argument kind!");
6653}
6654
6655TemplateParameterList *
6656ASTReader::ReadTemplateParameterList(ModuleFile &F,
6657                                     const RecordData &Record, unsigned &Idx) {
6658  SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
6659  SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
6660  SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
6661
6662  unsigned NumParams = Record[Idx++];
6663  SmallVector<NamedDecl *, 16> Params;
6664  Params.reserve(NumParams);
6665  while (NumParams--)
6666    Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
6667
6668  TemplateParameterList* TemplateParams =
6669    TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
6670                                  Params.data(), Params.size(), RAngleLoc);
6671  return TemplateParams;
6672}
6673
6674void
6675ASTReader::
6676ReadTemplateArgumentList(SmallVector<TemplateArgument, 8> &TemplArgs,
6677                         ModuleFile &F, const RecordData &Record,
6678                         unsigned &Idx) {
6679  unsigned NumTemplateArgs = Record[Idx++];
6680  TemplArgs.reserve(NumTemplateArgs);
6681  while (NumTemplateArgs--)
6682    TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
6683}
6684
6685/// \brief Read a UnresolvedSet structure.
6686void ASTReader::ReadUnresolvedSet(ModuleFile &F, ASTUnresolvedSet &Set,
6687                                  const RecordData &Record, unsigned &Idx) {
6688  unsigned NumDecls = Record[Idx++];
6689  Set.reserve(Context, NumDecls);
6690  while (NumDecls--) {
6691    NamedDecl *D = ReadDeclAs<NamedDecl>(F, Record, Idx);
6692    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
6693    Set.addDecl(Context, D, AS);
6694  }
6695}
6696
6697CXXBaseSpecifier
6698ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
6699                                const RecordData &Record, unsigned &Idx) {
6700  bool isVirtual = static_cast<bool>(Record[Idx++]);
6701  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
6702  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
6703  bool inheritConstructors = static_cast<bool>(Record[Idx++]);
6704  TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
6705  SourceRange Range = ReadSourceRange(F, Record, Idx);
6706  SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
6707  CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
6708                          EllipsisLoc);
6709  Result.setInheritConstructors(inheritConstructors);
6710  return Result;
6711}
6712
6713std::pair<CXXCtorInitializer **, unsigned>
6714ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
6715                                   unsigned &Idx) {
6716  CXXCtorInitializer **CtorInitializers = 0;
6717  unsigned NumInitializers = Record[Idx++];
6718  if (NumInitializers) {
6719    CtorInitializers
6720        = new (Context) CXXCtorInitializer*[NumInitializers];
6721    for (unsigned i=0; i != NumInitializers; ++i) {
6722      TypeSourceInfo *TInfo = 0;
6723      bool IsBaseVirtual = false;
6724      FieldDecl *Member = 0;
6725      IndirectFieldDecl *IndirectMember = 0;
6726
6727      CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
6728      switch (Type) {
6729      case CTOR_INITIALIZER_BASE:
6730        TInfo = GetTypeSourceInfo(F, Record, Idx);
6731        IsBaseVirtual = Record[Idx++];
6732        break;
6733
6734      case CTOR_INITIALIZER_DELEGATING:
6735        TInfo = GetTypeSourceInfo(F, Record, Idx);
6736        break;
6737
6738       case CTOR_INITIALIZER_MEMBER:
6739        Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
6740        break;
6741
6742       case CTOR_INITIALIZER_INDIRECT_MEMBER:
6743        IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
6744        break;
6745      }
6746
6747      SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
6748      Expr *Init = ReadExpr(F);
6749      SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
6750      SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
6751      bool IsWritten = Record[Idx++];
6752      unsigned SourceOrderOrNumArrayIndices;
6753      SmallVector<VarDecl *, 8> Indices;
6754      if (IsWritten) {
6755        SourceOrderOrNumArrayIndices = Record[Idx++];
6756      } else {
6757        SourceOrderOrNumArrayIndices = Record[Idx++];
6758        Indices.reserve(SourceOrderOrNumArrayIndices);
6759        for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
6760          Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
6761      }
6762
6763      CXXCtorInitializer *BOMInit;
6764      if (Type == CTOR_INITIALIZER_BASE) {
6765        BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
6766                                             LParenLoc, Init, RParenLoc,
6767                                             MemberOrEllipsisLoc);
6768      } else if (Type == CTOR_INITIALIZER_DELEGATING) {
6769        BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
6770                                                   Init, RParenLoc);
6771      } else if (IsWritten) {
6772        if (Member)
6773          BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
6774                                               LParenLoc, Init, RParenLoc);
6775        else
6776          BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
6777                                               MemberOrEllipsisLoc, LParenLoc,
6778                                               Init, RParenLoc);
6779      } else {
6780        BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
6781                                             LParenLoc, Init, RParenLoc,
6782                                             Indices.data(), Indices.size());
6783      }
6784
6785      if (IsWritten)
6786        BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
6787      CtorInitializers[i] = BOMInit;
6788    }
6789  }
6790
6791  return std::make_pair(CtorInitializers, NumInitializers);
6792}
6793
6794NestedNameSpecifier *
6795ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
6796                                   const RecordData &Record, unsigned &Idx) {
6797  unsigned N = Record[Idx++];
6798  NestedNameSpecifier *NNS = 0, *Prev = 0;
6799  for (unsigned I = 0; I != N; ++I) {
6800    NestedNameSpecifier::SpecifierKind Kind
6801      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
6802    switch (Kind) {
6803    case NestedNameSpecifier::Identifier: {
6804      IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6805      NNS = NestedNameSpecifier::Create(Context, Prev, II);
6806      break;
6807    }
6808
6809    case NestedNameSpecifier::Namespace: {
6810      NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6811      NNS = NestedNameSpecifier::Create(Context, Prev, NS);
6812      break;
6813    }
6814
6815    case NestedNameSpecifier::NamespaceAlias: {
6816      NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6817      NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
6818      break;
6819    }
6820
6821    case NestedNameSpecifier::TypeSpec:
6822    case NestedNameSpecifier::TypeSpecWithTemplate: {
6823      const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
6824      if (!T)
6825        return 0;
6826
6827      bool Template = Record[Idx++];
6828      NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
6829      break;
6830    }
6831
6832    case NestedNameSpecifier::Global: {
6833      NNS = NestedNameSpecifier::GlobalSpecifier(Context);
6834      // No associated value, and there can't be a prefix.
6835      break;
6836    }
6837    }
6838    Prev = NNS;
6839  }
6840  return NNS;
6841}
6842
6843NestedNameSpecifierLoc
6844ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
6845                                      unsigned &Idx) {
6846  unsigned N = Record[Idx++];
6847  NestedNameSpecifierLocBuilder Builder;
6848  for (unsigned I = 0; I != N; ++I) {
6849    NestedNameSpecifier::SpecifierKind Kind
6850      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
6851    switch (Kind) {
6852    case NestedNameSpecifier::Identifier: {
6853      IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
6854      SourceRange Range = ReadSourceRange(F, Record, Idx);
6855      Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
6856      break;
6857    }
6858
6859    case NestedNameSpecifier::Namespace: {
6860      NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
6861      SourceRange Range = ReadSourceRange(F, Record, Idx);
6862      Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
6863      break;
6864    }
6865
6866    case NestedNameSpecifier::NamespaceAlias: {
6867      NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
6868      SourceRange Range = ReadSourceRange(F, Record, Idx);
6869      Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
6870      break;
6871    }
6872
6873    case NestedNameSpecifier::TypeSpec:
6874    case NestedNameSpecifier::TypeSpecWithTemplate: {
6875      bool Template = Record[Idx++];
6876      TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
6877      if (!T)
6878        return NestedNameSpecifierLoc();
6879      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
6880
6881      // FIXME: 'template' keyword location not saved anywhere, so we fake it.
6882      Builder.Extend(Context,
6883                     Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
6884                     T->getTypeLoc(), ColonColonLoc);
6885      break;
6886    }
6887
6888    case NestedNameSpecifier::Global: {
6889      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
6890      Builder.MakeGlobal(Context, ColonColonLoc);
6891      break;
6892    }
6893    }
6894  }
6895
6896  return Builder.getWithLocInContext(Context);
6897}
6898
6899SourceRange
6900ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
6901                           unsigned &Idx) {
6902  SourceLocation beg = ReadSourceLocation(F, Record, Idx);
6903  SourceLocation end = ReadSourceLocation(F, Record, Idx);
6904  return SourceRange(beg, end);
6905}
6906
6907/// \brief Read an integral value
6908llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
6909  unsigned BitWidth = Record[Idx++];
6910  unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
6911  llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
6912  Idx += NumWords;
6913  return Result;
6914}
6915
6916/// \brief Read a signed integral value
6917llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
6918  bool isUnsigned = Record[Idx++];
6919  return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
6920}
6921
6922/// \brief Read a floating-point value
6923llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
6924                                     const llvm::fltSemantics &Sem,
6925                                     unsigned &Idx) {
6926  return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
6927}
6928
6929// \brief Read a string
6930std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
6931  unsigned Len = Record[Idx++];
6932  std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
6933  Idx += Len;
6934  return Result;
6935}
6936
6937VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
6938                                         unsigned &Idx) {
6939  unsigned Major = Record[Idx++];
6940  unsigned Minor = Record[Idx++];
6941  unsigned Subminor = Record[Idx++];
6942  if (Minor == 0)
6943    return VersionTuple(Major);
6944  if (Subminor == 0)
6945    return VersionTuple(Major, Minor - 1);
6946  return VersionTuple(Major, Minor - 1, Subminor - 1);
6947}
6948
6949CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
6950                                          const RecordData &Record,
6951                                          unsigned &Idx) {
6952  CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
6953  return CXXTemporary::Create(Context, Decl);
6954}
6955
6956DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
6957  return Diag(SourceLocation(), DiagID);
6958}
6959
6960DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
6961  return Diags.Report(Loc, DiagID);
6962}
6963
6964/// \brief Retrieve the identifier table associated with the
6965/// preprocessor.
6966IdentifierTable &ASTReader::getIdentifierTable() {
6967  return PP.getIdentifierTable();
6968}
6969
6970/// \brief Record that the given ID maps to the given switch-case
6971/// statement.
6972void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
6973  assert((*CurrSwitchCaseStmts)[ID] == 0 &&
6974         "Already have a SwitchCase with this ID");
6975  (*CurrSwitchCaseStmts)[ID] = SC;
6976}
6977
6978/// \brief Retrieve the switch-case statement with the given ID.
6979SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
6980  assert((*CurrSwitchCaseStmts)[ID] != 0 && "No SwitchCase with this ID");
6981  return (*CurrSwitchCaseStmts)[ID];
6982}
6983
6984void ASTReader::ClearSwitchCaseIDs() {
6985  CurrSwitchCaseStmts->clear();
6986}
6987
6988void ASTReader::ReadComments() {
6989  std::vector<RawComment *> Comments;
6990  for (SmallVectorImpl<std::pair<BitstreamCursor,
6991                                 serialization::ModuleFile *> >::iterator
6992       I = CommentsCursors.begin(),
6993       E = CommentsCursors.end();
6994       I != E; ++I) {
6995    BitstreamCursor &Cursor = I->first;
6996    serialization::ModuleFile &F = *I->second;
6997    SavedStreamPosition SavedPosition(Cursor);
6998
6999    RecordData Record;
7000    while (true) {
7001      llvm::BitstreamEntry Entry =
7002        Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
7003
7004      switch (Entry.Kind) {
7005      case llvm::BitstreamEntry::SubBlock: // Handled for us already.
7006      case llvm::BitstreamEntry::Error:
7007        Error("malformed block record in AST file");
7008        return;
7009      case llvm::BitstreamEntry::EndBlock:
7010        goto NextCursor;
7011      case llvm::BitstreamEntry::Record:
7012        // The interesting case.
7013        break;
7014      }
7015
7016      // Read a record.
7017      Record.clear();
7018      switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
7019      case COMMENTS_RAW_COMMENT: {
7020        unsigned Idx = 0;
7021        SourceRange SR = ReadSourceRange(F, Record, Idx);
7022        RawComment::CommentKind Kind =
7023            (RawComment::CommentKind) Record[Idx++];
7024        bool IsTrailingComment = Record[Idx++];
7025        bool IsAlmostTrailingComment = Record[Idx++];
7026        Comments.push_back(new (Context) RawComment(SR, Kind,
7027                                                    IsTrailingComment,
7028                                                    IsAlmostTrailingComment));
7029        break;
7030      }
7031      }
7032    }
7033  NextCursor:;
7034  }
7035  Context.Comments.addCommentsToFront(Comments);
7036}
7037
7038void ASTReader::finishPendingActions() {
7039  while (!PendingIdentifierInfos.empty() || !PendingDeclChains.empty() ||
7040         !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty()) {
7041    // If any identifiers with corresponding top-level declarations have
7042    // been loaded, load those declarations now.
7043    llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > TopLevelDecls;
7044    while (!PendingIdentifierInfos.empty()) {
7045      // FIXME: std::move
7046      IdentifierInfo *II = PendingIdentifierInfos.back().first;
7047      SmallVector<uint32_t, 4> DeclIDs = PendingIdentifierInfos.back().second;
7048      PendingIdentifierInfos.pop_back();
7049
7050      SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
7051    }
7052
7053    // Load pending declaration chains.
7054    for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
7055      loadPendingDeclChain(PendingDeclChains[I]);
7056      PendingDeclChainsKnown.erase(PendingDeclChains[I]);
7057    }
7058    PendingDeclChains.clear();
7059
7060    // Make the most recent of the top-level declarations visible.
7061    for (llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >::iterator
7062           TLD = TopLevelDecls.begin(), TLDEnd = TopLevelDecls.end();
7063         TLD != TLDEnd; ++TLD) {
7064      IdentifierInfo *II = TLD->first;
7065      for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
7066        NamedDecl *ND = cast<NamedDecl>(TLD->second[I]->getMostRecentDecl());
7067        SemaObj->pushExternalDeclIntoScope(ND, II);
7068      }
7069    }
7070
7071    // Load any pending macro definitions.
7072    for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
7073      // FIXME: std::move here
7074      SmallVector<MacroID, 2> GlobalIDs = PendingMacroIDs.begin()[I].second;
7075      MacroDirective *Hint = 0;
7076      for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx !=  NumIDs;
7077           ++IDIdx) {
7078        Hint = getMacro(GlobalIDs[IDIdx], Hint);
7079      }
7080    }
7081    PendingMacroIDs.clear();
7082
7083    // Wire up the DeclContexts for Decls that we delayed setting until
7084    // recursive loading is completed.
7085    while (!PendingDeclContextInfos.empty()) {
7086      PendingDeclContextInfo Info = PendingDeclContextInfos.front();
7087      PendingDeclContextInfos.pop_front();
7088      DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
7089      DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
7090      Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
7091    }
7092  }
7093
7094  // If we deserialized any C++ or Objective-C class definitions, any
7095  // Objective-C protocol definitions, or any redeclarable templates, make sure
7096  // that all redeclarations point to the definitions. Note that this can only
7097  // happen now, after the redeclaration chains have been fully wired.
7098  for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
7099                                           DEnd = PendingDefinitions.end();
7100       D != DEnd; ++D) {
7101    if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
7102      if (const TagType *TagT = dyn_cast<TagType>(TD->TypeForDecl)) {
7103        // Make sure that the TagType points at the definition.
7104        const_cast<TagType*>(TagT)->decl = TD;
7105      }
7106
7107      if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(*D)) {
7108        for (CXXRecordDecl::redecl_iterator R = RD->redecls_begin(),
7109                                         REnd = RD->redecls_end();
7110             R != REnd; ++R)
7111          cast<CXXRecordDecl>(*R)->DefinitionData = RD->DefinitionData;
7112
7113      }
7114
7115      continue;
7116    }
7117
7118    if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
7119      // Make sure that the ObjCInterfaceType points at the definition.
7120      const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
7121        ->Decl = ID;
7122
7123      for (ObjCInterfaceDecl::redecl_iterator R = ID->redecls_begin(),
7124                                           REnd = ID->redecls_end();
7125           R != REnd; ++R)
7126        R->Data = ID->Data;
7127
7128      continue;
7129    }
7130
7131    if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(*D)) {
7132      for (ObjCProtocolDecl::redecl_iterator R = PD->redecls_begin(),
7133                                          REnd = PD->redecls_end();
7134           R != REnd; ++R)
7135        R->Data = PD->Data;
7136
7137      continue;
7138    }
7139
7140    RedeclarableTemplateDecl *RTD
7141      = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
7142    for (RedeclarableTemplateDecl::redecl_iterator R = RTD->redecls_begin(),
7143                                                REnd = RTD->redecls_end();
7144         R != REnd; ++R)
7145      R->Common = RTD->Common;
7146  }
7147  PendingDefinitions.clear();
7148
7149  // Load the bodies of any functions or methods we've encountered. We do
7150  // this now (delayed) so that we can be sure that the declaration chains
7151  // have been fully wired up.
7152  for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
7153                               PBEnd = PendingBodies.end();
7154       PB != PBEnd; ++PB) {
7155    if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
7156      // FIXME: Check for =delete/=default?
7157      // FIXME: Complain about ODR violations here?
7158      if (!getContext().getLangOpts().Modules || !FD->hasBody())
7159        FD->setLazyBody(PB->second);
7160      continue;
7161    }
7162
7163    ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
7164    if (!getContext().getLangOpts().Modules || !MD->hasBody())
7165      MD->setLazyBody(PB->second);
7166  }
7167  PendingBodies.clear();
7168}
7169
7170void ASTReader::FinishedDeserializing() {
7171  assert(NumCurrentElementsDeserializing &&
7172         "FinishedDeserializing not paired with StartedDeserializing");
7173  if (NumCurrentElementsDeserializing == 1) {
7174    // We decrease NumCurrentElementsDeserializing only after pending actions
7175    // are finished, to avoid recursively re-calling finishPendingActions().
7176    finishPendingActions();
7177  }
7178  --NumCurrentElementsDeserializing;
7179
7180  if (NumCurrentElementsDeserializing == 0 &&
7181      Consumer && !PassingDeclsToConsumer) {
7182    // Guard variable to avoid recursively redoing the process of passing
7183    // decls to consumer.
7184    SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
7185                                                     true);
7186
7187    while (!InterestingDecls.empty()) {
7188      // We are not in recursive loading, so it's safe to pass the "interesting"
7189      // decls to the consumer.
7190      Decl *D = InterestingDecls.front();
7191      InterestingDecls.pop_front();
7192      PassInterestingDeclToConsumer(D);
7193    }
7194  }
7195}
7196
7197ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context,
7198                     StringRef isysroot, bool DisableValidation,
7199                     bool AllowASTWithCompilerErrors, bool UseGlobalIndex)
7200  : Listener(new PCHValidator(PP, *this)), DeserializationListener(0),
7201    SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
7202    Diags(PP.getDiagnostics()), SemaObj(0), PP(PP), Context(Context),
7203    Consumer(0), ModuleMgr(PP.getFileManager()),
7204    isysroot(isysroot), DisableValidation(DisableValidation),
7205    AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
7206    UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
7207    CurrentGeneration(0), CurrSwitchCaseStmts(&SwitchCaseStmts),
7208    NumSLocEntriesRead(0), TotalNumSLocEntries(0),
7209    NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0),
7210    TotalNumMacros(0), NumIdentifierLookups(0), NumIdentifierLookupHits(0),
7211    NumSelectorsRead(0), NumMethodPoolEntriesRead(0),
7212    NumMethodPoolLookups(0), NumMethodPoolHits(0),
7213    NumMethodPoolTableLookups(0), NumMethodPoolTableHits(0),
7214    TotalNumMethodPoolEntries(0),
7215    NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
7216    NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
7217    TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
7218    PassingDeclsToConsumer(false),
7219    NumCXXBaseSpecifiersLoaded(0)
7220{
7221  SourceMgr.setExternalSLocEntrySource(this);
7222}
7223
7224ASTReader::~ASTReader() {
7225  for (DeclContextVisibleUpdatesPending::iterator
7226           I = PendingVisibleUpdates.begin(),
7227           E = PendingVisibleUpdates.end();
7228       I != E; ++I) {
7229    for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
7230                                             F = I->second.end();
7231         J != F; ++J)
7232      delete J->first;
7233  }
7234}
7235