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