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