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