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