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