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