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