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