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