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