ASTReader.cpp revision ad762fcdc16b9e4705b12b09d92b8c026212b906
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.back());
2467    ASTBuffers.pop_back();
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  if (unsigned AutoDeduct = SpecialTypes[SPECIAL_TYPE_AUTO_DEDUCT])
2680    Context->AutoDeductTy = GetType(AutoDeduct);
2681  if (unsigned AutoRRefDeduct = SpecialTypes[SPECIAL_TYPE_AUTO_RREF_DEDUCT])
2682    Context->AutoRRefDeductTy = GetType(AutoRRefDeduct);
2683
2684  ReadPragmaDiagnosticMappings(Context->getDiagnostics());
2685
2686  // If there were any CUDA special declarations, deserialize them.
2687  if (!CUDASpecialDeclRefs.empty()) {
2688    assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
2689    Context->setcudaConfigureCallDecl(
2690                           cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
2691  }
2692}
2693
2694/// \brief Retrieve the name of the original source file name
2695/// directly from the AST file, without actually loading the AST
2696/// file.
2697std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
2698                                             FileManager &FileMgr,
2699                                             Diagnostic &Diags) {
2700  // Open the AST file.
2701  std::string ErrStr;
2702  llvm::OwningPtr<llvm::MemoryBuffer> Buffer;
2703  Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
2704  if (!Buffer) {
2705    Diags.Report(diag::err_fe_unable_to_read_pch_file) << ErrStr;
2706    return std::string();
2707  }
2708
2709  // Initialize the stream
2710  llvm::BitstreamReader StreamFile;
2711  llvm::BitstreamCursor Stream;
2712  StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
2713                  (const unsigned char *)Buffer->getBufferEnd());
2714  Stream.init(StreamFile);
2715
2716  // Sniff for the signature.
2717  if (Stream.Read(8) != 'C' ||
2718      Stream.Read(8) != 'P' ||
2719      Stream.Read(8) != 'C' ||
2720      Stream.Read(8) != 'H') {
2721    Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
2722    return std::string();
2723  }
2724
2725  RecordData Record;
2726  while (!Stream.AtEndOfStream()) {
2727    unsigned Code = Stream.ReadCode();
2728
2729    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
2730      unsigned BlockID = Stream.ReadSubBlockID();
2731
2732      // We only know the AST subblock ID.
2733      switch (BlockID) {
2734      case AST_BLOCK_ID:
2735        if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2736          Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
2737          return std::string();
2738        }
2739        break;
2740
2741      default:
2742        if (Stream.SkipBlock()) {
2743          Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
2744          return std::string();
2745        }
2746        break;
2747      }
2748      continue;
2749    }
2750
2751    if (Code == llvm::bitc::END_BLOCK) {
2752      if (Stream.ReadBlockEnd()) {
2753        Diags.Report(diag::err_fe_pch_error_at_end_block) << ASTFileName;
2754        return std::string();
2755      }
2756      continue;
2757    }
2758
2759    if (Code == llvm::bitc::DEFINE_ABBREV) {
2760      Stream.ReadAbbrevRecord();
2761      continue;
2762    }
2763
2764    Record.clear();
2765    const char *BlobStart = 0;
2766    unsigned BlobLen = 0;
2767    if (Stream.ReadRecord(Code, Record, &BlobStart, &BlobLen)
2768          == ORIGINAL_FILE_NAME)
2769      return std::string(BlobStart, BlobLen);
2770  }
2771
2772  return std::string();
2773}
2774
2775/// \brief Parse the record that corresponds to a LangOptions data
2776/// structure.
2777///
2778/// This routine parses the language options from the AST file and then gives
2779/// them to the AST listener if one is set.
2780///
2781/// \returns true if the listener deems the file unacceptable, false otherwise.
2782bool ASTReader::ParseLanguageOptions(
2783                             const llvm::SmallVectorImpl<uint64_t> &Record) {
2784  if (Listener) {
2785    LangOptions LangOpts;
2786
2787  #define PARSE_LANGOPT(Option)                  \
2788      LangOpts.Option = Record[Idx];             \
2789      ++Idx
2790
2791    unsigned Idx = 0;
2792    PARSE_LANGOPT(Trigraphs);
2793    PARSE_LANGOPT(BCPLComment);
2794    PARSE_LANGOPT(DollarIdents);
2795    PARSE_LANGOPT(AsmPreprocessor);
2796    PARSE_LANGOPT(GNUMode);
2797    PARSE_LANGOPT(GNUKeywords);
2798    PARSE_LANGOPT(ImplicitInt);
2799    PARSE_LANGOPT(Digraphs);
2800    PARSE_LANGOPT(HexFloats);
2801    PARSE_LANGOPT(C99);
2802    PARSE_LANGOPT(Microsoft);
2803    PARSE_LANGOPT(CPlusPlus);
2804    PARSE_LANGOPT(CPlusPlus0x);
2805    PARSE_LANGOPT(CXXOperatorNames);
2806    PARSE_LANGOPT(ObjC1);
2807    PARSE_LANGOPT(ObjC2);
2808    PARSE_LANGOPT(ObjCNonFragileABI);
2809    PARSE_LANGOPT(ObjCNonFragileABI2);
2810    PARSE_LANGOPT(AppleKext);
2811    PARSE_LANGOPT(ObjCDefaultSynthProperties);
2812    PARSE_LANGOPT(NoConstantCFStrings);
2813    PARSE_LANGOPT(PascalStrings);
2814    PARSE_LANGOPT(WritableStrings);
2815    PARSE_LANGOPT(LaxVectorConversions);
2816    PARSE_LANGOPT(AltiVec);
2817    PARSE_LANGOPT(Exceptions);
2818    PARSE_LANGOPT(ObjCExceptions);
2819    PARSE_LANGOPT(CXXExceptions);
2820    PARSE_LANGOPT(SjLjExceptions);
2821    PARSE_LANGOPT(MSBitfields);
2822    PARSE_LANGOPT(NeXTRuntime);
2823    PARSE_LANGOPT(Freestanding);
2824    PARSE_LANGOPT(NoBuiltin);
2825    PARSE_LANGOPT(ThreadsafeStatics);
2826    PARSE_LANGOPT(POSIXThreads);
2827    PARSE_LANGOPT(Blocks);
2828    PARSE_LANGOPT(EmitAllDecls);
2829    PARSE_LANGOPT(MathErrno);
2830    LangOpts.setSignedOverflowBehavior((LangOptions::SignedOverflowBehaviorTy)
2831                                       Record[Idx++]);
2832    PARSE_LANGOPT(HeinousExtensions);
2833    PARSE_LANGOPT(Optimize);
2834    PARSE_LANGOPT(OptimizeSize);
2835    PARSE_LANGOPT(Static);
2836    PARSE_LANGOPT(PICLevel);
2837    PARSE_LANGOPT(GNUInline);
2838    PARSE_LANGOPT(NoInline);
2839    PARSE_LANGOPT(AccessControl);
2840    PARSE_LANGOPT(CharIsSigned);
2841    PARSE_LANGOPT(ShortWChar);
2842    PARSE_LANGOPT(ShortEnums);
2843    LangOpts.setGCMode((LangOptions::GCMode)Record[Idx++]);
2844    LangOpts.setVisibilityMode((Visibility)Record[Idx++]);
2845    LangOpts.setStackProtectorMode((LangOptions::StackProtectorMode)
2846                                   Record[Idx++]);
2847    PARSE_LANGOPT(InstantiationDepth);
2848    PARSE_LANGOPT(OpenCL);
2849    PARSE_LANGOPT(CUDA);
2850    PARSE_LANGOPT(CatchUndefined);
2851    PARSE_LANGOPT(DefaultFPContract);
2852    PARSE_LANGOPT(ElideConstructors);
2853    PARSE_LANGOPT(SpellChecking);
2854    PARSE_LANGOPT(MRTD);
2855  #undef PARSE_LANGOPT
2856
2857    return Listener->ReadLanguageOptions(LangOpts);
2858  }
2859
2860  return false;
2861}
2862
2863void ASTReader::ReadPreprocessedEntities() {
2864  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2865    PerFileData &F = *Chain[I];
2866    if (!F.PreprocessorDetailCursor.getBitStreamReader())
2867      continue;
2868
2869    SavedStreamPosition SavedPosition(F.PreprocessorDetailCursor);
2870    F.PreprocessorDetailCursor.JumpToBit(F.PreprocessorDetailStartOffset);
2871    while (LoadPreprocessedEntity(F)) { }
2872  }
2873}
2874
2875PreprocessedEntity *ASTReader::ReadPreprocessedEntityAtOffset(uint64_t Offset) {
2876  PerFileData *F = 0;
2877  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2878    if (Offset < Chain[I]->SizeInBits) {
2879      F = Chain[I];
2880      break;
2881    }
2882
2883    Offset -= Chain[I]->SizeInBits;
2884  }
2885
2886  if (!F) {
2887    Error("Malformed preprocessed entity offset");
2888    return 0;
2889  }
2890
2891  // Keep track of where we are in the stream, then jump back there
2892  // after reading this entity.
2893  SavedStreamPosition SavedPosition(F->PreprocessorDetailCursor);
2894  F->PreprocessorDetailCursor.JumpToBit(Offset);
2895  return LoadPreprocessedEntity(*F);
2896}
2897
2898HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
2899  HeaderFileInfoTrait Trait(FE->getName());
2900  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2901    PerFileData &F = *Chain[I];
2902    HeaderFileInfoLookupTable *Table
2903      = static_cast<HeaderFileInfoLookupTable *>(F.HeaderFileInfoTable);
2904    if (!Table)
2905      continue;
2906
2907    // Look in the on-disk hash table for an entry for this file name.
2908    HeaderFileInfoLookupTable::iterator Pos = Table->find(FE->getName(),
2909                                                          &Trait);
2910    if (Pos == Table->end())
2911      continue;
2912
2913    HeaderFileInfo HFI = *Pos;
2914    if (Listener)
2915      Listener->ReadHeaderFileInfo(HFI, FE->getUID());
2916
2917    return HFI;
2918  }
2919
2920  return HeaderFileInfo();
2921}
2922
2923void ASTReader::ReadPragmaDiagnosticMappings(Diagnostic &Diag) {
2924  unsigned Idx = 0;
2925  while (Idx < PragmaDiagMappings.size()) {
2926    SourceLocation
2927      Loc = SourceLocation::getFromRawEncoding(PragmaDiagMappings[Idx++]);
2928    while (1) {
2929      assert(Idx < PragmaDiagMappings.size() &&
2930             "Invalid data, didn't find '-1' marking end of diag/map pairs");
2931      if (Idx >= PragmaDiagMappings.size())
2932        break; // Something is messed up but at least avoid infinite loop in
2933               // release build.
2934      unsigned DiagID = PragmaDiagMappings[Idx++];
2935      if (DiagID == (unsigned)-1)
2936        break; // no more diag/map pairs for this location.
2937      diag::Mapping Map = (diag::Mapping)PragmaDiagMappings[Idx++];
2938      Diag.setDiagnosticMapping(DiagID, Map, Loc);
2939    }
2940  }
2941}
2942
2943/// \brief Get the correct cursor and offset for loading a type.
2944ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
2945  PerFileData *F = 0;
2946  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
2947    F = Chain[N - I - 1];
2948    if (Index < F->LocalNumTypes)
2949      break;
2950    Index -= F->LocalNumTypes;
2951  }
2952  assert(F && F->LocalNumTypes > Index && "Broken chain");
2953  return RecordLocation(F, F->TypeOffsets[Index]);
2954}
2955
2956/// \brief Read and return the type with the given index..
2957///
2958/// The index is the type ID, shifted and minus the number of predefs. This
2959/// routine actually reads the record corresponding to the type at the given
2960/// location. It is a helper routine for GetType, which deals with reading type
2961/// IDs.
2962QualType ASTReader::ReadTypeRecord(unsigned Index) {
2963  RecordLocation Loc = TypeCursorForIndex(Index);
2964  llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
2965
2966  // Keep track of where we are in the stream, then jump back there
2967  // after reading this type.
2968  SavedStreamPosition SavedPosition(DeclsCursor);
2969
2970  ReadingKindTracker ReadingKind(Read_Type, *this);
2971
2972  // Note that we are loading a type record.
2973  Deserializing AType(this);
2974
2975  DeclsCursor.JumpToBit(Loc.Offset);
2976  RecordData Record;
2977  unsigned Code = DeclsCursor.ReadCode();
2978  switch ((TypeCode)DeclsCursor.ReadRecord(Code, Record)) {
2979  case TYPE_EXT_QUAL: {
2980    if (Record.size() != 2) {
2981      Error("Incorrect encoding of extended qualifier type");
2982      return QualType();
2983    }
2984    QualType Base = GetType(Record[0]);
2985    Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[1]);
2986    return Context->getQualifiedType(Base, Quals);
2987  }
2988
2989  case TYPE_COMPLEX: {
2990    if (Record.size() != 1) {
2991      Error("Incorrect encoding of complex type");
2992      return QualType();
2993    }
2994    QualType ElemType = GetType(Record[0]);
2995    return Context->getComplexType(ElemType);
2996  }
2997
2998  case TYPE_POINTER: {
2999    if (Record.size() != 1) {
3000      Error("Incorrect encoding of pointer type");
3001      return QualType();
3002    }
3003    QualType PointeeType = GetType(Record[0]);
3004    return Context->getPointerType(PointeeType);
3005  }
3006
3007  case TYPE_BLOCK_POINTER: {
3008    if (Record.size() != 1) {
3009      Error("Incorrect encoding of block pointer type");
3010      return QualType();
3011    }
3012    QualType PointeeType = GetType(Record[0]);
3013    return Context->getBlockPointerType(PointeeType);
3014  }
3015
3016  case TYPE_LVALUE_REFERENCE: {
3017    if (Record.size() != 2) {
3018      Error("Incorrect encoding of lvalue reference type");
3019      return QualType();
3020    }
3021    QualType PointeeType = GetType(Record[0]);
3022    return Context->getLValueReferenceType(PointeeType, Record[1]);
3023  }
3024
3025  case TYPE_RVALUE_REFERENCE: {
3026    if (Record.size() != 1) {
3027      Error("Incorrect encoding of rvalue reference type");
3028      return QualType();
3029    }
3030    QualType PointeeType = GetType(Record[0]);
3031    return Context->getRValueReferenceType(PointeeType);
3032  }
3033
3034  case TYPE_MEMBER_POINTER: {
3035    if (Record.size() != 2) {
3036      Error("Incorrect encoding of member pointer type");
3037      return QualType();
3038    }
3039    QualType PointeeType = GetType(Record[0]);
3040    QualType ClassType = GetType(Record[1]);
3041    if (PointeeType.isNull() || ClassType.isNull())
3042      return QualType();
3043
3044    return Context->getMemberPointerType(PointeeType, ClassType.getTypePtr());
3045  }
3046
3047  case TYPE_CONSTANT_ARRAY: {
3048    QualType ElementType = GetType(Record[0]);
3049    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3050    unsigned IndexTypeQuals = Record[2];
3051    unsigned Idx = 3;
3052    llvm::APInt Size = ReadAPInt(Record, Idx);
3053    return Context->getConstantArrayType(ElementType, Size,
3054                                         ASM, IndexTypeQuals);
3055  }
3056
3057  case TYPE_INCOMPLETE_ARRAY: {
3058    QualType ElementType = GetType(Record[0]);
3059    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3060    unsigned IndexTypeQuals = Record[2];
3061    return Context->getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
3062  }
3063
3064  case TYPE_VARIABLE_ARRAY: {
3065    QualType ElementType = GetType(Record[0]);
3066    ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
3067    unsigned IndexTypeQuals = Record[2];
3068    SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
3069    SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
3070    return Context->getVariableArrayType(ElementType, ReadExpr(*Loc.F),
3071                                         ASM, IndexTypeQuals,
3072                                         SourceRange(LBLoc, RBLoc));
3073  }
3074
3075  case TYPE_VECTOR: {
3076    if (Record.size() != 3) {
3077      Error("incorrect encoding of vector type in AST file");
3078      return QualType();
3079    }
3080
3081    QualType ElementType = GetType(Record[0]);
3082    unsigned NumElements = Record[1];
3083    unsigned VecKind = Record[2];
3084    return Context->getVectorType(ElementType, NumElements,
3085                                  (VectorType::VectorKind)VecKind);
3086  }
3087
3088  case TYPE_EXT_VECTOR: {
3089    if (Record.size() != 3) {
3090      Error("incorrect encoding of extended vector type in AST file");
3091      return QualType();
3092    }
3093
3094    QualType ElementType = GetType(Record[0]);
3095    unsigned NumElements = Record[1];
3096    return Context->getExtVectorType(ElementType, NumElements);
3097  }
3098
3099  case TYPE_FUNCTION_NO_PROTO: {
3100    if (Record.size() != 5) {
3101      Error("incorrect encoding of no-proto function type");
3102      return QualType();
3103    }
3104    QualType ResultType = GetType(Record[0]);
3105    FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], (CallingConv)Record[4]);
3106    return Context->getFunctionNoProtoType(ResultType, Info);
3107  }
3108
3109  case TYPE_FUNCTION_PROTO: {
3110    QualType ResultType = GetType(Record[0]);
3111
3112    FunctionProtoType::ExtProtoInfo EPI;
3113    EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
3114                                        /*hasregparm*/ Record[2],
3115                                        /*regparm*/ Record[3],
3116                                        static_cast<CallingConv>(Record[4]));
3117
3118    unsigned Idx = 5;
3119    unsigned NumParams = Record[Idx++];
3120    llvm::SmallVector<QualType, 16> ParamTypes;
3121    for (unsigned I = 0; I != NumParams; ++I)
3122      ParamTypes.push_back(GetType(Record[Idx++]));
3123
3124    EPI.Variadic = Record[Idx++];
3125    EPI.TypeQuals = Record[Idx++];
3126    EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
3127    ExceptionSpecificationType EST =
3128        static_cast<ExceptionSpecificationType>(Record[Idx++]);
3129    EPI.ExceptionSpecType = EST;
3130    if (EST == EST_Dynamic) {
3131      EPI.NumExceptions = Record[Idx++];
3132      llvm::SmallVector<QualType, 2> Exceptions;
3133      for (unsigned I = 0; I != EPI.NumExceptions; ++I)
3134        Exceptions.push_back(GetType(Record[Idx++]));
3135      EPI.Exceptions = Exceptions.data();
3136    } else if (EST == EST_ComputedNoexcept) {
3137      EPI.NoexceptExpr = ReadExpr(*Loc.F);
3138    }
3139    return Context->getFunctionType(ResultType, ParamTypes.data(), NumParams,
3140                                    EPI);
3141  }
3142
3143  case TYPE_UNRESOLVED_USING:
3144    return Context->getTypeDeclType(
3145             cast<UnresolvedUsingTypenameDecl>(GetDecl(Record[0])));
3146
3147  case TYPE_TYPEDEF: {
3148    if (Record.size() != 2) {
3149      Error("incorrect encoding of typedef type");
3150      return QualType();
3151    }
3152    TypedefDecl *Decl = cast<TypedefDecl>(GetDecl(Record[0]));
3153    QualType Canonical = GetType(Record[1]);
3154    if (!Canonical.isNull())
3155      Canonical = Context->getCanonicalType(Canonical);
3156    return Context->getTypedefType(Decl, Canonical);
3157  }
3158
3159  case TYPE_TYPEOF_EXPR:
3160    return Context->getTypeOfExprType(ReadExpr(*Loc.F));
3161
3162  case TYPE_TYPEOF: {
3163    if (Record.size() != 1) {
3164      Error("incorrect encoding of typeof(type) in AST file");
3165      return QualType();
3166    }
3167    QualType UnderlyingType = GetType(Record[0]);
3168    return Context->getTypeOfType(UnderlyingType);
3169  }
3170
3171  case TYPE_DECLTYPE:
3172    return Context->getDecltypeType(ReadExpr(*Loc.F));
3173
3174  case TYPE_AUTO:
3175    return Context->getAutoType(GetType(Record[0]));
3176
3177  case TYPE_RECORD: {
3178    if (Record.size() != 2) {
3179      Error("incorrect encoding of record type");
3180      return QualType();
3181    }
3182    bool IsDependent = Record[0];
3183    QualType T = Context->getRecordType(cast<RecordDecl>(GetDecl(Record[1])));
3184    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3185    return T;
3186  }
3187
3188  case TYPE_ENUM: {
3189    if (Record.size() != 2) {
3190      Error("incorrect encoding of enum type");
3191      return QualType();
3192    }
3193    bool IsDependent = Record[0];
3194    QualType T = Context->getEnumType(cast<EnumDecl>(GetDecl(Record[1])));
3195    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3196    return T;
3197  }
3198
3199  case TYPE_ATTRIBUTED: {
3200    if (Record.size() != 3) {
3201      Error("incorrect encoding of attributed type");
3202      return QualType();
3203    }
3204    QualType modifiedType = GetType(Record[0]);
3205    QualType equivalentType = GetType(Record[1]);
3206    AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
3207    return Context->getAttributedType(kind, modifiedType, equivalentType);
3208  }
3209
3210  case TYPE_PAREN: {
3211    if (Record.size() != 1) {
3212      Error("incorrect encoding of paren type");
3213      return QualType();
3214    }
3215    QualType InnerType = GetType(Record[0]);
3216    return Context->getParenType(InnerType);
3217  }
3218
3219  case TYPE_PACK_EXPANSION: {
3220    if (Record.size() != 2) {
3221      Error("incorrect encoding of pack expansion type");
3222      return QualType();
3223    }
3224    QualType Pattern = GetType(Record[0]);
3225    if (Pattern.isNull())
3226      return QualType();
3227    llvm::Optional<unsigned> NumExpansions;
3228    if (Record[1])
3229      NumExpansions = Record[1] - 1;
3230    return Context->getPackExpansionType(Pattern, NumExpansions);
3231  }
3232
3233  case TYPE_ELABORATED: {
3234    unsigned Idx = 0;
3235    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
3236    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
3237    QualType NamedType = GetType(Record[Idx++]);
3238    return Context->getElaboratedType(Keyword, NNS, NamedType);
3239  }
3240
3241  case TYPE_OBJC_INTERFACE: {
3242    unsigned Idx = 0;
3243    ObjCInterfaceDecl *ItfD = cast<ObjCInterfaceDecl>(GetDecl(Record[Idx++]));
3244    return Context->getObjCInterfaceType(ItfD);
3245  }
3246
3247  case TYPE_OBJC_OBJECT: {
3248    unsigned Idx = 0;
3249    QualType Base = GetType(Record[Idx++]);
3250    unsigned NumProtos = Record[Idx++];
3251    llvm::SmallVector<ObjCProtocolDecl*, 4> Protos;
3252    for (unsigned I = 0; I != NumProtos; ++I)
3253      Protos.push_back(cast<ObjCProtocolDecl>(GetDecl(Record[Idx++])));
3254    return Context->getObjCObjectType(Base, Protos.data(), NumProtos);
3255  }
3256
3257  case TYPE_OBJC_OBJECT_POINTER: {
3258    unsigned Idx = 0;
3259    QualType Pointee = GetType(Record[Idx++]);
3260    return Context->getObjCObjectPointerType(Pointee);
3261  }
3262
3263  case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
3264    unsigned Idx = 0;
3265    QualType Parm = GetType(Record[Idx++]);
3266    QualType Replacement = GetType(Record[Idx++]);
3267    return
3268      Context->getSubstTemplateTypeParmType(cast<TemplateTypeParmType>(Parm),
3269                                            Replacement);
3270  }
3271
3272  case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
3273    unsigned Idx = 0;
3274    QualType Parm = GetType(Record[Idx++]);
3275    TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
3276    return Context->getSubstTemplateTypeParmPackType(
3277                                               cast<TemplateTypeParmType>(Parm),
3278                                                     ArgPack);
3279  }
3280
3281  case TYPE_INJECTED_CLASS_NAME: {
3282    CXXRecordDecl *D = cast<CXXRecordDecl>(GetDecl(Record[0]));
3283    QualType TST = GetType(Record[1]); // probably derivable
3284    // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
3285    // for AST reading, too much interdependencies.
3286    return
3287      QualType(new (*Context, TypeAlignment) InjectedClassNameType(D, TST), 0);
3288  }
3289
3290  case TYPE_TEMPLATE_TYPE_PARM: {
3291    unsigned Idx = 0;
3292    unsigned Depth = Record[Idx++];
3293    unsigned Index = Record[Idx++];
3294    bool Pack = Record[Idx++];
3295    IdentifierInfo *Name = GetIdentifierInfo(Record, Idx);
3296    return Context->getTemplateTypeParmType(Depth, Index, Pack, Name);
3297  }
3298
3299  case TYPE_DEPENDENT_NAME: {
3300    unsigned Idx = 0;
3301    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
3302    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
3303    const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx);
3304    QualType Canon = GetType(Record[Idx++]);
3305    if (!Canon.isNull())
3306      Canon = Context->getCanonicalType(Canon);
3307    return Context->getDependentNameType(Keyword, NNS, Name, Canon);
3308  }
3309
3310  case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
3311    unsigned Idx = 0;
3312    ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
3313    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
3314    const IdentifierInfo *Name = this->GetIdentifierInfo(Record, Idx);
3315    unsigned NumArgs = Record[Idx++];
3316    llvm::SmallVector<TemplateArgument, 8> Args;
3317    Args.reserve(NumArgs);
3318    while (NumArgs--)
3319      Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
3320    return Context->getDependentTemplateSpecializationType(Keyword, NNS, Name,
3321                                                      Args.size(), Args.data());
3322  }
3323
3324  case TYPE_DEPENDENT_SIZED_ARRAY: {
3325    unsigned Idx = 0;
3326
3327    // ArrayType
3328    QualType ElementType = GetType(Record[Idx++]);
3329    ArrayType::ArraySizeModifier ASM
3330      = (ArrayType::ArraySizeModifier)Record[Idx++];
3331    unsigned IndexTypeQuals = Record[Idx++];
3332
3333    // DependentSizedArrayType
3334    Expr *NumElts = ReadExpr(*Loc.F);
3335    SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
3336
3337    return Context->getDependentSizedArrayType(ElementType, NumElts, ASM,
3338                                               IndexTypeQuals, Brackets);
3339  }
3340
3341  case TYPE_TEMPLATE_SPECIALIZATION: {
3342    unsigned Idx = 0;
3343    bool IsDependent = Record[Idx++];
3344    TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
3345    llvm::SmallVector<TemplateArgument, 8> Args;
3346    ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
3347    QualType Canon = GetType(Record[Idx++]);
3348    QualType T;
3349    if (Canon.isNull())
3350      T = Context->getCanonicalTemplateSpecializationType(Name, Args.data(),
3351                                                          Args.size());
3352    else
3353      T = Context->getTemplateSpecializationType(Name, Args.data(),
3354                                                 Args.size(), Canon);
3355    const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
3356    return T;
3357  }
3358  }
3359  // Suppress a GCC warning
3360  return QualType();
3361}
3362
3363class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
3364  ASTReader &Reader;
3365  ASTReader::PerFileData &F;
3366  llvm::BitstreamCursor &DeclsCursor;
3367  const ASTReader::RecordData &Record;
3368  unsigned &Idx;
3369
3370  SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
3371                                    unsigned &I) {
3372    return Reader.ReadSourceLocation(F, R, I);
3373  }
3374
3375public:
3376  TypeLocReader(ASTReader &Reader, ASTReader::PerFileData &F,
3377                const ASTReader::RecordData &Record, unsigned &Idx)
3378    : Reader(Reader), F(F), DeclsCursor(F.DeclsCursor), Record(Record), Idx(Idx)
3379  { }
3380
3381  // We want compile-time assurance that we've enumerated all of
3382  // these, so unfortunately we have to declare them first, then
3383  // define them out-of-line.
3384#define ABSTRACT_TYPELOC(CLASS, PARENT)
3385#define TYPELOC(CLASS, PARENT) \
3386  void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
3387#include "clang/AST/TypeLocNodes.def"
3388
3389  void VisitFunctionTypeLoc(FunctionTypeLoc);
3390  void VisitArrayTypeLoc(ArrayTypeLoc);
3391};
3392
3393void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
3394  // nothing to do
3395}
3396void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
3397  TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
3398  if (TL.needsExtraLocalData()) {
3399    TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
3400    TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
3401    TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
3402    TL.setModeAttr(Record[Idx++]);
3403  }
3404}
3405void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
3406  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3407}
3408void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
3409  TL.setStarLoc(ReadSourceLocation(Record, Idx));
3410}
3411void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
3412  TL.setCaretLoc(ReadSourceLocation(Record, Idx));
3413}
3414void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
3415  TL.setAmpLoc(ReadSourceLocation(Record, Idx));
3416}
3417void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
3418  TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
3419}
3420void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
3421  TL.setStarLoc(ReadSourceLocation(Record, Idx));
3422  TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
3423}
3424void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
3425  TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
3426  TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
3427  if (Record[Idx++])
3428    TL.setSizeExpr(Reader.ReadExpr(F));
3429  else
3430    TL.setSizeExpr(0);
3431}
3432void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
3433  VisitArrayTypeLoc(TL);
3434}
3435void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
3436  VisitArrayTypeLoc(TL);
3437}
3438void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
3439  VisitArrayTypeLoc(TL);
3440}
3441void TypeLocReader::VisitDependentSizedArrayTypeLoc(
3442                                            DependentSizedArrayTypeLoc TL) {
3443  VisitArrayTypeLoc(TL);
3444}
3445void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
3446                                        DependentSizedExtVectorTypeLoc TL) {
3447  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3448}
3449void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
3450  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3451}
3452void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
3453  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3454}
3455void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
3456  TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
3457  TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
3458  TL.setTrailingReturn(Record[Idx++]);
3459  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3460    TL.setArg(i, cast_or_null<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
3461  }
3462}
3463void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
3464  VisitFunctionTypeLoc(TL);
3465}
3466void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
3467  VisitFunctionTypeLoc(TL);
3468}
3469void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
3470  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3471}
3472void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
3473  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3474}
3475void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
3476  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
3477  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
3478  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
3479}
3480void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
3481  TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
3482  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
3483  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
3484  TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
3485}
3486void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
3487  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3488}
3489void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
3490  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3491}
3492void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
3493  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3494}
3495void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
3496  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3497}
3498void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
3499  TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
3500  if (TL.hasAttrOperand()) {
3501    SourceRange range;
3502    range.setBegin(ReadSourceLocation(Record, Idx));
3503    range.setEnd(ReadSourceLocation(Record, Idx));
3504    TL.setAttrOperandParensRange(range);
3505  }
3506  if (TL.hasAttrExprOperand()) {
3507    if (Record[Idx++])
3508      TL.setAttrExprOperand(Reader.ReadExpr(F));
3509    else
3510      TL.setAttrExprOperand(0);
3511  } else if (TL.hasAttrEnumOperand())
3512    TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
3513}
3514void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
3515  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3516}
3517void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
3518                                            SubstTemplateTypeParmTypeLoc TL) {
3519  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3520}
3521void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
3522                                          SubstTemplateTypeParmPackTypeLoc TL) {
3523  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3524}
3525void TypeLocReader::VisitTemplateSpecializationTypeLoc(
3526                                           TemplateSpecializationTypeLoc TL) {
3527  TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
3528  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
3529  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
3530  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
3531    TL.setArgLocInfo(i,
3532        Reader.GetTemplateArgumentLocInfo(F,
3533                                          TL.getTypePtr()->getArg(i).getKind(),
3534                                          Record, Idx));
3535}
3536void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
3537  TL.setLParenLoc(ReadSourceLocation(Record, Idx));
3538  TL.setRParenLoc(ReadSourceLocation(Record, Idx));
3539}
3540void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
3541  TL.setKeywordLoc(ReadSourceLocation(Record, Idx));
3542  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
3543}
3544void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
3545  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3546}
3547void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
3548  TL.setKeywordLoc(ReadSourceLocation(Record, Idx));
3549  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
3550  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3551}
3552void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
3553       DependentTemplateSpecializationTypeLoc TL) {
3554  TL.setKeywordLoc(ReadSourceLocation(Record, Idx));
3555  TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
3556  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3557  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
3558  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
3559  for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
3560    TL.setArgLocInfo(I,
3561        Reader.GetTemplateArgumentLocInfo(F,
3562                                          TL.getTypePtr()->getArg(I).getKind(),
3563                                          Record, Idx));
3564}
3565void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
3566  TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
3567}
3568void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
3569  TL.setNameLoc(ReadSourceLocation(Record, Idx));
3570}
3571void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
3572  TL.setHasBaseTypeAsWritten(Record[Idx++]);
3573  TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
3574  TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
3575  for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
3576    TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
3577}
3578void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
3579  TL.setStarLoc(ReadSourceLocation(Record, Idx));
3580}
3581
3582TypeSourceInfo *ASTReader::GetTypeSourceInfo(PerFileData &F,
3583                                             const RecordData &Record,
3584                                             unsigned &Idx) {
3585  QualType InfoTy = GetType(Record[Idx++]);
3586  if (InfoTy.isNull())
3587    return 0;
3588
3589  TypeSourceInfo *TInfo = getContext()->CreateTypeSourceInfo(InfoTy);
3590  TypeLocReader TLR(*this, F, Record, Idx);
3591  for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
3592    TLR.Visit(TL);
3593  return TInfo;
3594}
3595
3596QualType ASTReader::GetType(TypeID ID) {
3597  unsigned FastQuals = ID & Qualifiers::FastMask;
3598  unsigned Index = ID >> Qualifiers::FastWidth;
3599
3600  if (Index < NUM_PREDEF_TYPE_IDS) {
3601    QualType T;
3602    switch ((PredefinedTypeIDs)Index) {
3603    case PREDEF_TYPE_NULL_ID: return QualType();
3604    case PREDEF_TYPE_VOID_ID: T = Context->VoidTy; break;
3605    case PREDEF_TYPE_BOOL_ID: T = Context->BoolTy; break;
3606
3607    case PREDEF_TYPE_CHAR_U_ID:
3608    case PREDEF_TYPE_CHAR_S_ID:
3609      // FIXME: Check that the signedness of CharTy is correct!
3610      T = Context->CharTy;
3611      break;
3612
3613    case PREDEF_TYPE_UCHAR_ID:      T = Context->UnsignedCharTy;     break;
3614    case PREDEF_TYPE_USHORT_ID:     T = Context->UnsignedShortTy;    break;
3615    case PREDEF_TYPE_UINT_ID:       T = Context->UnsignedIntTy;      break;
3616    case PREDEF_TYPE_ULONG_ID:      T = Context->UnsignedLongTy;     break;
3617    case PREDEF_TYPE_ULONGLONG_ID:  T = Context->UnsignedLongLongTy; break;
3618    case PREDEF_TYPE_UINT128_ID:    T = Context->UnsignedInt128Ty;   break;
3619    case PREDEF_TYPE_SCHAR_ID:      T = Context->SignedCharTy;       break;
3620    case PREDEF_TYPE_WCHAR_ID:      T = Context->WCharTy;            break;
3621    case PREDEF_TYPE_SHORT_ID:      T = Context->ShortTy;            break;
3622    case PREDEF_TYPE_INT_ID:        T = Context->IntTy;              break;
3623    case PREDEF_TYPE_LONG_ID:       T = Context->LongTy;             break;
3624    case PREDEF_TYPE_LONGLONG_ID:   T = Context->LongLongTy;         break;
3625    case PREDEF_TYPE_INT128_ID:     T = Context->Int128Ty;           break;
3626    case PREDEF_TYPE_FLOAT_ID:      T = Context->FloatTy;            break;
3627    case PREDEF_TYPE_DOUBLE_ID:     T = Context->DoubleTy;           break;
3628    case PREDEF_TYPE_LONGDOUBLE_ID: T = Context->LongDoubleTy;       break;
3629    case PREDEF_TYPE_OVERLOAD_ID:   T = Context->OverloadTy;         break;
3630    case PREDEF_TYPE_DEPENDENT_ID:  T = Context->DependentTy;        break;
3631    case PREDEF_TYPE_UNKNOWN_ANY:   T = Context->UnknownAnyTy;       break;
3632    case PREDEF_TYPE_NULLPTR_ID:    T = Context->NullPtrTy;          break;
3633    case PREDEF_TYPE_CHAR16_ID:     T = Context->Char16Ty;           break;
3634    case PREDEF_TYPE_CHAR32_ID:     T = Context->Char32Ty;           break;
3635    case PREDEF_TYPE_OBJC_ID:       T = Context->ObjCBuiltinIdTy;    break;
3636    case PREDEF_TYPE_OBJC_CLASS:    T = Context->ObjCBuiltinClassTy; break;
3637    case PREDEF_TYPE_OBJC_SEL:      T = Context->ObjCBuiltinSelTy;   break;
3638    }
3639
3640    assert(!T.isNull() && "Unknown predefined type");
3641    return T.withFastQualifiers(FastQuals);
3642  }
3643
3644  Index -= NUM_PREDEF_TYPE_IDS;
3645  assert(Index < TypesLoaded.size() && "Type index out-of-range");
3646  if (TypesLoaded[Index].isNull()) {
3647    TypesLoaded[Index] = ReadTypeRecord(Index);
3648    if (TypesLoaded[Index].isNull())
3649      return QualType();
3650
3651    TypesLoaded[Index]->setFromAST();
3652    TypeIdxs[TypesLoaded[Index]] = TypeIdx::fromTypeID(ID);
3653    if (DeserializationListener)
3654      DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
3655                                        TypesLoaded[Index]);
3656  }
3657
3658  return TypesLoaded[Index].withFastQualifiers(FastQuals);
3659}
3660
3661TypeID ASTReader::GetTypeID(QualType T) const {
3662  return MakeTypeID(T,
3663              std::bind1st(std::mem_fun(&ASTReader::GetTypeIdx), this));
3664}
3665
3666TypeIdx ASTReader::GetTypeIdx(QualType T) const {
3667  if (T.isNull())
3668    return TypeIdx();
3669  assert(!T.getLocalFastQualifiers());
3670
3671  TypeIdxMap::const_iterator I = TypeIdxs.find(T);
3672  // GetTypeIdx is mostly used for computing the hash of DeclarationNames and
3673  // comparing keys of ASTDeclContextNameLookupTable.
3674  // If the type didn't come from the AST file use a specially marked index
3675  // so that any hash/key comparison fail since no such index is stored
3676  // in a AST file.
3677  if (I == TypeIdxs.end())
3678    return TypeIdx(-1);
3679  return I->second;
3680}
3681
3682unsigned ASTReader::getTotalNumCXXBaseSpecifiers() const {
3683  unsigned Result = 0;
3684  for (unsigned I = 0, N = Chain.size(); I != N; ++I)
3685    Result += Chain[I]->LocalNumCXXBaseSpecifiers;
3686
3687  return Result;
3688}
3689
3690TemplateArgumentLocInfo
3691ASTReader::GetTemplateArgumentLocInfo(PerFileData &F,
3692                                      TemplateArgument::ArgKind Kind,
3693                                      const RecordData &Record,
3694                                      unsigned &Index) {
3695  switch (Kind) {
3696  case TemplateArgument::Expression:
3697    return ReadExpr(F);
3698  case TemplateArgument::Type:
3699    return GetTypeSourceInfo(F, Record, Index);
3700  case TemplateArgument::Template: {
3701    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
3702                                                                     Index);
3703    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
3704    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
3705                                   SourceLocation());
3706  }
3707  case TemplateArgument::TemplateExpansion: {
3708    NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
3709                                                                     Index);
3710    SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
3711    SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
3712    return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
3713                                   EllipsisLoc);
3714  }
3715  case TemplateArgument::Null:
3716  case TemplateArgument::Integral:
3717  case TemplateArgument::Declaration:
3718  case TemplateArgument::Pack:
3719    return TemplateArgumentLocInfo();
3720  }
3721  llvm_unreachable("unexpected template argument loc");
3722  return TemplateArgumentLocInfo();
3723}
3724
3725TemplateArgumentLoc
3726ASTReader::ReadTemplateArgumentLoc(PerFileData &F,
3727                                   const RecordData &Record, unsigned &Index) {
3728  TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
3729
3730  if (Arg.getKind() == TemplateArgument::Expression) {
3731    if (Record[Index++]) // bool InfoHasSameExpr.
3732      return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
3733  }
3734  return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
3735                                                             Record, Index));
3736}
3737
3738Decl *ASTReader::GetExternalDecl(uint32_t ID) {
3739  return GetDecl(ID);
3740}
3741
3742uint64_t
3743ASTReader::GetCXXBaseSpecifiersOffset(serialization::CXXBaseSpecifiersID ID) {
3744  if (ID == 0)
3745    return 0;
3746
3747  --ID;
3748  uint64_t Offset = 0;
3749  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
3750    PerFileData &F = *Chain[N - I - 1];
3751
3752    if (ID < F.LocalNumCXXBaseSpecifiers)
3753      return Offset + F.CXXBaseSpecifiersOffsets[ID];
3754
3755    ID -= F.LocalNumCXXBaseSpecifiers;
3756    Offset += F.SizeInBits;
3757  }
3758
3759  assert(false && "CXXBaseSpecifiers not found");
3760  return 0;
3761}
3762
3763CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
3764  // Figure out which AST file contains this offset.
3765  PerFileData *F = 0;
3766  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
3767    if (Offset < Chain[N - I - 1]->SizeInBits) {
3768      F = Chain[N - I - 1];
3769      break;
3770    }
3771
3772    Offset -= Chain[N - I - 1]->SizeInBits;
3773  }
3774
3775  if (!F) {
3776    Error("Malformed AST file: C++ base specifiers at impossible offset");
3777    return 0;
3778  }
3779
3780  llvm::BitstreamCursor &Cursor = F->DeclsCursor;
3781  SavedStreamPosition SavedPosition(Cursor);
3782  Cursor.JumpToBit(Offset);
3783  ReadingKindTracker ReadingKind(Read_Decl, *this);
3784  RecordData Record;
3785  unsigned Code = Cursor.ReadCode();
3786  unsigned RecCode = Cursor.ReadRecord(Code, Record);
3787  if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
3788    Error("Malformed AST file: missing C++ base specifiers");
3789    return 0;
3790  }
3791
3792  unsigned Idx = 0;
3793  unsigned NumBases = Record[Idx++];
3794  void *Mem = Context->Allocate(sizeof(CXXBaseSpecifier) * NumBases);
3795  CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
3796  for (unsigned I = 0; I != NumBases; ++I)
3797    Bases[I] = ReadCXXBaseSpecifier(*F, Record, Idx);
3798  return Bases;
3799}
3800
3801TranslationUnitDecl *ASTReader::GetTranslationUnitDecl() {
3802  if (!DeclsLoaded[0]) {
3803    ReadDeclRecord(0, 1);
3804    if (DeserializationListener)
3805      DeserializationListener->DeclRead(1, DeclsLoaded[0]);
3806  }
3807
3808  return cast<TranslationUnitDecl>(DeclsLoaded[0]);
3809}
3810
3811Decl *ASTReader::GetDecl(DeclID ID) {
3812  if (ID == 0)
3813    return 0;
3814
3815  if (ID > DeclsLoaded.size()) {
3816    Error("declaration ID out-of-range for AST file");
3817    return 0;
3818  }
3819
3820  unsigned Index = ID - 1;
3821  if (!DeclsLoaded[Index]) {
3822    ReadDeclRecord(Index, ID);
3823    if (DeserializationListener)
3824      DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
3825  }
3826
3827  return DeclsLoaded[Index];
3828}
3829
3830/// \brief Resolve the offset of a statement into a statement.
3831///
3832/// This operation will read a new statement from the external
3833/// source each time it is called, and is meant to be used via a
3834/// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
3835Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
3836  // Switch case IDs are per Decl.
3837  ClearSwitchCaseIDs();
3838
3839  // Offset here is a global offset across the entire chain.
3840  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
3841    PerFileData &F = *Chain[N - I - 1];
3842    if (Offset < F.SizeInBits) {
3843      // Since we know that this statement is part of a decl, make sure to use
3844      // the decl cursor to read it.
3845      F.DeclsCursor.JumpToBit(Offset);
3846      return ReadStmtFromStream(F);
3847    }
3848    Offset -= F.SizeInBits;
3849  }
3850  llvm_unreachable("Broken chain");
3851}
3852
3853bool ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
3854                                         bool (*isKindWeWant)(Decl::Kind),
3855                                         llvm::SmallVectorImpl<Decl*> &Decls) {
3856  assert(DC->hasExternalLexicalStorage() &&
3857         "DeclContext has no lexical decls in storage");
3858
3859  // There might be lexical decls in multiple parts of the chain, for the TU
3860  // at least.
3861  // DeclContextOffsets might reallocate as we load additional decls below,
3862  // so make a copy of the vector.
3863  DeclContextInfos Infos = DeclContextOffsets[DC];
3864  for (DeclContextInfos::iterator I = Infos.begin(), E = Infos.end();
3865       I != E; ++I) {
3866    // IDs can be 0 if this context doesn't contain declarations.
3867    if (!I->LexicalDecls)
3868      continue;
3869
3870    // Load all of the declaration IDs
3871    for (const KindDeclIDPair *ID = I->LexicalDecls,
3872                              *IDE = ID + I->NumLexicalDecls; ID != IDE; ++ID) {
3873      if (isKindWeWant && !isKindWeWant((Decl::Kind)ID->first))
3874        continue;
3875
3876      Decl *D = GetDecl(ID->second);
3877      assert(D && "Null decl in lexical decls");
3878      Decls.push_back(D);
3879    }
3880  }
3881
3882  ++NumLexicalDeclContextsRead;
3883  return false;
3884}
3885
3886DeclContext::lookup_result
3887ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
3888                                          DeclarationName Name) {
3889  assert(DC->hasExternalVisibleStorage() &&
3890         "DeclContext has no visible decls in storage");
3891  if (!Name)
3892    return DeclContext::lookup_result(DeclContext::lookup_iterator(0),
3893                                      DeclContext::lookup_iterator(0));
3894
3895  llvm::SmallVector<NamedDecl *, 64> Decls;
3896  // There might be visible decls in multiple parts of the chain, for the TU
3897  // and namespaces. For any given name, the last available results replace
3898  // all earlier ones. For this reason, we walk in reverse.
3899  DeclContextInfos &Infos = DeclContextOffsets[DC];
3900  for (DeclContextInfos::reverse_iterator I = Infos.rbegin(), E = Infos.rend();
3901       I != E; ++I) {
3902    if (!I->NameLookupTableData)
3903      continue;
3904
3905    ASTDeclContextNameLookupTable *LookupTable =
3906        (ASTDeclContextNameLookupTable*)I->NameLookupTableData;
3907    ASTDeclContextNameLookupTable::iterator Pos = LookupTable->find(Name);
3908    if (Pos == LookupTable->end())
3909      continue;
3910
3911    ASTDeclContextNameLookupTrait::data_type Data = *Pos;
3912    for (; Data.first != Data.second; ++Data.first)
3913      Decls.push_back(cast<NamedDecl>(GetDecl(*Data.first)));
3914    break;
3915  }
3916
3917  ++NumVisibleDeclContextsRead;
3918
3919  SetExternalVisibleDeclsForName(DC, Name, Decls);
3920  return const_cast<DeclContext*>(DC)->lookup(Name);
3921}
3922
3923void ASTReader::MaterializeVisibleDecls(const DeclContext *DC) {
3924  assert(DC->hasExternalVisibleStorage() &&
3925         "DeclContext has no visible decls in storage");
3926
3927  llvm::SmallVector<NamedDecl *, 64> Decls;
3928  // There might be visible decls in multiple parts of the chain, for the TU
3929  // and namespaces.
3930  DeclContextInfos &Infos = DeclContextOffsets[DC];
3931  for (DeclContextInfos::iterator I = Infos.begin(), E = Infos.end();
3932       I != E; ++I) {
3933    if (!I->NameLookupTableData)
3934      continue;
3935
3936    ASTDeclContextNameLookupTable *LookupTable =
3937        (ASTDeclContextNameLookupTable*)I->NameLookupTableData;
3938    for (ASTDeclContextNameLookupTable::item_iterator
3939           ItemI = LookupTable->item_begin(),
3940           ItemEnd = LookupTable->item_end() ; ItemI != ItemEnd; ++ItemI) {
3941      ASTDeclContextNameLookupTable::item_iterator::value_type Val
3942          = *ItemI;
3943      ASTDeclContextNameLookupTrait::data_type Data = Val.second;
3944      Decls.clear();
3945      for (; Data.first != Data.second; ++Data.first)
3946        Decls.push_back(cast<NamedDecl>(GetDecl(*Data.first)));
3947      MaterializeVisibleDeclsForName(DC, Val.first, Decls);
3948    }
3949  }
3950}
3951
3952void ASTReader::PassInterestingDeclsToConsumer() {
3953  assert(Consumer);
3954  while (!InterestingDecls.empty()) {
3955    DeclGroupRef DG(InterestingDecls.front());
3956    InterestingDecls.pop_front();
3957    Consumer->HandleInterestingDecl(DG);
3958  }
3959}
3960
3961void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
3962  this->Consumer = Consumer;
3963
3964  if (!Consumer)
3965    return;
3966
3967  for (unsigned I = 0, N = ExternalDefinitions.size(); I != N; ++I) {
3968    // Force deserialization of this decl, which will cause it to be queued for
3969    // passing to the consumer.
3970    GetDecl(ExternalDefinitions[I]);
3971  }
3972
3973  PassInterestingDeclsToConsumer();
3974}
3975
3976void ASTReader::PrintStats() {
3977  std::fprintf(stderr, "*** AST File Statistics:\n");
3978
3979  unsigned NumTypesLoaded
3980    = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
3981                                      QualType());
3982  unsigned NumDeclsLoaded
3983    = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
3984                                      (Decl *)0);
3985  unsigned NumIdentifiersLoaded
3986    = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
3987                                            IdentifiersLoaded.end(),
3988                                            (IdentifierInfo *)0);
3989  unsigned NumSelectorsLoaded
3990    = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
3991                                          SelectorsLoaded.end(),
3992                                          Selector());
3993
3994  std::fprintf(stderr, "  %u stat cache hits\n", NumStatHits);
3995  std::fprintf(stderr, "  %u stat cache misses\n", NumStatMisses);
3996  if (TotalNumSLocEntries)
3997    std::fprintf(stderr, "  %u/%u source location entries read (%f%%)\n",
3998                 NumSLocEntriesRead, TotalNumSLocEntries,
3999                 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
4000  if (!TypesLoaded.empty())
4001    std::fprintf(stderr, "  %u/%u types read (%f%%)\n",
4002                 NumTypesLoaded, (unsigned)TypesLoaded.size(),
4003                 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
4004  if (!DeclsLoaded.empty())
4005    std::fprintf(stderr, "  %u/%u declarations read (%f%%)\n",
4006                 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
4007                 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
4008  if (!IdentifiersLoaded.empty())
4009    std::fprintf(stderr, "  %u/%u identifiers read (%f%%)\n",
4010                 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
4011                 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
4012  if (!SelectorsLoaded.empty())
4013    std::fprintf(stderr, "  %u/%u selectors read (%f%%)\n",
4014                 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
4015                 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
4016  if (TotalNumStatements)
4017    std::fprintf(stderr, "  %u/%u statements read (%f%%)\n",
4018                 NumStatementsRead, TotalNumStatements,
4019                 ((float)NumStatementsRead/TotalNumStatements * 100));
4020  if (TotalNumMacros)
4021    std::fprintf(stderr, "  %u/%u macros read (%f%%)\n",
4022                 NumMacrosRead, TotalNumMacros,
4023                 ((float)NumMacrosRead/TotalNumMacros * 100));
4024  if (TotalLexicalDeclContexts)
4025    std::fprintf(stderr, "  %u/%u lexical declcontexts read (%f%%)\n",
4026                 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
4027                 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
4028                  * 100));
4029  if (TotalVisibleDeclContexts)
4030    std::fprintf(stderr, "  %u/%u visible declcontexts read (%f%%)\n",
4031                 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
4032                 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
4033                  * 100));
4034  if (TotalNumMethodPoolEntries) {
4035    std::fprintf(stderr, "  %u/%u method pool entries read (%f%%)\n",
4036                 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
4037                 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
4038                  * 100));
4039    std::fprintf(stderr, "  %u method pool misses\n", NumMethodPoolMisses);
4040  }
4041  std::fprintf(stderr, "\n");
4042}
4043
4044void ASTReader::InitializeSema(Sema &S) {
4045  SemaObj = &S;
4046  S.ExternalSource = this;
4047
4048  // Makes sure any declarations that were deserialized "too early"
4049  // still get added to the identifier's declaration chains.
4050  for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
4051    if (SemaObj->TUScope)
4052      SemaObj->TUScope->AddDecl(PreloadedDecls[I]);
4053
4054    SemaObj->IdResolver.AddDecl(PreloadedDecls[I]);
4055  }
4056  PreloadedDecls.clear();
4057
4058  // If there were any tentative definitions, deserialize them and add
4059  // them to Sema's list of tentative definitions.
4060  for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
4061    VarDecl *Var = cast<VarDecl>(GetDecl(TentativeDefinitions[I]));
4062    SemaObj->TentativeDefinitions.push_back(Var);
4063  }
4064
4065  // If there were any unused file scoped decls, deserialize them and add to
4066  // Sema's list of unused file scoped decls.
4067  for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
4068    DeclaratorDecl *D = cast<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
4069    SemaObj->UnusedFileScopedDecls.push_back(D);
4070  }
4071
4072  // If there were any locally-scoped external declarations,
4073  // deserialize them and add them to Sema's table of locally-scoped
4074  // external declarations.
4075  for (unsigned I = 0, N = LocallyScopedExternalDecls.size(); I != N; ++I) {
4076    NamedDecl *D = cast<NamedDecl>(GetDecl(LocallyScopedExternalDecls[I]));
4077    SemaObj->LocallyScopedExternalDecls[D->getDeclName()] = D;
4078  }
4079
4080  // If there were any ext_vector type declarations, deserialize them
4081  // and add them to Sema's vector of such declarations.
4082  for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I)
4083    SemaObj->ExtVectorDecls.push_back(
4084                               cast<TypedefDecl>(GetDecl(ExtVectorDecls[I])));
4085
4086  // FIXME: Do VTable uses and dynamic classes deserialize too much ?
4087  // Can we cut them down before writing them ?
4088
4089  // If there were any dynamic classes declarations, deserialize them
4090  // and add them to Sema's vector of such declarations.
4091  for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I)
4092    SemaObj->DynamicClasses.push_back(
4093                               cast<CXXRecordDecl>(GetDecl(DynamicClasses[I])));
4094
4095  // Load the offsets of the declarations that Sema references.
4096  // They will be lazily deserialized when needed.
4097  if (!SemaDeclRefs.empty()) {
4098    assert(SemaDeclRefs.size() == 2 && "More decl refs than expected!");
4099    SemaObj->StdNamespace = SemaDeclRefs[0];
4100    SemaObj->StdBadAlloc = SemaDeclRefs[1];
4101  }
4102
4103  for (PerFileData *F = FirstInSource; F; F = F->NextInSource) {
4104
4105    // If there are @selector references added them to its pool. This is for
4106    // implementation of -Wselector.
4107    if (!F->ReferencedSelectorsData.empty()) {
4108      unsigned int DataSize = F->ReferencedSelectorsData.size()-1;
4109      unsigned I = 0;
4110      while (I < DataSize) {
4111        Selector Sel = DecodeSelector(F->ReferencedSelectorsData[I++]);
4112        SourceLocation SelLoc = ReadSourceLocation(
4113                                    *F, F->ReferencedSelectorsData, I);
4114        SemaObj->ReferencedSelectors.insert(std::make_pair(Sel, SelLoc));
4115      }
4116    }
4117
4118    // If there were any pending implicit instantiations, deserialize them
4119    // and add them to Sema's queue of such instantiations.
4120    assert(F->PendingInstantiations.size() % 2 == 0 &&
4121           "Expected pairs of entries");
4122    for (unsigned Idx = 0, N = F->PendingInstantiations.size(); Idx < N;) {
4123      ValueDecl *D=cast<ValueDecl>(GetDecl(F->PendingInstantiations[Idx++]));
4124      SourceLocation Loc = ReadSourceLocation(*F, F->PendingInstantiations,Idx);
4125      SemaObj->PendingInstantiations.push_back(std::make_pair(D, Loc));
4126    }
4127  }
4128
4129  // The two special data sets below always come from the most recent PCH,
4130  // which is at the front of the chain.
4131  PerFileData &F = *Chain.front();
4132
4133  // If there were any weak undeclared identifiers, deserialize them and add to
4134  // Sema's list of weak undeclared identifiers.
4135  if (!WeakUndeclaredIdentifiers.empty()) {
4136    unsigned Idx = 0;
4137    for (unsigned I = 0, N = WeakUndeclaredIdentifiers[Idx++]; I != N; ++I) {
4138      IdentifierInfo *WeakId = GetIdentifierInfo(WeakUndeclaredIdentifiers,Idx);
4139      IdentifierInfo *AliasId= GetIdentifierInfo(WeakUndeclaredIdentifiers,Idx);
4140      SourceLocation Loc = ReadSourceLocation(F, WeakUndeclaredIdentifiers,Idx);
4141      bool Used = WeakUndeclaredIdentifiers[Idx++];
4142      Sema::WeakInfo WI(AliasId, Loc);
4143      WI.setUsed(Used);
4144      SemaObj->WeakUndeclaredIdentifiers.insert(std::make_pair(WeakId, WI));
4145    }
4146  }
4147
4148  // If there were any VTable uses, deserialize the information and add it
4149  // to Sema's vector and map of VTable uses.
4150  if (!VTableUses.empty()) {
4151    unsigned Idx = 0;
4152    for (unsigned I = 0, N = VTableUses[Idx++]; I != N; ++I) {
4153      CXXRecordDecl *Class = cast<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
4154      SourceLocation Loc = ReadSourceLocation(F, VTableUses, Idx);
4155      bool DefinitionRequired = VTableUses[Idx++];
4156      SemaObj->VTableUses.push_back(std::make_pair(Class, Loc));
4157      SemaObj->VTablesUsed[Class] = DefinitionRequired;
4158    }
4159  }
4160
4161  if (!FPPragmaOptions.empty()) {
4162    assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
4163    SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
4164  }
4165
4166  if (!OpenCLExtensions.empty()) {
4167    unsigned I = 0;
4168#define OPENCLEXT(nm)  SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
4169#include "clang/Basic/OpenCLExtensions.def"
4170
4171    assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
4172  }
4173}
4174
4175IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
4176  // Try to find this name within our on-disk hash tables. We start with the
4177  // most recent one, since that one contains the most up-to-date info.
4178  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4179    ASTIdentifierLookupTable *IdTable
4180        = (ASTIdentifierLookupTable *)Chain[I]->IdentifierLookupTable;
4181    if (!IdTable)
4182      continue;
4183    std::pair<const char*, unsigned> Key(NameStart, NameEnd - NameStart);
4184    ASTIdentifierLookupTable::iterator Pos = IdTable->find(Key);
4185    if (Pos == IdTable->end())
4186      continue;
4187
4188    // Dereferencing the iterator has the effect of building the
4189    // IdentifierInfo node and populating it with the various
4190    // declarations it needs.
4191    return *Pos;
4192  }
4193  return 0;
4194}
4195
4196namespace clang {
4197  /// \brief An identifier-lookup iterator that enumerates all of the
4198  /// identifiers stored within a set of AST files.
4199  class ASTIdentifierIterator : public IdentifierIterator {
4200    /// \brief The AST reader whose identifiers are being enumerated.
4201    const ASTReader &Reader;
4202
4203    /// \brief The current index into the chain of AST files stored in
4204    /// the AST reader.
4205    unsigned Index;
4206
4207    /// \brief The current position within the identifier lookup table
4208    /// of the current AST file.
4209    ASTIdentifierLookupTable::key_iterator Current;
4210
4211    /// \brief The end position within the identifier lookup table of
4212    /// the current AST file.
4213    ASTIdentifierLookupTable::key_iterator End;
4214
4215  public:
4216    explicit ASTIdentifierIterator(const ASTReader &Reader);
4217
4218    virtual llvm::StringRef Next();
4219  };
4220}
4221
4222ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
4223  : Reader(Reader), Index(Reader.Chain.size() - 1) {
4224  ASTIdentifierLookupTable *IdTable
4225    = (ASTIdentifierLookupTable *)Reader.Chain[Index]->IdentifierLookupTable;
4226  Current = IdTable->key_begin();
4227  End = IdTable->key_end();
4228}
4229
4230llvm::StringRef ASTIdentifierIterator::Next() {
4231  while (Current == End) {
4232    // If we have exhausted all of our AST files, we're done.
4233    if (Index == 0)
4234      return llvm::StringRef();
4235
4236    --Index;
4237    ASTIdentifierLookupTable *IdTable
4238      = (ASTIdentifierLookupTable *)Reader.Chain[Index]->IdentifierLookupTable;
4239    Current = IdTable->key_begin();
4240    End = IdTable->key_end();
4241  }
4242
4243  // We have any identifiers remaining in the current AST file; return
4244  // the next one.
4245  std::pair<const char*, unsigned> Key = *Current;
4246  ++Current;
4247  return llvm::StringRef(Key.first, Key.second);
4248}
4249
4250IdentifierIterator *ASTReader::getIdentifiers() const {
4251  return new ASTIdentifierIterator(*this);
4252}
4253
4254std::pair<ObjCMethodList, ObjCMethodList>
4255ASTReader::ReadMethodPool(Selector Sel) {
4256  // Find this selector in a hash table. We want to find the most recent entry.
4257  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4258    PerFileData &F = *Chain[I];
4259    if (!F.SelectorLookupTable)
4260      continue;
4261
4262    ASTSelectorLookupTable *PoolTable
4263      = (ASTSelectorLookupTable*)F.SelectorLookupTable;
4264    ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
4265    if (Pos != PoolTable->end()) {
4266      ++NumSelectorsRead;
4267      // FIXME: Not quite happy with the statistics here. We probably should
4268      // disable this tracking when called via LoadSelector.
4269      // Also, should entries without methods count as misses?
4270      ++NumMethodPoolEntriesRead;
4271      ASTSelectorLookupTrait::data_type Data = *Pos;
4272      if (DeserializationListener)
4273        DeserializationListener->SelectorRead(Data.ID, Sel);
4274      return std::make_pair(Data.Instance, Data.Factory);
4275    }
4276  }
4277
4278  ++NumMethodPoolMisses;
4279  return std::pair<ObjCMethodList, ObjCMethodList>();
4280}
4281
4282void ASTReader::LoadSelector(Selector Sel) {
4283  // It would be complicated to avoid reading the methods anyway. So don't.
4284  ReadMethodPool(Sel);
4285}
4286
4287void ASTReader::SetIdentifierInfo(unsigned ID, IdentifierInfo *II) {
4288  assert(ID && "Non-zero identifier ID required");
4289  assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
4290  IdentifiersLoaded[ID - 1] = II;
4291  if (DeserializationListener)
4292    DeserializationListener->IdentifierRead(ID, II);
4293}
4294
4295/// \brief Set the globally-visible declarations associated with the given
4296/// identifier.
4297///
4298/// If the AST reader is currently in a state where the given declaration IDs
4299/// cannot safely be resolved, they are queued until it is safe to resolve
4300/// them.
4301///
4302/// \param II an IdentifierInfo that refers to one or more globally-visible
4303/// declarations.
4304///
4305/// \param DeclIDs the set of declaration IDs with the name @p II that are
4306/// visible at global scope.
4307///
4308/// \param Nonrecursive should be true to indicate that the caller knows that
4309/// this call is non-recursive, and therefore the globally-visible declarations
4310/// will not be placed onto the pending queue.
4311void
4312ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
4313                              const llvm::SmallVectorImpl<uint32_t> &DeclIDs,
4314                                   bool Nonrecursive) {
4315  if (NumCurrentElementsDeserializing && !Nonrecursive) {
4316    PendingIdentifierInfos.push_back(PendingIdentifierInfo());
4317    PendingIdentifierInfo &PII = PendingIdentifierInfos.back();
4318    PII.II = II;
4319    PII.DeclIDs.append(DeclIDs.begin(), DeclIDs.end());
4320    return;
4321  }
4322
4323  for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
4324    NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
4325    if (SemaObj) {
4326      if (SemaObj->TUScope) {
4327        // Introduce this declaration into the translation-unit scope
4328        // and add it to the declaration chain for this identifier, so
4329        // that (unqualified) name lookup will find it.
4330        SemaObj->TUScope->AddDecl(D);
4331      }
4332      SemaObj->IdResolver.AddDeclToIdentifierChain(II, D);
4333    } else {
4334      // Queue this declaration so that it will be added to the
4335      // translation unit scope and identifier's declaration chain
4336      // once a Sema object is known.
4337      PreloadedDecls.push_back(D);
4338    }
4339  }
4340}
4341
4342IdentifierInfo *ASTReader::DecodeIdentifierInfo(unsigned ID) {
4343  if (ID == 0)
4344    return 0;
4345
4346  if (IdentifiersLoaded.empty()) {
4347    Error("no identifier table in AST file");
4348    return 0;
4349  }
4350
4351  assert(PP && "Forgot to set Preprocessor ?");
4352  ID -= 1;
4353  if (!IdentifiersLoaded[ID]) {
4354    unsigned Index = ID;
4355    const char *Str = 0;
4356    for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4357      PerFileData *F = Chain[N - I - 1];
4358      if (Index < F->LocalNumIdentifiers) {
4359         uint32_t Offset = F->IdentifierOffsets[Index];
4360         Str = F->IdentifierTableData + Offset;
4361         break;
4362      }
4363      Index -= F->LocalNumIdentifiers;
4364    }
4365    assert(Str && "Broken Chain");
4366
4367    // All of the strings in the AST file are preceded by a 16-bit length.
4368    // Extract that 16-bit length to avoid having to execute strlen().
4369    // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
4370    //  unsigned integers.  This is important to avoid integer overflow when
4371    //  we cast them to 'unsigned'.
4372    const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
4373    unsigned StrLen = (((unsigned) StrLenPtr[0])
4374                       | (((unsigned) StrLenPtr[1]) << 8)) - 1;
4375    IdentifiersLoaded[ID]
4376      = &PP->getIdentifierTable().get(Str, StrLen);
4377    if (DeserializationListener)
4378      DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
4379  }
4380
4381  return IdentifiersLoaded[ID];
4382}
4383
4384void ASTReader::ReadSLocEntry(unsigned ID) {
4385  ReadSLocEntryRecord(ID);
4386}
4387
4388Selector ASTReader::DecodeSelector(unsigned ID) {
4389  if (ID == 0)
4390    return Selector();
4391
4392  if (ID > SelectorsLoaded.size()) {
4393    Error("selector ID out of range in AST file");
4394    return Selector();
4395  }
4396
4397  if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 0) {
4398    // Load this selector from the selector table.
4399    unsigned Idx = ID - 1;
4400    for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
4401      PerFileData &F = *Chain[N - I - 1];
4402      if (Idx < F.LocalNumSelectors) {
4403        ASTSelectorLookupTrait Trait(*this);
4404        SelectorsLoaded[ID - 1] =
4405           Trait.ReadKey(F.SelectorLookupTableData + F.SelectorOffsets[Idx], 0);
4406        if (DeserializationListener)
4407          DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
4408        break;
4409      }
4410      Idx -= F.LocalNumSelectors;
4411    }
4412  }
4413
4414  return SelectorsLoaded[ID - 1];
4415}
4416
4417Selector ASTReader::GetExternalSelector(uint32_t ID) {
4418  return DecodeSelector(ID);
4419}
4420
4421uint32_t ASTReader::GetNumExternalSelectors() {
4422  // ID 0 (the null selector) is considered an external selector.
4423  return getTotalNumSelectors() + 1;
4424}
4425
4426DeclarationName
4427ASTReader::ReadDeclarationName(const RecordData &Record, unsigned &Idx) {
4428  DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
4429  switch (Kind) {
4430  case DeclarationName::Identifier:
4431    return DeclarationName(GetIdentifierInfo(Record, Idx));
4432
4433  case DeclarationName::ObjCZeroArgSelector:
4434  case DeclarationName::ObjCOneArgSelector:
4435  case DeclarationName::ObjCMultiArgSelector:
4436    return DeclarationName(GetSelector(Record, Idx));
4437
4438  case DeclarationName::CXXConstructorName:
4439    return Context->DeclarationNames.getCXXConstructorName(
4440                          Context->getCanonicalType(GetType(Record[Idx++])));
4441
4442  case DeclarationName::CXXDestructorName:
4443    return Context->DeclarationNames.getCXXDestructorName(
4444                          Context->getCanonicalType(GetType(Record[Idx++])));
4445
4446  case DeclarationName::CXXConversionFunctionName:
4447    return Context->DeclarationNames.getCXXConversionFunctionName(
4448                          Context->getCanonicalType(GetType(Record[Idx++])));
4449
4450  case DeclarationName::CXXOperatorName:
4451    return Context->DeclarationNames.getCXXOperatorName(
4452                                       (OverloadedOperatorKind)Record[Idx++]);
4453
4454  case DeclarationName::CXXLiteralOperatorName:
4455    return Context->DeclarationNames.getCXXLiteralOperatorName(
4456                                       GetIdentifierInfo(Record, Idx));
4457
4458  case DeclarationName::CXXUsingDirective:
4459    return DeclarationName::getUsingDirectiveName();
4460  }
4461
4462  // Required to silence GCC warning
4463  return DeclarationName();
4464}
4465
4466void ASTReader::ReadDeclarationNameLoc(PerFileData &F,
4467                                       DeclarationNameLoc &DNLoc,
4468                                       DeclarationName Name,
4469                                      const RecordData &Record, unsigned &Idx) {
4470  switch (Name.getNameKind()) {
4471  case DeclarationName::CXXConstructorName:
4472  case DeclarationName::CXXDestructorName:
4473  case DeclarationName::CXXConversionFunctionName:
4474    DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
4475    break;
4476
4477  case DeclarationName::CXXOperatorName:
4478    DNLoc.CXXOperatorName.BeginOpNameLoc
4479        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
4480    DNLoc.CXXOperatorName.EndOpNameLoc
4481        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
4482    break;
4483
4484  case DeclarationName::CXXLiteralOperatorName:
4485    DNLoc.CXXLiteralOperatorName.OpNameLoc
4486        = ReadSourceLocation(F, Record, Idx).getRawEncoding();
4487    break;
4488
4489  case DeclarationName::Identifier:
4490  case DeclarationName::ObjCZeroArgSelector:
4491  case DeclarationName::ObjCOneArgSelector:
4492  case DeclarationName::ObjCMultiArgSelector:
4493  case DeclarationName::CXXUsingDirective:
4494    break;
4495  }
4496}
4497
4498void ASTReader::ReadDeclarationNameInfo(PerFileData &F,
4499                                        DeclarationNameInfo &NameInfo,
4500                                      const RecordData &Record, unsigned &Idx) {
4501  NameInfo.setName(ReadDeclarationName(Record, Idx));
4502  NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
4503  DeclarationNameLoc DNLoc;
4504  ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
4505  NameInfo.setInfo(DNLoc);
4506}
4507
4508void ASTReader::ReadQualifierInfo(PerFileData &F, QualifierInfo &Info,
4509                                  const RecordData &Record, unsigned &Idx) {
4510  Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
4511  unsigned NumTPLists = Record[Idx++];
4512  Info.NumTemplParamLists = NumTPLists;
4513  if (NumTPLists) {
4514    Info.TemplParamLists = new (*Context) TemplateParameterList*[NumTPLists];
4515    for (unsigned i=0; i != NumTPLists; ++i)
4516      Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
4517  }
4518}
4519
4520TemplateName
4521ASTReader::ReadTemplateName(PerFileData &F, const RecordData &Record,
4522                            unsigned &Idx) {
4523  TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
4524  switch (Kind) {
4525  case TemplateName::Template:
4526    return TemplateName(cast_or_null<TemplateDecl>(GetDecl(Record[Idx++])));
4527
4528  case TemplateName::OverloadedTemplate: {
4529    unsigned size = Record[Idx++];
4530    UnresolvedSet<8> Decls;
4531    while (size--)
4532      Decls.addDecl(cast<NamedDecl>(GetDecl(Record[Idx++])));
4533
4534    return Context->getOverloadedTemplateName(Decls.begin(), Decls.end());
4535  }
4536
4537  case TemplateName::QualifiedTemplate: {
4538    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
4539    bool hasTemplKeyword = Record[Idx++];
4540    TemplateDecl *Template = cast<TemplateDecl>(GetDecl(Record[Idx++]));
4541    return Context->getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
4542  }
4543
4544  case TemplateName::DependentTemplate: {
4545    NestedNameSpecifier *NNS = ReadNestedNameSpecifier(Record, Idx);
4546    if (Record[Idx++])  // isIdentifier
4547      return Context->getDependentTemplateName(NNS,
4548                                               GetIdentifierInfo(Record, Idx));
4549    return Context->getDependentTemplateName(NNS,
4550                                         (OverloadedOperatorKind)Record[Idx++]);
4551  }
4552
4553  case TemplateName::SubstTemplateTemplateParmPack: {
4554    TemplateTemplateParmDecl *Param
4555      = cast_or_null<TemplateTemplateParmDecl>(GetDecl(Record[Idx++]));
4556    if (!Param)
4557      return TemplateName();
4558
4559    TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
4560    if (ArgPack.getKind() != TemplateArgument::Pack)
4561      return TemplateName();
4562
4563    return Context->getSubstTemplateTemplateParmPack(Param, ArgPack);
4564  }
4565  }
4566
4567  assert(0 && "Unhandled template name kind!");
4568  return TemplateName();
4569}
4570
4571TemplateArgument
4572ASTReader::ReadTemplateArgument(PerFileData &F,
4573                                const RecordData &Record, unsigned &Idx) {
4574  TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
4575  switch (Kind) {
4576  case TemplateArgument::Null:
4577    return TemplateArgument();
4578  case TemplateArgument::Type:
4579    return TemplateArgument(GetType(Record[Idx++]));
4580  case TemplateArgument::Declaration:
4581    return TemplateArgument(GetDecl(Record[Idx++]));
4582  case TemplateArgument::Integral: {
4583    llvm::APSInt Value = ReadAPSInt(Record, Idx);
4584    QualType T = GetType(Record[Idx++]);
4585    return TemplateArgument(Value, T);
4586  }
4587  case TemplateArgument::Template:
4588    return TemplateArgument(ReadTemplateName(F, Record, Idx));
4589  case TemplateArgument::TemplateExpansion: {
4590    TemplateName Name = ReadTemplateName(F, Record, Idx);
4591    llvm::Optional<unsigned> NumTemplateExpansions;
4592    if (unsigned NumExpansions = Record[Idx++])
4593      NumTemplateExpansions = NumExpansions - 1;
4594    return TemplateArgument(Name, NumTemplateExpansions);
4595  }
4596  case TemplateArgument::Expression:
4597    return TemplateArgument(ReadExpr(F));
4598  case TemplateArgument::Pack: {
4599    unsigned NumArgs = Record[Idx++];
4600    TemplateArgument *Args = new (*Context) TemplateArgument[NumArgs];
4601    for (unsigned I = 0; I != NumArgs; ++I)
4602      Args[I] = ReadTemplateArgument(F, Record, Idx);
4603    return TemplateArgument(Args, NumArgs);
4604  }
4605  }
4606
4607  assert(0 && "Unhandled template argument kind!");
4608  return TemplateArgument();
4609}
4610
4611TemplateParameterList *
4612ASTReader::ReadTemplateParameterList(PerFileData &F,
4613                                     const RecordData &Record, unsigned &Idx) {
4614  SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
4615  SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
4616  SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
4617
4618  unsigned NumParams = Record[Idx++];
4619  llvm::SmallVector<NamedDecl *, 16> Params;
4620  Params.reserve(NumParams);
4621  while (NumParams--)
4622    Params.push_back(cast<NamedDecl>(GetDecl(Record[Idx++])));
4623
4624  TemplateParameterList* TemplateParams =
4625    TemplateParameterList::Create(*Context, TemplateLoc, LAngleLoc,
4626                                  Params.data(), Params.size(), RAngleLoc);
4627  return TemplateParams;
4628}
4629
4630void
4631ASTReader::
4632ReadTemplateArgumentList(llvm::SmallVector<TemplateArgument, 8> &TemplArgs,
4633                         PerFileData &F, const RecordData &Record,
4634                         unsigned &Idx) {
4635  unsigned NumTemplateArgs = Record[Idx++];
4636  TemplArgs.reserve(NumTemplateArgs);
4637  while (NumTemplateArgs--)
4638    TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
4639}
4640
4641/// \brief Read a UnresolvedSet structure.
4642void ASTReader::ReadUnresolvedSet(UnresolvedSetImpl &Set,
4643                                  const RecordData &Record, unsigned &Idx) {
4644  unsigned NumDecls = Record[Idx++];
4645  while (NumDecls--) {
4646    NamedDecl *D = cast<NamedDecl>(GetDecl(Record[Idx++]));
4647    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
4648    Set.addDecl(D, AS);
4649  }
4650}
4651
4652CXXBaseSpecifier
4653ASTReader::ReadCXXBaseSpecifier(PerFileData &F,
4654                                const RecordData &Record, unsigned &Idx) {
4655  bool isVirtual = static_cast<bool>(Record[Idx++]);
4656  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
4657  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
4658  bool inheritConstructors = static_cast<bool>(Record[Idx++]);
4659  TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
4660  SourceRange Range = ReadSourceRange(F, Record, Idx);
4661  SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
4662  CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
4663                          EllipsisLoc);
4664  Result.setInheritConstructors(inheritConstructors);
4665  return Result;
4666}
4667
4668std::pair<CXXCtorInitializer **, unsigned>
4669ASTReader::ReadCXXCtorInitializers(PerFileData &F, const RecordData &Record,
4670                                   unsigned &Idx) {
4671  CXXCtorInitializer **CtorInitializers = 0;
4672  unsigned NumInitializers = Record[Idx++];
4673  if (NumInitializers) {
4674    ASTContext &C = *getContext();
4675
4676    CtorInitializers
4677        = new (C) CXXCtorInitializer*[NumInitializers];
4678    for (unsigned i=0; i != NumInitializers; ++i) {
4679      TypeSourceInfo *BaseClassInfo = 0;
4680      bool IsBaseVirtual = false;
4681      FieldDecl *Member = 0;
4682      IndirectFieldDecl *IndirectMember = 0;
4683
4684      bool IsBaseInitializer = Record[Idx++];
4685      if (IsBaseInitializer) {
4686        BaseClassInfo = GetTypeSourceInfo(F, Record, Idx);
4687        IsBaseVirtual = Record[Idx++];
4688      } else {
4689        bool IsIndirectMemberInitializer = Record[Idx++];
4690        if (IsIndirectMemberInitializer)
4691          IndirectMember = cast<IndirectFieldDecl>(GetDecl(Record[Idx++]));
4692        else
4693          Member = cast<FieldDecl>(GetDecl(Record[Idx++]));
4694      }
4695      SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
4696      Expr *Init = ReadExpr(F);
4697      SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
4698      SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
4699      bool IsWritten = Record[Idx++];
4700      unsigned SourceOrderOrNumArrayIndices;
4701      llvm::SmallVector<VarDecl *, 8> Indices;
4702      if (IsWritten) {
4703        SourceOrderOrNumArrayIndices = Record[Idx++];
4704      } else {
4705        SourceOrderOrNumArrayIndices = Record[Idx++];
4706        Indices.reserve(SourceOrderOrNumArrayIndices);
4707        for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
4708          Indices.push_back(cast<VarDecl>(GetDecl(Record[Idx++])));
4709      }
4710
4711      CXXCtorInitializer *BOMInit;
4712      if (IsBaseInitializer) {
4713        BOMInit = new (C) CXXCtorInitializer(C, BaseClassInfo, IsBaseVirtual,
4714                                             LParenLoc, Init, RParenLoc,
4715                                             MemberOrEllipsisLoc);
4716      } else if (IsWritten) {
4717        if (Member)
4718          BOMInit = new (C) CXXCtorInitializer(C, Member, MemberOrEllipsisLoc,
4719                                               LParenLoc, Init, RParenLoc);
4720        else
4721          BOMInit = new (C) CXXCtorInitializer(C, IndirectMember,
4722                                               MemberOrEllipsisLoc, LParenLoc,
4723                                               Init, RParenLoc);
4724      } else {
4725        BOMInit = CXXCtorInitializer::Create(C, Member, MemberOrEllipsisLoc,
4726                                             LParenLoc, Init, RParenLoc,
4727                                             Indices.data(), Indices.size());
4728      }
4729
4730      if (IsWritten)
4731        BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
4732      CtorInitializers[i] = BOMInit;
4733    }
4734  }
4735
4736  return std::make_pair(CtorInitializers, NumInitializers);
4737}
4738
4739NestedNameSpecifier *
4740ASTReader::ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx) {
4741  unsigned N = Record[Idx++];
4742  NestedNameSpecifier *NNS = 0, *Prev = 0;
4743  for (unsigned I = 0; I != N; ++I) {
4744    NestedNameSpecifier::SpecifierKind Kind
4745      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
4746    switch (Kind) {
4747    case NestedNameSpecifier::Identifier: {
4748      IdentifierInfo *II = GetIdentifierInfo(Record, Idx);
4749      NNS = NestedNameSpecifier::Create(*Context, Prev, II);
4750      break;
4751    }
4752
4753    case NestedNameSpecifier::Namespace: {
4754      NamespaceDecl *NS = cast<NamespaceDecl>(GetDecl(Record[Idx++]));
4755      NNS = NestedNameSpecifier::Create(*Context, Prev, NS);
4756      break;
4757    }
4758
4759    case NestedNameSpecifier::NamespaceAlias: {
4760      NamespaceAliasDecl *Alias
4761        = cast<NamespaceAliasDecl>(GetDecl(Record[Idx++]));
4762      NNS = NestedNameSpecifier::Create(*Context, Prev, Alias);
4763      break;
4764    }
4765
4766    case NestedNameSpecifier::TypeSpec:
4767    case NestedNameSpecifier::TypeSpecWithTemplate: {
4768      const Type *T = GetType(Record[Idx++]).getTypePtrOrNull();
4769      if (!T)
4770        return 0;
4771
4772      bool Template = Record[Idx++];
4773      NNS = NestedNameSpecifier::Create(*Context, Prev, Template, T);
4774      break;
4775    }
4776
4777    case NestedNameSpecifier::Global: {
4778      NNS = NestedNameSpecifier::GlobalSpecifier(*Context);
4779      // No associated value, and there can't be a prefix.
4780      break;
4781    }
4782    }
4783    Prev = NNS;
4784  }
4785  return NNS;
4786}
4787
4788NestedNameSpecifierLoc
4789ASTReader::ReadNestedNameSpecifierLoc(PerFileData &F, const RecordData &Record,
4790                                      unsigned &Idx) {
4791  unsigned N = Record[Idx++];
4792  NestedNameSpecifierLocBuilder Builder;
4793  for (unsigned I = 0; I != N; ++I) {
4794    NestedNameSpecifier::SpecifierKind Kind
4795      = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
4796    switch (Kind) {
4797    case NestedNameSpecifier::Identifier: {
4798      IdentifierInfo *II = GetIdentifierInfo(Record, Idx);
4799      SourceRange Range = ReadSourceRange(F, Record, Idx);
4800      Builder.Extend(*Context, II, Range.getBegin(), Range.getEnd());
4801      break;
4802    }
4803
4804    case NestedNameSpecifier::Namespace: {
4805      NamespaceDecl *NS = cast<NamespaceDecl>(GetDecl(Record[Idx++]));
4806      SourceRange Range = ReadSourceRange(F, Record, Idx);
4807      Builder.Extend(*Context, NS, Range.getBegin(), Range.getEnd());
4808      break;
4809    }
4810
4811    case NestedNameSpecifier::NamespaceAlias: {
4812      NamespaceAliasDecl *Alias
4813        = cast<NamespaceAliasDecl>(GetDecl(Record[Idx++]));
4814      SourceRange Range = ReadSourceRange(F, Record, Idx);
4815      Builder.Extend(*Context, Alias, Range.getBegin(), Range.getEnd());
4816      break;
4817    }
4818
4819    case NestedNameSpecifier::TypeSpec:
4820    case NestedNameSpecifier::TypeSpecWithTemplate: {
4821      bool Template = Record[Idx++];
4822      TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
4823      if (!T)
4824        return NestedNameSpecifierLoc();
4825      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
4826
4827      // FIXME: 'template' keyword location not saved anywhere, so we fake it.
4828      Builder.Extend(*Context,
4829                     Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
4830                     T->getTypeLoc(), ColonColonLoc);
4831      break;
4832    }
4833
4834    case NestedNameSpecifier::Global: {
4835      SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
4836      Builder.MakeGlobal(*Context, ColonColonLoc);
4837      break;
4838    }
4839    }
4840  }
4841
4842  return Builder.getWithLocInContext(*Context);
4843}
4844
4845SourceRange
4846ASTReader::ReadSourceRange(PerFileData &F, const RecordData &Record,
4847                           unsigned &Idx) {
4848  SourceLocation beg = ReadSourceLocation(F, Record, Idx);
4849  SourceLocation end = ReadSourceLocation(F, Record, Idx);
4850  return SourceRange(beg, end);
4851}
4852
4853/// \brief Read an integral value
4854llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
4855  unsigned BitWidth = Record[Idx++];
4856  unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
4857  llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
4858  Idx += NumWords;
4859  return Result;
4860}
4861
4862/// \brief Read a signed integral value
4863llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
4864  bool isUnsigned = Record[Idx++];
4865  return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
4866}
4867
4868/// \brief Read a floating-point value
4869llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, unsigned &Idx) {
4870  return llvm::APFloat(ReadAPInt(Record, Idx));
4871}
4872
4873// \brief Read a string
4874std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
4875  unsigned Len = Record[Idx++];
4876  std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
4877  Idx += Len;
4878  return Result;
4879}
4880
4881VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
4882                                         unsigned &Idx) {
4883  unsigned Major = Record[Idx++];
4884  unsigned Minor = Record[Idx++];
4885  unsigned Subminor = Record[Idx++];
4886  if (Minor == 0)
4887    return VersionTuple(Major);
4888  if (Subminor == 0)
4889    return VersionTuple(Major, Minor - 1);
4890  return VersionTuple(Major, Minor - 1, Subminor - 1);
4891}
4892
4893CXXTemporary *ASTReader::ReadCXXTemporary(const RecordData &Record,
4894                                          unsigned &Idx) {
4895  CXXDestructorDecl *Decl = cast<CXXDestructorDecl>(GetDecl(Record[Idx++]));
4896  return CXXTemporary::Create(*Context, Decl);
4897}
4898
4899DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
4900  return Diag(SourceLocation(), DiagID);
4901}
4902
4903DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
4904  return Diags.Report(Loc, DiagID);
4905}
4906
4907/// \brief Retrieve the identifier table associated with the
4908/// preprocessor.
4909IdentifierTable &ASTReader::getIdentifierTable() {
4910  assert(PP && "Forgot to set Preprocessor ?");
4911  return PP->getIdentifierTable();
4912}
4913
4914/// \brief Record that the given ID maps to the given switch-case
4915/// statement.
4916void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
4917  assert(SwitchCaseStmts[ID] == 0 && "Already have a SwitchCase with this ID");
4918  SwitchCaseStmts[ID] = SC;
4919}
4920
4921/// \brief Retrieve the switch-case statement with the given ID.
4922SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
4923  assert(SwitchCaseStmts[ID] != 0 && "No SwitchCase with this ID");
4924  return SwitchCaseStmts[ID];
4925}
4926
4927void ASTReader::ClearSwitchCaseIDs() {
4928  SwitchCaseStmts.clear();
4929}
4930
4931void ASTReader::FinishedDeserializing() {
4932  assert(NumCurrentElementsDeserializing &&
4933         "FinishedDeserializing not paired with StartedDeserializing");
4934  if (NumCurrentElementsDeserializing == 1) {
4935    // If any identifiers with corresponding top-level declarations have
4936    // been loaded, load those declarations now.
4937    while (!PendingIdentifierInfos.empty()) {
4938      SetGloballyVisibleDecls(PendingIdentifierInfos.front().II,
4939                              PendingIdentifierInfos.front().DeclIDs, true);
4940      PendingIdentifierInfos.pop_front();
4941    }
4942
4943    // Ready to load previous declarations of Decls that were delayed.
4944    while (!PendingPreviousDecls.empty()) {
4945      loadAndAttachPreviousDecl(PendingPreviousDecls.front().first,
4946                                PendingPreviousDecls.front().second);
4947      PendingPreviousDecls.pop_front();
4948    }
4949
4950    // We are not in recursive loading, so it's safe to pass the "interesting"
4951    // decls to the consumer.
4952    if (Consumer)
4953      PassInterestingDeclsToConsumer();
4954
4955    assert(PendingForwardRefs.size() == 0 &&
4956           "Some forward refs did not get linked to the definition!");
4957  }
4958  --NumCurrentElementsDeserializing;
4959}
4960
4961ASTReader::ASTReader(Preprocessor &PP, ASTContext *Context,
4962                     const char *isysroot, bool DisableValidation,
4963                     bool DisableStatCache)
4964  : Listener(new PCHValidator(PP, *this)), DeserializationListener(0),
4965    SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
4966    Diags(PP.getDiagnostics()), SemaObj(0), PP(&PP), Context(Context),
4967    Consumer(0), isysroot(isysroot), DisableValidation(DisableValidation),
4968    DisableStatCache(DisableStatCache), NumStatHits(0), NumStatMisses(0),
4969    NumSLocEntriesRead(0), TotalNumSLocEntries(0), NextSLocOffset(0),
4970    NumStatementsRead(0), TotalNumStatements(0), NumMacrosRead(0),
4971    TotalNumMacros(0), NumSelectorsRead(0), NumMethodPoolEntriesRead(0),
4972    NumMethodPoolMisses(0), TotalNumMethodPoolEntries(0),
4973    NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
4974    NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
4975    NumCurrentElementsDeserializing(0)
4976{
4977  RelocatablePCH = false;
4978}
4979
4980ASTReader::ASTReader(SourceManager &SourceMgr, FileManager &FileMgr,
4981                     Diagnostic &Diags, const char *isysroot,
4982                     bool DisableValidation, bool DisableStatCache)
4983  : DeserializationListener(0), SourceMgr(SourceMgr), FileMgr(FileMgr),
4984    Diags(Diags), SemaObj(0), PP(0), Context(0), Consumer(0),
4985    isysroot(isysroot), DisableValidation(DisableValidation),
4986    DisableStatCache(DisableStatCache), NumStatHits(0), NumStatMisses(0),
4987    NumSLocEntriesRead(0), TotalNumSLocEntries(0),
4988    NextSLocOffset(0), NumStatementsRead(0), TotalNumStatements(0),
4989    NumMacrosRead(0), TotalNumMacros(0), NumSelectorsRead(0),
4990    NumMethodPoolEntriesRead(0), NumMethodPoolMisses(0),
4991    TotalNumMethodPoolEntries(0), NumLexicalDeclContextsRead(0),
4992    TotalLexicalDeclContexts(0), NumVisibleDeclContextsRead(0),
4993    TotalVisibleDeclContexts(0), NumCurrentElementsDeserializing(0) {
4994  RelocatablePCH = false;
4995}
4996
4997ASTReader::~ASTReader() {
4998  for (unsigned i = 0, e = Chain.size(); i != e; ++i)
4999    delete Chain[e - i - 1];
5000  // Delete all visible decl lookup tables
5001  for (DeclContextOffsetsMap::iterator I = DeclContextOffsets.begin(),
5002                                       E = DeclContextOffsets.end();
5003       I != E; ++I) {
5004    for (DeclContextInfos::iterator J = I->second.begin(), F = I->second.end();
5005         J != F; ++J) {
5006      if (J->NameLookupTableData)
5007        delete static_cast<ASTDeclContextNameLookupTable*>(
5008            J->NameLookupTableData);
5009    }
5010  }
5011  for (DeclContextVisibleUpdatesPending::iterator
5012           I = PendingVisibleUpdates.begin(),
5013           E = PendingVisibleUpdates.end();
5014       I != E; ++I) {
5015    for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
5016                                             F = I->second.end();
5017         J != F; ++J)
5018      delete static_cast<ASTDeclContextNameLookupTable*>(*J);
5019  }
5020}
5021
5022ASTReader::PerFileData::PerFileData(ASTFileType Ty)
5023  : Type(Ty), SizeInBits(0), LocalNumSLocEntries(0), SLocOffsets(0), LocalSLocSize(0),
5024    LocalNumIdentifiers(0), IdentifierOffsets(0), IdentifierTableData(0),
5025    IdentifierLookupTable(0), LocalNumMacroDefinitions(0),
5026    MacroDefinitionOffsets(0),
5027    LocalNumHeaderFileInfos(0), HeaderFileInfoTableData(0),
5028    HeaderFileInfoTable(0),
5029    LocalNumSelectors(0), SelectorOffsets(0),
5030    SelectorLookupTableData(0), SelectorLookupTable(0), LocalNumDecls(0),
5031    DeclOffsets(0), LocalNumCXXBaseSpecifiers(0), CXXBaseSpecifiersOffsets(0),
5032    LocalNumTypes(0), TypeOffsets(0), StatCache(0),
5033    NumPreallocatedPreprocessingEntities(0), NextInSource(0)
5034{}
5035
5036ASTReader::PerFileData::~PerFileData() {
5037  delete static_cast<ASTIdentifierLookupTable *>(IdentifierLookupTable);
5038  delete static_cast<HeaderFileInfoLookupTable *>(HeaderFileInfoTable);
5039  delete static_cast<ASTSelectorLookupTable *>(SelectorLookupTable);
5040}
5041