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