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