ASTReader.cpp revision 0a0d2b179085a52c10402feebeb6db8b4d96a140
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 "ASTCommon.h"
17#include "clang/Frontend/FrontendDiagnostic.h"
18#include "clang/Frontend/Utils.h"
19#include "clang/Sema/Sema.h"
20#include "clang/Sema/Scope.h"
21#include "clang/AST/ASTConsumer.h"
22#include "clang/AST/ASTContext.h"
23#include "clang/AST/DeclTemplate.h"
24#include "clang/AST/Expr.h"
25#include "clang/AST/ExprCXX.h"
26#include "clang/AST/NestedNameSpecifier.h"
27#include "clang/AST/Type.h"
28#include "clang/AST/TypeLocVisitor.h"
29#include "clang/Lex/MacroInfo.h"
30#include "clang/Lex/PreprocessingRecord.h"
31#include "clang/Lex/Preprocessor.h"
32#include "clang/Lex/HeaderSearch.h"
33#include "clang/Basic/OnDiskHashTable.h"
34#include "clang/Basic/SourceManager.h"
35#include "clang/Basic/SourceManagerInternals.h"
36#include "clang/Basic/FileManager.h"
37#include "clang/Basic/FileSystemStatCache.h"
38#include "clang/Basic/TargetInfo.h"
39#include "clang/Basic/Version.h"
40#include "clang/Basic/VersionTuple.h"
41#include "llvm/ADT/StringExtras.h"
42#include "llvm/Bitcode/BitstreamReader.h"
43#include "llvm/Support/MemoryBuffer.h"
44#include "llvm/Support/ErrorHandling.h"
45#include "llvm/Support/FileSystem.h"
46#include "llvm/Support/Path.h"
47#include "llvm/Support/system_error.h"
48#include <algorithm>
49#include <iterator>
50#include <cstdio>
51#include <sys/stat.h>
52
53using namespace clang;
54using namespace clang::serialization;
55
56//===----------------------------------------------------------------------===//
57// PCH validator implementation
58//===----------------------------------------------------------------------===//
59
60ASTReaderListener::~ASTReaderListener() {}
61
62bool
63PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts) {
64  const LangOptions &PPLangOpts = PP.getLangOptions();
65#define PARSE_LANGOPT_BENIGN(Option)
66#define PARSE_LANGOPT_IMPORTANT(Option, DiagID)                    \
67  if (PPLangOpts.Option != LangOpts.Option) {                      \
68    Reader.Diag(DiagID) << LangOpts.Option << PPLangOpts.Option;   \
69    return true;                                                   \
70  }
71
72  PARSE_LANGOPT_BENIGN(Trigraphs);
73  PARSE_LANGOPT_BENIGN(BCPLComment);
74  PARSE_LANGOPT_BENIGN(DollarIdents);
75  PARSE_LANGOPT_BENIGN(AsmPreprocessor);
76  PARSE_LANGOPT_IMPORTANT(GNUMode, diag::warn_pch_gnu_extensions);
77  PARSE_LANGOPT_IMPORTANT(GNUKeywords, diag::warn_pch_gnu_keywords);
78  PARSE_LANGOPT_BENIGN(ImplicitInt);
79  PARSE_LANGOPT_BENIGN(Digraphs);
80  PARSE_LANGOPT_BENIGN(HexFloats);
81  PARSE_LANGOPT_IMPORTANT(C99, diag::warn_pch_c99);
82  PARSE_LANGOPT_IMPORTANT(Microsoft, diag::warn_pch_microsoft_extensions);
83  PARSE_LANGOPT_BENIGN(MSCVersion);
84  PARSE_LANGOPT_IMPORTANT(CPlusPlus, diag::warn_pch_cplusplus);
85  PARSE_LANGOPT_IMPORTANT(CPlusPlus0x, diag::warn_pch_cplusplus0x);
86  PARSE_LANGOPT_BENIGN(CXXOperatorName);
87  PARSE_LANGOPT_IMPORTANT(ObjC1, diag::warn_pch_objective_c);
88  PARSE_LANGOPT_IMPORTANT(ObjC2, diag::warn_pch_objective_c2);
89  PARSE_LANGOPT_IMPORTANT(ObjCNonFragileABI, diag::warn_pch_nonfragile_abi);
90  PARSE_LANGOPT_IMPORTANT(ObjCNonFragileABI2, diag::warn_pch_nonfragile_abi2);
91  PARSE_LANGOPT_IMPORTANT(AppleKext, diag::warn_pch_apple_kext);
92  PARSE_LANGOPT_IMPORTANT(ObjCDefaultSynthProperties,
93                          diag::warn_pch_objc_auto_properties);
94  PARSE_LANGOPT_IMPORTANT(NoConstantCFStrings,
95                          diag::warn_pch_no_constant_cfstrings);
96  PARSE_LANGOPT_BENIGN(PascalStrings);
97  PARSE_LANGOPT_BENIGN(WritableStrings);
98  PARSE_LANGOPT_IMPORTANT(LaxVectorConversions,
99                          diag::warn_pch_lax_vector_conversions);
100  PARSE_LANGOPT_IMPORTANT(AltiVec, diag::warn_pch_altivec);
101  PARSE_LANGOPT_IMPORTANT(Exceptions, diag::warn_pch_exceptions);
102  PARSE_LANGOPT_IMPORTANT(ObjCExceptions, diag::warn_pch_objc_exceptions);
103  PARSE_LANGOPT_IMPORTANT(CXXExceptions, diag::warn_pch_cxx_exceptions);
104  PARSE_LANGOPT_IMPORTANT(SjLjExceptions, diag::warn_pch_sjlj_exceptions);
105  PARSE_LANGOPT_IMPORTANT(MSBitfields, diag::warn_pch_ms_bitfields);
106  PARSE_LANGOPT_IMPORTANT(NeXTRuntime, diag::warn_pch_objc_runtime);
107  PARSE_LANGOPT_IMPORTANT(Freestanding, diag::warn_pch_freestanding);
108  PARSE_LANGOPT_IMPORTANT(NoBuiltin, diag::warn_pch_builtins);
109  PARSE_LANGOPT_IMPORTANT(ThreadsafeStatics,
110                          diag::warn_pch_thread_safe_statics);
111  PARSE_LANGOPT_IMPORTANT(POSIXThreads, diag::warn_pch_posix_threads);
112  PARSE_LANGOPT_IMPORTANT(Blocks, diag::warn_pch_blocks);
113  PARSE_LANGOPT_BENIGN(EmitAllDecls);
114  PARSE_LANGOPT_IMPORTANT(MathErrno, diag::warn_pch_math_errno);
115  PARSE_LANGOPT_BENIGN(getSignedOverflowBehavior());
116  PARSE_LANGOPT_IMPORTANT(HeinousExtensions,
117                          diag::warn_pch_heinous_extensions);
118  // FIXME: Most of the options below are benign if the macro wasn't
119  // used. Unfortunately, this means that a PCH compiled without
120  // optimization can't be used with optimization turned on, even
121  // though the only thing that changes is whether __OPTIMIZE__ was
122  // defined... but if __OPTIMIZE__ never showed up in the header, it
123  // doesn't matter. We could consider making this some special kind
124  // of check.
125  PARSE_LANGOPT_IMPORTANT(Optimize, diag::warn_pch_optimize);
126  PARSE_LANGOPT_IMPORTANT(OptimizeSize, diag::warn_pch_optimize_size);
127  PARSE_LANGOPT_IMPORTANT(Static, diag::warn_pch_static);
128  PARSE_LANGOPT_IMPORTANT(PICLevel, diag::warn_pch_pic_level);
129  PARSE_LANGOPT_IMPORTANT(GNUInline, diag::warn_pch_gnu_inline);
130  PARSE_LANGOPT_IMPORTANT(NoInline, diag::warn_pch_no_inline);
131  PARSE_LANGOPT_IMPORTANT(AccessControl, diag::warn_pch_access_control);
132  PARSE_LANGOPT_IMPORTANT(CharIsSigned, diag::warn_pch_char_signed);
133  PARSE_LANGOPT_IMPORTANT(ShortWChar, diag::warn_pch_short_wchar);
134  PARSE_LANGOPT_IMPORTANT(ShortEnums, diag::warn_pch_short_enums);
135  if ((PPLangOpts.getGCMode() != 0) != (LangOpts.getGCMode() != 0)) {
136    Reader.Diag(diag::warn_pch_gc_mode)
137      << LangOpts.getGCMode() << PPLangOpts.getGCMode();
138    return true;
139  }
140  PARSE_LANGOPT_BENIGN(getVisibilityMode());
141  PARSE_LANGOPT_IMPORTANT(getStackProtectorMode(),
142                          diag::warn_pch_stack_protector);
143  PARSE_LANGOPT_BENIGN(InstantiationDepth);
144  PARSE_LANGOPT_IMPORTANT(OpenCL, diag::warn_pch_opencl);
145  PARSE_LANGOPT_IMPORTANT(CUDA, diag::warn_pch_cuda);
146  PARSE_LANGOPT_BENIGN(CatchUndefined);
147  PARSE_LANGOPT_IMPORTANT(ElideConstructors, diag::warn_pch_elide_constructors);
148  PARSE_LANGOPT_BENIGN(SpellChecking);
149  PARSE_LANGOPT_BENIGN(DefaultFPContract);
150#undef PARSE_LANGOPT_IMPORTANT
151#undef PARSE_LANGOPT_BENIGN
152
153  return false;
154}
155
156bool PCHValidator::ReadTargetTriple(llvm::StringRef Triple) {
157  if (Triple == PP.getTargetInfo().getTriple().str())
158    return false;
159
160  Reader.Diag(diag::warn_pch_target_triple)
161    << Triple << PP.getTargetInfo().getTriple().str();
162  return true;
163}
164
165namespace {
166  struct EmptyStringRef {
167    bool operator ()(llvm::StringRef r) const { return r.empty(); }
168  };
169  struct EmptyBlock {
170    bool operator ()(const PCHPredefinesBlock &r) const {return r.Data.empty();}
171  };
172}
173
174static bool EqualConcatenations(llvm::SmallVector<llvm::StringRef, 2> L,
175                                PCHPredefinesBlocks R) {
176  // First, sum up the lengths.
177  unsigned LL = 0, RL = 0;
178  for (unsigned I = 0, N = L.size(); I != N; ++I) {
179    LL += L[I].size();
180  }
181  for (unsigned I = 0, N = R.size(); I != N; ++I) {
182    RL += R[I].Data.size();
183  }
184  if (LL != RL)
185    return false;
186  if (LL == 0 && RL == 0)
187    return true;
188
189  // Kick out empty parts, they confuse the algorithm below.
190  L.erase(std::remove_if(L.begin(), L.end(), EmptyStringRef()), L.end());
191  R.erase(std::remove_if(R.begin(), R.end(), EmptyBlock()), R.end());
192
193  // Do it the hard way. At this point, both vectors must be non-empty.
194  llvm::StringRef LR = L[0], RR = R[0].Data;
195  unsigned LI = 0, RI = 0, LN = L.size(), RN = R.size();
196  (void) RN;
197  for (;;) {
198    // Compare the current pieces.
199    if (LR.size() == RR.size()) {
200      // If they're the same length, it's pretty easy.
201      if (LR != RR)
202        return false;
203      // Both pieces are done, advance.
204      ++LI;
205      ++RI;
206      // If either string is done, they're both done, since they're the same
207      // length.
208      if (LI == LN) {
209        assert(RI == RN && "Strings not the same length after all?");
210        return true;
211      }
212      LR = L[LI];
213      RR = R[RI].Data;
214    } else if (LR.size() < RR.size()) {
215      // Right piece is longer.
216      if (!RR.startswith(LR))
217        return false;
218      ++LI;
219      assert(LI != LN && "Strings not the same length after all?");
220      RR = RR.substr(LR.size());
221      LR = L[LI];
222    } else {
223      // Left piece is longer.
224      if (!LR.startswith(RR))
225        return false;
226      ++RI;
227      assert(RI != RN && "Strings not the same length after all?");
228      LR = LR.substr(RR.size());
229      RR = R[RI].Data;
230    }
231  }
232}
233
234static std::pair<FileID, llvm::StringRef::size_type>
235FindMacro(const PCHPredefinesBlocks &Buffers, llvm::StringRef MacroDef) {
236  std::pair<FileID, llvm::StringRef::size_type> Res;
237  for (unsigned I = 0, N = Buffers.size(); I != N; ++I) {
238    Res.second = Buffers[I].Data.find(MacroDef);
239    if (Res.second != llvm::StringRef::npos) {
240      Res.first = Buffers[I].BufferID;
241      break;
242    }
243  }
244  return Res;
245}
246
247bool PCHValidator::ReadPredefinesBuffer(const PCHPredefinesBlocks &Buffers,
248                                        llvm::StringRef OriginalFileName,
249                                        std::string &SuggestedPredefines,
250                                        FileManager &FileMgr) {
251  // We are in the context of an implicit include, so the predefines buffer will
252  // have a #include entry for the PCH file itself (as normalized by the
253  // preprocessor initialization). Find it and skip over it in the checking
254  // below.
255  llvm::SmallString<256> PCHInclude;
256  PCHInclude += "#include \"";
257  PCHInclude += NormalizeDashIncludePath(OriginalFileName, FileMgr);
258  PCHInclude += "\"\n";
259  std::pair<llvm::StringRef,llvm::StringRef> Split =
260    llvm::StringRef(PP.getPredefines()).split(PCHInclude.str());
261  llvm::StringRef Left =  Split.first, Right = Split.second;
262  if (Left == PP.getPredefines()) {
263    Error("Missing PCH include entry!");
264    return true;
265  }
266
267  // If the concatenation of all the PCH buffers is equal to the adjusted
268  // command line, we're done.
269  llvm::SmallVector<llvm::StringRef, 2> CommandLine;
270  CommandLine.push_back(Left);
271  CommandLine.push_back(Right);
272  if (EqualConcatenations(CommandLine, Buffers))
273    return false;
274
275  SourceManager &SourceMgr = PP.getSourceManager();
276
277  // The predefines buffers are different. Determine what the differences are,
278  // and whether they require us to reject the PCH file.
279  llvm::SmallVector<llvm::StringRef, 8> PCHLines;
280  for (unsigned I = 0, N = Buffers.size(); I != N; ++I)
281    Buffers[I].Data.split(PCHLines, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
282
283  llvm::SmallVector<llvm::StringRef, 8> CmdLineLines;
284  Left.split(CmdLineLines, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
285
286  // Pick out implicit #includes after the PCH and don't consider them for
287  // validation; we will insert them into SuggestedPredefines so that the
288  // preprocessor includes them.
289  std::string IncludesAfterPCH;
290  llvm::SmallVector<llvm::StringRef, 8> AfterPCHLines;
291  Right.split(AfterPCHLines, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false);
292  for (unsigned i = 0, e = AfterPCHLines.size(); i != e; ++i) {
293    if (AfterPCHLines[i].startswith("#include ")) {
294      IncludesAfterPCH += AfterPCHLines[i];
295      IncludesAfterPCH += '\n';
296    } else {
297      CmdLineLines.push_back(AfterPCHLines[i]);
298    }
299  }
300
301  // Make sure we add the includes last into SuggestedPredefines before we
302  // exit this function.
303  struct AddIncludesRAII {
304    std::string &SuggestedPredefines;
305    std::string &IncludesAfterPCH;
306
307    AddIncludesRAII(std::string &SuggestedPredefines,
308                    std::string &IncludesAfterPCH)
309      : SuggestedPredefines(SuggestedPredefines),
310        IncludesAfterPCH(IncludesAfterPCH) { }
311    ~AddIncludesRAII() {
312      SuggestedPredefines += IncludesAfterPCH;
313    }
314  } AddIncludes(SuggestedPredefines, IncludesAfterPCH);
315
316  // Sort both sets of predefined buffer lines, since we allow some extra
317  // definitions and they may appear at any point in the output.
318  std::sort(CmdLineLines.begin(), CmdLineLines.end());
319  std::sort(PCHLines.begin(), PCHLines.end());
320
321  // Determine which predefines that were used to build the PCH file are missing
322  // from the command line.
323  std::vector<llvm::StringRef> MissingPredefines;
324  std::set_difference(PCHLines.begin(), PCHLines.end(),
325                      CmdLineLines.begin(), CmdLineLines.end(),
326                      std::back_inserter(MissingPredefines));
327
328  bool MissingDefines = false;
329  bool ConflictingDefines = false;
330  for (unsigned I = 0, N = MissingPredefines.size(); I != N; ++I) {
331    llvm::StringRef Missing = MissingPredefines[I];
332    if (Missing.startswith("#include ")) {
333      // An -include was specified when generating the PCH; it is included in
334      // the PCH, just ignore it.
335      continue;
336    }
337    if (!Missing.startswith("#define ")) {
338      Reader.Diag(diag::warn_pch_compiler_options_mismatch);
339      return true;
340    }
341
342    // This is a macro definition. Determine the name of the macro we're
343    // defining.
344    std::string::size_type StartOfMacroName = strlen("#define ");
345    std::string::size_type EndOfMacroName
346      = Missing.find_first_of("( \n\r", StartOfMacroName);
347    assert(EndOfMacroName != std::string::npos &&
348           "Couldn't find the end of the macro name");
349    llvm::StringRef MacroName = Missing.slice(StartOfMacroName, EndOfMacroName);
350
351    // Determine whether this macro was given a different definition on the
352    // command line.
353    std::string MacroDefStart = "#define " + MacroName.str();
354    std::string::size_type MacroDefLen = MacroDefStart.size();
355    llvm::SmallVector<llvm::StringRef, 8>::iterator ConflictPos
356      = std::lower_bound(CmdLineLines.begin(), CmdLineLines.end(),
357                         MacroDefStart);
358    for (; ConflictPos != CmdLineLines.end(); ++ConflictPos) {
359      if (!ConflictPos->startswith(MacroDefStart)) {
360        // Different macro; we're done.
361        ConflictPos = CmdLineLines.end();
362        break;
363      }
364
365      assert(ConflictPos->size() > MacroDefLen &&
366             "Invalid #define in predefines buffer?");
367      if ((*ConflictPos)[MacroDefLen] != ' ' &&
368          (*ConflictPos)[MacroDefLen] != '(')
369        continue; // Longer macro name; keep trying.
370
371      // We found a conflicting macro definition.
372      break;
373    }
374
375    if (ConflictPos != CmdLineLines.end()) {
376      Reader.Diag(diag::warn_cmdline_conflicting_macro_def)
377          << MacroName;
378
379      // Show the definition of this macro within the PCH file.
380      std::pair<FileID, llvm::StringRef::size_type> MacroLoc =
381          FindMacro(Buffers, Missing);
382      assert(MacroLoc.second!=llvm::StringRef::npos && "Unable to find macro!");
383      SourceLocation PCHMissingLoc =
384          SourceMgr.getLocForStartOfFile(MacroLoc.first)
385            .getFileLocWithOffset(MacroLoc.second);
386      Reader.Diag(PCHMissingLoc, diag::note_pch_macro_defined_as) << MacroName;
387
388      ConflictingDefines = true;
389      continue;
390    }
391
392    // If the macro doesn't conflict, then we'll just pick up the macro
393    // definition from the PCH file. Warn the user that they made a mistake.
394    if (ConflictingDefines)
395      continue; // Don't complain if there are already conflicting defs
396
397    if (!MissingDefines) {
398      Reader.Diag(diag::warn_cmdline_missing_macro_defs);
399      MissingDefines = true;
400    }
401
402    // Show the definition of this macro within the PCH file.
403    std::pair<FileID, llvm::StringRef::size_type> MacroLoc =
404        FindMacro(Buffers, Missing);
405    assert(MacroLoc.second!=llvm::StringRef::npos && "Unable to find macro!");
406    SourceLocation PCHMissingLoc =
407        SourceMgr.getLocForStartOfFile(MacroLoc.first)
408          .getFileLocWithOffset(MacroLoc.second);
409    Reader.Diag(PCHMissingLoc, diag::note_using_macro_def_from_pch);
410  }
411
412  if (ConflictingDefines)
413    return true;
414
415  // Determine what predefines were introduced based on command-line
416  // parameters that were not present when building the PCH
417  // file. Extra #defines are okay, so long as the identifiers being
418  // defined were not used within the precompiled header.
419  std::vector<llvm::StringRef> ExtraPredefines;
420  std::set_difference(CmdLineLines.begin(), CmdLineLines.end(),
421                      PCHLines.begin(), PCHLines.end(),
422                      std::back_inserter(ExtraPredefines));
423  for (unsigned I = 0, N = ExtraPredefines.size(); I != N; ++I) {
424    llvm::StringRef &Extra = ExtraPredefines[I];
425    if (!Extra.startswith("#define ")) {
426      Reader.Diag(diag::warn_pch_compiler_options_mismatch);
427      return true;
428    }
429
430    // This is an extra macro definition. Determine the name of the
431    // macro we're defining.
432    std::string::size_type StartOfMacroName = strlen("#define ");
433    std::string::size_type EndOfMacroName
434      = Extra.find_first_of("( \n\r", StartOfMacroName);
435    assert(EndOfMacroName != std::string::npos &&
436           "Couldn't find the end of the macro name");
437    llvm::StringRef MacroName = Extra.slice(StartOfMacroName, EndOfMacroName);
438
439    // Check whether this name was used somewhere in the PCH file. If
440    // so, defining it as a macro could change behavior, so we reject
441    // the PCH file.
442    if (IdentifierInfo *II = Reader.get(MacroName)) {
443      Reader.Diag(diag::warn_macro_name_used_in_pch) << II;
444      return true;
445    }
446
447    // Add this definition to the suggested predefines buffer.
448    SuggestedPredefines += Extra;
449    SuggestedPredefines += '\n';
450  }
451
452  // If we get here, it's because the predefines buffer had compatible
453  // contents. Accept the PCH file.
454  return false;
455}
456
457void PCHValidator::ReadHeaderFileInfo(const HeaderFileInfo &HFI,
458                                      unsigned ID) {
459  PP.getHeaderSearchInfo().setHeaderFileInfoForUID(HFI, ID);
460  ++NumHeaderInfos;
461}
462
463void PCHValidator::ReadCounter(unsigned Value) {
464  PP.setCounterValue(Value);
465}
466
467//===----------------------------------------------------------------------===//
468// AST reader implementation
469//===----------------------------------------------------------------------===//
470
471void
472ASTReader::setDeserializationListener(ASTDeserializationListener *Listener) {
473  DeserializationListener = Listener;
474}
475
476
477namespace {
478class ASTSelectorLookupTrait {
479  ASTReader &Reader;
480
481public:
482  struct data_type {
483    SelectorID ID;
484    ObjCMethodList Instance, Factory;
485  };
486
487  typedef Selector external_key_type;
488  typedef external_key_type internal_key_type;
489
490  explicit ASTSelectorLookupTrait(ASTReader &Reader) : Reader(Reader) { }
491
492  static bool EqualKey(const internal_key_type& a,
493                       const internal_key_type& b) {
494    return a == b;
495  }
496
497  static unsigned ComputeHash(Selector Sel) {
498    return serialization::ComputeHash(Sel);
499  }
500
501  // This hopefully will just get inlined and removed by the optimizer.
502  static const internal_key_type&
503  GetInternalKey(const external_key_type& x) { return x; }
504
505  static std::pair<unsigned, unsigned>
506  ReadKeyDataLength(const unsigned char*& d) {
507    using namespace clang::io;
508    unsigned KeyLen = ReadUnalignedLE16(d);
509    unsigned DataLen = ReadUnalignedLE16(d);
510    return std::make_pair(KeyLen, DataLen);
511  }
512
513  internal_key_type ReadKey(const unsigned char* d, unsigned) {
514    using namespace clang::io;
515    SelectorTable &SelTable = Reader.getContext()->Selectors;
516    unsigned N = ReadUnalignedLE16(d);
517    IdentifierInfo *FirstII
518      = Reader.DecodeIdentifierInfo(ReadUnalignedLE32(d));
519    if (N == 0)
520      return SelTable.getNullarySelector(FirstII);
521    else if (N == 1)
522      return SelTable.getUnarySelector(FirstII);
523
524    llvm::SmallVector<IdentifierInfo *, 16> Args;
525    Args.push_back(FirstII);
526    for (unsigned I = 1; I != N; ++I)
527      Args.push_back(Reader.DecodeIdentifierInfo(ReadUnalignedLE32(d)));
528
529    return SelTable.getSelector(N, Args.data());
530  }
531
532  data_type ReadData(Selector, const unsigned char* d, unsigned DataLen) {
533    using namespace clang::io;
534
535    data_type Result;
536
537    Result.ID = ReadUnalignedLE32(d);
538    unsigned NumInstanceMethods = ReadUnalignedLE16(d);
539    unsigned NumFactoryMethods = ReadUnalignedLE16(d);
540
541    // Load instance methods
542    ObjCMethodList *Prev = 0;
543    for (unsigned I = 0; I != NumInstanceMethods; ++I) {
544      ObjCMethodDecl *Method
545        = cast<ObjCMethodDecl>(Reader.GetDecl(ReadUnalignedLE32(d)));
546      if (!Result.Instance.Method) {
547        // This is the first method, which is the easy case.
548        Result.Instance.Method = Method;
549        Prev = &Result.Instance;
550        continue;
551      }
552
553      ObjCMethodList *Mem =
554        Reader.getSema()->BumpAlloc.Allocate<ObjCMethodList>();
555      Prev->Next = new (Mem) ObjCMethodList(Method, 0);
556      Prev = Prev->Next;
557    }
558
559    // Load factory methods
560    Prev = 0;
561    for (unsigned I = 0; I != NumFactoryMethods; ++I) {
562      ObjCMethodDecl *Method
563        = cast<ObjCMethodDecl>(Reader.GetDecl(ReadUnalignedLE32(d)));
564      if (!Result.Factory.Method) {
565        // This is the first method, which is the easy case.
566        Result.Factory.Method = Method;
567        Prev = &Result.Factory;
568        continue;
569      }
570
571      ObjCMethodList *Mem =
572        Reader.getSema()->BumpAlloc.Allocate<ObjCMethodList>();
573      Prev->Next = new (Mem) ObjCMethodList(Method, 0);
574      Prev = Prev->Next;
575    }
576
577    return Result;
578  }
579};
580
581} // end anonymous namespace
582
583/// \brief The on-disk hash table used for the global method pool.
584typedef OnDiskChainedHashTable<ASTSelectorLookupTrait>
585  ASTSelectorLookupTable;
586
587namespace clang {
588class ASTIdentifierLookupTrait {
589  ASTReader &Reader;
590  ASTReader::PerFileData &F;
591
592  // If we know the IdentifierInfo in advance, it is here and we will
593  // not build a new one. Used when deserializing information about an
594  // identifier that was constructed before the AST file was read.
595  IdentifierInfo *KnownII;
596
597public:
598  typedef IdentifierInfo * data_type;
599
600  typedef const std::pair<const char*, unsigned> external_key_type;
601
602  typedef external_key_type internal_key_type;
603
604  ASTIdentifierLookupTrait(ASTReader &Reader, ASTReader::PerFileData &F,
605                           IdentifierInfo *II = 0)
606    : Reader(Reader), F(F), KnownII(II) { }
607
608  static bool EqualKey(const internal_key_type& a,
609                       const internal_key_type& b) {
610    return (a.second == b.second) ? memcmp(a.first, b.first, a.second) == 0
611                                  : false;
612  }
613
614  static unsigned ComputeHash(const internal_key_type& a) {
615    return llvm::HashString(llvm::StringRef(a.first, a.second));
616  }
617
618  // This hopefully will just get inlined and removed by the optimizer.
619  static const internal_key_type&
620  GetInternalKey(const external_key_type& x) { return x; }
621
622  // This hopefully will just get inlined and removed by the optimizer.
623  static const external_key_type&
624  GetExternalKey(const internal_key_type& x) { return x; }
625
626  static std::pair<unsigned, unsigned>
627  ReadKeyDataLength(const unsigned char*& d) {
628    using namespace clang::io;
629    unsigned DataLen = ReadUnalignedLE16(d);
630    unsigned KeyLen = ReadUnalignedLE16(d);
631    return std::make_pair(KeyLen, DataLen);
632  }
633
634  static std::pair<const char*, unsigned>
635  ReadKey(const unsigned char* d, unsigned n) {
636    assert(n >= 2 && d[n-1] == '\0');
637    return std::make_pair((const char*) d, n-1);
638  }
639
640  IdentifierInfo *ReadData(const internal_key_type& k,
641                           const unsigned char* d,
642                           unsigned DataLen) {
643    using namespace clang::io;
644    IdentID ID = ReadUnalignedLE32(d);
645    bool IsInteresting = ID & 0x01;
646
647    // Wipe out the "is interesting" bit.
648    ID = ID >> 1;
649
650    if (!IsInteresting) {
651      // For uninteresting identifiers, just build the IdentifierInfo
652      // and associate it with the persistent ID.
653      IdentifierInfo *II = KnownII;
654      if (!II)
655        II = &Reader.getIdentifierTable().getOwn(k.first, k.first + k.second);
656      Reader.SetIdentifierInfo(ID, II);
657      II->setIsFromAST();
658      return II;
659    }
660
661    unsigned Bits = ReadUnalignedLE16(d);
662    bool CPlusPlusOperatorKeyword = Bits & 0x01;
663    Bits >>= 1;
664    bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
665    Bits >>= 1;
666    bool Poisoned = Bits & 0x01;
667    Bits >>= 1;
668    bool ExtensionToken = Bits & 0x01;
669    Bits >>= 1;
670    bool hasMacroDefinition = Bits & 0x01;
671    Bits >>= 1;
672    unsigned ObjCOrBuiltinID = Bits & 0x3FF;
673    Bits >>= 10;
674
675    assert(Bits == 0 && "Extra bits in the identifier?");
676    DataLen -= 6;
677
678    // Build the IdentifierInfo itself and link the identifier ID with
679    // the new IdentifierInfo.
680    IdentifierInfo *II = KnownII;
681    if (!II)
682      II = &Reader.getIdentifierTable().getOwn(k.first, k.first + k.second);
683    Reader.SetIdentifierInfo(ID, II);
684
685    // Set or check the various bits in the IdentifierInfo structure.
686    // Token IDs are read-only.
687    if (HasRevertedTokenIDToIdentifier)
688      II->RevertTokenIDToIdentifier();
689    II->setObjCOrBuiltinID(ObjCOrBuiltinID);
690    assert(II->isExtensionToken() == ExtensionToken &&
691           "Incorrect extension token flag");
692    (void)ExtensionToken;
693    II->setIsPoisoned(Poisoned);
694    assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
695           "Incorrect C++ operator keyword flag");
696    (void)CPlusPlusOperatorKeyword;
697
698    // If this identifier is a macro, deserialize the macro
699    // definition.
700    if (hasMacroDefinition) {
701      uint32_t Offset = ReadUnalignedLE32(d);
702      Reader.SetIdentifierIsMacro(II, F, Offset);
703      DataLen -= 4;
704    }
705
706    // Read all of the declarations visible at global scope with this
707    // name.
708    if (Reader.getContext() == 0) return II;
709    if (DataLen > 0) {
710      llvm::SmallVector<uint32_t, 4> DeclIDs;
711      for (; DataLen > 0; DataLen -= 4)
712        DeclIDs.push_back(ReadUnalignedLE32(d));
713      Reader.SetGloballyVisibleDecls(II, DeclIDs);
714    }
715
716    II->setIsFromAST();
717    return II;
718  }
719};
720
721} // end anonymous namespace
722
723/// \brief The on-disk hash table used to contain information about
724/// all of the identifiers in the program.
725typedef OnDiskChainedHashTable<ASTIdentifierLookupTrait>
726  ASTIdentifierLookupTable;
727
728namespace {
729class ASTDeclContextNameLookupTrait {
730  ASTReader &Reader;
731
732public:
733  /// \brief Pair of begin/end iterators for DeclIDs.
734  typedef std::pair<DeclID *, DeclID *> data_type;
735
736  /// \brief Special internal key for declaration names.
737  /// The hash table creates keys for comparison; we do not create
738  /// a DeclarationName for the internal key to avoid deserializing types.
739  struct DeclNameKey {
740    DeclarationName::NameKind Kind;
741    uint64_t Data;
742    DeclNameKey() : Kind((DeclarationName::NameKind)0), Data(0) { }
743  };
744
745  typedef DeclarationName external_key_type;
746  typedef DeclNameKey internal_key_type;
747
748  explicit ASTDeclContextNameLookupTrait(ASTReader &Reader) : Reader(Reader) { }
749
750  static bool EqualKey(const internal_key_type& a,
751                       const internal_key_type& b) {
752    return a.Kind == b.Kind && a.Data == b.Data;
753  }
754
755  unsigned ComputeHash(const DeclNameKey &Key) const {
756    llvm::FoldingSetNodeID ID;
757    ID.AddInteger(Key.Kind);
758
759    switch (Key.Kind) {
760    case DeclarationName::Identifier:
761    case DeclarationName::CXXLiteralOperatorName:
762      ID.AddString(((IdentifierInfo*)Key.Data)->getName());
763      break;
764    case DeclarationName::ObjCZeroArgSelector:
765    case DeclarationName::ObjCOneArgSelector:
766    case DeclarationName::ObjCMultiArgSelector:
767      ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
768      break;
769    case DeclarationName::CXXConstructorName:
770    case DeclarationName::CXXDestructorName:
771    case DeclarationName::CXXConversionFunctionName:
772      ID.AddInteger((TypeID)Key.Data);
773      break;
774    case DeclarationName::CXXOperatorName:
775      ID.AddInteger((OverloadedOperatorKind)Key.Data);
776      break;
777    case DeclarationName::CXXUsingDirective:
778      break;
779    }
780
781    return ID.ComputeHash();
782  }
783
784  internal_key_type GetInternalKey(const external_key_type& Name) const {
785    DeclNameKey Key;
786    Key.Kind = Name.getNameKind();
787    switch (Name.getNameKind()) {
788    case DeclarationName::Identifier:
789      Key.Data = (uint64_t)Name.getAsIdentifierInfo();
790      break;
791    case DeclarationName::ObjCZeroArgSelector:
792    case DeclarationName::ObjCOneArgSelector:
793    case DeclarationName::ObjCMultiArgSelector:
794      Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
795      break;
796    case DeclarationName::CXXConstructorName:
797    case DeclarationName::CXXDestructorName:
798    case DeclarationName::CXXConversionFunctionName:
799      Key.Data = Reader.GetTypeID(Name.getCXXNameType());
800      break;
801    case DeclarationName::CXXOperatorName:
802      Key.Data = Name.getCXXOverloadedOperator();
803      break;
804    case DeclarationName::CXXLiteralOperatorName:
805      Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
806      break;
807    case DeclarationName::CXXUsingDirective:
808      break;
809    }
810
811    return Key;
812  }
813
814  external_key_type GetExternalKey(const internal_key_type& Key) const {
815    ASTContext *Context = Reader.getContext();
816    switch (Key.Kind) {
817    case DeclarationName::Identifier:
818      return DeclarationName((IdentifierInfo*)Key.Data);
819
820    case DeclarationName::ObjCZeroArgSelector:
821    case DeclarationName::ObjCOneArgSelector:
822    case DeclarationName::ObjCMultiArgSelector:
823      return DeclarationName(Selector(Key.Data));
824
825    case DeclarationName::CXXConstructorName:
826      return Context->DeclarationNames.getCXXConstructorName(
827                           Context->getCanonicalType(Reader.GetType(Key.Data)));
828
829    case DeclarationName::CXXDestructorName:
830      return Context->DeclarationNames.getCXXDestructorName(
831                           Context->getCanonicalType(Reader.GetType(Key.Data)));
832
833    case DeclarationName::CXXConversionFunctionName:
834      return Context->DeclarationNames.getCXXConversionFunctionName(
835                           Context->getCanonicalType(Reader.GetType(Key.Data)));
836
837    case DeclarationName::CXXOperatorName:
838      return Context->DeclarationNames.getCXXOperatorName(
839                                         (OverloadedOperatorKind)Key.Data);
840
841    case DeclarationName::CXXLiteralOperatorName:
842      return Context->DeclarationNames.getCXXLiteralOperatorName(
843                                                     (IdentifierInfo*)Key.Data);
844
845    case DeclarationName::CXXUsingDirective:
846      return DeclarationName::getUsingDirectiveName();
847    }
848
849    llvm_unreachable("Invalid Name Kind ?");
850  }
851
852  static std::pair<unsigned, unsigned>
853  ReadKeyDataLength(const unsigned char*& d) {
854    using namespace clang::io;
855    unsigned KeyLen = ReadUnalignedLE16(d);
856    unsigned DataLen = ReadUnalignedLE16(d);
857    return std::make_pair(KeyLen, DataLen);
858  }
859
860  internal_key_type ReadKey(const unsigned char* d, unsigned) {
861    using namespace clang::io;
862
863    DeclNameKey Key;
864    Key.Kind = (DeclarationName::NameKind)*d++;
865    switch (Key.Kind) {
866    case DeclarationName::Identifier:
867      Key.Data = (uint64_t)Reader.DecodeIdentifierInfo(ReadUnalignedLE32(d));
868      break;
869    case DeclarationName::ObjCZeroArgSelector:
870    case DeclarationName::ObjCOneArgSelector:
871    case DeclarationName::ObjCMultiArgSelector:
872      Key.Data =
873         (uint64_t)Reader.DecodeSelector(ReadUnalignedLE32(d)).getAsOpaquePtr();
874      break;
875    case DeclarationName::CXXConstructorName:
876    case DeclarationName::CXXDestructorName:
877    case DeclarationName::CXXConversionFunctionName:
878      Key.Data = ReadUnalignedLE32(d); // TypeID
879      break;
880    case DeclarationName::CXXOperatorName:
881      Key.Data = *d++; // OverloadedOperatorKind
882      break;
883    case DeclarationName::CXXLiteralOperatorName:
884      Key.Data = (uint64_t)Reader.DecodeIdentifierInfo(ReadUnalignedLE32(d));
885      break;
886    case DeclarationName::CXXUsingDirective:
887      break;
888    }
889
890    return Key;
891  }
892
893  data_type ReadData(internal_key_type, const unsigned char* d,
894                     unsigned DataLen) {
895    using namespace clang::io;
896    unsigned NumDecls = ReadUnalignedLE16(d);
897    DeclID *Start = (DeclID *)d;
898    return std::make_pair(Start, Start + NumDecls);
899  }
900};
901
902} // end anonymous namespace
903
904/// \brief The on-disk hash table used for the DeclContext's Name lookup table.
905typedef OnDiskChainedHashTable<ASTDeclContextNameLookupTrait>
906  ASTDeclContextNameLookupTable;
907
908bool ASTReader::ReadDeclContextStorage(llvm::BitstreamCursor &Cursor,
909                                   const std::pair<uint64_t, uint64_t> &Offsets,
910                                       DeclContextInfo &Info) {
911  SavedStreamPosition SavedPosition(Cursor);
912  // First the lexical decls.
913  if (Offsets.first != 0) {
914    Cursor.JumpToBit(Offsets.first);
915
916    RecordData Record;
917    const char *Blob;
918    unsigned BlobLen;
919    unsigned Code = Cursor.ReadCode();
920    unsigned RecCode = Cursor.ReadRecord(Code, Record, &Blob, &BlobLen);
921    if (RecCode != DECL_CONTEXT_LEXICAL) {
922      Error("Expected lexical block");
923      return true;
924    }
925
926    Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob);
927    Info.NumLexicalDecls = BlobLen / sizeof(KindDeclIDPair);
928  } else {
929    Info.LexicalDecls = 0;
930    Info.NumLexicalDecls = 0;
931  }
932
933  // Now the lookup table.
934  if (Offsets.second != 0) {
935    Cursor.JumpToBit(Offsets.second);
936
937    RecordData Record;
938    const char *Blob;
939    unsigned BlobLen;
940    unsigned Code = Cursor.ReadCode();
941    unsigned RecCode = Cursor.ReadRecord(Code, Record, &Blob, &BlobLen);
942    if (RecCode != DECL_CONTEXT_VISIBLE) {
943      Error("Expected visible lookup table block");
944      return true;
945    }
946    Info.NameLookupTableData
947      = ASTDeclContextNameLookupTable::Create(
948                    (const unsigned char *)Blob + Record[0],
949                    (const unsigned char *)Blob,
950                    ASTDeclContextNameLookupTrait(*this));
951  } else {
952    Info.NameLookupTableData = 0;
953  }
954
955  return false;
956}
957
958void ASTReader::Error(const char *Msg) {
959  Diag(diag::err_fe_pch_malformed) << Msg;
960}
961
962/// \brief Tell the AST listener about the predefines buffers in the chain.
963bool ASTReader::CheckPredefinesBuffers() {
964  if (Listener)
965    return Listener->ReadPredefinesBuffer(PCHPredefinesBuffers,
966                                          ActualOriginalFileName,
967                                          SuggestedPredefines,
968                                          FileMgr);
969  return false;
970}
971
972//===----------------------------------------------------------------------===//
973// Source Manager Deserialization
974//===----------------------------------------------------------------------===//
975
976/// \brief Read the line table in the source manager block.
977/// \returns true if there was an error.
978bool ASTReader::ParseLineTable(PerFileData &F,
979                               llvm::SmallVectorImpl<uint64_t> &Record) {
980  unsigned Idx = 0;
981  LineTableInfo &LineTable = SourceMgr.getLineTable();
982
983  // Parse the file names
984  std::map<int, int> FileIDs;
985  for (int I = 0, N = Record[Idx++]; I != N; ++I) {
986    // Extract the file name
987    unsigned FilenameLen = Record[Idx++];
988    std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
989    Idx += FilenameLen;
990    MaybeAddSystemRootToFilename(Filename);
991    FileIDs[I] = LineTable.getLineTableFilenameID(Filename.c_str(),
992                                                  Filename.size());
993  }
994
995  // Parse the line entries
996  std::vector<LineEntry> Entries;
997  while (Idx < Record.size()) {
998    int FID = Record[Idx++];
999
1000    // Extract the line entries
1001    unsigned NumEntries = Record[Idx++];
1002    assert(NumEntries && "Numentries is 00000");
1003    Entries.clear();
1004    Entries.reserve(NumEntries);
1005    for (unsigned I = 0; I != NumEntries; ++I) {
1006      unsigned FileOffset = Record[Idx++];
1007      unsigned LineNo = Record[Idx++];
1008      int FilenameID = FileIDs[Record[Idx++]];
1009      SrcMgr::CharacteristicKind FileKind
1010        = (SrcMgr::CharacteristicKind)Record[Idx++];
1011      unsigned IncludeOffset = Record[Idx++];
1012      Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1013                                       FileKind, IncludeOffset));
1014    }
1015    LineTable.AddEntry(FID, Entries);
1016  }
1017
1018  return false;
1019}
1020
1021namespace {
1022
1023class ASTStatData {
1024public:
1025  const ino_t ino;
1026  const dev_t dev;
1027  const mode_t mode;
1028  const time_t mtime;
1029  const off_t size;
1030
1031  ASTStatData(ino_t i, dev_t d, mode_t mo, time_t m, off_t s)
1032    : ino(i), dev(d), mode(mo), mtime(m), size(s) {}
1033};
1034
1035class ASTStatLookupTrait {
1036 public:
1037  typedef const char *external_key_type;
1038  typedef const char *internal_key_type;
1039
1040  typedef ASTStatData data_type;
1041
1042  static unsigned ComputeHash(const char *path) {
1043    return llvm::HashString(path);
1044  }
1045
1046  static internal_key_type GetInternalKey(const char *path) { return path; }
1047
1048  static bool EqualKey(internal_key_type a, internal_key_type b) {
1049    return strcmp(a, b) == 0;
1050  }
1051
1052  static std::pair<unsigned, unsigned>
1053  ReadKeyDataLength(const unsigned char*& d) {
1054    unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d);
1055    unsigned DataLen = (unsigned) *d++;
1056    return std::make_pair(KeyLen + 1, DataLen);
1057  }
1058
1059  static internal_key_type ReadKey(const unsigned char *d, unsigned) {
1060    return (const char *)d;
1061  }
1062
1063  static data_type ReadData(const internal_key_type, const unsigned char *d,
1064                            unsigned /*DataLen*/) {
1065    using namespace clang::io;
1066
1067    ino_t ino = (ino_t) ReadUnalignedLE32(d);
1068    dev_t dev = (dev_t) ReadUnalignedLE32(d);
1069    mode_t mode = (mode_t) ReadUnalignedLE16(d);
1070    time_t mtime = (time_t) ReadUnalignedLE64(d);
1071    off_t size = (off_t) ReadUnalignedLE64(d);
1072    return data_type(ino, dev, mode, mtime, size);
1073  }
1074};
1075
1076/// \brief stat() cache for precompiled headers.
1077///
1078/// This cache is very similar to the stat cache used by pretokenized
1079/// headers.
1080class ASTStatCache : public FileSystemStatCache {
1081  typedef OnDiskChainedHashTable<ASTStatLookupTrait> CacheTy;
1082  CacheTy *Cache;
1083
1084  unsigned &NumStatHits, &NumStatMisses;
1085public:
1086  ASTStatCache(const unsigned char *Buckets, const unsigned char *Base,
1087               unsigned &NumStatHits, unsigned &NumStatMisses)
1088    : Cache(0), NumStatHits(NumStatHits), NumStatMisses(NumStatMisses) {
1089    Cache = CacheTy::Create(Buckets, Base);
1090  }
1091
1092  ~ASTStatCache() { delete Cache; }
1093
1094  LookupResult getStat(const char *Path, struct stat &StatBuf,
1095                       int *FileDescriptor) {
1096    // Do the lookup for the file's data in the AST file.
1097    CacheTy::iterator I = Cache->find(Path);
1098
1099    // If we don't get a hit in the AST file just forward to 'stat'.
1100    if (I == Cache->end()) {
1101      ++NumStatMisses;
1102      return statChained(Path, StatBuf, FileDescriptor);
1103    }
1104
1105    ++NumStatHits;
1106    ASTStatData Data = *I;
1107
1108    StatBuf.st_ino = Data.ino;
1109    StatBuf.st_dev = Data.dev;
1110    StatBuf.st_mtime = Data.mtime;
1111    StatBuf.st_mode = Data.mode;
1112    StatBuf.st_size = Data.size;
1113    return CacheExists;
1114  }
1115};
1116} // end anonymous namespace
1117
1118
1119/// \brief Read a source manager block
1120ASTReader::ASTReadResult ASTReader::ReadSourceManagerBlock(PerFileData &F) {
1121  using namespace SrcMgr;
1122
1123  llvm::BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1124
1125  // Set the source-location entry cursor to the current position in
1126  // the stream. This cursor will be used to read the contents of the
1127  // source manager block initially, and then lazily read
1128  // source-location entries as needed.
1129  SLocEntryCursor = F.Stream;
1130
1131  // The stream itself is going to skip over the source manager block.
1132  if (F.Stream.SkipBlock()) {
1133    Error("malformed block record in AST file");
1134    return Failure;
1135  }
1136
1137  // Enter the source manager block.
1138  if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1139    Error("malformed source manager block record in AST file");
1140    return Failure;
1141  }
1142
1143  RecordData Record;
1144  while (true) {
1145    unsigned Code = SLocEntryCursor.ReadCode();
1146    if (Code == llvm::bitc::END_BLOCK) {
1147      if (SLocEntryCursor.ReadBlockEnd()) {
1148        Error("error at end of Source Manager block in AST file");
1149        return Failure;
1150      }
1151      return Success;
1152    }
1153
1154    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1155      // No known subblocks, always skip them.
1156      SLocEntryCursor.ReadSubBlockID();
1157      if (SLocEntryCursor.SkipBlock()) {
1158        Error("malformed block record in AST file");
1159        return Failure;
1160      }
1161      continue;
1162    }
1163
1164    if (Code == llvm::bitc::DEFINE_ABBREV) {
1165      SLocEntryCursor.ReadAbbrevRecord();
1166      continue;
1167    }
1168
1169    // Read a record.
1170    const char *BlobStart;
1171    unsigned BlobLen;
1172    Record.clear();
1173    switch (SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
1174    default:  // Default behavior: ignore.
1175      break;
1176
1177    case SM_LINE_TABLE:
1178      if (ParseLineTable(F, Record))
1179        return Failure;
1180      break;
1181
1182    case SM_SLOC_FILE_ENTRY:
1183    case SM_SLOC_BUFFER_ENTRY:
1184    case SM_SLOC_INSTANTIATION_ENTRY:
1185      // Once we hit one of the source location entries, we're done.
1186      return Success;
1187    }
1188  }
1189}
1190
1191/// \brief If a header file is not found at the path that we expect it to be
1192/// and the PCH file was moved from its original location, try to resolve the
1193/// file by assuming that header+PCH were moved together and the header is in
1194/// the same place relative to the PCH.
1195static std::string
1196resolveFileRelativeToOriginalDir(const std::string &Filename,
1197                                 const std::string &OriginalDir,
1198                                 const std::string &CurrDir) {
1199  assert(OriginalDir != CurrDir &&
1200         "No point trying to resolve the file if the PCH dir didn't change");
1201  using namespace llvm::sys;
1202  llvm::SmallString<128> filePath(Filename);
1203  fs::make_absolute(filePath);
1204  assert(path::is_absolute(OriginalDir));
1205  llvm::SmallString<128> currPCHPath(CurrDir);
1206
1207  path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1208                       fileDirE = path::end(path::parent_path(filePath));
1209  path::const_iterator origDirI = path::begin(OriginalDir),
1210                       origDirE = path::end(OriginalDir);
1211  // Skip the common path components from filePath and OriginalDir.
1212  while (fileDirI != fileDirE && origDirI != origDirE &&
1213         *fileDirI == *origDirI) {
1214    ++fileDirI;
1215    ++origDirI;
1216  }
1217  for (; origDirI != origDirE; ++origDirI)
1218    path::append(currPCHPath, "..");
1219  path::append(currPCHPath, fileDirI, fileDirE);
1220  path::append(currPCHPath, path::filename(Filename));
1221  return currPCHPath.str();
1222}
1223
1224/// \brief Get a cursor that's correctly positioned for reading the source
1225/// location entry with the given ID.
1226ASTReader::PerFileData *ASTReader::SLocCursorForID(unsigned ID) {
1227  assert(ID != 0 && ID <= TotalNumSLocEntries &&
1228         "SLocCursorForID should only be called for real IDs.");
1229
1230  ID -= 1;
1231  PerFileData *F = 0;
1232  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1233    F = Chain[N - I - 1];
1234    if (ID < F->LocalNumSLocEntries)
1235      break;
1236    ID -= F->LocalNumSLocEntries;
1237  }
1238  assert(F && F->LocalNumSLocEntries > ID && "Chain corrupted");
1239
1240  F->SLocEntryCursor.JumpToBit(F->SLocOffsets[ID]);
1241  return F;
1242}
1243
1244/// \brief Read in the source location entry with the given ID.
1245ASTReader::ASTReadResult ASTReader::ReadSLocEntryRecord(unsigned ID) {
1246  if (ID == 0)
1247    return Success;
1248
1249  if (ID > TotalNumSLocEntries) {
1250    Error("source location entry ID out-of-range for AST file");
1251    return Failure;
1252  }
1253
1254  PerFileData *F = SLocCursorForID(ID);
1255  llvm::BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1256
1257  ++NumSLocEntriesRead;
1258  unsigned Code = SLocEntryCursor.ReadCode();
1259  if (Code == llvm::bitc::END_BLOCK ||
1260      Code == llvm::bitc::ENTER_SUBBLOCK ||
1261      Code == llvm::bitc::DEFINE_ABBREV) {
1262    Error("incorrectly-formatted source location entry in AST file");
1263    return Failure;
1264  }
1265
1266  RecordData Record;
1267  const char *BlobStart;
1268  unsigned BlobLen;
1269  switch (SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
1270  default:
1271    Error("incorrectly-formatted source location entry in AST file");
1272    return Failure;
1273
1274  case SM_SLOC_FILE_ENTRY: {
1275    std::string Filename(BlobStart, BlobStart + BlobLen);
1276    MaybeAddSystemRootToFilename(Filename);
1277    const FileEntry *File = FileMgr.getFile(Filename);
1278    if (File == 0 && !OriginalDir.empty() && !CurrentDir.empty() &&
1279        OriginalDir != CurrentDir) {
1280      std::string resolved = resolveFileRelativeToOriginalDir(Filename,
1281                                                              OriginalDir,
1282                                                              CurrentDir);
1283      if (!resolved.empty())
1284        File = FileMgr.getFile(resolved);
1285    }
1286    if (File == 0)
1287      File = FileMgr.getVirtualFile(Filename, (off_t)Record[4],
1288                                    (time_t)Record[5]);
1289    if (File == 0) {
1290      std::string ErrorStr = "could not find file '";
1291      ErrorStr += Filename;
1292      ErrorStr += "' referenced by AST file";
1293      Error(ErrorStr.c_str());
1294      return Failure;
1295    }
1296
1297    if (Record.size() < 6) {
1298      Error("source location entry is incorrect");
1299      return Failure;
1300    }
1301
1302    if (!DisableValidation &&
1303        ((off_t)Record[4] != File->getSize()
1304#if !defined(LLVM_ON_WIN32)
1305        // In our regression testing, the Windows file system seems to
1306        // have inconsistent modification times that sometimes
1307        // erroneously trigger this error-handling path.
1308         || (time_t)Record[5] != File->getModificationTime()
1309#endif
1310        )) {
1311      Diag(diag::err_fe_pch_file_modified)
1312        << Filename;
1313      return Failure;
1314    }
1315
1316    FileID FID = SourceMgr.createFileID(File, ReadSourceLocation(*F, Record[1]),
1317                                        (SrcMgr::CharacteristicKind)Record[2],
1318                                        ID, Record[0]);
1319    if (Record[3])
1320      const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile())
1321        .setHasLineDirectives();
1322
1323    break;
1324  }
1325
1326  case SM_SLOC_BUFFER_ENTRY: {
1327    const char *Name = BlobStart;
1328    unsigned Offset = Record[0];
1329    unsigned Code = SLocEntryCursor.ReadCode();
1330    Record.clear();
1331    unsigned RecCode
1332      = SLocEntryCursor.ReadRecord(Code, Record, &BlobStart, &BlobLen);
1333
1334    if (RecCode != SM_SLOC_BUFFER_BLOB) {
1335      Error("AST record has invalid code");
1336      return Failure;
1337    }
1338
1339    llvm::MemoryBuffer *Buffer
1340    = llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(BlobStart, BlobLen - 1),
1341                                       Name);
1342    FileID BufferID = SourceMgr.createFileIDForMemBuffer(Buffer, ID, Offset);
1343
1344    if (strcmp(Name, "<built-in>") == 0) {
1345      PCHPredefinesBlock Block = {
1346        BufferID,
1347        llvm::StringRef(BlobStart, BlobLen - 1)
1348      };
1349      PCHPredefinesBuffers.push_back(Block);
1350    }
1351
1352    break;
1353  }
1354
1355  case SM_SLOC_INSTANTIATION_ENTRY: {
1356    SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1357    SourceMgr.createInstantiationLoc(SpellingLoc,
1358                                     ReadSourceLocation(*F, Record[2]),
1359                                     ReadSourceLocation(*F, Record[3]),
1360                                     Record[4],
1361                                     ID,
1362                                     Record[0]);
1363    break;
1364  }
1365  }
1366
1367  return Success;
1368}
1369
1370/// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1371/// specified cursor.  Read the abbreviations that are at the top of the block
1372/// and then leave the cursor pointing into the block.
1373bool ASTReader::ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor,
1374                                 unsigned BlockID) {
1375  if (Cursor.EnterSubBlock(BlockID)) {
1376    Error("malformed block record in AST file");
1377    return Failure;
1378  }
1379
1380  while (true) {
1381    uint64_t Offset = Cursor.GetCurrentBitNo();
1382    unsigned Code = Cursor.ReadCode();
1383
1384    // We expect all abbrevs to be at the start of the block.
1385    if (Code != llvm::bitc::DEFINE_ABBREV) {
1386      Cursor.JumpToBit(Offset);
1387      return false;
1388    }
1389    Cursor.ReadAbbrevRecord();
1390  }
1391}
1392
1393PreprocessedEntity *ASTReader::ReadMacroRecord(PerFileData &F, uint64_t Offset) {
1394  assert(PP && "Forgot to set Preprocessor ?");
1395  llvm::BitstreamCursor &Stream = F.MacroCursor;
1396
1397  // Keep track of where we are in the stream, then jump back there
1398  // after reading this macro.
1399  SavedStreamPosition SavedPosition(Stream);
1400
1401  Stream.JumpToBit(Offset);
1402  RecordData Record;
1403  llvm::SmallVector<IdentifierInfo*, 16> MacroArgs;
1404  MacroInfo *Macro = 0;
1405
1406  while (true) {
1407    unsigned Code = Stream.ReadCode();
1408    switch (Code) {
1409    case llvm::bitc::END_BLOCK:
1410      return 0;
1411
1412    case llvm::bitc::ENTER_SUBBLOCK:
1413      // No known subblocks, always skip them.
1414      Stream.ReadSubBlockID();
1415      if (Stream.SkipBlock()) {
1416        Error("malformed block record in AST file");
1417        return 0;
1418      }
1419      continue;
1420
1421    case llvm::bitc::DEFINE_ABBREV:
1422      Stream.ReadAbbrevRecord();
1423      continue;
1424    default: break;
1425    }
1426
1427    // Read a record.
1428    const char *BlobStart = 0;
1429    unsigned BlobLen = 0;
1430    Record.clear();
1431    PreprocessorRecordTypes RecType =
1432      (PreprocessorRecordTypes)Stream.ReadRecord(Code, Record, BlobStart,
1433                                                 BlobLen);
1434    switch (RecType) {
1435    case PP_MACRO_OBJECT_LIKE:
1436    case PP_MACRO_FUNCTION_LIKE: {
1437      // If we already have a macro, that means that we've hit the end
1438      // of the definition of the macro we were looking for. We're
1439      // done.
1440      if (Macro)
1441        return 0;
1442
1443      IdentifierInfo *II = DecodeIdentifierInfo(Record[0]);
1444      if (II == 0) {
1445        Error("macro must have a name in AST file");
1446        return 0;
1447      }
1448      SourceLocation Loc = ReadSourceLocation(F, Record[1]);
1449      bool isUsed = Record[2];
1450
1451      MacroInfo *MI = PP->AllocateMacroInfo(Loc);
1452      MI->setIsUsed(isUsed);
1453      MI->setIsFromAST();
1454
1455      unsigned NextIndex = 3;
1456      if (RecType == PP_MACRO_FUNCTION_LIKE) {
1457        // Decode function-like macro info.
1458        bool isC99VarArgs = Record[3];
1459        bool isGNUVarArgs = Record[4];
1460        MacroArgs.clear();
1461        unsigned NumArgs = Record[5];
1462        NextIndex = 6 + NumArgs;
1463        for (unsigned i = 0; i != NumArgs; ++i)
1464          MacroArgs.push_back(DecodeIdentifierInfo(Record[6+i]));
1465
1466        // Install function-like macro info.
1467        MI->setIsFunctionLike();
1468        if (isC99VarArgs) MI->setIsC99Varargs();
1469        if (isGNUVarArgs) MI->setIsGNUVarargs();
1470        MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1471                            PP->getPreprocessorAllocator());
1472      }
1473
1474      // Finally, install the macro.
1475      PP->setMacroInfo(II, MI);
1476
1477      // Remember that we saw this macro last so that we add the tokens that
1478      // form its body to it.
1479      Macro = MI;
1480
1481      if (NextIndex + 1 == Record.size() && PP->getPreprocessingRecord()) {
1482        // We have a macro definition. Load it now.
1483        PP->getPreprocessingRecord()->RegisterMacroDefinition(Macro,
1484                                        getMacroDefinition(Record[NextIndex]));
1485      }
1486
1487      ++NumMacrosRead;
1488      break;
1489    }
1490
1491    case PP_TOKEN: {
1492      // If we see a TOKEN before a PP_MACRO_*, then the file is
1493      // erroneous, just pretend we didn't see this.
1494      if (Macro == 0) break;
1495
1496      Token Tok;
1497      Tok.startToken();
1498      Tok.setLocation(ReadSourceLocation(F, Record[0]));
1499      Tok.setLength(Record[1]);
1500      if (IdentifierInfo *II = DecodeIdentifierInfo(Record[2]))
1501        Tok.setIdentifierInfo(II);
1502      Tok.setKind((tok::TokenKind)Record[3]);
1503      Tok.setFlag((Token::TokenFlags)Record[4]);
1504      Macro->AddTokenToBody(Tok);
1505      break;
1506    }
1507  }
1508  }
1509
1510  return 0;
1511}
1512
1513PreprocessedEntity *ASTReader::LoadPreprocessedEntity(PerFileData &F) {
1514  assert(PP && "Forgot to set Preprocessor ?");
1515  unsigned Code = F.PreprocessorDetailCursor.ReadCode();
1516  switch (Code) {
1517  case llvm::bitc::END_BLOCK:
1518    return 0;
1519
1520  case llvm::bitc::ENTER_SUBBLOCK:
1521    Error("unexpected subblock record in preprocessor detail block");
1522    return 0;
1523
1524  case llvm::bitc::DEFINE_ABBREV:
1525    Error("unexpected abbrevation record in preprocessor detail block");
1526    return 0;
1527
1528  default:
1529    break;
1530  }
1531
1532  if (!PP->getPreprocessingRecord()) {
1533    Error("no preprocessing record");
1534    return 0;
1535  }
1536
1537  // Read the record.
1538  PreprocessingRecord &PPRec = *PP->getPreprocessingRecord();
1539  const char *BlobStart = 0;
1540  unsigned BlobLen = 0;
1541  RecordData Record;
1542  PreprocessorDetailRecordTypes RecType =
1543    (PreprocessorDetailRecordTypes)F.PreprocessorDetailCursor.ReadRecord(
1544                                             Code, Record, BlobStart, BlobLen);
1545  switch (RecType) {
1546  case PPD_MACRO_INSTANTIATION: {
1547    if (PreprocessedEntity *PE = PPRec.getPreprocessedEntity(Record[0]))
1548      return PE;
1549
1550    MacroInstantiation *MI
1551      = new (PPRec) MacroInstantiation(DecodeIdentifierInfo(Record[3]),
1552                                 SourceRange(ReadSourceLocation(F, Record[1]),
1553                                             ReadSourceLocation(F, Record[2])),
1554                                       getMacroDefinition(Record[4]));
1555    PPRec.SetPreallocatedEntity(Record[0], MI);
1556    return MI;
1557  }
1558
1559  case PPD_MACRO_DEFINITION: {
1560    if (PreprocessedEntity *PE = PPRec.getPreprocessedEntity(Record[0]))
1561      return PE;
1562
1563    if (Record[1] > MacroDefinitionsLoaded.size()) {
1564      Error("out-of-bounds macro definition record");
1565      return 0;
1566    }
1567
1568    // Decode the identifier info and then check again; if the macro is
1569    // still defined and associated with the identifier,
1570    IdentifierInfo *II = DecodeIdentifierInfo(Record[4]);
1571    if (!MacroDefinitionsLoaded[Record[1] - 1]) {
1572      MacroDefinition *MD
1573        = new (PPRec) MacroDefinition(II,
1574                                      ReadSourceLocation(F, Record[5]),
1575                                      SourceRange(
1576                                            ReadSourceLocation(F, Record[2]),
1577                                            ReadSourceLocation(F, Record[3])));
1578
1579      PPRec.SetPreallocatedEntity(Record[0], MD);
1580      MacroDefinitionsLoaded[Record[1] - 1] = MD;
1581
1582      if (DeserializationListener)
1583        DeserializationListener->MacroDefinitionRead(Record[1], MD);
1584    }
1585
1586    return MacroDefinitionsLoaded[Record[1] - 1];
1587  }
1588
1589  case PPD_INCLUSION_DIRECTIVE: {
1590    if (PreprocessedEntity *PE = PPRec.getPreprocessedEntity(Record[0]))
1591      return PE;
1592
1593    const char *FullFileNameStart = BlobStart + Record[3];
1594    const FileEntry *File
1595      = PP->getFileManager().getFile(llvm::StringRef(FullFileNameStart,
1596                                                     BlobLen - Record[3]));
1597
1598    // FIXME: Stable encoding
1599    InclusionDirective::InclusionKind Kind
1600      = static_cast<InclusionDirective::InclusionKind>(Record[5]);
1601    InclusionDirective *ID
1602      = new (PPRec) InclusionDirective(PPRec, Kind,
1603                                       llvm::StringRef(BlobStart, Record[3]),
1604                                       Record[4],
1605                                       File,
1606                                 SourceRange(ReadSourceLocation(F, Record[1]),
1607                                             ReadSourceLocation(F, Record[2])));
1608    PPRec.SetPreallocatedEntity(Record[0], ID);
1609    return ID;
1610  }
1611  }
1612
1613  Error("invalid offset in preprocessor detail block");
1614  return 0;
1615}
1616
1617namespace {
1618  /// \brief Trait class used to search the on-disk hash table containing all of
1619  /// the header search information.
1620  ///
1621  /// The on-disk hash table contains a mapping from each header path to
1622  /// information about that header (how many times it has been included, its
1623  /// controlling macro, etc.). Note that we actually hash based on the
1624  /// filename, and support "deep" comparisons of file names based on current
1625  /// inode numbers, so that the search can cope with non-normalized path names
1626  /// and symlinks.
1627  class HeaderFileInfoTrait {
1628    const char *SearchPath;
1629    struct stat SearchPathStatBuf;
1630    llvm::Optional<int> SearchPathStatResult;
1631
1632    int StatSimpleCache(const char *Path, struct stat *StatBuf) {
1633      if (Path == SearchPath) {
1634        if (!SearchPathStatResult)
1635          SearchPathStatResult = stat(Path, &SearchPathStatBuf);
1636
1637        *StatBuf = SearchPathStatBuf;
1638        return *SearchPathStatResult;
1639      }
1640
1641      return stat(Path, StatBuf);
1642    }
1643
1644  public:
1645    typedef const char *external_key_type;
1646    typedef const char *internal_key_type;
1647
1648    typedef HeaderFileInfo data_type;
1649
1650    HeaderFileInfoTrait(const char *SearchPath = 0) : SearchPath(SearchPath) { }
1651
1652    static unsigned ComputeHash(const char *path) {
1653      return llvm::HashString(llvm::sys::path::filename(path));
1654    }
1655
1656    static internal_key_type GetInternalKey(const char *path) { return path; }
1657
1658    bool EqualKey(internal_key_type a, internal_key_type b) {
1659      if (strcmp(a, b) == 0)
1660        return true;
1661
1662      if (llvm::sys::path::filename(a) != llvm::sys::path::filename(b))
1663        return false;
1664
1665      // The file names match, but the path names don't. stat() the files to
1666      // see if they are the same.
1667      struct stat StatBufA, StatBufB;
1668      if (StatSimpleCache(a, &StatBufA) || StatSimpleCache(b, &StatBufB))
1669        return false;
1670
1671      return StatBufA.st_ino == StatBufB.st_ino;
1672    }
1673
1674    static std::pair<unsigned, unsigned>
1675    ReadKeyDataLength(const unsigned char*& d) {
1676      unsigned KeyLen = (unsigned) clang::io::ReadUnalignedLE16(d);
1677      unsigned DataLen = (unsigned) *d++;
1678      return std::make_pair(KeyLen + 1, DataLen);
1679    }
1680
1681    static internal_key_type ReadKey(const unsigned char *d, unsigned) {
1682      return (const char *)d;
1683    }
1684
1685    static data_type ReadData(const internal_key_type, const unsigned char *d,
1686                              unsigned DataLen) {
1687      const unsigned char *End = d + DataLen;
1688      using namespace clang::io;
1689      HeaderFileInfo HFI;
1690      unsigned Flags = *d++;
1691      HFI.isImport = (Flags >> 3) & 0x01;
1692      HFI.DirInfo = (Flags >> 1) & 0x03;
1693      HFI.Resolved = Flags & 0x01;
1694      HFI.NumIncludes = ReadUnalignedLE16(d);
1695      HFI.ControllingMacroID = ReadUnalignedLE32(d);
1696      assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1697      (void)End;
1698
1699      // This HeaderFileInfo was externally loaded.
1700      HFI.External = true;
1701      return HFI;
1702    }
1703  };
1704}
1705
1706/// \brief The on-disk hash table used for the global method pool.
1707typedef OnDiskChainedHashTable<HeaderFileInfoTrait>
1708  HeaderFileInfoLookupTable;
1709
1710void ASTReader::SetIdentifierIsMacro(IdentifierInfo *II, PerFileData &F,
1711                                     uint64_t Offset) {
1712  // Note that this identifier has a macro definition.
1713  II->setHasMacroDefinition(true);
1714
1715  // Adjust the offset based on our position in the chain.
1716  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1717    if (Chain[I] == &F)
1718      break;
1719
1720    Offset += Chain[I]->SizeInBits;
1721  }
1722
1723  UnreadMacroRecordOffsets[II] = Offset;
1724}
1725
1726void ASTReader::ReadDefinedMacros() {
1727  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1728    PerFileData &F = *Chain[N - I - 1];
1729    llvm::BitstreamCursor &MacroCursor = F.MacroCursor;
1730
1731    // If there was no preprocessor block, skip this file.
1732    if (!MacroCursor.getBitStreamReader())
1733      continue;
1734
1735    llvm::BitstreamCursor Cursor = MacroCursor;
1736    Cursor.JumpToBit(F.MacroStartOffset);
1737
1738    RecordData Record;
1739    while (true) {
1740      unsigned Code = Cursor.ReadCode();
1741      if (Code == llvm::bitc::END_BLOCK)
1742        break;
1743
1744      if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1745        // No known subblocks, always skip them.
1746        Cursor.ReadSubBlockID();
1747        if (Cursor.SkipBlock()) {
1748          Error("malformed block record in AST file");
1749          return;
1750        }
1751        continue;
1752      }
1753
1754      if (Code == llvm::bitc::DEFINE_ABBREV) {
1755        Cursor.ReadAbbrevRecord();
1756        continue;
1757      }
1758
1759      // Read a record.
1760      const char *BlobStart;
1761      unsigned BlobLen;
1762      Record.clear();
1763      switch (Cursor.ReadRecord(Code, Record, &BlobStart, &BlobLen)) {
1764      default:  // Default behavior: ignore.
1765        break;
1766
1767      case PP_MACRO_OBJECT_LIKE:
1768      case PP_MACRO_FUNCTION_LIKE:
1769        DecodeIdentifierInfo(Record[0]);
1770        break;
1771
1772      case PP_TOKEN:
1773        // Ignore tokens.
1774        break;
1775      }
1776    }
1777  }
1778
1779  // Drain the unread macro-record offsets map.
1780  while (!UnreadMacroRecordOffsets.empty())
1781    LoadMacroDefinition(UnreadMacroRecordOffsets.begin());
1782}
1783
1784void ASTReader::LoadMacroDefinition(
1785                     llvm::DenseMap<IdentifierInfo *, uint64_t>::iterator Pos) {
1786  assert(Pos != UnreadMacroRecordOffsets.end() && "Unknown macro definition");
1787  PerFileData *F = 0;
1788  uint64_t Offset = Pos->second;
1789  UnreadMacroRecordOffsets.erase(Pos);
1790
1791  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1792    if (Offset < Chain[I]->SizeInBits) {
1793      F = Chain[I];
1794      break;
1795    }
1796
1797    Offset -= Chain[I]->SizeInBits;
1798  }
1799  if (!F) {
1800    Error("Malformed macro record offset");
1801    return;
1802  }
1803
1804  ReadMacroRecord(*F, Offset);
1805}
1806
1807void ASTReader::LoadMacroDefinition(IdentifierInfo *II) {
1808  llvm::DenseMap<IdentifierInfo *, uint64_t>::iterator Pos
1809    = UnreadMacroRecordOffsets.find(II);
1810  LoadMacroDefinition(Pos);
1811}
1812
1813MacroDefinition *ASTReader::getMacroDefinition(MacroID ID) {
1814  if (ID == 0 || ID > MacroDefinitionsLoaded.size())
1815    return 0;
1816
1817  if (!MacroDefinitionsLoaded[ID - 1]) {
1818    unsigned Index = ID - 1;
1819    for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1820      PerFileData &F = *Chain[N - I - 1];
1821      if (Index < F.LocalNumMacroDefinitions) {
1822        SavedStreamPosition SavedPosition(F.PreprocessorDetailCursor);
1823        F.PreprocessorDetailCursor.JumpToBit(F.MacroDefinitionOffsets[Index]);
1824        LoadPreprocessedEntity(F);
1825        break;
1826      }
1827      Index -= F.LocalNumMacroDefinitions;
1828    }
1829    assert(MacroDefinitionsLoaded[ID - 1] && "Broken chain");
1830  }
1831
1832  return MacroDefinitionsLoaded[ID - 1];
1833}
1834
1835/// \brief If we are loading a relocatable PCH file, and the filename is
1836/// not an absolute path, add the system root to the beginning of the file
1837/// name.
1838void ASTReader::MaybeAddSystemRootToFilename(std::string &Filename) {
1839  // If this is not a relocatable PCH file, there's nothing to do.
1840  if (!RelocatablePCH)
1841    return;
1842
1843  if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
1844    return;
1845
1846  if (isysroot == 0) {
1847    // If no system root was given, default to '/'
1848    Filename.insert(Filename.begin(), '/');
1849    return;
1850  }
1851
1852  unsigned Length = strlen(isysroot);
1853  if (isysroot[Length - 1] != '/')
1854    Filename.insert(Filename.begin(), '/');
1855
1856  Filename.insert(Filename.begin(), isysroot, isysroot + Length);
1857}
1858
1859ASTReader::ASTReadResult
1860ASTReader::ReadASTBlock(PerFileData &F) {
1861  llvm::BitstreamCursor &Stream = F.Stream;
1862
1863  if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
1864    Error("malformed block record in AST file");
1865    return Failure;
1866  }
1867
1868  // Read all of the records and blocks for the ASt file.
1869  RecordData Record;
1870  bool First = true;
1871  while (!Stream.AtEndOfStream()) {
1872    unsigned Code = Stream.ReadCode();
1873    if (Code == llvm::bitc::END_BLOCK) {
1874      if (Stream.ReadBlockEnd()) {
1875        Error("error at end of module block in AST file");
1876        return Failure;
1877      }
1878
1879      return Success;
1880    }
1881
1882    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1883      switch (Stream.ReadSubBlockID()) {
1884      case DECLTYPES_BLOCK_ID:
1885        // We lazily load the decls block, but we want to set up the
1886        // DeclsCursor cursor to point into it.  Clone our current bitcode
1887        // cursor to it, enter the block and read the abbrevs in that block.
1888        // With the main cursor, we just skip over it.
1889        F.DeclsCursor = Stream;
1890        if (Stream.SkipBlock() ||  // Skip with the main cursor.
1891            // Read the abbrevs.
1892            ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
1893          Error("malformed block record in AST file");
1894          return Failure;
1895        }
1896        break;
1897
1898      case DECL_UPDATES_BLOCK_ID:
1899        if (Stream.SkipBlock()) {
1900          Error("malformed block record in AST file");
1901          return Failure;
1902        }
1903        break;
1904
1905      case PREPROCESSOR_BLOCK_ID:
1906        F.MacroCursor = Stream;
1907        if (PP)
1908          PP->setExternalSource(this);
1909
1910        if (Stream.SkipBlock() ||
1911            ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
1912          Error("malformed block record in AST file");
1913          return Failure;
1914        }
1915        F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
1916        break;
1917
1918      case PREPROCESSOR_DETAIL_BLOCK_ID:
1919        F.PreprocessorDetailCursor = Stream;
1920        if (Stream.SkipBlock() ||
1921            ReadBlockAbbrevs(F.PreprocessorDetailCursor,
1922                             PREPROCESSOR_DETAIL_BLOCK_ID)) {
1923          Error("malformed preprocessor detail record in AST file");
1924          return Failure;
1925        }
1926        F.PreprocessorDetailStartOffset
1927          = F.PreprocessorDetailCursor.GetCurrentBitNo();
1928        break;
1929
1930      case SOURCE_MANAGER_BLOCK_ID:
1931        switch (ReadSourceManagerBlock(F)) {
1932        case Success:
1933          break;
1934
1935        case Failure:
1936          Error("malformed source manager block in AST file");
1937          return Failure;
1938
1939        case IgnorePCH:
1940          return IgnorePCH;
1941        }
1942        break;
1943      }
1944      First = false;
1945      continue;
1946    }
1947
1948    if (Code == llvm::bitc::DEFINE_ABBREV) {
1949      Stream.ReadAbbrevRecord();
1950      continue;
1951    }
1952
1953    // Read and process a record.
1954    Record.clear();
1955    const char *BlobStart = 0;
1956    unsigned BlobLen = 0;
1957    switch ((ASTRecordTypes)Stream.ReadRecord(Code, Record,
1958                                              &BlobStart, &BlobLen)) {
1959    default:  // Default behavior: ignore.
1960      break;
1961
1962    case METADATA: {
1963      if (Record[0] != VERSION_MAJOR && !DisableValidation) {
1964        Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old
1965                                           : diag::warn_pch_version_too_new);
1966        return IgnorePCH;
1967      }
1968
1969      RelocatablePCH = Record[4];
1970      if (Listener) {
1971        std::string TargetTriple(BlobStart, BlobLen);
1972        if (Listener->ReadTargetTriple(TargetTriple))
1973          return IgnorePCH;
1974      }
1975      break;
1976    }
1977
1978    case CHAINED_METADATA: {
1979      if (!First) {
1980        Error("CHAINED_METADATA is not first record in block");
1981        return Failure;
1982      }
1983      if (Record[0] != VERSION_MAJOR && !DisableValidation) {
1984        Diag(Record[0] < VERSION_MAJOR? diag::warn_pch_version_too_old
1985                                           : diag::warn_pch_version_too_new);
1986        return IgnorePCH;
1987      }
1988
1989      // Load the chained file, which is always a PCH file.
1990      switch(ReadASTCore(llvm::StringRef(BlobStart, BlobLen), PCH)) {
1991      case Failure: return Failure;
1992        // If we have to ignore the dependency, we'll have to ignore this too.
1993      case IgnorePCH: return IgnorePCH;
1994      case Success: break;
1995      }
1996      break;
1997    }
1998
1999    case TYPE_OFFSET:
2000      if (F.LocalNumTypes != 0) {
2001        Error("duplicate TYPE_OFFSET record in AST file");
2002        return Failure;
2003      }
2004      F.TypeOffsets = (const uint32_t *)BlobStart;
2005      F.LocalNumTypes = Record[0];
2006      break;
2007
2008    case DECL_OFFSET:
2009      if (F.LocalNumDecls != 0) {
2010        Error("duplicate DECL_OFFSET record in AST file");
2011        return Failure;
2012      }
2013      F.DeclOffsets = (const uint32_t *)BlobStart;
2014      F.LocalNumDecls = Record[0];
2015      break;
2016
2017    case TU_UPDATE_LEXICAL: {
2018      DeclContextInfo Info = {
2019        /* No visible information */ 0,
2020        reinterpret_cast<const KindDeclIDPair *>(BlobStart),
2021        BlobLen / sizeof(KindDeclIDPair)
2022      };
2023      DeclContextOffsets[Context ? Context->getTranslationUnitDecl() : 0]
2024        .push_back(Info);
2025      break;
2026    }
2027
2028    case UPDATE_VISIBLE: {
2029      serialization::DeclID ID = Record[0];
2030      void *Table = ASTDeclContextNameLookupTable::Create(
2031                        (const unsigned char *)BlobStart + Record[1],
2032                        (const unsigned char *)BlobStart,
2033                        ASTDeclContextNameLookupTrait(*this));
2034      if (ID == 1 && Context) { // Is it the TU?
2035        DeclContextInfo Info = {
2036          Table, /* No lexical inforamtion */ 0, 0
2037        };
2038        DeclContextOffsets[Context->getTranslationUnitDecl()].push_back(Info);
2039      } else
2040        PendingVisibleUpdates[ID].push_back(Table);
2041      break;
2042    }
2043
2044    case REDECLS_UPDATE_LATEST: {
2045      assert(Record.size() % 2 == 0 && "Expected pairs of DeclIDs");
2046      for (unsigned i = 0, e = Record.size(); i < e; i += 2) {
2047        DeclID First = Record[i], Latest = Record[i+1];
2048        assert((FirstLatestDeclIDs.find(First) == FirstLatestDeclIDs.end() ||
2049                Latest > FirstLatestDeclIDs[First]) &&
2050               "The new latest is supposed to come after the previous latest");
2051        FirstLatestDeclIDs[First] = Latest;
2052      }
2053      break;
2054    }
2055
2056    case LANGUAGE_OPTIONS:
2057      if (ParseLanguageOptions(Record) && !DisableValidation)
2058        return IgnorePCH;
2059      break;
2060
2061    case IDENTIFIER_TABLE:
2062      F.IdentifierTableData = BlobStart;
2063      if (Record[0]) {
2064        F.IdentifierLookupTable
2065          = ASTIdentifierLookupTable::Create(
2066                       (const unsigned char *)F.IdentifierTableData + Record[0],
2067                       (const unsigned char *)F.IdentifierTableData,
2068                       ASTIdentifierLookupTrait(*this, F));
2069        if (PP)
2070          PP->getIdentifierTable().setExternalIdentifierLookup(this);
2071      }
2072      break;
2073
2074    case IDENTIFIER_OFFSET:
2075      if (F.LocalNumIdentifiers != 0) {
2076        Error("duplicate IDENTIFIER_OFFSET record in AST file");
2077        return Failure;
2078      }
2079      F.IdentifierOffsets = (const uint32_t *)BlobStart;
2080      F.LocalNumIdentifiers = Record[0];
2081      break;
2082
2083    case EXTERNAL_DEFINITIONS:
2084      // Optimization for the first block.
2085      if (ExternalDefinitions.empty())
2086        ExternalDefinitions.swap(Record);
2087      else
2088        ExternalDefinitions.insert(ExternalDefinitions.end(),
2089                                   Record.begin(), Record.end());
2090      break;
2091
2092    case SPECIAL_TYPES:
2093      // Optimization for the first block
2094      if (SpecialTypes.empty())
2095        SpecialTypes.swap(Record);
2096      else
2097        SpecialTypes.insert(SpecialTypes.end(), Record.begin(), Record.end());
2098      break;
2099
2100    case STATISTICS:
2101      TotalNumStatements += Record[0];
2102      TotalNumMacros += Record[1];
2103      TotalLexicalDeclContexts += Record[2];
2104      TotalVisibleDeclContexts += Record[3];
2105      break;
2106
2107    case TENTATIVE_DEFINITIONS:
2108      // Optimization for the first block.
2109      if (TentativeDefinitions.empty())
2110        TentativeDefinitions.swap(Record);
2111      else
2112        TentativeDefinitions.insert(TentativeDefinitions.end(),
2113                                    Record.begin(), Record.end());
2114      break;
2115
2116    case UNUSED_FILESCOPED_DECLS:
2117      // Optimization for the first block.
2118      if (UnusedFileScopedDecls.empty())
2119        UnusedFileScopedDecls.swap(Record);
2120      else
2121        UnusedFileScopedDecls.insert(UnusedFileScopedDecls.end(),
2122                                     Record.begin(), Record.end());
2123      break;
2124
2125    case WEAK_UNDECLARED_IDENTIFIERS:
2126      // Later blocks overwrite earlier ones.
2127      WeakUndeclaredIdentifiers.swap(Record);
2128      break;
2129
2130    case LOCALLY_SCOPED_EXTERNAL_DECLS:
2131      // Optimization for the first block.
2132      if (LocallyScopedExternalDecls.empty())
2133        LocallyScopedExternalDecls.swap(Record);
2134      else
2135        LocallyScopedExternalDecls.insert(LocallyScopedExternalDecls.end(),
2136                                          Record.begin(), Record.end());
2137      break;
2138
2139    case SELECTOR_OFFSETS:
2140      F.SelectorOffsets = (const uint32_t *)BlobStart;
2141      F.LocalNumSelectors = Record[0];
2142      break;
2143
2144    case METHOD_POOL:
2145      F.SelectorLookupTableData = (const unsigned char *)BlobStart;
2146      if (Record[0])
2147        F.SelectorLookupTable
2148          = ASTSelectorLookupTable::Create(
2149                        F.SelectorLookupTableData + Record[0],
2150                        F.SelectorLookupTableData,
2151                        ASTSelectorLookupTrait(*this));
2152      TotalNumMethodPoolEntries += Record[1];
2153      break;
2154
2155    case REFERENCED_SELECTOR_POOL:
2156      F.ReferencedSelectorsData.swap(Record);
2157      break;
2158
2159    case PP_COUNTER_VALUE:
2160      if (!Record.empty() && Listener)
2161        Listener->ReadCounter(Record[0]);
2162      break;
2163
2164    case SOURCE_LOCATION_OFFSETS:
2165      F.SLocOffsets = (const uint32_t *)BlobStart;
2166      F.LocalNumSLocEntries = Record[0];
2167      F.LocalSLocSize = Record[1];
2168      break;
2169
2170    case SOURCE_LOCATION_PRELOADS:
2171      if (PreloadSLocEntries.empty())
2172        PreloadSLocEntries.swap(Record);
2173      else
2174        PreloadSLocEntries.insert(PreloadSLocEntries.end(),
2175            Record.begin(), Record.end());
2176      break;
2177
2178    case STAT_CACHE: {
2179      if (!DisableStatCache) {
2180        ASTStatCache *MyStatCache =
2181          new ASTStatCache((const unsigned char *)BlobStart + Record[0],
2182                           (const unsigned char *)BlobStart,
2183                           NumStatHits, NumStatMisses);
2184        FileMgr.addStatCache(MyStatCache);
2185        F.StatCache = MyStatCache;
2186      }
2187      break;
2188    }
2189
2190    case EXT_VECTOR_DECLS:
2191      // Optimization for the first block.
2192      if (ExtVectorDecls.empty())
2193        ExtVectorDecls.swap(Record);
2194      else
2195        ExtVectorDecls.insert(ExtVectorDecls.end(),
2196                              Record.begin(), Record.end());
2197      break;
2198
2199    case VTABLE_USES:
2200      // Later tables overwrite earlier ones.
2201      VTableUses.swap(Record);
2202      break;
2203
2204    case DYNAMIC_CLASSES:
2205      // Optimization for the first block.
2206      if (DynamicClasses.empty())
2207        DynamicClasses.swap(Record);
2208      else
2209        DynamicClasses.insert(DynamicClasses.end(),
2210                              Record.begin(), Record.end());
2211      break;
2212
2213    case PENDING_IMPLICIT_INSTANTIATIONS:
2214      F.PendingInstantiations.swap(Record);
2215      break;
2216
2217    case SEMA_DECL_REFS:
2218      // Later tables overwrite earlier ones.
2219      SemaDeclRefs.swap(Record);
2220      break;
2221
2222    case ORIGINAL_FILE_NAME:
2223      // The primary AST will be the last to get here, so it will be the one
2224      // that's used.
2225      ActualOriginalFileName.assign(BlobStart, BlobLen);
2226      OriginalFileName = ActualOriginalFileName;
2227      MaybeAddSystemRootToFilename(OriginalFileName);
2228      break;
2229
2230    case ORIGINAL_PCH_DIR:
2231      // The primary AST will be the last to get here, so it will be the one
2232      // that's used.
2233      OriginalDir.assign(BlobStart, BlobLen);
2234      break;
2235
2236    case VERSION_CONTROL_BRANCH_REVISION: {
2237      const std::string &CurBranch = getClangFullRepositoryVersion();
2238      llvm::StringRef ASTBranch(BlobStart, BlobLen);
2239      if (llvm::StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2240        Diag(diag::warn_pch_different_branch) << ASTBranch << CurBranch;
2241        return IgnorePCH;
2242      }
2243      break;
2244    }
2245
2246    case MACRO_DEFINITION_OFFSETS:
2247      F.MacroDefinitionOffsets = (const uint32_t *)BlobStart;
2248      F.NumPreallocatedPreprocessingEntities = Record[0];
2249      F.LocalNumMacroDefinitions = Record[1];
2250      break;
2251
2252    case DECL_UPDATE_OFFSETS: {
2253      if (Record.size() % 2 != 0) {
2254        Error("invalid DECL_UPDATE_OFFSETS block in AST file");
2255        return Failure;
2256      }
2257      for (unsigned I = 0, N = Record.size(); I != N; I += 2)
2258        DeclUpdateOffsets[static_cast<DeclID>(Record[I])]
2259            .push_back(std::make_pair(&F, Record[I+1]));
2260      break;
2261    }
2262
2263    case DECL_REPLACEMENTS: {
2264      if (Record.size() % 2 != 0) {
2265        Error("invalid DECL_REPLACEMENTS block in AST file");
2266        return Failure;
2267      }
2268      for (unsigned I = 0, N = Record.size(); I != N; I += 2)
2269        ReplacedDecls[static_cast<DeclID>(Record[I])] =
2270            std::make_pair(&F, Record[I+1]);
2271      break;
2272    }
2273
2274    case CXX_BASE_SPECIFIER_OFFSETS: {
2275      if (F.LocalNumCXXBaseSpecifiers != 0) {
2276        Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
2277        return Failure;
2278      }
2279
2280      F.LocalNumCXXBaseSpecifiers = Record[0];
2281      F.CXXBaseSpecifiersOffsets = (const uint32_t *)BlobStart;
2282      break;
2283    }
2284
2285    case DIAG_PRAGMA_MAPPINGS:
2286      if (Record.size() % 2 != 0) {
2287        Error("invalid DIAG_USER_MAPPINGS block in AST file");
2288        return Failure;
2289      }
2290      if (PragmaDiagMappings.empty())
2291        PragmaDiagMappings.swap(Record);
2292      else
2293        PragmaDiagMappings.insert(PragmaDiagMappings.end(),
2294                                Record.begin(), Record.end());
2295      break;
2296
2297    case CUDA_SPECIAL_DECL_REFS:
2298      // Later tables overwrite earlier ones.
2299      CUDASpecialDeclRefs.swap(Record);
2300      break;
2301
2302    case HEADER_SEARCH_TABLE:
2303      F.HeaderFileInfoTableData = BlobStart;
2304      F.LocalNumHeaderFileInfos = Record[1];
2305      if (Record[0]) {
2306        F.HeaderFileInfoTable
2307          = HeaderFileInfoLookupTable::Create(
2308                   (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
2309                   (const unsigned char *)F.HeaderFileInfoTableData);
2310        if (PP)
2311          PP->getHeaderSearchInfo().SetExternalSource(this);
2312      }
2313      break;
2314
2315    case FP_PRAGMA_OPTIONS:
2316      // Later tables overwrite earlier ones.
2317      FPPragmaOptions.swap(Record);
2318      break;
2319
2320    case OPENCL_EXTENSIONS:
2321      // Later tables overwrite earlier ones.
2322      OpenCLExtensions.swap(Record);
2323      break;
2324    }
2325    First = false;
2326  }
2327  Error("premature end of bitstream in AST file");
2328  return Failure;
2329}
2330
2331ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
2332                                            ASTFileType Type) {
2333  switch(ReadASTCore(FileName, Type)) {
2334  case Failure: return Failure;
2335  case IgnorePCH: return IgnorePCH;
2336  case Success: break;
2337  }
2338
2339  // Here comes stuff that we only do once the entire chain is loaded.
2340
2341  // Allocate space for loaded slocentries, identifiers, decls and types.
2342  unsigned TotalNumIdentifiers = 0, TotalNumTypes = 0, TotalNumDecls = 0,
2343           TotalNumPreallocatedPreprocessingEntities = 0, TotalNumMacroDefs = 0,
2344           TotalNumSelectors = 0;
2345  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2346    TotalNumSLocEntries += Chain[I]->LocalNumSLocEntries;
2347    NextSLocOffset += Chain[I]->LocalSLocSize;
2348    TotalNumIdentifiers += Chain[I]->LocalNumIdentifiers;
2349    TotalNumTypes += Chain[I]->LocalNumTypes;
2350    TotalNumDecls += Chain[I]->LocalNumDecls;
2351    TotalNumPreallocatedPreprocessingEntities +=
2352        Chain[I]->NumPreallocatedPreprocessingEntities;
2353    TotalNumMacroDefs += Chain[I]->LocalNumMacroDefinitions;
2354    TotalNumSelectors += Chain[I]->LocalNumSelectors;
2355  }
2356  SourceMgr.PreallocateSLocEntries(this, TotalNumSLocEntries, NextSLocOffset);
2357  IdentifiersLoaded.resize(TotalNumIdentifiers);
2358  TypesLoaded.resize(TotalNumTypes);
2359  DeclsLoaded.resize(TotalNumDecls);
2360  MacroDefinitionsLoaded.resize(TotalNumMacroDefs);
2361  if (PP) {
2362    if (TotalNumIdentifiers > 0)
2363      PP->getHeaderSearchInfo().SetExternalLookup(this);
2364    if (TotalNumPreallocatedPreprocessingEntities > 0) {
2365      if (!PP->getPreprocessingRecord())
2366        PP->createPreprocessingRecord();
2367      PP->getPreprocessingRecord()->SetExternalSource(*this,
2368                                     TotalNumPreallocatedPreprocessingEntities);
2369    }
2370  }
2371  SelectorsLoaded.resize(TotalNumSelectors);
2372  // Preload SLocEntries.
2373  for (unsigned I = 0, N = PreloadSLocEntries.size(); I != N; ++I) {
2374    ASTReadResult Result = ReadSLocEntryRecord(PreloadSLocEntries[I]);
2375    if (Result != Success)
2376      return Result;
2377  }
2378
2379  // Check the predefines buffers.
2380  if (!DisableValidation && CheckPredefinesBuffers())
2381    return IgnorePCH;
2382
2383  if (PP) {
2384    // Initialization of keywords and pragmas occurs before the
2385    // AST file is read, so there may be some identifiers that were
2386    // loaded into the IdentifierTable before we intercepted the
2387    // creation of identifiers. Iterate through the list of known
2388    // identifiers and determine whether we have to establish
2389    // preprocessor definitions or top-level identifier declaration
2390    // chains for those identifiers.
2391    //
2392    // We copy the IdentifierInfo pointers to a small vector first,
2393    // since de-serializing declarations or macro definitions can add
2394    // new entries into the identifier table, invalidating the
2395    // iterators.
2396    llvm::SmallVector<IdentifierInfo *, 128> Identifiers;
2397    for (IdentifierTable::iterator Id = PP->getIdentifierTable().begin(),
2398                                IdEnd = PP->getIdentifierTable().end();
2399         Id != IdEnd; ++Id)
2400      Identifiers.push_back(Id->second);
2401    // We need to search the tables in all files.
2402    for (unsigned J = 0, M = Chain.size(); J != M; ++J) {
2403      ASTIdentifierLookupTable *IdTable
2404        = (ASTIdentifierLookupTable *)Chain[J]->IdentifierLookupTable;
2405      // Not all AST files necessarily have identifier tables, only the useful
2406      // ones.
2407      if (!IdTable)
2408        continue;
2409      for (unsigned I = 0, N = Identifiers.size(); I != N; ++I) {
2410        IdentifierInfo *II = Identifiers[I];
2411        // Look in the on-disk hash tables for an entry for this identifier
2412        ASTIdentifierLookupTrait Info(*this, *Chain[J], II);
2413        std::pair<const char*,unsigned> Key(II->getNameStart(),II->getLength());
2414        ASTIdentifierLookupTable::iterator Pos = IdTable->find(Key, &Info);
2415        if (Pos == IdTable->end())
2416          continue;
2417
2418        // Dereferencing the iterator has the effect of populating the
2419        // IdentifierInfo node with the various declarations it needs.
2420        (void)*Pos;
2421      }
2422    }
2423  }
2424
2425  if (Context)
2426    InitializeContext(*Context);
2427
2428  if (DeserializationListener)
2429    DeserializationListener->ReaderInitialized(this);
2430
2431  // If this AST file is a precompiled preamble, then set the main file ID of
2432  // the source manager to the file source file from which the preamble was
2433  // built. This is the only valid way to use a precompiled preamble.
2434  if (Type == Preamble) {
2435    SourceLocation Loc
2436      = SourceMgr.getLocation(FileMgr.getFile(getOriginalSourceFile()), 1, 1);
2437    if (Loc.isValid()) {
2438      std::pair<FileID, unsigned> Decomposed = SourceMgr.getDecomposedLoc(Loc);
2439      SourceMgr.SetPreambleFileID(Decomposed.first);
2440    }
2441  }
2442
2443  return Success;
2444}
2445
2446ASTReader::ASTReadResult ASTReader::ReadASTCore(llvm::StringRef FileName,
2447                                                ASTFileType Type) {
2448  PerFileData *Prev = Chain.empty() ? 0 : Chain.back();
2449  Chain.push_back(new PerFileData(Type));
2450  PerFileData &F = *Chain.back();
2451  if (Prev)
2452    Prev->NextInSource = &F;
2453  else
2454    FirstInSource = &F;
2455  F.Loaders.push_back(Prev);
2456
2457  // Set the AST file name.
2458  F.FileName = FileName;
2459
2460  if (FileName != "-") {
2461    CurrentDir = llvm::sys::path::parent_path(FileName);
2462    if (CurrentDir.empty()) CurrentDir = ".";
2463  }
2464
2465  if (!ASTBuffers.empty()) {
2466    F.Buffer.reset(ASTBuffers.front());
2467    ASTBuffers.pop_front();
2468    assert(F.Buffer && "Passed null buffer");
2469  } else {
2470    // Open the AST file.
2471    //
2472    // FIXME: This shouldn't be here, we should just take a raw_ostream.
2473    std::string ErrStr;
2474    llvm::error_code ec;
2475    if (FileName == "-") {
2476      ec = llvm::MemoryBuffer::getSTDIN(F.Buffer);
2477      if (ec)
2478        ErrStr = ec.message();
2479    } else
2480      F.Buffer.reset(FileMgr.getBufferForFile(FileName, &ErrStr));
2481    if (!F.Buffer) {
2482      Error(ErrStr.c_str());
2483      return IgnorePCH;
2484    }
2485  }
2486
2487  // Initialize the stream
2488  F.StreamFile.init((const unsigned char *)F.Buffer->getBufferStart(),
2489                    (const unsigned char *)F.Buffer->getBufferEnd());
2490  llvm::BitstreamCursor &Stream = F.Stream;
2491  Stream.init(F.StreamFile);
2492  F.SizeInBits = F.Buffer->getBufferSize() * 8;
2493
2494  // Sniff for the signature.
2495  if (Stream.Read(8) != 'C' ||
2496      Stream.Read(8) != 'P' ||
2497      Stream.Read(8) != 'C' ||
2498      Stream.Read(8) != 'H') {
2499    Diag(diag::err_not_a_pch_file) << FileName;
2500    return Failure;
2501  }
2502
2503  while (!Stream.AtEndOfStream()) {
2504    unsigned Code = Stream.ReadCode();
2505
2506    if (Code != llvm::bitc::ENTER_SUBBLOCK) {
2507      Error("invalid record at top-level of AST file");
2508      return Failure;
2509    }
2510
2511    unsigned BlockID = Stream.ReadSubBlockID();
2512
2513    // We only know the AST subblock ID.
2514    switch (BlockID) {
2515    case llvm::bitc::BLOCKINFO_BLOCK_ID:
2516      if (Stream.ReadBlockInfoBlock()) {
2517        Error("malformed BlockInfoBlock in AST file");
2518        return Failure;
2519      }
2520      break;
2521    case AST_BLOCK_ID:
2522      switch (ReadASTBlock(F)) {
2523      case Success:
2524        break;
2525
2526      case Failure:
2527        return Failure;
2528
2529      case IgnorePCH:
2530        // FIXME: We could consider reading through to the end of this
2531        // AST block, skipping subblocks, to see if there are other
2532        // AST blocks elsewhere.
2533
2534        // Clear out any preallocated source location entries, so that
2535        // the source manager does not try to resolve them later.
2536        SourceMgr.ClearPreallocatedSLocEntries();
2537
2538        // Remove the stat cache.
2539        if (F.StatCache)
2540          FileMgr.removeStatCache((ASTStatCache*)F.StatCache);
2541
2542        return IgnorePCH;
2543      }
2544      break;
2545    default:
2546      if (Stream.SkipBlock()) {
2547        Error("malformed block record in AST file");
2548        return Failure;
2549      }
2550      break;
2551    }
2552  }
2553
2554  return Success;
2555}
2556
2557void ASTReader::setPreprocessor(Preprocessor &pp) {
2558  PP = &pp;
2559
2560  unsigned TotalNum = 0;
2561  for (unsigned I = 0, N = Chain.size(); I != N; ++I)
2562    TotalNum += Chain[I]->NumPreallocatedPreprocessingEntities;
2563  if (TotalNum) {
2564    if (!PP->getPreprocessingRecord())
2565      PP->createPreprocessingRecord();
2566    PP->getPreprocessingRecord()->SetExternalSource(*this, TotalNum);
2567  }
2568}
2569
2570void ASTReader::InitializeContext(ASTContext &Ctx) {
2571  Context = &Ctx;
2572  assert(Context && "Passed null context!");
2573
2574  assert(PP && "Forgot to set Preprocessor ?");
2575  PP->getIdentifierTable().setExternalIdentifierLookup(this);
2576  PP->getHeaderSearchInfo().SetExternalLookup(this);
2577  PP->setExternalSource(this);
2578  PP->getHeaderSearchInfo().SetExternalSource(this);
2579
2580  // If we have an update block for the TU waiting, we have to add it before
2581  // deserializing the decl.
2582  DeclContextOffsetsMap::iterator DCU = DeclContextOffsets.find(0);
2583  if (DCU != DeclContextOffsets.end()) {
2584    // Insertion could invalidate map, so grab vector.
2585    DeclContextInfos T;
2586    T.swap(DCU->second);
2587    DeclContextOffsets.erase(DCU);
2588    DeclContextOffsets[Ctx.getTranslationUnitDecl()].swap(T);
2589  }
2590
2591  // Load the translation unit declaration
2592  GetTranslationUnitDecl();
2593
2594  // Load the special types.
2595  Context->setBuiltinVaListType(
2596    GetType(SpecialTypes[SPECIAL_TYPE_BUILTIN_VA_LIST]));
2597  if (unsigned Id = SpecialTypes[SPECIAL_TYPE_OBJC_ID])
2598    Context->setObjCIdType(GetType(Id));
2599  if (unsigned Sel = SpecialTypes[SPECIAL_TYPE_OBJC_SELECTOR])
2600    Context->setObjCSelType(GetType(Sel));
2601  if (unsigned Proto = SpecialTypes[SPECIAL_TYPE_OBJC_PROTOCOL])
2602    Context->setObjCProtoType(GetType(Proto));
2603  if (unsigned Class = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS])
2604    Context->setObjCClassType(GetType(Class));
2605
2606  if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING])
2607    Context->setCFConstantStringType(GetType(String));
2608  if (unsigned FastEnum
2609        = SpecialTypes[SPECIAL_TYPE_OBJC_FAST_ENUMERATION_STATE])
2610    Context->setObjCFastEnumerationStateType(GetType(FastEnum));
2611  if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
2612    QualType FileType = GetType(File);
2613    if (FileType.isNull()) {
2614      Error("FILE type is NULL");
2615      return;
2616    }
2617    if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
2618      Context->setFILEDecl(Typedef->getDecl());
2619    else {
2620      const TagType *Tag = FileType->getAs<TagType>();
2621      if (!Tag) {
2622        Error("Invalid FILE type in AST file");
2623        return;
2624      }
2625      Context->setFILEDecl(Tag->getDecl());
2626    }
2627  }
2628  if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_jmp_buf]) {
2629    QualType Jmp_bufType = GetType(Jmp_buf);
2630    if (Jmp_bufType.isNull()) {
2631      Error("jmp_bug type is NULL");
2632      return;
2633    }
2634    if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
2635      Context->setjmp_bufDecl(Typedef->getDecl());
2636    else {
2637      const TagType *Tag = Jmp_bufType->getAs<TagType>();
2638      if (!Tag) {
2639        Error("Invalid jmp_buf type in AST file");
2640        return;
2641      }
2642      Context->setjmp_bufDecl(Tag->getDecl());
2643    }
2644  }
2645  if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_sigjmp_buf]) {
2646    QualType Sigjmp_bufType = GetType(Sigjmp_buf);
2647    if (Sigjmp_bufType.isNull()) {
2648      Error("sigjmp_buf type is NULL");
2649      return;
2650    }
2651    if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
2652      Context->setsigjmp_bufDecl(Typedef->getDecl());
2653    else {
2654      const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
2655      assert(Tag && "Invalid sigjmp_buf type in AST file");
2656      Context->setsigjmp_bufDecl(Tag->getDecl());
2657    }
2658  }
2659  if (unsigned ObjCIdRedef
2660        = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION])
2661    Context->ObjCIdRedefinitionType = GetType(ObjCIdRedef);
2662  if (unsigned ObjCClassRedef
2663      = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION])
2664    Context->ObjCClassRedefinitionType = GetType(ObjCClassRedef);
2665  if (unsigned String = SpecialTypes[SPECIAL_TYPE_BLOCK_DESCRIPTOR])
2666    Context->setBlockDescriptorType(GetType(String));
2667  if (unsigned String
2668      = SpecialTypes[SPECIAL_TYPE_BLOCK_EXTENDED_DESCRIPTOR])
2669    Context->setBlockDescriptorExtendedType(GetType(String));
2670  if (unsigned ObjCSelRedef
2671      = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION])
2672    Context->ObjCSelRedefinitionType = GetType(ObjCSelRedef);
2673  if (unsigned String = SpecialTypes[SPECIAL_TYPE_NS_CONSTANT_STRING])
2674    Context->setNSConstantStringType(GetType(String));
2675
2676  if (SpecialTypes[SPECIAL_TYPE_INT128_INSTALLED])
2677    Context->setInt128Installed();
2678
2679  ReadPragmaDiagnosticMappings(Context->getDiagnostics());
2680
2681  // If there were any CUDA special declarations, deserialize them.
2682  if (!CUDASpecialDeclRefs.empty()) {
2683    assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
2684    Context->setcudaConfigureCallDecl(
2685                           cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
2686  }
2687}
2688
2689/// \brief Retrieve the name of the original source file name
2690/// directly from the AST file, without actually loading the AST
2691/// file.
2692std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
2693                                             FileManager &FileMgr,
2694                                             Diagnostic &Diags) {
2695  // Open the AST file.
2696  std::string ErrStr;
2697  llvm::OwningPtr<llvm::MemoryBuffer> Buffer;
2698  Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
2699  if (!Buffer) {
2700    Diags.Report(diag::err_fe_unable_to_read_pch_file) << ErrStr;
2701    return std::string();
2702  }
2703
2704  // Initialize the stream
2705  llvm::BitstreamReader StreamFile;
2706  llvm::BitstreamCursor Stream;
2707  StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
2708                  (const unsigned char *)Buffer->getBufferEnd());
2709  Stream.init(StreamFile);
2710
2711  // Sniff for the signature.
2712  if (Stream.Read(8) != 'C' ||
2713      Stream.Read(8) != 'P' ||
2714      Stream.Read(8) != 'C' ||
2715      Stream.Read(8) != 'H') {
2716    Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
2717    return std::string();
2718  }
2719
2720  RecordData Record;
2721  while (!Stream.AtEndOfStream()) {
2722    unsigned Code = Stream.ReadCode();
2723
2724    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
2725      unsigned BlockID = Stream.ReadSubBlockID();
2726
2727      // We only know the AST subblock ID.
2728      switch (BlockID) {
2729      case AST_BLOCK_ID:
2730        if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2731          Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
2732          return std::string();
2733        }
2734        break;
2735
2736      default:
2737        if (Stream.SkipBlock()) {
2738          Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
2739          return std::string();
2740        }
2741        break;
2742      }
2743      continue;
2744    }
2745
2746    if (Code == llvm::bitc::END_BLOCK) {
2747      if (Stream.ReadBlockEnd()) {
2748        Diags.Report(diag::err_fe_pch_error_at_end_block) << ASTFileName;
2749        return std::string();
2750      }
2751      continue;
2752    }
2753
2754    if (Code == llvm::bitc::DEFINE_ABBREV) {
2755      Stream.ReadAbbrevRecord();
2756      continue;
2757    }
2758
2759    Record.clear();
2760    const char *BlobStart = 0;
2761    unsigned BlobLen = 0;
2762    if (Stream.ReadRecord(Code, Record, &BlobStart, &BlobLen)
2763          == ORIGINAL_FILE_NAME)
2764      return std::string(BlobStart, BlobLen);
2765  }
2766
2767  return std::string();
2768}
2769
2770/// \brief Parse the record that corresponds to a LangOptions data
2771/// structure.
2772///
2773/// This routine parses the language options from the AST file and then gives
2774/// them to the AST listener if one is set.
2775///
2776/// \returns true if the listener deems the file unacceptable, false otherwise.
2777bool ASTReader::ParseLanguageOptions(
2778                             const llvm::SmallVectorImpl<uint64_t> &Record) {
2779  if (Listener) {
2780    LangOptions LangOpts;
2781
2782  #define PARSE_LANGOPT(Option)                  \
2783      LangOpts.Option = Record[Idx];             \
2784      ++Idx
2785
2786    unsigned Idx = 0;
2787    PARSE_LANGOPT(Trigraphs);
2788    PARSE_LANGOPT(BCPLComment);
2789    PARSE_LANGOPT(DollarIdents);
2790    PARSE_LANGOPT(AsmPreprocessor);
2791    PARSE_LANGOPT(GNUMode);
2792    PARSE_LANGOPT(GNUKeywords);
2793    PARSE_LANGOPT(ImplicitInt);
2794    PARSE_LANGOPT(Digraphs);
2795    PARSE_LANGOPT(HexFloats);
2796    PARSE_LANGOPT(C99);
2797    PARSE_LANGOPT(Microsoft);
2798    PARSE_LANGOPT(CPlusPlus);
2799    PARSE_LANGOPT(CPlusPlus0x);
2800    PARSE_LANGOPT(CXXOperatorNames);
2801    PARSE_LANGOPT(ObjC1);
2802    PARSE_LANGOPT(ObjC2);
2803    PARSE_LANGOPT(ObjCNonFragileABI);
2804    PARSE_LANGOPT(ObjCNonFragileABI2);
2805    PARSE_LANGOPT(AppleKext);
2806    PARSE_LANGOPT(ObjCDefaultSynthProperties);
2807    PARSE_LANGOPT(NoConstantCFStrings);
2808    PARSE_LANGOPT(PascalStrings);
2809    PARSE_LANGOPT(WritableStrings);
2810    PARSE_LANGOPT(LaxVectorConversions);
2811    PARSE_LANGOPT(AltiVec);
2812    PARSE_LANGOPT(Exceptions);
2813    PARSE_LANGOPT(ObjCExceptions);
2814    PARSE_LANGOPT(CXXExceptions);
2815    PARSE_LANGOPT(SjLjExceptions);
2816    PARSE_LANGOPT(MSBitfields);
2817    PARSE_LANGOPT(NeXTRuntime);
2818    PARSE_LANGOPT(Freestanding);
2819    PARSE_LANGOPT(NoBuiltin);
2820    PARSE_LANGOPT(ThreadsafeStatics);
2821    PARSE_LANGOPT(POSIXThreads);
2822    PARSE_LANGOPT(Blocks);
2823    PARSE_LANGOPT(EmitAllDecls);
2824    PARSE_LANGOPT(MathErrno);
2825    LangOpts.setSignedOverflowBehavior((LangOptions::SignedOverflowBehaviorTy)
2826                                       Record[Idx++]);
2827    PARSE_LANGOPT(HeinousExtensions);
2828    PARSE_LANGOPT(Optimize);
2829    PARSE_LANGOPT(OptimizeSize);
2830    PARSE_LANGOPT(Static);
2831    PARSE_LANGOPT(PICLevel);
2832    PARSE_LANGOPT(GNUInline);
2833    PARSE_LANGOPT(NoInline);
2834    PARSE_LANGOPT(AccessControl);
2835    PARSE_LANGOPT(CharIsSigned);
2836    PARSE_LANGOPT(ShortWChar);
2837    PARSE_LANGOPT(ShortEnums);
2838    LangOpts.setGCMode((LangOptions::GCMode)Record[Idx++]);
2839    LangOpts.setVisibilityMode((Visibility)Record[Idx++]);
2840    LangOpts.setStackProtectorMode((LangOptions::StackProtectorMode)
2841                                   Record[Idx++]);
2842    PARSE_LANGOPT(InstantiationDepth);
2843    PARSE_LANGOPT(OpenCL);
2844    PARSE_LANGOPT(CUDA);
2845    PARSE_LANGOPT(CatchUndefined);
2846    PARSE_LANGOPT(DefaultFPContract);
2847    PARSE_LANGOPT(ElideConstructors);
2848    PARSE_LANGOPT(SpellChecking);
2849    PARSE_LANGOPT(MRTD);
2850  #undef PARSE_LANGOPT
2851
2852    return Listener->ReadLanguageOptions(LangOpts);
2853  }
2854
2855  return false;
2856}
2857
2858void ASTReader::ReadPreprocessedEntities() {
2859  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2860    PerFileData &F = *Chain[I];
2861    if (!F.PreprocessorDetailCursor.getBitStreamReader())
2862      continue;
2863
2864    SavedStreamPosition SavedPosition(F.PreprocessorDetailCursor);
2865    F.PreprocessorDetailCursor.JumpToBit(F.PreprocessorDetailStartOffset);
2866    while (LoadPreprocessedEntity(F)) { }
2867  }
2868}
2869
2870PreprocessedEntity *ASTReader::ReadPreprocessedEntityAtOffset(uint64_t Offset) {
2871  PerFileData *F = 0;
2872  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2873    if (Offset < Chain[I]->SizeInBits) {
2874      F = Chain[I];
2875      break;
2876    }
2877
2878    Offset -= Chain[I]->SizeInBits;
2879  }
2880
2881  if (!F) {
2882    Error("Malformed preprocessed entity offset");
2883    return 0;
2884  }
2885
2886  // Keep track of where we are in the stream, then jump back there
2887  // after reading this entity.
2888  SavedStreamPosition SavedPosition(F->PreprocessorDetailCursor);
2889  F->PreprocessorDetailCursor.JumpToBit(Offset);
2890  return LoadPreprocessedEntity(*F);
2891}
2892
2893HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
2894  HeaderFileInfoTrait Trait(FE->getName());
2895  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2896    PerFileData &F = *Chain[I];
2897    HeaderFileInfoLookupTable *Table
2898      = static_cast<HeaderFileInfoLookupTable *>(F.HeaderFileInfoTable);
2899    if (!Table)
2900      continue;
2901
2902    // Look in the on-disk hash table for an entry for this file name.
2903    HeaderFileInfoLookupTable::iterator Pos = Table->find(FE->getName(),
2904                                                          &Trait);
2905    if (Pos == Table->end())
2906      continue;
2907
2908    HeaderFileInfo HFI = *Pos;
2909    if (Listener)
2910      Listener->ReadHeaderFileInfo(HFI, FE->getUID());
2911
2912    return HFI;
2913  }
2914
2915  return HeaderFileInfo();
2916}
2917
2918void ASTReader::ReadPragmaDiagnosticMappings(Diagnostic &Diag) {
2919  unsigned Idx = 0;
2920  while (Idx < PragmaDiagMappings.size()) {
2921    SourceLocation
2922      Loc = SourceLocation::getFromRawEncoding(PragmaDiagMappings[Idx++]);
2923    while (1) {
2924      assert(Idx < PragmaDiagMappings.size() &&
2925             "Invalid data, didn't find '-1' marking end of diag/map pairs");
2926      if (Idx >= PragmaDiagMappings.size())
2927        break; // Something is messed up but at least avoid infinite loop in
2928               // release build.
2929      unsigned DiagID = PragmaDiagMappings[Idx++];
2930      if (DiagID == (unsigned)-1)
2931        break; // no more diag/map pairs for this location.
2932      diag::Mapping Map = (diag::Mapping)PragmaDiagMappings[Idx++];
2933      Diag.setDiagnosticMapping(DiagID, Map, Loc);
2934    }
2935  }
2936}
2937
2938/// \brief Get the correct cursor and offset for loading a type.
2939ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
2940  PerFileData *F = 0;
2941  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2942    F = Chain[N - I - 1];
2943    if (Index < F->LocalNumTypes)
2944      break;
2945    Index -= F->LocalNumTypes;
2946  }
2947  assert(F && F->LocalNumTypes > Index && "Broken chain");
2948  return RecordLocation(F, F->TypeOffsets[Index]);
2949}
2950
2951/// \brief Read and return the type with the given index..
2952///
2953/// The index is the type ID, shifted and minus the number of predefs. This
2954/// routine actually reads the record corresponding to the type at the given
2955/// location. It is a helper routine for GetType, which deals with reading type
2956/// IDs.
2957QualType ASTReader::ReadTypeRecord(unsigned Index) {
2958  RecordLocation Loc = TypeCursorForIndex(Index);
2959  llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
2960
2961  // Keep track of where we are in the stream, then jump back there
2962  // after reading this type.
2963  SavedStreamPosition SavedPosition(DeclsCursor);
2964
2965  ReadingKindTracker ReadingKind(Read_Type, *this);
2966
2967  // Note that we are loading a type record.
2968  Deserializing AType(this);
2969
2970  DeclsCursor.JumpToBit(Loc.Offset);
2971  RecordData Record;
2972  unsigned Code = DeclsCursor.ReadCode();
2973  switch ((TypeCode)DeclsCursor.ReadRecord(Code, Record)) {
2974  case TYPE_EXT_QUAL: {
2975    if (Record.size() != 2) {
2976      Error("Incorrect encoding of extended qualifier type");
2977      return QualType();
2978    }
2979    QualType Base = GetType(Record[0]);
2980    Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[1]);
2981    return Context->getQualifiedType(Base, Quals);
2982  }
2983
2984  case TYPE_COMPLEX: {
2985    if (Record.size() != 1) {
2986      Error("Incorrect encoding of complex type");
2987      return QualType();
2988    }
2989    QualType ElemType = GetType(Record[0]);
2990    return Context->getComplexType(ElemType);
2991  }
2992
2993  case TYPE_POINTER: {
2994    if (Record.size() != 1) {
2995      Error("Incorrect encoding of pointer type");
2996      return QualType();
2997    }
2998    QualType PointeeType = GetType(Record[0]);
2999    return Context->getPointerType(PointeeType);
3000  }
3001
3002  case TYPE_BLOCK_POINTER: {
3003    if (Record.size() != 1) {
3004      Error("Incorrect encoding of block pointer type");
3005      return QualType();
3006    }
3007    QualType PointeeType = GetType(Record[0]);
3008    return Context->getBlockPointerType(PointeeType);
3009  }
3010
3011  case TYPE_LVALUE_REFERENCE: {
3012    if (Record.size() != 1) {
3013      Error("Incorrect encoding of lvalue reference type");
3014      return QualType();
3015    }
3016    QualType PointeeType = GetType(Record[0]);
3017    return Context->getLValueReferenceType(PointeeType);
3018  }
3019
3020  case TYPE_RVALUE_REFERENCE: {
3021    if (Record.size() != 1) {
3022      Error("Incorrect encoding of rvalue reference type");
3023      return QualType();
3024    }
3025    QualType PointeeType = GetType(Record[0]);
3026    return Context->getRValueReferenceType(PointeeType);
3027  }
3028
3029  case TYPE_MEMBER_POINTER: {
3030    if (Record.size() != 2) {
3031      Error("Incorrect encoding of member pointer type");
3032      return QualType();
3033    }
3034    QualType PointeeType = GetType(Record[0]);
3035    QualType ClassType = GetType(Record[1]);
3036    if (PointeeType.isNull() || ClassType.isNull())
3037      return QualType();
3038
3039    return Context->getMemberPointerType(PointeeType, ClassType.getTypePtr());
3040  }
3041
3042  case TYPE_CONSTANT_ARRAY: {
3043    QualType ElementType = GetType(Record[0]);
3044    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3045    unsigned IndexTypeQuals = Record[2];
3046    unsigned Idx = 3;
3047    llvm::APInt Size = ReadAPInt(Record, Idx);
3048    return Context->getConstantArrayType(ElementType, Size,
3049                                         ASM, IndexTypeQuals);
3050  }
3051
3052  case TYPE_INCOMPLETE_ARRAY: {
3053    QualType ElementType = GetType(Record[0]);
3054    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3055    unsigned IndexTypeQuals = Record[2];
3056    return Context->getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
3057  }
3058
3059  case TYPE_VARIABLE_ARRAY: {
3060    QualType ElementType = GetType(Record[0]);
3061    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3062    unsigned IndexTypeQuals = Record[2];
3063    SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
3064    SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
3065    return Context->getVariableArrayType(ElementType, ReadExpr(*Loc.F),
3066                                         ASM, IndexTypeQuals,
3067                                         SourceRange(LBLoc, RBLoc));
3068  }
3069
3070  case TYPE_VECTOR: {
3071    if (Record.size() != 3) {
3072      Error("incorrect encoding of vector type in AST file");
3073      return QualType();
3074    }
3075
3076    QualType ElementType = GetType(Record[0]);
3077    unsigned NumElements = Record[1];
3078    unsigned VecKind = Record[2];
3079    return Context->getVectorType(ElementType, NumElements,
3080                                  (VectorType::VectorKind)VecKind);
3081  }
3082
3083  case TYPE_EXT_VECTOR: {
3084    if (Record.size() != 3) {
3085      Error("incorrect encoding of extended vector type in AST file");
3086      return QualType();
3087    }
3088
3089    QualType ElementType = GetType(Record[0]);
3090    unsigned NumElements = Record[1];
3091    return Context->getExtVectorType(ElementType, NumElements);
3092  }
3093
3094  case TYPE_FUNCTION_NO_PROTO: {
3095    if (Record.size() != 4) {
3096      Error("incorrect encoding of no-proto function type");
3097      return QualType();
3098    }
3099    QualType ResultType = GetType(Record[0]);
3100    FunctionType::ExtInfo Info(Record[1], Record[2], (CallingConv)Record[3]);
3101    return Context->getFunctionNoProtoType(ResultType, Info);
3102  }
3103
3104  case TYPE_FUNCTION_PROTO: {
3105    QualType ResultType = GetType(Record[0]);
3106
3107    FunctionProtoType::ExtProtoInfo EPI;
3108    EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
3109                                        /*regparm*/ Record[2],
3110                                        static_cast<CallingConv>(Record[3]));
3111
3112    unsigned Idx = 4;
3113    unsigned NumParams = Record[Idx++];
3114    llvm::SmallVector<QualType, 16> ParamTypes;
3115    for (unsigned I = 0; I != NumParams; ++I)
3116      ParamTypes.push_back(GetType(Record[Idx++]));
3117
3118    EPI.Variadic = Record[Idx++];
3119    EPI.TypeQuals = Record[Idx++];
3120    EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
3121    ExceptionSpecificationType EST =
3122        static_cast<ExceptionSpecificationType>(Record[Idx++]);
3123    EPI.ExceptionSpecType = EST;
3124    if (EST == EST_Dynamic) {
3125      EPI.NumExceptions = Record[Idx++];
3126      llvm::SmallVector<QualType, 2> Exceptions;
3127      for (unsigned I = 0; I != EPI.NumExceptions; ++I)
3128        Exceptions.push_back(GetType(Record[Idx++]));
3129      EPI.Exceptions = Exceptions.data();
3130    } else if (EST == EST_ComputedNoexcept) {
3131      EPI.NoexceptExpr = ReadExpr(*Loc.F);
3132    }
3133    return Context->getFunctionType(ResultType, ParamTypes.data(), NumParams,
3134                                    EPI);
3135  }
3136
3137  case TYPE_UNRESOLVED_USING:
3138    return Context->getTypeDeclType(
3139             cast<UnresolvedUsingTypenameDecl>(GetDecl(Record[0])));
3140
3141  case TYPE_TYPEDEF: {
3142    if (Record.size() != 2) {
3143      Error("incorrect encoding of typedef type");
3144      return QualType();
3145    }
3146    TypedefDecl *Decl = cast<TypedefDecl>(GetDecl(Record[0]));
3147    QualType Canonical = GetType(Record[1]);
3148    if (!Canonical.isNull())
3149      Canonical = Context->getCanonicalType(Canonical);
3150    return Context->getTypedefType(Decl, Canonical);
3151  }
3152
3153  case TYPE_TYPEOF_EXPR:
3154    return Context->getTypeOfExprType(ReadExpr(*Loc.F));
3155
3156  case TYPE_TYPEOF: {
3157    if (Record.size() != 1) {
3158      Error("incorrect encoding of typeof(type) in AST file");
3159      return QualType();
3160    }
3161    QualType UnderlyingType = GetType(Record[0]);
3162    return Context->getTypeOfType(UnderlyingType);
3163  }
3164
3165  case TYPE_DECLTYPE:
3166    return Context->getDecltypeType(ReadExpr(*Loc.F));
3167
3168  case TYPE_AUTO:
3169    return Context->getAutoType(GetType(Record[0]));
3170
3171  case TYPE_RECORD: {
3172    if (Record.size() != 2) {
3173      Error("incorrect encoding of record type");
3174      return QualType();
3175    }
3176    bool IsDependent = Record[0];
3177    QualType T = Context->getRecordType(cast<RecordDecl>(GetDecl(Record[1])));
3178    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3179    return T;
3180  }
3181
3182  case TYPE_ENUM: {
3183    if (Record.size() != 2) {
3184      Error("incorrect encoding of enum type");
3185      return QualType();
3186    }
3187    bool IsDependent = Record[0];
3188    QualType T = Context->getEnumType(cast<EnumDecl>(GetDecl(Record[1])));
3189    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3190    return T;
3191  }
3192
3193  case TYPE_ATTRIBUTED: {
3194    if (Record.size() != 3) {
3195      Error("incorrect encoding of attributed type");
3196      return QualType();
3197    }
3198    QualType modifiedType = GetType(Record[0]);
3199    QualType equivalentType = GetType(Record[1]);
3200    AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
3201    return Context->getAttributedType(kind, modifiedType, equivalentType);
3202  }
3203
3204  case TYPE_PAREN: {
3205    if (Record.size() != 1) {
3206      Error("incorrect encoding of paren type");
3207      return QualType();
3208    }
3209    QualType InnerType = GetType(Record[0]);
3210    return Context->getParenType(InnerType);
3211  }
3212
3213  case TYPE_PACK_EXPANSION: {
3214    if (Record.size() != 2) {
3215      Error("incorrect encoding of pack expansion type");
3216      return QualType();
3217    }
3218    QualType Pattern = GetType(Record[0]);
3219    if (Pattern.isNull())
3220      return QualType();
3221    llvm::Optional<unsigned> NumExpansions;
3222    if (Record[1])
3223      NumExpansions = Record[1] - 1;
3224    return Context->getPackExpansionType(Pattern, NumExpansions);
3225  }
3226
3227  case TYPE_ELABORATED: {
3228    unsigned Idx = 0;
3229    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
3230    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
3231    QualType NamedType = GetType(Record[Idx++]);
3232    return Context->getElaboratedType(Keyword, NNS, NamedType);
3233  }
3234
3235  case TYPE_OBJC_INTERFACE: {
3236    unsigned Idx = 0;
3237    ObjCInterfaceDecl *ItfD = cast<ObjCInterfaceDecl>(GetDecl(Record[Idx++]));
3238    return Context->getObjCInterfaceType(ItfD);
3239  }
3240
3241  case TYPE_OBJC_OBJECT: {
3242    unsigned Idx = 0;
3243    QualType Base = GetType(Record[Idx++]);
3244    unsigned NumProtos = Record[Idx++];
3245    llvm::SmallVector<ObjCProtocolDecl*, 4> Protos;
3246    for (unsigned I = 0; I != NumProtos; ++I)
3247      Protos.push_back(cast<ObjCProtocolDecl>(GetDecl(Record[Idx++])));
3248    return Context->getObjCObjectType(Base, Protos.data(), NumProtos);
3249  }
3250
3251  case TYPE_OBJC_OBJECT_POINTER: {
3252    unsigned Idx = 0;
3253    QualType Pointee = GetType(Record[Idx++]);
3254    return Context->getObjCObjectPointerType(Pointee);
3255  }
3256
3257  case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
3258    unsigned Idx = 0;
3259    QualType Parm = GetType(Record[Idx++]);
3260    QualType Replacement = GetType(Record[Idx++]);
3261    return
3262      Context->getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm),
3263                                            Replacement);
3264  }
3265
3266  case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
3267    unsigned Idx = 0;
3268    QualType Parm = GetType(Record[Idx++]);
3269    TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
3270    return Context->getSubstTemplateTypeParmPackType(
3271                                               cast<TemplateTypeParmType>(Parm),
3272                                                     ArgPack);
3273  }
3274
3275  case TYPE_INJECTED_CLASS_NAME: {
3276    CXXRecordDecl *D = cast<CXXRecordDecl>(GetDecl(Record[0]));
3277    QualType TST = GetType(Record[1]); // probably derivable
3278    // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
3279    // for AST reading, too much interdependencies.
3280    return
3281      QualType(new (*Context, TypeAlignment) InjectedClassNameType(D, TST), 0);
3282  }
3283
3284  case TYPE_TEMPLATE_TYPE_PARM: {
3285    unsigned Idx = 0;
3286    unsigned Depth = Record[Idx++];
3287    unsigned Index = Record[Idx++];
3288    bool Pack = Record[Idx++];
3289    IdentifierInfo *Name = GetIdentifierInfo(Record, Idx);
3290    return Context->getTemplateTypeParmType(Depth, Index, Pack, Name);
3291  }
3292
3293  case TYPE_DEPENDENT_NAME: {
3294    unsigned Idx = 0;
3295    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
3296    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
3297    const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx);
3298    QualType Canon = GetType(Record[Idx++]);
3299    if (!Canon.isNull())
3300      Canon = Context->getCanonicalType(Canon);
3301    return Context->getDependentNameType(Keyword, NNS, Name, Canon);
3302  }
3303
3304  case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
3305    unsigned Idx = 0;
3306    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
3307    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
3308    const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx);
3309    unsigned NumArgs = Record[Idx++];
3310    llvm::SmallVector<TemplateArgument, 8> Args;
3311    Args.reserve(NumArgs);
3312    while (NumArgs--)
3313      Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
3314    return Context->getDependentTemplateSpecializationType(Keyword, NNS, Name,
3315                                                      Args.size(), Args.data());
3316  }
3317
3318  case TYPE_DEPENDENT_SIZED_ARRAY: {
3319    unsigned Idx = 0;
3320
3321    // ArrayType
3322    QualType ElementType = GetType(Record[Idx++]);
3323    ArrayType::ArraySizeModifier ASM
3324      = (ArrayType::ArraySizeModifier)Record[Idx++];
3325    unsigned IndexTypeQuals = Record[Idx++];
3326
3327    // DependentSizedArrayType
3328    Expr *NumElts = ReadExpr(*Loc.F);
3329    SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
3330
3331    return Context->getDependentSizedArrayType(ElementType, NumElts, ASM,
3332                                               IndexTypeQuals, Brackets);
3333  }
3334
3335  case TYPE_TEMPLATE_SPECIALIZATION: {
3336    unsigned Idx = 0;
3337    bool IsDependent = Record[Idx++];
3338    TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
3339    llvm::SmallVector<TemplateArgument, 8> Args;
3340    ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
3341    QualType Canon = GetType(Record[Idx++]);
3342    QualType T;
3343    if (Canon.isNull())
3344      T = Context->getCanonicalTemplateSpecializationType(Name, Args.data(),
3345                                                          Args.size());
3346    else
3347      T = Context->getTemplateSpecializationType(Name, Args.data(),
3348                                                 Args.size(), Canon);
3349    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3350    return T;
3351  }
3352  }
3353  // Suppress a GCC warning
3354  return QualType();
3355}
3356
3357class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
3358  ASTReader &Reader;
3359  ASTReader::PerFileData &F;
3360  llvm::BitstreamCursor &DeclsCursor;
3361  const ASTReader::RecordData &Record;
3362  unsigned &Idx;
3363
3364  SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
3365                                    unsigned &I) {
3366    return Reader.ReadSourceLocation(F, R, I);
3367  }
3368
3369public:
3370  TypeLocReader(ASTReader &Reader, ASTReader::PerFileData &F,
3371                const ASTReader::RecordData &Record, unsigned &Idx)
3372    : Reader(Reader), F(F), DeclsCursor(F.DeclsCursor), Record(Record), Idx(Idx)
3373  { }
3374
3375  // We want compile-time assurance that we've enumerated all of
3376  // these, so unfortunately we have to declare them first, then
3377  // define them out-of-line.
3378#define ABSTRACT_TYPELOC(CLASS, PARENT)
3379#define TYPELOC(CLASS, PARENT) \
3380  void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
3381#include "clang/AST/TypeLocNodes.def"
3382
3383  void VisitFunctionTypeLoc(FunctionTypeLoc);
3384  void VisitArrayTypeLoc(ArrayTypeLoc);
3385};
3386
3387void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
3388  // nothing to do
3389}
3390void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
3391  TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
3392  if (TL.needsExtraLocalData()) {
3393    TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
3394    TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
3395    TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
3396    TL.setModeAttr(Record[Idx++]);
3397  }
3398}
3399void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
3400  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3401}
3402void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
3403  TL.setStarLoc(ReadSourceLocation(Record, Idx));
3404}
3405void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
3406  TL.setCaretLoc(ReadSourceLocation(Record, Idx));
3407}
3408void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
3409  TL.setAmpLoc(ReadSourceLocation(Record, Idx));
3410}
3411void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
3412  TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
3413}
3414void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
3415  TL.setStarLoc(ReadSourceLocation(Record, Idx));
3416  TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
3417}
3418void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
3419  TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
3420  TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
3421  if (Record[Idx++])
3422    TL.setSizeExpr(Reader.ReadExpr(F));
3423  else
3424    TL.setSizeExpr(0);
3425}
3426void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
3427  VisitArrayTypeLoc(TL);
3428}
3429void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
3430  VisitArrayTypeLoc(TL);
3431}
3432void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
3433  VisitArrayTypeLoc(TL);
3434}
3435void TypeLocReader::VisitDependentSizedArrayTypeLoc(
3436                                            DependentSizedArrayTypeLoc TL) {
3437  VisitArrayTypeLoc(TL);
3438}
3439void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
3440                                        DependentSizedExtVectorTypeLoc TL) {
3441  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3442}
3443void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
3444  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3445}
3446void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
3447  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3448}
3449void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
3450  TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
3451  TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
3452  TL.setTrailingReturn(Record[Idx++]);
3453  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3454    TL.setArg(i, cast_or_null<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
3455  }
3456}
3457void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
3458  VisitFunctionTypeLoc(TL);
3459}
3460void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
3461  VisitFunctionTypeLoc(TL);
3462}
3463void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
3464  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3465}
3466void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
3467  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3468}
3469void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
3470  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
3471  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
3472  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
3473}
3474void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
3475  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
3476  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
3477  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
3478  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
3479}
3480void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
3481  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3482}
3483void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
3484  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3485}
3486void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
3487  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3488}
3489void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
3490  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3491}
3492void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
3493  TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
3494  if (TL.hasAttrOperand()) {
3495    SourceRange range;
3496    range.setBegin(ReadSourceLocation(Record, Idx));
3497    range.setEnd(ReadSourceLocation(Record, Idx));
3498    TL.setAttrOperandParensRange(range);
3499  }
3500  if (TL.hasAttrExprOperand()) {
3501    if (Record[Idx++])
3502      TL.setAttrExprOperand(Reader.ReadExpr(F));
3503    else
3504      TL.setAttrExprOperand(0);
3505  } else if (TL.hasAttrEnumOperand())
3506    TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
3507}
3508void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
3509  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3510}
3511void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
3512                                            SubstTemplateTypeParmTypeLoc TL) {
3513  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3514}
3515void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
3516                                          SubstTemplateTypeParmPackTypeLoc TL) {
3517  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3518}
3519void TypeLocReader::VisitTemplateSpecializationTypeLoc(
3520                                           TemplateSpecializationTypeLoc TL) {
3521  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
3522  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
3523  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
3524  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
3525    TL.setArgLocInfo(i,
3526        Reader.GetTemplateArgumentLocInfo(F,
3527                                          TL.getTypePtr()->getArg(i).getKind(),
3528                                          Record, Idx));
3529}
3530void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
3531  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
3532  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
3533}
3534void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
3535  TL.setKeywordLoc(ReadSourceLocation(Record, Idx));
3536  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
3537}
3538void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
3539  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3540}
3541void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
3542  TL.setKeywordLoc(ReadSourceLocation(Record, Idx));
3543  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
3544  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3545}
3546void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
3547       DependentTemplateSpecializationTypeLoc TL) {
3548  TL.setKeywordLoc(ReadSourceLocation(Record, Idx));
3549  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
3550  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3551  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
3552  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
3553  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
3554    TL.setArgLocInfo(I,
3555        Reader.GetTemplateArgumentLocInfo(F,
3556                                          TL.getTypePtr()->getArg(I).getKind(),
3557                                          Record, Idx));
3558}
3559void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
3560  TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
3561}
3562void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
3563  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3564}
3565void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
3566  TL.setHasBaseTypeAsWritten(Record[Idx++]);
3567  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
3568  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
3569  for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
3570    TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
3571}
3572void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
3573  TL.setStarLoc(ReadSourceLocation(Record, Idx));
3574}
3575
3576TypeSourceInfo *ASTReader::GetTypeSourceInfo(PerFileData &F,
3577                                             const RecordData &Record,
3578                                             unsigned &Idx) {
3579  QualType InfoTy = GetType(Record[Idx++]);
3580  if (InfoTy.isNull())
3581    return 0;
3582
3583  TypeSourceInfo *TInfo = getContext()->CreateTypeSourceInfo(InfoTy);
3584  TypeLocReader TLR(*this, F, Record, Idx);
3585  for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
3586    TLR.Visit(TL);
3587  return TInfo;
3588}
3589
3590QualType ASTReader::GetType(TypeID ID) {
3591  unsigned FastQuals = ID & Qualifiers::FastMask;
3592  unsigned Index = ID >> Qualifiers::FastWidth;
3593
3594  if (Index < NUM_PREDEF_TYPE_IDS) {
3595    QualType T;
3596    switch ((PredefinedTypeIDs)Index) {
3597    case PREDEF_TYPE_NULL_ID: return QualType();
3598    case PREDEF_TYPE_VOID_ID: T = Context->VoidTy; break;
3599    case PREDEF_TYPE_BOOL_ID: T = Context->BoolTy; break;
3600
3601    case PREDEF_TYPE_CHAR_U_ID:
3602    case PREDEF_TYPE_CHAR_S_ID:
3603      // FIXME: Check that the signedness of CharTy is correct!
3604      T = Context->CharTy;
3605      break;
3606
3607    case PREDEF_TYPE_UCHAR_ID:      T = Context->UnsignedCharTy;     break;
3608    case PREDEF_TYPE_USHORT_ID:     T = Context->UnsignedShortTy;    break;
3609    case PREDEF_TYPE_UINT_ID:       T = Context->UnsignedIntTy;      break;
3610    case PREDEF_TYPE_ULONG_ID:      T = Context->UnsignedLongTy;     break;
3611    case PREDEF_TYPE_ULONGLONG_ID:  T = Context->UnsignedLongLongTy; break;
3612    case PREDEF_TYPE_UINT128_ID:    T = Context->UnsignedInt128Ty;   break;
3613    case PREDEF_TYPE_SCHAR_ID:      T = Context->SignedCharTy;       break;
3614    case PREDEF_TYPE_WCHAR_ID:      T = Context->WCharTy;            break;
3615    case PREDEF_TYPE_SHORT_ID:      T = Context->ShortTy;            break;
3616    case PREDEF_TYPE_INT_ID:        T = Context->IntTy;              break;
3617    case PREDEF_TYPE_LONG_ID:       T = Context->LongTy;             break;
3618    case PREDEF_TYPE_LONGLONG_ID:   T = Context->LongLongTy;         break;
3619    case PREDEF_TYPE_INT128_ID:     T = Context->Int128Ty;           break;
3620    case PREDEF_TYPE_FLOAT_ID:      T = Context->FloatTy;            break;
3621    case PREDEF_TYPE_DOUBLE_ID:     T = Context->DoubleTy;           break;
3622    case PREDEF_TYPE_LONGDOUBLE_ID: T = Context->LongDoubleTy;       break;
3623    case PREDEF_TYPE_OVERLOAD_ID:   T = Context->OverloadTy;         break;
3624    case PREDEF_TYPE_DEPENDENT_ID:  T = Context->DependentTy;        break;
3625    case PREDEF_TYPE_NULLPTR_ID:    T = Context->NullPtrTy;          break;
3626    case PREDEF_TYPE_CHAR16_ID:     T = Context->Char16Ty;           break;
3627    case PREDEF_TYPE_CHAR32_ID:     T = Context->Char32Ty;           break;
3628    case PREDEF_TYPE_OBJC_ID:       T = Context->ObjCBuiltinIdTy;    break;
3629    case PREDEF_TYPE_OBJC_CLASS:    T = Context->ObjCBuiltinClassTy; break;
3630    case PREDEF_TYPE_OBJC_SEL:      T = Context->ObjCBuiltinSelTy;   break;
3631    }
3632
3633    assert(!T.isNull() && "Unknown predefined type");
3634    return T.withFastQualifiers(FastQuals);
3635  }
3636
3637  Index -= NUM_PREDEF_TYPE_IDS;
3638  assert(Index < TypesLoaded.size() && "Type index out-of-range");
3639  if (TypesLoaded[Index].isNull()) {
3640    TypesLoaded[Index] = ReadTypeRecord(Index);
3641    if (TypesLoaded[Index].isNull())
3642      return QualType();
3643
3644    TypesLoaded[Index]->setFromAST();
3645    TypeIdxs[TypesLoaded[Index]] = TypeIdx::fromTypeID(ID);
3646    if (DeserializationListener)
3647      DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
3648                                        TypesLoaded[Index]);
3649  }
3650
3651  return TypesLoaded[Index].withFastQualifiers(FastQuals);
3652}
3653
3654TypeID ASTReader::GetTypeID(QualType T) const {
3655  return MakeTypeID(T,
3656              std::bind1st(std::mem_fun(&ASTReader::GetTypeIdx), this));
3657}
3658
3659TypeIdx ASTReader::GetTypeIdx(QualType T) const {
3660  if (T.isNull())
3661    return TypeIdx();
3662  assert(!T.getLocalFastQualifiers());
3663
3664  TypeIdxMap::const_iterator I = TypeIdxs.find(T);
3665  // GetTypeIdx is mostly used for computing the hash of DeclarationNames and
3666  // comparing keys of ASTDeclContextNameLookupTable.
3667  // If the type didn't come from the AST file use a specially marked index
3668  // so that any hash/key comparison fail since no such index is stored
3669  // in a AST file.
3670  if (I == TypeIdxs.end())
3671    return TypeIdx(-1);
3672  return I->second;
3673}
3674
3675unsigned ASTReader::getTotalNumCXXBaseSpecifiers() const {
3676  unsigned Result = 0;
3677  for (unsigned I = 0, N = Chain.size(); I != N; ++I)
3678    Result += Chain[I]->LocalNumCXXBaseSpecifiers;
3679
3680  return Result;
3681}
3682
3683TemplateArgumentLocInfo
3684ASTReader::GetTemplateArgumentLocInfo(PerFileData &F,
3685                                      TemplateArgument::ArgKind Kind,
3686                                      const RecordData &Record,
3687                                      unsigned &Index) {
3688  switch (Kind) {
3689  case TemplateArgument::Expression:
3690    return ReadExpr(F);
3691  case TemplateArgument::Type:
3692    return GetTypeSourceInfo(F, Record, Index);
3693  case TemplateArgument::Template: {
3694    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
3695                                                                     Index);
3696    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
3697    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
3698                                   SourceLocation());
3699  }
3700  case TemplateArgument::TemplateExpansion: {
3701    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
3702                                                                     Index);
3703    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
3704    SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
3705    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
3706                                   EllipsisLoc);
3707  }
3708  case TemplateArgument::Null:
3709  case TemplateArgument::Integral:
3710  case TemplateArgument::Declaration:
3711  case TemplateArgument::Pack:
3712    return TemplateArgumentLocInfo();
3713  }
3714  llvm_unreachable("unexpected template argument loc");
3715  return TemplateArgumentLocInfo();
3716}
3717
3718TemplateArgumentLoc
3719ASTReader::ReadTemplateArgumentLoc(PerFileData &F,
3720                                   const RecordData &Record, unsigned &Index) {
3721  TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
3722
3723  if (Arg.getKind() == TemplateArgument::Expression) {
3724    if (Record[Index++]) // bool InfoHasSameExpr.
3725      return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
3726  }
3727  return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
3728                                                             Record, Index));
3729}
3730
3731Decl *ASTReader::GetExternalDecl(uint32_t ID) {
3732  return GetDecl(ID);
3733}
3734
3735uint64_t
3736ASTReader::GetCXXBaseSpecifiersOffset(serialization::CXXBaseSpecifiersID ID) {
3737  if (ID == 0)
3738    return 0;
3739
3740  --ID;
3741  uint64_t Offset = 0;
3742  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
3743    PerFileData &F = *Chain[N - I - 1];
3744
3745    if (ID < F.LocalNumCXXBaseSpecifiers)
3746      return Offset + F.CXXBaseSpecifiersOffsets[ID];
3747
3748    ID -= F.LocalNumCXXBaseSpecifiers;
3749    Offset += F.SizeInBits;
3750  }
3751
3752  assert(false && "CXXBaseSpecifiers not found");
3753  return 0;
3754}
3755
3756CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
3757  // Figure out which AST file contains this offset.
3758  PerFileData *F = 0;
3759  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
3760    if (Offset < Chain[N - I - 1]->SizeInBits) {
3761      F = Chain[N - I - 1];
3762      break;
3763    }
3764
3765    Offset -= Chain[N - I - 1]->SizeInBits;
3766  }
3767
3768  if (!F) {
3769    Error("Malformed AST file: C++ base specifiers at impossible offset");
3770    return 0;
3771  }
3772
3773  llvm::BitstreamCursor &Cursor = F->DeclsCursor;
3774  SavedStreamPosition SavedPosition(Cursor);
3775  Cursor.JumpToBit(Offset);
3776  ReadingKindTracker ReadingKind(Read_Decl, *this);
3777  RecordData Record;
3778  unsigned Code = Cursor.ReadCode();
3779  unsigned RecCode = Cursor.ReadRecord(Code, Record);
3780  if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
3781    Error("Malformed AST file: missing C++ base specifiers");
3782    return 0;
3783  }
3784
3785  unsigned Idx = 0;
3786  unsigned NumBases = Record[Idx++];
3787  void *Mem = Context->Allocate(sizeof(CXXBaseSpecifier) * NumBases);
3788  CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
3789  for (unsigned I = 0; I != NumBases; ++I)
3790    Bases[I] = ReadCXXBaseSpecifier(*F, Record, Idx);
3791  return Bases;
3792}
3793
3794TranslationUnitDecl *ASTReader::GetTranslationUnitDecl() {
3795  if (!DeclsLoaded[0]) {
3796    ReadDeclRecord(0, 1);
3797    if (DeserializationListener)
3798      DeserializationListener->DeclRead(1, DeclsLoaded[0]);
3799  }
3800
3801  return cast<TranslationUnitDecl>(DeclsLoaded[0]);
3802}
3803
3804Decl *ASTReader::GetDecl(DeclID ID) {
3805  if (ID == 0)
3806    return 0;
3807
3808  if (ID > DeclsLoaded.size()) {
3809    Error("declaration ID out-of-range for AST file");
3810    return 0;
3811  }
3812
3813  unsigned Index = ID - 1;
3814  if (!DeclsLoaded[Index]) {
3815    ReadDeclRecord(Index, ID);
3816    if (DeserializationListener)
3817      DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
3818  }
3819
3820  return DeclsLoaded[Index];
3821}
3822
3823/// \brief Resolve the offset of a statement into a statement.
3824///
3825/// This operation will read a new statement from the external
3826/// source each time it is called, and is meant to be used via a
3827/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
3828Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
3829  // Switch case IDs are per Decl.
3830  ClearSwitchCaseIDs();
3831
3832  // Offset here is a global offset across the entire chain.
3833  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
3834    PerFileData &F = *Chain[N - I - 1];
3835    if (Offset < F.SizeInBits) {
3836      // Since we know that this statement is part of a decl, make sure to use
3837      // the decl cursor to read it.
3838      F.DeclsCursor.JumpToBit(Offset);
3839      return ReadStmtFromStream(F);
3840    }
3841    Offset -= F.SizeInBits;
3842  }
3843  llvm_unreachable("Broken chain");
3844}
3845
3846bool ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
3847                                         bool (*isKindWeWant)(Decl::Kind),
3848                                         llvm::SmallVectorImpl<Decl*> &Decls) {
3849  assert(DC->hasExternalLexicalStorage() &&
3850         "DeclContext has no lexical decls in storage");
3851
3852  // There might be lexical decls in multiple parts of the chain, for the TU
3853  // at least.
3854  // DeclContextOffsets might reallocate as we load additional decls below,
3855  // so make a copy of the vector.
3856  DeclContextInfos Infos = DeclContextOffsets[DC];
3857  for (DeclContextInfos::iterator I = Infos.begin(), E = Infos.end();
3858       I != E; ++I) {
3859    // IDs can be 0 if this context doesn't contain declarations.
3860    if (!I->LexicalDecls)
3861      continue;
3862
3863    // Load all of the declaration IDs
3864    for (const KindDeclIDPair *ID = I->LexicalDecls,
3865                              *IDE = ID + I->NumLexicalDecls; ID != IDE; ++ID) {
3866      if (isKindWeWant && !isKindWeWant((Decl::Kind)ID->first))
3867        continue;
3868
3869      Decl *D = GetDecl(ID->second);
3870      assert(D && "Null decl in lexical decls");
3871      Decls.push_back(D);
3872    }
3873  }
3874
3875  ++NumLexicalDeclContextsRead;
3876  return false;
3877}
3878
3879DeclContext::lookup_result
3880ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
3881                                          DeclarationName Name) {
3882  assert(DC->hasExternalVisibleStorage() &&
3883         "DeclContext has no visible decls in storage");
3884  if (!Name)
3885    return DeclContext::lookup_result(DeclContext::lookup_iterator(0),
3886                                      DeclContext::lookup_iterator(0));
3887
3888  llvm::SmallVector<NamedDecl *, 64> Decls;
3889  // There might be visible decls in multiple parts of the chain, for the TU
3890  // and namespaces. For any given name, the last available results replace
3891  // all earlier ones. For this reason, we walk in reverse.
3892  DeclContextInfos &Infos = DeclContextOffsets[DC];
3893  for (DeclContextInfos::reverse_iterator I = Infos.rbegin(), E = Infos.rend();
3894       I != E; ++I) {
3895    if (!I->NameLookupTableData)
3896      continue;
3897
3898    ASTDeclContextNameLookupTable *LookupTable =
3899        (ASTDeclContextNameLookupTable*)I->NameLookupTableData;
3900    ASTDeclContextNameLookupTable::iterator Pos = LookupTable->find(Name);
3901    if (Pos == LookupTable->end())
3902      continue;
3903
3904    ASTDeclContextNameLookupTrait::data_type Data = *Pos;
3905    for (; Data.first != Data.second; ++Data.first)
3906      Decls.push_back(cast<NamedDecl>(GetDecl(*Data.first)));
3907    break;
3908  }
3909
3910  ++NumVisibleDeclContextsRead;
3911
3912  SetExternalVisibleDeclsForName(DC, Name, Decls);
3913  return const_cast<DeclContext*>(DC)->lookup(Name);
3914}
3915
3916void ASTReader::MaterializeVisibleDecls(const DeclContext *DC) {
3917  assert(DC->hasExternalVisibleStorage() &&
3918         "DeclContext has no visible decls in storage");
3919
3920  llvm::SmallVector<NamedDecl *, 64> Decls;
3921  // There might be visible decls in multiple parts of the chain, for the TU
3922  // and namespaces.
3923  DeclContextInfos &Infos = DeclContextOffsets[DC];
3924  for (DeclContextInfos::iterator I = Infos.begin(), E = Infos.end();
3925       I != E; ++I) {
3926    if (!I->NameLookupTableData)
3927      continue;
3928
3929    ASTDeclContextNameLookupTable *LookupTable =
3930        (ASTDeclContextNameLookupTable*)I->NameLookupTableData;
3931    for (ASTDeclContextNameLookupTable::item_iterator
3932           ItemI = LookupTable->item_begin(),
3933           ItemEnd = LookupTable->item_end() ; ItemI != ItemEnd; ++ItemI) {
3934      ASTDeclContextNameLookupTable::item_iterator::value_type Val
3935          = *ItemI;
3936      ASTDeclContextNameLookupTrait::data_type Data = Val.second;
3937      Decls.clear();
3938      for (; Data.first != Data.second; ++Data.first)
3939        Decls.push_back(cast<NamedDecl>(GetDecl(*Data.first)));
3940      MaterializeVisibleDeclsForName(DC, Val.first, Decls);
3941    }
3942  }
3943}
3944
3945void ASTReader::PassInterestingDeclsToConsumer() {
3946  assert(Consumer);
3947  while (!InterestingDecls.empty()) {
3948    DeclGroupRef DG(InterestingDecls.front());
3949    InterestingDecls.pop_front();
3950    Consumer->HandleInterestingDecl(DG);
3951  }
3952}
3953
3954void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
3955  this->Consumer = Consumer;
3956
3957  if (!Consumer)
3958    return;
3959
3960  for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) {
3961    // Force deserialization of this decl, which will cause it to be queued for
3962    // passing to the consumer.
3963    GetDecl(ExternalDefinitions[I]);
3964  }
3965
3966  PassInterestingDeclsToConsumer();
3967}
3968
3969void ASTReader::PrintStats() {
3970  std::fprintf(stderr, "*** AST File Statistics:\n");
3971
3972  unsigned NumTypesLoaded
3973    = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
3974                                      QualType());
3975  unsigned NumDeclsLoaded
3976    = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
3977                                      (Decl *)0);
3978  unsigned NumIdentifiersLoaded
3979    = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
3980                                            IdentifiersLoaded.end(),
3981                                            (IdentifierInfo *)0);
3982  unsigned NumSelectorsLoaded
3983    = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
3984                                          SelectorsLoaded.end(),
3985                                          Selector());
3986
3987  std::fprintf(stderr, "  %u stat cache hits\n", NumStatHits);
3988  std::fprintf(stderr, "  %u stat cache misses\n", NumStatMisses);
3989  if (TotalNumSLocEntries)
3990    std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
3991                 NumSLocEntriesRead, TotalNumSLocEntries,
3992                 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
3993  if (!TypesLoaded.empty())
3994    std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
3995                 NumTypesLoaded, (unsigned)TypesLoaded.size(),
3996                 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
3997  if (!DeclsLoaded.empty())
3998    std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
3999                 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
4000                 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
4001  if (!IdentifiersLoaded.empty())
4002    std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
4003                 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
4004                 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
4005  if (!SelectorsLoaded.empty())
4006    std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
4007                 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
4008                 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
4009  if (TotalNumStatements)
4010    std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
4011                 NumStatementsRead, TotalNumStatements,
4012                 ((float)NumStatementsRead/TotalNumStatements * 100));
4013  if (TotalNumMacros)
4014    std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
4015                 NumMacrosRead, TotalNumMacros,
4016                 ((float)NumMacrosRead/TotalNumMacros * 100));
4017  if (TotalLexicalDeclContexts)
4018    std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
4019                 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
4020                 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
4021                  * 100));
4022  if (TotalVisibleDeclContexts)
4023    std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
4024                 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
4025                 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
4026                  * 100));
4027  if (TotalNumMethodPoolEntries) {
4028    std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
4029                 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
4030                 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
4031                  * 100));
4032    std::fprintf(stderr, "  %u method pool misses\n", NumMethodPoolMisses);
4033  }
4034  std::fprintf(stderr, "\n");
4035}
4036
4037void ASTReader::InitializeSema(Sema &S) {
4038  SemaObj = &S;
4039  S.ExternalSource = this;
4040
4041  // Makes sure any declarations that were deserialized "too early"
4042  // still get added to the identifier's declaration chains.
4043  for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
4044    if (SemaObj->TUScope)
4045      SemaObj->TUScope->AddDecl(PreloadedDecls[I]);
4046
4047    SemaObj->IdResolver.AddDecl(PreloadedDecls[I]);
4048  }
4049  PreloadedDecls.clear();
4050
4051  // If there were any tentative definitions, deserialize them and add
4052  // them to Sema's list of tentative definitions.
4053  for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
4054    VarDecl *Var = cast<VarDecl>(GetDecl(TentativeDefinitions[I]));
4055    SemaObj->TentativeDefinitions.push_back(Var);
4056  }
4057
4058  // If there were any unused file scoped decls, deserialize them and add to
4059  // Sema's list of unused file scoped decls.
4060  for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
4061    DeclaratorDecl *D = cast<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
4062    SemaObj->UnusedFileScopedDecls.push_back(D);
4063  }
4064
4065  // If there were any locally-scoped external declarations,
4066  // deserialize them and add them to Sema's table of locally-scoped
4067  // external declarations.
4068  for (unsigned I = 0, N = LocallyScopedExternalDecls.size(); I != N; ++I) {
4069    NamedDecl *D = cast<NamedDecl>(GetDecl(LocallyScopedExternalDecls[I]));
4070    SemaObj->LocallyScopedExternalDecls[D->getDeclName()] = D;
4071  }
4072
4073  // If there were any ext_vector type declarations, deserialize them
4074  // and add them to Sema's vector of such declarations.
4075  for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I)
4076    SemaObj->ExtVectorDecls.push_back(
4077                               cast<TypedefDecl>(GetDecl(ExtVectorDecls[I])));
4078
4079  // FIXME: Do VTable uses and dynamic classes deserialize too much ?
4080  // Can we cut them down before writing them ?
4081
4082  // If there were any dynamic classes declarations, deserialize them
4083  // and add them to Sema's vector of such declarations.
4084  for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I)
4085    SemaObj->DynamicClasses.push_back(
4086                               cast<CXXRecordDecl>(GetDecl(DynamicClasses[I])));
4087
4088  // Load the offsets of the declarations that Sema references.
4089  // They will be lazily deserialized when needed.
4090  if (!SemaDeclRefs.empty()) {
4091    assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!");
4092    SemaObj->StdNamespace = SemaDeclRefs[0];
4093    SemaObj->StdBadAlloc = SemaDeclRefs[1];
4094  }
4095
4096  for (PerFileData *F = FirstInSource; F; F = F->NextInSource) {
4097
4098    // If there are @selector references added them to its pool. This is for
4099    // implementation of -Wselector.
4100    if (!F->ReferencedSelectorsData.empty()) {
4101      unsigned int DataSize = F->ReferencedSelectorsData.size()-1;
4102      unsigned I = 0;
4103      while (I < DataSize) {
4104        Selector Sel = DecodeSelector(F->ReferencedSelectorsData[I++]);
4105        SourceLocation SelLoc = ReadSourceLocation(
4106                                    *F, F->ReferencedSelectorsData, I);
4107        SemaObj->ReferencedSelectors.insert(std::make_pair(Sel, SelLoc));
4108      }
4109    }
4110
4111    // If there were any pending implicit instantiations, deserialize them
4112    // and add them to Sema's queue of such instantiations.
4113    assert(F->PendingInstantiations.size() % 2 == 0 &&
4114           "Expected pairs of entries");
4115    for (unsigned Idx = 0, N = F->PendingInstantiations.size(); Idx < N;) {
4116      ValueDecl *D=cast<ValueDecl>(GetDecl(F->PendingInstantiations[Idx++]));
4117      SourceLocation Loc = ReadSourceLocation(*F, F->PendingInstantiations,Idx);
4118      SemaObj->PendingInstantiations.push_back(std::make_pair(D, Loc));
4119    }
4120  }
4121
4122  // The two special data sets below always come from the most recent PCH,
4123  // which is at the front of the chain.
4124  PerFileData &F = *Chain.front();
4125
4126  // If there were any weak undeclared identifiers, deserialize them and add to
4127  // Sema's list of weak undeclared identifiers.
4128  if (!WeakUndeclaredIdentifiers.empty()) {
4129    unsigned Idx = 0;
4130    for (unsigned I = 0, N = WeakUndeclaredIdentifiers[Idx++]; I != N; ++I) {
4131      IdentifierInfo *WeakId = GetIdentifierInfo(WeakUndeclaredIdentifiers,Idx);
4132      IdentifierInfo *AliasId= GetIdentifierInfo(WeakUndeclaredIdentifiers,Idx);
4133      SourceLocation Loc = ReadSourceLocation(F, WeakUndeclaredIdentifiers,Idx);
4134      bool Used = WeakUndeclaredIdentifiers[Idx++];
4135      Sema::WeakInfo WI(AliasId, Loc);
4136      WI.setUsed(Used);
4137      SemaObj->WeakUndeclaredIdentifiers.insert(std::make_pair(WeakId, WI));
4138    }
4139  }
4140
4141  // If there were any VTable uses, deserialize the information and add it
4142  // to Sema's vector and map of VTable uses.
4143  if (!VTableUses.empty()) {
4144    unsigned Idx = 0;
4145    for (unsigned I = 0, N = VTableUses[Idx++]; I != N; ++I) {
4146      CXXRecordDecl *Class = cast<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
4147      SourceLocation Loc = ReadSourceLocation(F, VTableUses, Idx);
4148      bool DefinitionRequired = VTableUses[Idx++];
4149      SemaObj->VTableUses.push_back(std::make_pair(Class, Loc));
4150      SemaObj->VTablesUsed[Class] = DefinitionRequired;
4151    }
4152  }
4153
4154  if (!FPPragmaOptions.empty()) {
4155    assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
4156    SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
4157  }
4158
4159  if (!OpenCLExtensions.empty()) {
4160    unsigned I = 0;
4161#define OPENCLEXT(nm)  SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
4162#include "clang/Basic/OpenCLExtensions.def"
4163
4164    assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
4165  }
4166}
4167
4168IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
4169  // Try to find this name within our on-disk hash tables. We start with the
4170  // most recent one, since that one contains the most up-to-date info.
4171  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4172    ASTIdentifierLookupTable *IdTable
4173        = (ASTIdentifierLookupTable *)Chain[I]->IdentifierLookupTable;
4174    if (!IdTable)
4175      continue;
4176    std::pair<const char*, unsigned> Key(NameStart, NameEnd - NameStart);
4177    ASTIdentifierLookupTable::iterator Pos = IdTable->find(Key);
4178    if (Pos == IdTable->end())
4179      continue;
4180
4181    // Dereferencing the iterator has the effect of building the
4182    // IdentifierInfo node and populating it with the various
4183    // declarations it needs.
4184    return *Pos;
4185  }
4186  return 0;
4187}
4188
4189namespace clang {
4190  /// \brief An identifier-lookup iterator that enumerates all of the
4191  /// identifiers stored within a set of AST files.
4192  class ASTIdentifierIterator : public IdentifierIterator {
4193    /// \brief The AST reader whose identifiers are being enumerated.
4194    const ASTReader &Reader;
4195
4196    /// \brief The current index into the chain of AST files stored in
4197    /// the AST reader.
4198    unsigned Index;
4199
4200    /// \brief The current position within the identifier lookup table
4201    /// of the current AST file.
4202    ASTIdentifierLookupTable::key_iterator Current;
4203
4204    /// \brief The end position within the identifier lookup table of
4205    /// the current AST file.
4206    ASTIdentifierLookupTable::key_iterator End;
4207
4208  public:
4209    explicit ASTIdentifierIterator(const ASTReader &Reader);
4210
4211    virtual llvm::StringRef Next();
4212  };
4213}
4214
4215ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
4216  : Reader(Reader), Index(Reader.Chain.size() - 1) {
4217  ASTIdentifierLookupTable *IdTable
4218    = (ASTIdentifierLookupTable *)Reader.Chain[Index]->IdentifierLookupTable;
4219  Current = IdTable->key_begin();
4220  End = IdTable->key_end();
4221}
4222
4223llvm::StringRef ASTIdentifierIterator::Next() {
4224  while (Current == End) {
4225    // If we have exhausted all of our AST files, we're done.
4226    if (Index == 0)
4227      return llvm::StringRef();
4228
4229    --Index;
4230    ASTIdentifierLookupTable *IdTable
4231      = (ASTIdentifierLookupTable *)Reader.Chain[Index]->IdentifierLookupTable;
4232    Current = IdTable->key_begin();
4233    End = IdTable->key_end();
4234  }
4235
4236  // We have any identifiers remaining in the current AST file; return
4237  // the next one.
4238  std::pair<const char*, unsigned> Key = *Current;
4239  ++Current;
4240  return llvm::StringRef(Key.first, Key.second);
4241}
4242
4243IdentifierIterator *ASTReader::getIdentifiers() const {
4244  return new ASTIdentifierIterator(*this);
4245}
4246
4247std::pair<ObjCMethodList, ObjCMethodList>
4248ASTReader::ReadMethodPool(Selector Sel) {
4249  // Find this selector in a hash table. We want to find the most recent entry.
4250  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4251    PerFileData &F = *Chain[I];
4252    if (!F.SelectorLookupTable)
4253      continue;
4254
4255    ASTSelectorLookupTable *PoolTable
4256      = (ASTSelectorLookupTable*)F.SelectorLookupTable;
4257    ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
4258    if (Pos != PoolTable->end()) {
4259      ++NumSelectorsRead;
4260      // FIXME: Not quite happy with the statistics here. We probably should
4261      // disable this tracking when called via LoadSelector.
4262      // Also, should entries without methods count as misses?
4263      ++NumMethodPoolEntriesRead;
4264      ASTSelectorLookupTrait::data_type Data = *Pos;
4265      if (DeserializationListener)
4266        DeserializationListener->SelectorRead(Data.ID, Sel);
4267      return std::make_pair(Data.Instance, Data.Factory);
4268    }
4269  }
4270
4271  ++NumMethodPoolMisses;
4272  return std::pair<ObjCMethodList, ObjCMethodList>();
4273}
4274
4275void ASTReader::LoadSelector(Selector Sel) {
4276  // It would be complicated to avoid reading the methods anyway. So don't.
4277  ReadMethodPool(Sel);
4278}
4279
4280void ASTReader::SetIdentifierInfo(unsigned ID, IdentifierInfo *II) {
4281  assert(ID && "Non-zero identifier ID required");
4282  assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
4283  IdentifiersLoaded[ID - 1] = II;
4284  if (DeserializationListener)
4285    DeserializationListener->IdentifierRead(ID, II);
4286}
4287
4288/// \brief Set the globally-visible declarations associated with the given
4289/// identifier.
4290///
4291/// If the AST reader is currently in a state where the given declaration IDs
4292/// cannot safely be resolved, they are queued until it is safe to resolve
4293/// them.
4294///
4295/// \param II an IdentifierInfo that refers to one or more globally-visible
4296/// declarations.
4297///
4298/// \param DeclIDs the set of declaration IDs with the name @p II that are
4299/// visible at global scope.
4300///
4301/// \param Nonrecursive should be true to indicate that the caller knows that
4302/// this call is non-recursive, and therefore the globally-visible declarations
4303/// will not be placed onto the pending queue.
4304void
4305ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
4306                              const llvm::SmallVectorImpl<uint32_t> &DeclIDs,
4307                                   bool Nonrecursive) {
4308  if (NumCurrentElementsDeserializing && !Nonrecursive) {
4309    PendingIdentifierInfos.push_back(PendingIdentifierInfo());
4310    PendingIdentifierInfo &PII = PendingIdentifierInfos.back();
4311    PII.II = II;
4312    PII.DeclIDs.append(DeclIDs.begin(), DeclIDs.end());
4313    return;
4314  }
4315
4316  for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
4317    NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
4318    if (SemaObj) {
4319      if (SemaObj->TUScope) {
4320        // Introduce this declaration into the translation-unit scope
4321        // and add it to the declaration chain for this identifier, so
4322        // that (unqualified) name lookup will find it.
4323        SemaObj->TUScope->AddDecl(D);
4324      }
4325      SemaObj->IdResolver.AddDeclToIdentifierChain(II, D);
4326    } else {
4327      // Queue this declaration so that it will be added to the
4328      // translation unit scope and identifier's declaration chain
4329      // once a Sema object is known.
4330      PreloadedDecls.push_back(D);
4331    }
4332  }
4333}
4334
4335IdentifierInfo *ASTReader::DecodeIdentifierInfo(unsigned ID) {
4336  if (ID == 0)
4337    return 0;
4338
4339  if (IdentifiersLoaded.empty()) {
4340    Error("no identifier table in AST file");
4341    return 0;
4342  }
4343
4344  assert(PP && "Forgot to set Preprocessor ?");
4345  ID -= 1;
4346  if (!IdentifiersLoaded[ID]) {
4347    unsigned Index = ID;
4348    const char *Str = 0;
4349    for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4350      PerFileData *F = Chain[N - I - 1];
4351      if (Index < F->LocalNumIdentifiers) {
4352         uint32_t Offset = F->IdentifierOffsets[Index];
4353         Str = F->IdentifierTableData + Offset;
4354         break;
4355      }
4356      Index -= F->LocalNumIdentifiers;
4357    }
4358    assert(Str && "Broken Chain");
4359
4360    // All of the strings in the AST file are preceded by a 16-bit length.
4361    // Extract that 16-bit length to avoid having to execute strlen().
4362    // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
4363    //  unsigned integers.  This is important to avoid integer overflow when
4364    //  we cast them to 'unsigned'.
4365    const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
4366    unsigned StrLen = (((unsigned) StrLenPtr[0])
4367                       | (((unsigned) StrLenPtr[1]) << 8)) - 1;
4368    IdentifiersLoaded[ID]
4369      = &PP->getIdentifierTable().get(Str, StrLen);
4370    if (DeserializationListener)
4371      DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
4372  }
4373
4374  return IdentifiersLoaded[ID];
4375}
4376
4377void ASTReader::ReadSLocEntry(unsigned ID) {
4378  ReadSLocEntryRecord(ID);
4379}
4380
4381Selector ASTReader::DecodeSelector(unsigned ID) {
4382  if (ID == 0)
4383    return Selector();
4384
4385  if (ID > SelectorsLoaded.size()) {
4386    Error("selector ID out of range in AST file");
4387    return Selector();
4388  }
4389
4390  if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) {
4391    // Load this selector from the selector table.
4392    unsigned Idx = ID - 1;
4393    for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4394      PerFileData &F = *Chain[N - I - 1];
4395      if (Idx < F.LocalNumSelectors) {
4396        ASTSelectorLookupTrait Trait(*this);
4397        SelectorsLoaded[ID - 1] =
4398           Trait.ReadKey(F.SelectorLookupTableData + F.SelectorOffsets[Idx], 0);
4399        if (DeserializationListener)
4400          DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
4401        break;
4402      }
4403      Idx -= F.LocalNumSelectors;
4404    }
4405  }
4406
4407  return SelectorsLoaded[ID - 1];
4408}
4409
4410Selector ASTReader::GetExternalSelector(uint32_t ID) {
4411  return DecodeSelector(ID);
4412}
4413
4414uint32_t ASTReader::GetNumExternalSelectors() {
4415  // ID 0 (the null selector) is considered an external selector.
4416  return getTotalNumSelectors() + 1;
4417}
4418
4419DeclarationName
4420ASTReader::ReadDeclarationName(const RecordData &Record, unsigned &Idx) {
4421  DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
4422  switch (Kind) {
4423  case DeclarationName::Identifier:
4424    return DeclarationName(GetIdentifierInfo(Record, Idx));
4425
4426  case DeclarationName::ObjCZeroArgSelector:
4427  case DeclarationName::ObjCOneArgSelector:
4428  case DeclarationName::ObjCMultiArgSelector:
4429    return DeclarationName(GetSelector(Record, Idx));
4430
4431  case DeclarationName::CXXConstructorName:
4432    return Context->DeclarationNames.getCXXConstructorName(
4433                          Context->getCanonicalType(GetType(Record[Idx++])));
4434
4435  case DeclarationName::CXXDestructorName:
4436    return Context->DeclarationNames.getCXXDestructorName(
4437                          Context->getCanonicalType(GetType(Record[Idx++])));
4438
4439  case DeclarationName::CXXConversionFunctionName:
4440    return Context->DeclarationNames.getCXXConversionFunctionName(
4441                          Context->getCanonicalType(GetType(Record[Idx++])));
4442
4443  case DeclarationName::CXXOperatorName:
4444    return Context->DeclarationNames.getCXXOperatorName(
4445                                       (OverloadedOperatorKind)Record[Idx++]);
4446
4447  case DeclarationName::CXXLiteralOperatorName:
4448    return Context->DeclarationNames.getCXXLiteralOperatorName(
4449                                       GetIdentifierInfo(Record, Idx));
4450
4451  case DeclarationName::CXXUsingDirective:
4452    return DeclarationName::getUsingDirectiveName();
4453  }
4454
4455  // Required to silence GCC warning
4456  return DeclarationName();
4457}
4458
4459void ASTReader::ReadDeclarationNameLoc(PerFileData &F,
4460                                       DeclarationNameLoc &DNLoc,
4461                                       DeclarationName Name,
4462                                      const RecordData &Record, unsigned &Idx) {
4463  switch (Name.getNameKind()) {
4464  case DeclarationName::CXXConstructorName:
4465  case DeclarationName::CXXDestructorName:
4466  case DeclarationName::CXXConversionFunctionName:
4467    DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
4468    break;
4469
4470  case DeclarationName::CXXOperatorName:
4471    DNLoc.CXXOperatorName.BeginOpNameLoc
4472        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
4473    DNLoc.CXXOperatorName.EndOpNameLoc
4474        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
4475    break;
4476
4477  case DeclarationName::CXXLiteralOperatorName:
4478    DNLoc.CXXLiteralOperatorName.OpNameLoc
4479        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
4480    break;
4481
4482  case DeclarationName::Identifier:
4483  case DeclarationName::ObjCZeroArgSelector:
4484  case DeclarationName::ObjCOneArgSelector:
4485  case DeclarationName::ObjCMultiArgSelector:
4486  case DeclarationName::CXXUsingDirective:
4487    break;
4488  }
4489}
4490
4491void ASTReader::ReadDeclarationNameInfo(PerFileData &F,
4492                                        DeclarationNameInfo &NameInfo,
4493                                      const RecordData &Record, unsigned &Idx) {
4494  NameInfo.setName(ReadDeclarationName(Record, Idx));
4495  NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
4496  DeclarationNameLoc DNLoc;
4497  ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
4498  NameInfo.setInfo(DNLoc);
4499}
4500
4501void ASTReader::ReadQualifierInfo(PerFileData &F, QualifierInfo &Info,
4502                                  const RecordData &Record, unsigned &Idx) {
4503  Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
4504  unsigned NumTPLists = Record[Idx++];
4505  Info.NumTemplParamLists = NumTPLists;
4506  if (NumTPLists) {
4507    Info.TemplParamLists = new (*Context) TemplateParameterList*[NumTPLists];
4508    for (unsigned i=0; i != NumTPLists; ++i)
4509      Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
4510  }
4511}
4512
4513TemplateName
4514ASTReader::ReadTemplateName(PerFileData &F, const RecordData &Record,
4515                            unsigned &Idx) {
4516  TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
4517  switch (Kind) {
4518  case TemplateName::Template:
4519    return TemplateName(cast_or_null<TemplateDecl>(GetDecl(Record[Idx++])));
4520
4521  case TemplateName::OverloadedTemplate: {
4522    unsigned size = Record[Idx++];
4523    UnresolvedSet<8> Decls;
4524    while (size--)
4525      Decls.addDecl(cast<NamedDecl>(GetDecl(Record[Idx++])));
4526
4527    return Context->getOverloadedTemplateName(Decls.begin(), Decls.end());
4528  }
4529
4530  case TemplateName::QualifiedTemplate: {
4531    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
4532    bool hasTemplKeyword = Record[Idx++];
4533    TemplateDecl *Template = cast<TemplateDecl>(GetDecl(Record[Idx++]));
4534    return Context->getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
4535  }
4536
4537  case TemplateName::DependentTemplate: {
4538    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
4539    if (Record[Idx++])  // isIdentifier
4540      return Context->getDependentTemplateName(NNS,
4541                                               GetIdentifierInfo(Record, Idx));
4542    return Context->getDependentTemplateName(NNS,
4543                                         (OverloadedOperatorKind)Record[Idx++]);
4544  }
4545
4546  case TemplateName::SubstTemplateTemplateParmPack: {
4547    TemplateTemplateParmDecl *Param
4548      = cast_or_null<TemplateTemplateParmDecl>(GetDecl(Record[Idx++]));
4549    if (!Param)
4550      return TemplateName();
4551
4552    TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
4553    if (ArgPack.getKind() != TemplateArgument::Pack)
4554      return TemplateName();
4555
4556    return Context->getSubstTemplateTemplateParmPack(Param, ArgPack);
4557  }
4558  }
4559
4560  assert(0 && "Unhandled template name kind!");
4561  return TemplateName();
4562}
4563
4564TemplateArgument
4565ASTReader::ReadTemplateArgument(PerFileData &F,
4566                                const RecordData &Record, unsigned &Idx) {
4567  TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
4568  switch (Kind) {
4569  case TemplateArgument::Null:
4570    return TemplateArgument();
4571  case TemplateArgument::Type:
4572    return TemplateArgument(GetType(Record[Idx++]));
4573  case TemplateArgument::Declaration:
4574    return TemplateArgument(GetDecl(Record[Idx++]));
4575  case TemplateArgument::Integral: {
4576    llvm::APSInt Value = ReadAPSInt(Record, Idx);
4577    QualType T = GetType(Record[Idx++]);
4578    return TemplateArgument(Value, T);
4579  }
4580  case TemplateArgument::Template:
4581    return TemplateArgument(ReadTemplateName(F, Record, Idx));
4582  case TemplateArgument::TemplateExpansion: {
4583    TemplateName Name = ReadTemplateName(F, Record, Idx);
4584    llvm::Optional<unsigned> NumTemplateExpansions;
4585    if (unsigned NumExpansions = Record[Idx++])
4586      NumTemplateExpansions = NumExpansions - 1;
4587    return TemplateArgument(Name, NumTemplateExpansions);
4588  }
4589  case TemplateArgument::Expression:
4590    return TemplateArgument(ReadExpr(F));
4591  case TemplateArgument::Pack: {
4592    unsigned NumArgs = Record[Idx++];
4593    TemplateArgument *Args = new (*Context) TemplateArgument[NumArgs];
4594    for (unsigned I = 0; I != NumArgs; ++I)
4595      Args[I] = ReadTemplateArgument(F, Record, Idx);
4596    return TemplateArgument(Args, NumArgs);
4597  }
4598  }
4599
4600  assert(0 && "Unhandled template argument kind!");
4601  return TemplateArgument();
4602}
4603
4604TemplateParameterList *
4605ASTReader::ReadTemplateParameterList(PerFileData &F,
4606                                     const RecordData &Record, unsigned &Idx) {
4607  SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
4608  SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
4609  SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
4610
4611  unsigned NumParams = Record[Idx++];
4612  llvm::SmallVector<NamedDecl *, 16> Params;
4613  Params.reserve(NumParams);
4614  while (NumParams--)
4615    Params.push_back(cast<NamedDecl>(GetDecl(Record[Idx++])));
4616
4617  TemplateParameterList* TemplateParams =
4618    TemplateParameterList::Create(*Context, TemplateLoc, LAngleLoc,
4619                                  Params.data(), Params.size(), RAngleLoc);
4620  return TemplateParams;
4621}
4622
4623void
4624ASTReader::
4625ReadTemplateArgumentList(llvm::SmallVector<TemplateArgument, 8> &TemplArgs,
4626                         PerFileData &F, const RecordData &Record,
4627                         unsigned &Idx) {
4628  unsigned NumTemplateArgs = Record[Idx++];
4629  TemplArgs.reserve(NumTemplateArgs);
4630  while (NumTemplateArgs--)
4631    TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
4632}
4633
4634/// \brief Read a UnresolvedSet structure.
4635void ASTReader::ReadUnresolvedSet(UnresolvedSetImpl &Set,
4636                                  const RecordData &Record, unsigned &Idx) {
4637  unsigned NumDecls = Record[Idx++];
4638  while (NumDecls--) {
4639    NamedDecl *D = cast<NamedDecl>(GetDecl(Record[Idx++]));
4640    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
4641    Set.addDecl(D, AS);
4642  }
4643}
4644
4645CXXBaseSpecifier
4646ASTReader::ReadCXXBaseSpecifier(PerFileData &F,
4647                                const RecordData &Record, unsigned &Idx) {
4648  bool isVirtual = static_cast<bool>(Record[Idx++]);
4649  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
4650  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
4651  bool inheritConstructors = static_cast<bool>(Record[Idx++]);
4652  TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
4653  SourceRange Range = ReadSourceRange(F, Record, Idx);
4654  SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
4655  CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
4656                          EllipsisLoc);
4657  Result.setInheritConstructors(inheritConstructors);
4658  return Result;
4659}
4660
4661std::pair<CXXCtorInitializer **, unsigned>
4662ASTReader::ReadCXXCtorInitializers(PerFileData &F, const RecordData &Record,
4663                                   unsigned &Idx) {
4664  CXXCtorInitializer **CtorInitializers = 0;
4665  unsigned NumInitializers = Record[Idx++];
4666  if (NumInitializers) {
4667    ASTContext &C = *getContext();
4668
4669    CtorInitializers
4670        = new (C) CXXCtorInitializer*[NumInitializers];
4671    for (unsigned i=0; i != NumInitializers; ++i) {
4672      TypeSourceInfo *BaseClassInfo = 0;
4673      bool IsBaseVirtual = false;
4674      FieldDecl *Member = 0;
4675      IndirectFieldDecl *IndirectMember = 0;
4676
4677      bool IsBaseInitializer = Record[Idx++];
4678      if (IsBaseInitializer) {
4679        BaseClassInfo = GetTypeSourceInfo(F, Record, Idx);
4680        IsBaseVirtual = Record[Idx++];
4681      } else {
4682        bool IsIndirectMemberInitializer = Record[Idx++];
4683        if (IsIndirectMemberInitializer)
4684          IndirectMember = cast<IndirectFieldDecl>(GetDecl(Record[Idx++]));
4685        else
4686          Member = cast<FieldDecl>(GetDecl(Record[Idx++]));
4687      }
4688      SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
4689      Expr *Init = ReadExpr(F);
4690      SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
4691      SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
4692      bool IsWritten = Record[Idx++];
4693      unsigned SourceOrderOrNumArrayIndices;
4694      llvm::SmallVector<VarDecl *, 8> Indices;
4695      if (IsWritten) {
4696        SourceOrderOrNumArrayIndices = Record[Idx++];
4697      } else {
4698        SourceOrderOrNumArrayIndices = Record[Idx++];
4699        Indices.reserve(SourceOrderOrNumArrayIndices);
4700        for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
4701          Indices.push_back(cast<VarDecl>(GetDecl(Record[Idx++])));
4702      }
4703
4704      CXXCtorInitializer *BOMInit;
4705      if (IsBaseInitializer) {
4706        BOMInit = new (C) CXXCtorInitializer(C, BaseClassInfo, IsBaseVirtual,
4707                                             LParenLoc, Init, RParenLoc,
4708                                             MemberOrEllipsisLoc);
4709      } else if (IsWritten) {
4710        if (Member)
4711          BOMInit = new (C) CXXCtorInitializer(C, Member, MemberOrEllipsisLoc,
4712                                               LParenLoc, Init, RParenLoc);
4713        else
4714          BOMInit = new (C) CXXCtorInitializer(C, IndirectMember,
4715                                               MemberOrEllipsisLoc, LParenLoc,
4716                                               Init, RParenLoc);
4717      } else {
4718        BOMInit = CXXCtorInitializer::Create(C, Member, MemberOrEllipsisLoc,
4719                                             LParenLoc, Init, RParenLoc,
4720                                             Indices.data(), Indices.size());
4721      }
4722
4723      if (IsWritten)
4724        BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
4725      CtorInitializers[i] = BOMInit;
4726    }
4727  }
4728
4729  return std::make_pair(CtorInitializers, NumInitializers);
4730}
4731
4732NestedNameSpecifier *
4733ASTReader::ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx) {
4734  unsigned N = Record[Idx++];
4735  NestedNameSpecifier *NNS = 0, *Prev = 0;
4736  for (unsigned I = 0; I != N; ++I) {
4737    NestedNameSpecifier::SpecifierKind Kind
4738      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
4739    switch (Kind) {
4740    case NestedNameSpecifier::Identifier: {
4741      IdentifierInfo *II = GetIdentifierInfo(Record, Idx);
4742      NNS = NestedNameSpecifier::Create(*Context, Prev, II);
4743      break;
4744    }
4745
4746    case NestedNameSpecifier::Namespace: {
4747      NamespaceDecl *NS = cast<NamespaceDecl>(GetDecl(Record[Idx++]));
4748      NNS = NestedNameSpecifier::Create(*Context, Prev, NS);
4749      break;
4750    }
4751
4752    case NestedNameSpecifier::NamespaceAlias: {
4753      NamespaceAliasDecl *Alias
4754        = cast<NamespaceAliasDecl>(GetDecl(Record[Idx++]));
4755      NNS = NestedNameSpecifier::Create(*Context, Prev, Alias);
4756      break;
4757    }
4758
4759    case NestedNameSpecifier::TypeSpec:
4760    case NestedNameSpecifier::TypeSpecWithTemplate: {
4761      const Type *T = GetType(Record[Idx++]).getTypePtrOrNull();
4762      if (!T)
4763        return 0;
4764
4765      bool Template = Record[Idx++];
4766      NNS = NestedNameSpecifier::Create(*Context, Prev, Template, T);
4767      break;
4768    }
4769
4770    case NestedNameSpecifier::Global: {
4771      NNS = NestedNameSpecifier::GlobalSpecifier(*Context);
4772      // No associated value, and there can't be a prefix.
4773      break;
4774    }
4775    }
4776    Prev = NNS;
4777  }
4778  return NNS;
4779}
4780
4781NestedNameSpecifierLoc
4782ASTReader::ReadNestedNameSpecifierLoc(PerFileData &F, const RecordData &Record,
4783                                      unsigned &Idx) {
4784  unsigned N = Record[Idx++];
4785  NestedNameSpecifierLocBuilder Builder;
4786  for (unsigned I = 0; I != N; ++I) {
4787    NestedNameSpecifier::SpecifierKind Kind
4788      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
4789    switch (Kind) {
4790    case NestedNameSpecifier::Identifier: {
4791      IdentifierInfo *II = GetIdentifierInfo(Record, Idx);
4792      SourceRange Range = ReadSourceRange(F, Record, Idx);
4793      Builder.Extend(*Context, II, Range.getBegin(), Range.getEnd());
4794      break;
4795    }
4796
4797    case NestedNameSpecifier::Namespace: {
4798      NamespaceDecl *NS = cast<NamespaceDecl>(GetDecl(Record[Idx++]));
4799      SourceRange Range = ReadSourceRange(F, Record, Idx);
4800      Builder.Extend(*Context, NS, Range.getBegin(), Range.getEnd());
4801      break;
4802    }
4803
4804    case NestedNameSpecifier::NamespaceAlias: {
4805      NamespaceAliasDecl *Alias
4806        = cast<NamespaceAliasDecl>(GetDecl(Record[Idx++]));
4807      SourceRange Range = ReadSourceRange(F, Record, Idx);
4808      Builder.Extend(*Context, Alias, Range.getBegin(), Range.getEnd());
4809      break;
4810    }
4811
4812    case NestedNameSpecifier::TypeSpec:
4813    case NestedNameSpecifier::TypeSpecWithTemplate: {
4814      bool Template = Record[Idx++];
4815      TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
4816      if (!T)
4817        return NestedNameSpecifierLoc();
4818      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
4819
4820      // FIXME: 'template' keyword location not saved anywhere, so we fake it.
4821      Builder.Extend(*Context,
4822                     Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
4823                     T->getTypeLoc(), ColonColonLoc);
4824      break;
4825    }
4826
4827    case NestedNameSpecifier::Global: {
4828      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
4829      Builder.MakeGlobal(*Context, ColonColonLoc);
4830      break;
4831    }
4832    }
4833  }
4834
4835  return Builder.getWithLocInContext(*Context);
4836}
4837
4838SourceRange
4839ASTReader::ReadSourceRange(PerFileData &F, const RecordData &Record,
4840                           unsigned &Idx) {
4841  SourceLocation beg = ReadSourceLocation(F, Record, Idx);
4842  SourceLocation end = ReadSourceLocation(F, Record, Idx);
4843  return SourceRange(beg, end);
4844}
4845
4846/// \brief Read an integral value
4847llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
4848  unsigned BitWidth = Record[Idx++];
4849  unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
4850  llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
4851  Idx += NumWords;
4852  return Result;
4853}
4854
4855/// \brief Read a signed integral value
4856llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
4857  bool isUnsigned = Record[Idx++];
4858  return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
4859}
4860
4861/// \brief Read a floating-point value
4862llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, unsigned &Idx) {
4863  return llvm::APFloat(ReadAPInt(Record, Idx));
4864}
4865
4866// \brief Read a string
4867std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
4868  unsigned Len = Record[Idx++];
4869  std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
4870  Idx += Len;
4871  return Result;
4872}
4873
4874VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
4875                                         unsigned &Idx) {
4876  unsigned Major = Record[Idx++];
4877  unsigned Minor = Record[Idx++];
4878  unsigned Subminor = Record[Idx++];
4879  if (Minor == 0)
4880    return VersionTuple(Major);
4881  if (Subminor == 0)
4882    return VersionTuple(Major, Minor - 1);
4883  return VersionTuple(Major, Minor - 1, Subminor - 1);
4884}
4885
4886CXXTemporary *ASTReader::ReadCXXTemporary(const RecordData &Record,
4887                                          unsigned &Idx) {
4888  CXXDestructorDecl *Decl = cast<CXXDestructorDecl>(GetDecl(Record[Idx++]));
4889  return CXXTemporary::Create(*Context, Decl);
4890}
4891
4892DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
4893  return Diag(SourceLocation(), DiagID);
4894}
4895
4896DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
4897  return Diags.Report(Loc, DiagID);
4898}
4899
4900/// \brief Retrieve the identifier table associated with the
4901/// preprocessor.
4902IdentifierTable &ASTReader::getIdentifierTable() {
4903  assert(PP && "Forgot to set Preprocessor ?");
4904  return PP->getIdentifierTable();
4905}
4906
4907/// \brief Record that the given ID maps to the given switch-case
4908/// statement.
4909void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
4910  assert(SwitchCaseStmts[ID] == 0 && "Already have a SwitchCase with this ID");
4911  SwitchCaseStmts[ID] = SC;
4912}
4913
4914/// \brief Retrieve the switch-case statement with the given ID.
4915SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
4916  assert(SwitchCaseStmts[ID] != 0 && "No SwitchCase with this ID");
4917  return SwitchCaseStmts[ID];
4918}
4919
4920void ASTReader::ClearSwitchCaseIDs() {
4921  SwitchCaseStmts.clear();
4922}
4923
4924void ASTReader::FinishedDeserializing() {
4925  assert(NumCurrentElementsDeserializing &&
4926         "FinishedDeserializing not paired with StartedDeserializing");
4927  if (NumCurrentElementsDeserializing == 1) {
4928    // If any identifiers with corresponding top-level declarations have
4929    // been loaded, load those declarations now.
4930    while (!PendingIdentifierInfos.empty()) {
4931      SetGloballyVisibleDecls(PendingIdentifierInfos.front().II,
4932                              PendingIdentifierInfos.front().DeclIDs, true);
4933      PendingIdentifierInfos.pop_front();
4934    }
4935
4936    // Ready to load previous declarations of Decls that were delayed.
4937    while (!PendingPreviousDecls.empty()) {
4938      loadAndAttachPreviousDecl(PendingPreviousDecls.front().first,
4939                                PendingPreviousDecls.front().second);
4940      PendingPreviousDecls.pop_front();
4941    }
4942
4943    // We are not in recursive loading, so it's safe to pass the "interesting"
4944    // decls to the consumer.
4945    if (Consumer)
4946      PassInterestingDeclsToConsumer();
4947
4948    assert(PendingForwardRefs.size() == 0 &&
4949           "Some forward refs did not get linked to the definition!");
4950  }
4951  --NumCurrentElementsDeserializing;
4952}
4953
4954ASTReader::ASTReader(Preprocessor &PP, ASTContext *Context,
4955                     const char *isysroot, bool DisableValidation,
4956                     bool DisableStatCache)
4957  : Listener(new PCHValidator(PP, *this)), DeserializationListener(0),
4958    SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
4959    Diags(PP.getDiagnostics()), SemaObj(0), PP(&PP), Context(Context),
4960    Consumer(0), isysroot(isysroot), DisableValidation(DisableValidation),
4961    DisableStatCache(DisableStatCache), NumStatHits(0), NumStatMisses(0),
4962    NumSLocEntriesRead(0), TotalNumSLocEntries(0), NextSLocOffset(0),
4963    NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0),
4964    TotalNumMacros(0), NumSelectorsRead(0), NumMethodPoolEntriesRead(0),
4965    NumMethodPoolMisses(0), TotalNumMethodPoolEntries(0),
4966    NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
4967    NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
4968    NumCurrentElementsDeserializing(0)
4969{
4970  RelocatablePCH = false;
4971}
4972
4973ASTReader::ASTReader(SourceManager &SourceMgr, FileManager &FileMgr,
4974                     Diagnostic &Diags, const char *isysroot,
4975                     bool DisableValidation, bool DisableStatCache)
4976  : DeserializationListener(0), SourceMgr(SourceMgr), FileMgr(FileMgr),
4977    Diags(Diags), SemaObj(0), PP(0), Context(0), Consumer(0),
4978    isysroot(isysroot), DisableValidation(DisableValidation),
4979    DisableStatCache(DisableStatCache), NumStatHits(0), NumStatMisses(0),
4980    NumSLocEntriesRead(0), TotalNumSLocEntries(0),
4981    NextSLocOffset(0), NumStatementsRead(0), TotalNumStatements(0),
4982    NumMacrosRead(0), TotalNumMacros(0), NumSelectorsRead(0),
4983    NumMethodPoolEntriesRead(0), NumMethodPoolMisses(0),
4984    TotalNumMethodPoolEntries(0), NumLexicalDeclContextsRead(0),
4985    TotalLexicalDeclContexts(0), NumVisibleDeclContextsRead(0),
4986    TotalVisibleDeclContexts(0), NumCurrentElementsDeserializing(0) {
4987  RelocatablePCH = false;
4988}
4989
4990ASTReader::~ASTReader() {
4991  for (unsigned i = 0, e = Chain.size(); i != e; ++i)
4992    delete Chain[e - i - 1];
4993  // Delete all visible decl lookup tables
4994  for (DeclContextOffsetsMap::iterator I = DeclContextOffsets.begin(),
4995                                       E = DeclContextOffsets.end();
4996       I != E; ++I) {
4997    for (DeclContextInfos::iterator J = I->second.begin(), F = I->second.end();
4998         J != F; ++J) {
4999      if (J->NameLookupTableData)
5000        delete static_cast<ASTDeclContextNameLookupTable*>(
5001            J->NameLookupTableData);
5002    }
5003  }
5004  for (DeclContextVisibleUpdatesPending::iterator
5005           I = PendingVisibleUpdates.begin(),
5006           E = PendingVisibleUpdates.end();
5007       I != E; ++I) {
5008    for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
5009                                             F = I->second.end();
5010         J != F; ++J)
5011      delete static_cast<ASTDeclContextNameLookupTable*>(*J);
5012  }
5013}
5014
5015ASTReader::PerFileData::PerFileData(ASTFileType Ty)
5016  : Type(Ty), SizeInBits(0), LocalNumSLocEntries(0), SLocOffsets(0), LocalSLocSize(0),
5017    LocalNumIdentifiers(0), IdentifierOffsets(0), IdentifierTableData(0),
5018    IdentifierLookupTable(0), LocalNumMacroDefinitions(0),
5019    MacroDefinitionOffsets(0),
5020    LocalNumHeaderFileInfos(0), HeaderFileInfoTableData(0),
5021    HeaderFileInfoTable(0),
5022    LocalNumSelectors(0), SelectorOffsets(0),
5023    SelectorLookupTableData(0), SelectorLookupTable(0), LocalNumDecls(0),
5024    DeclOffsets(0), LocalNumCXXBaseSpecifiers(0), CXXBaseSpecifiersOffsets(0),
5025    LocalNumTypes(0), TypeOffsets(0), StatCache(0),
5026    NumPreallocatedPreprocessingEntities(0), NextInSource(0)
5027{}
5028
5029ASTReader::PerFileData::~PerFileData() {
5030  delete static_cast<ASTIdentifierLookupTable *>(IdentifierLookupTable);
5031  delete static_cast<HeaderFileInfoLookupTable *>(HeaderFileInfoTable);
5032  delete static_cast<ASTSelectorLookupTable *>(SelectorLookupTable);
5033}
5034