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