1 //===--- ASTReader.cpp - AST File Reader ----------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the ASTReader class, which reads AST files.
12 //===----------------------------------------------------------------------===//
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/DiagnosticOptions.h"
26 #include "clang/Basic/FileManager.h"
27 #include "clang/Basic/SourceManager.h"
28 #include "clang/Basic/SourceManagerInternals.h"
29 #include "clang/Basic/TargetInfo.h"
30 #include "clang/Basic/TargetOptions.h"
31 #include "clang/Basic/Version.h"
32 #include "clang/Basic/VersionTuple.h"
33 #include "clang/Frontend/Utils.h"
34 #include "clang/Lex/HeaderSearch.h"
35 #include "clang/Lex/HeaderSearchOptions.h"
36 #include "clang/Lex/MacroInfo.h"
37 #include "clang/Lex/PreprocessingRecord.h"
38 #include "clang/Lex/Preprocessor.h"
39 #include "clang/Lex/PreprocessorOptions.h"
40 #include "clang/Sema/Scope.h"
41 #include "clang/Sema/Sema.h"
42 #include "clang/Serialization/ASTDeserializationListener.h"
43 #include "clang/Serialization/GlobalModuleIndex.h"
44 #include "clang/Serialization/ModuleManager.h"
45 #include "clang/Serialization/SerializationDiagnostic.h"
46 #include "llvm/ADT/Hashing.h"
47 #include "llvm/ADT/StringExtras.h"
48 #include "llvm/Bitcode/BitstreamReader.h"
49 #include "llvm/Support/ErrorHandling.h"
50 #include "llvm/Support/FileSystem.h"
51 #include "llvm/Support/MemoryBuffer.h"
52 #include "llvm/Support/Path.h"
53 #include "llvm/Support/SaveAndRestore.h"
54 #include "llvm/Support/raw_ostream.h"
58 #include <system_error>
60 using namespace clang;
61 using namespace clang::serialization;
62 using namespace clang::serialization::reader;
63 using llvm::BitstreamCursor;
66 //===----------------------------------------------------------------------===//
67 // ChainedASTReaderListener implementation
68 //===----------------------------------------------------------------------===//
71 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
75 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
76 First->ReadModuleName(ModuleName);
77 Second->ReadModuleName(ModuleName);
79 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
80 First->ReadModuleMapFile(ModuleMapPath);
81 Second->ReadModuleMapFile(ModuleMapPath);
83 bool ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
85 return First->ReadLanguageOptions(LangOpts, Complain) ||
86 Second->ReadLanguageOptions(LangOpts, Complain);
89 ChainedASTReaderListener::ReadTargetOptions(const TargetOptions &TargetOpts,
91 return First->ReadTargetOptions(TargetOpts, Complain) ||
92 Second->ReadTargetOptions(TargetOpts, Complain);
94 bool ChainedASTReaderListener::ReadDiagnosticOptions(
95 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
96 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
97 Second->ReadDiagnosticOptions(DiagOpts, Complain);
100 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
102 return First->ReadFileSystemOptions(FSOpts, Complain) ||
103 Second->ReadFileSystemOptions(FSOpts, Complain);
106 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
107 const HeaderSearchOptions &HSOpts, bool Complain) {
108 return First->ReadHeaderSearchOptions(HSOpts, Complain) ||
109 Second->ReadHeaderSearchOptions(HSOpts, Complain);
111 bool ChainedASTReaderListener::ReadPreprocessorOptions(
112 const PreprocessorOptions &PPOpts, bool Complain,
113 std::string &SuggestedPredefines) {
114 return First->ReadPreprocessorOptions(PPOpts, Complain,
115 SuggestedPredefines) ||
116 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
118 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
120 First->ReadCounter(M, Value);
121 Second->ReadCounter(M, Value);
123 bool ChainedASTReaderListener::needsInputFileVisitation() {
124 return First->needsInputFileVisitation() ||
125 Second->needsInputFileVisitation();
127 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
128 return First->needsSystemInputFileVisitation() ||
129 Second->needsSystemInputFileVisitation();
131 void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
132 First->visitModuleFile(Filename);
133 Second->visitModuleFile(Filename);
135 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
138 bool Continue = false;
139 if (First->needsInputFileVisitation() &&
140 (!isSystem || First->needsSystemInputFileVisitation()))
141 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
142 if (Second->needsInputFileVisitation() &&
143 (!isSystem || Second->needsSystemInputFileVisitation()))
144 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
148 //===----------------------------------------------------------------------===//
149 // PCH validator implementation
150 //===----------------------------------------------------------------------===//
152 ASTReaderListener::~ASTReaderListener() {}
154 /// \brief Compare the given set of language options against an existing set of
155 /// language options.
157 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
159 /// \returns true if the languagae options mis-match, false otherwise.
160 static bool checkLanguageOptions(const LangOptions &LangOpts,
161 const LangOptions &ExistingLangOpts,
162 DiagnosticsEngine *Diags) {
163 #define LANGOPT(Name, Bits, Default, Description) \
164 if (ExistingLangOpts.Name != LangOpts.Name) { \
166 Diags->Report(diag::err_pch_langopt_mismatch) \
167 << Description << LangOpts.Name << ExistingLangOpts.Name; \
171 #define VALUE_LANGOPT(Name, Bits, Default, Description) \
172 if (ExistingLangOpts.Name != LangOpts.Name) { \
174 Diags->Report(diag::err_pch_langopt_value_mismatch) \
179 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
180 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
182 Diags->Report(diag::err_pch_langopt_value_mismatch) \
187 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
188 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
189 #include "clang/Basic/LangOptions.def"
191 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
193 Diags->Report(diag::err_pch_langopt_value_mismatch)
194 << "target Objective-C runtime";
198 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
199 LangOpts.CommentOpts.BlockCommandNames) {
201 Diags->Report(diag::err_pch_langopt_value_mismatch)
202 << "block command names";
209 /// \brief Compare the given set of target options against an existing set of
212 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
214 /// \returns true if the target options mis-match, false otherwise.
215 static bool checkTargetOptions(const TargetOptions &TargetOpts,
216 const TargetOptions &ExistingTargetOpts,
217 DiagnosticsEngine *Diags) {
218 #define CHECK_TARGET_OPT(Field, Name) \
219 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
221 Diags->Report(diag::err_pch_targetopt_mismatch) \
222 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
226 CHECK_TARGET_OPT(Triple, "target");
227 CHECK_TARGET_OPT(CPU, "target CPU");
228 CHECK_TARGET_OPT(ABI, "target ABI");
229 #undef CHECK_TARGET_OPT
231 // Compare feature sets.
232 SmallVector<StringRef, 4> ExistingFeatures(
233 ExistingTargetOpts.FeaturesAsWritten.begin(),
234 ExistingTargetOpts.FeaturesAsWritten.end());
235 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
236 TargetOpts.FeaturesAsWritten.end());
237 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
238 std::sort(ReadFeatures.begin(), ReadFeatures.end());
240 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
241 unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
242 while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
243 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
249 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
251 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
252 << false << ReadFeatures[ReadIdx];
257 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
258 << true << ExistingFeatures[ExistingIdx];
262 if (ExistingIdx < ExistingN) {
264 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
265 << true << ExistingFeatures[ExistingIdx];
269 if (ReadIdx < ReadN) {
271 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
272 << false << ReadFeatures[ReadIdx];
280 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
282 const LangOptions &ExistingLangOpts = PP.getLangOpts();
283 return checkLanguageOptions(LangOpts, ExistingLangOpts,
284 Complain? &Reader.Diags : nullptr);
287 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
289 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
290 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
291 Complain? &Reader.Diags : nullptr);
295 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
297 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
301 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
302 DiagnosticsEngine &Diags,
304 typedef DiagnosticsEngine::Level Level;
306 // Check current mappings for new -Werror mappings, and the stored mappings
307 // for cases that were explicitly mapped to *not* be errors that are now
308 // errors because of options like -Werror.
309 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
311 for (DiagnosticsEngine *MappingSource : MappingSources) {
312 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
313 diag::kind DiagID = DiagIDMappingPair.first;
314 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
315 if (CurLevel < DiagnosticsEngine::Error)
316 continue; // not significant
318 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
319 if (StoredLevel < DiagnosticsEngine::Error) {
321 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
322 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
331 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
332 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
333 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
335 return Ext >= diag::Severity::Error;
338 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
339 DiagnosticsEngine &Diags,
340 bool IsSystem, bool Complain) {
343 if (Diags.getSuppressSystemWarnings())
345 // If -Wsystem-headers was not enabled before, be conservative
346 if (StoredDiags.getSuppressSystemWarnings()) {
348 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
353 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
355 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
359 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
360 !StoredDiags.getEnableAllWarnings()) {
362 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
366 if (isExtHandlingFromDiagsError(Diags) &&
367 !isExtHandlingFromDiagsError(StoredDiags)) {
369 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
373 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
376 bool PCHValidator::ReadDiagnosticOptions(
377 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
378 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
379 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
380 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
381 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
382 // This should never fail, because we would have processed these options
383 // before writing them to an ASTFile.
384 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
386 ModuleManager &ModuleMgr = Reader.getModuleManager();
387 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
389 // If the original import came from a file explicitly generated by the user,
390 // don't check the diagnostic mappings.
391 // FIXME: currently this is approximated by checking whether this is not a
393 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
394 // the transitive closure of its imports, since unrelated modules cannot be
395 // imported until after this module finishes validation.
396 ModuleFile *TopImport = *ModuleMgr.rbegin();
397 while (!TopImport->ImportedBy.empty())
398 TopImport = TopImport->ImportedBy[0];
399 if (TopImport->Kind != MK_Module)
402 StringRef ModuleName = TopImport->ModuleName;
403 assert(!ModuleName.empty() && "diagnostic options read before module name");
405 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
406 assert(M && "missing module");
408 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
409 // contains the union of their flags.
410 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
413 /// \brief Collect the macro definitions provided by the given preprocessor
416 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
417 MacroDefinitionsMap &Macros,
418 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
419 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
420 StringRef Macro = PPOpts.Macros[I].first;
421 bool IsUndef = PPOpts.Macros[I].second;
423 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
424 StringRef MacroName = MacroPair.first;
425 StringRef MacroBody = MacroPair.second;
427 // For an #undef'd macro, we only care about the name.
429 if (MacroNames && !Macros.count(MacroName))
430 MacroNames->push_back(MacroName);
432 Macros[MacroName] = std::make_pair("", true);
436 // For a #define'd macro, figure out the actual definition.
437 if (MacroName.size() == Macro.size())
440 // Note: GCC drops anything following an end-of-line character.
441 StringRef::size_type End = MacroBody.find_first_of("\n\r");
442 MacroBody = MacroBody.substr(0, End);
445 if (MacroNames && !Macros.count(MacroName))
446 MacroNames->push_back(MacroName);
447 Macros[MacroName] = std::make_pair(MacroBody, false);
451 /// \brief Check the preprocessor options deserialized from the control block
452 /// against the preprocessor options in an existing preprocessor.
454 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
455 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
456 const PreprocessorOptions &ExistingPPOpts,
457 DiagnosticsEngine *Diags,
458 FileManager &FileMgr,
459 std::string &SuggestedPredefines,
460 const LangOptions &LangOpts) {
461 // Check macro definitions.
462 MacroDefinitionsMap ASTFileMacros;
463 collectMacroDefinitions(PPOpts, ASTFileMacros);
464 MacroDefinitionsMap ExistingMacros;
465 SmallVector<StringRef, 4> ExistingMacroNames;
466 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
468 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
469 // Dig out the macro definition in the existing preprocessor options.
470 StringRef MacroName = ExistingMacroNames[I];
471 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
473 // Check whether we know anything about this macro name or not.
474 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
475 = ASTFileMacros.find(MacroName);
476 if (Known == ASTFileMacros.end()) {
477 // FIXME: Check whether this identifier was referenced anywhere in the
478 // AST file. If so, we should reject the AST file. Unfortunately, this
479 // information isn't in the control block. What shall we do about it?
481 if (Existing.second) {
482 SuggestedPredefines += "#undef ";
483 SuggestedPredefines += MacroName.str();
484 SuggestedPredefines += '\n';
486 SuggestedPredefines += "#define ";
487 SuggestedPredefines += MacroName.str();
488 SuggestedPredefines += ' ';
489 SuggestedPredefines += Existing.first.str();
490 SuggestedPredefines += '\n';
495 // If the macro was defined in one but undef'd in the other, we have a
497 if (Existing.second != Known->second.second) {
499 Diags->Report(diag::err_pch_macro_def_undef)
500 << MacroName << Known->second.second;
505 // If the macro was #undef'd in both, or if the macro bodies are identical,
507 if (Existing.second || Existing.first == Known->second.first)
510 // The macro bodies differ; complain.
512 Diags->Report(diag::err_pch_macro_def_conflict)
513 << MacroName << Known->second.first << Existing.first;
518 // Check whether we're using predefines.
519 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
521 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
526 // Detailed record is important since it is used for the module cache hash.
527 if (LangOpts.Modules &&
528 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
530 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
535 // Compute the #include and #include_macros lines we need.
536 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
537 StringRef File = ExistingPPOpts.Includes[I];
538 if (File == ExistingPPOpts.ImplicitPCHInclude)
541 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
542 != PPOpts.Includes.end())
545 SuggestedPredefines += "#include \"";
546 SuggestedPredefines += File;
547 SuggestedPredefines += "\"\n";
550 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
551 StringRef File = ExistingPPOpts.MacroIncludes[I];
552 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
554 != PPOpts.MacroIncludes.end())
557 SuggestedPredefines += "#__include_macros \"";
558 SuggestedPredefines += File;
559 SuggestedPredefines += "\"\n##\n";
565 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
567 std::string &SuggestedPredefines) {
568 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
570 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
571 Complain? &Reader.Diags : nullptr,
577 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
578 PP.setCounterValue(Value);
581 //===----------------------------------------------------------------------===//
582 // AST reader implementation
583 //===----------------------------------------------------------------------===//
585 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
586 bool TakeOwnership) {
587 DeserializationListener = Listener;
588 OwnsDeserializationListener = TakeOwnership;
593 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
594 return serialization::ComputeHash(Sel);
598 std::pair<unsigned, unsigned>
599 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
600 using namespace llvm::support;
601 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
602 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
603 return std::make_pair(KeyLen, DataLen);
606 ASTSelectorLookupTrait::internal_key_type
607 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
608 using namespace llvm::support;
609 SelectorTable &SelTable = Reader.getContext().Selectors;
610 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
611 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
612 F, endian::readNext<uint32_t, little, unaligned>(d));
614 return SelTable.getNullarySelector(FirstII);
616 return SelTable.getUnarySelector(FirstII);
618 SmallVector<IdentifierInfo *, 16> Args;
619 Args.push_back(FirstII);
620 for (unsigned I = 1; I != N; ++I)
621 Args.push_back(Reader.getLocalIdentifier(
622 F, endian::readNext<uint32_t, little, unaligned>(d)));
624 return SelTable.getSelector(N, Args.data());
627 ASTSelectorLookupTrait::data_type
628 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
630 using namespace llvm::support;
634 Result.ID = Reader.getGlobalSelectorID(
635 F, endian::readNext<uint32_t, little, unaligned>(d));
636 unsigned NumInstanceMethodsAndBits =
637 endian::readNext<uint16_t, little, unaligned>(d);
638 unsigned NumFactoryMethodsAndBits =
639 endian::readNext<uint16_t, little, unaligned>(d);
640 Result.InstanceBits = NumInstanceMethodsAndBits & 0x3;
641 Result.FactoryBits = NumFactoryMethodsAndBits & 0x3;
642 unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2;
643 unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2;
645 // Load instance methods
646 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
647 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
648 F, endian::readNext<uint32_t, little, unaligned>(d)))
649 Result.Instance.push_back(Method);
652 // Load factory methods
653 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
654 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
655 F, endian::readNext<uint32_t, little, unaligned>(d)))
656 Result.Factory.push_back(Method);
662 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
663 return llvm::HashString(a);
666 std::pair<unsigned, unsigned>
667 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
668 using namespace llvm::support;
669 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
670 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
671 return std::make_pair(KeyLen, DataLen);
674 ASTIdentifierLookupTraitBase::internal_key_type
675 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
676 assert(n >= 2 && d[n-1] == '\0');
677 return StringRef((const char*) d, n-1);
680 /// \brief Whether the given identifier is "interesting".
681 static bool isInterestingIdentifier(IdentifierInfo &II) {
682 return II.isPoisoned() ||
683 II.isExtensionToken() ||
684 II.getObjCOrBuiltinID() ||
685 II.hasRevertedTokenIDToIdentifier() ||
686 II.hadMacroDefinition() ||
687 II.getFETokenInfo<void>();
690 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
691 const unsigned char* d,
693 using namespace llvm::support;
694 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
695 bool IsInteresting = RawID & 0x01;
697 // Wipe out the "is interesting" bit.
700 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
701 if (!IsInteresting) {
702 // For uninteresting identifiers, just build the IdentifierInfo
703 // and associate it with the persistent ID.
704 IdentifierInfo *II = KnownII;
706 II = &Reader.getIdentifierTable().getOwn(k);
709 Reader.SetIdentifierInfo(ID, II);
710 if (!II->isFromAST()) {
711 bool WasInteresting = isInterestingIdentifier(*II);
714 II->setChangedSinceDeserialization();
716 Reader.markIdentifierUpToDate(II);
720 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
721 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
722 bool CPlusPlusOperatorKeyword = Bits & 0x01;
724 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
726 bool Poisoned = Bits & 0x01;
728 bool ExtensionToken = Bits & 0x01;
730 bool hasSubmoduleMacros = Bits & 0x01;
732 bool hadMacroDefinition = Bits & 0x01;
735 assert(Bits == 0 && "Extra bits in the identifier?");
738 // Build the IdentifierInfo itself and link the identifier ID with
739 // the new IdentifierInfo.
740 IdentifierInfo *II = KnownII;
742 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
745 Reader.markIdentifierUpToDate(II);
746 if (!II->isFromAST()) {
747 bool WasInteresting = isInterestingIdentifier(*II);
750 II->setChangedSinceDeserialization();
753 // Set or check the various bits in the IdentifierInfo structure.
754 // Token IDs are read-only.
755 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
756 II->RevertTokenIDToIdentifier();
757 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
758 assert(II->isExtensionToken() == ExtensionToken &&
759 "Incorrect extension token flag");
760 (void)ExtensionToken;
762 II->setIsPoisoned(true);
763 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
764 "Incorrect C++ operator keyword flag");
765 (void)CPlusPlusOperatorKeyword;
767 // If this identifier is a macro, deserialize the macro
769 if (hadMacroDefinition) {
770 uint32_t MacroDirectivesOffset =
771 endian::readNext<uint32_t, little, unaligned>(d);
773 SmallVector<uint32_t, 8> LocalMacroIDs;
774 if (hasSubmoduleMacros) {
776 uint32_t LocalMacroID =
777 endian::readNext<uint32_t, little, unaligned>(d);
779 if (LocalMacroID == 0xdeadbeef) break;
780 LocalMacroIDs.push_back(LocalMacroID);
784 if (F.Kind == MK_Module) {
785 // Macro definitions are stored from newest to oldest, so reverse them
786 // before registering them.
787 llvm::SmallVector<unsigned, 8> MacroSizes;
788 for (SmallVectorImpl<uint32_t>::iterator
789 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
792 static const uint32_t HasOverridesFlag = 0x80000000U;
793 if (I + 1 != E && (I[1] & HasOverridesFlag))
794 Size += 1 + (I[1] & ~HasOverridesFlag);
796 MacroSizes.push_back(Size);
800 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
801 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
802 SE = MacroSizes.rend();
806 uint32_t LocalMacroID = *I;
807 ArrayRef<uint32_t> Overrides;
809 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
810 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
812 assert(I == LocalMacroIDs.begin());
814 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
818 Reader.SetIdentifierInfo(ID, II);
820 // Read all of the declarations visible at global scope with this
823 SmallVector<uint32_t, 4> DeclIDs;
824 for (; DataLen > 0; DataLen -= 4)
825 DeclIDs.push_back(Reader.getGlobalDeclID(
826 F, endian::readNext<uint32_t, little, unaligned>(d)));
827 Reader.SetGloballyVisibleDecls(II, DeclIDs);
834 ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
835 llvm::FoldingSetNodeID ID;
836 ID.AddInteger(Key.Kind);
839 case DeclarationName::Identifier:
840 case DeclarationName::CXXLiteralOperatorName:
841 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
843 case DeclarationName::ObjCZeroArgSelector:
844 case DeclarationName::ObjCOneArgSelector:
845 case DeclarationName::ObjCMultiArgSelector:
846 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
848 case DeclarationName::CXXOperatorName:
849 ID.AddInteger((OverloadedOperatorKind)Key.Data);
851 case DeclarationName::CXXConstructorName:
852 case DeclarationName::CXXDestructorName:
853 case DeclarationName::CXXConversionFunctionName:
854 case DeclarationName::CXXUsingDirective:
858 return ID.ComputeHash();
861 ASTDeclContextNameLookupTrait::internal_key_type
862 ASTDeclContextNameLookupTrait::GetInternalKey(
863 const external_key_type& Name) const {
865 Key.Kind = Name.getNameKind();
866 switch (Name.getNameKind()) {
867 case DeclarationName::Identifier:
868 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
870 case DeclarationName::ObjCZeroArgSelector:
871 case DeclarationName::ObjCOneArgSelector:
872 case DeclarationName::ObjCMultiArgSelector:
873 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
875 case DeclarationName::CXXOperatorName:
876 Key.Data = Name.getCXXOverloadedOperator();
878 case DeclarationName::CXXLiteralOperatorName:
879 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
881 case DeclarationName::CXXConstructorName:
882 case DeclarationName::CXXDestructorName:
883 case DeclarationName::CXXConversionFunctionName:
884 case DeclarationName::CXXUsingDirective:
892 std::pair<unsigned, unsigned>
893 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
894 using namespace llvm::support;
895 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
896 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
897 return std::make_pair(KeyLen, DataLen);
900 ASTDeclContextNameLookupTrait::internal_key_type
901 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
902 using namespace llvm::support;
905 Key.Kind = (DeclarationName::NameKind)*d++;
907 case DeclarationName::Identifier:
908 Key.Data = (uint64_t)Reader.getLocalIdentifier(
909 F, endian::readNext<uint32_t, little, unaligned>(d));
911 case DeclarationName::ObjCZeroArgSelector:
912 case DeclarationName::ObjCOneArgSelector:
913 case DeclarationName::ObjCMultiArgSelector:
915 (uint64_t)Reader.getLocalSelector(
916 F, endian::readNext<uint32_t, little, unaligned>(
917 d)).getAsOpaquePtr();
919 case DeclarationName::CXXOperatorName:
920 Key.Data = *d++; // OverloadedOperatorKind
922 case DeclarationName::CXXLiteralOperatorName:
923 Key.Data = (uint64_t)Reader.getLocalIdentifier(
924 F, endian::readNext<uint32_t, little, unaligned>(d));
926 case DeclarationName::CXXConstructorName:
927 case DeclarationName::CXXDestructorName:
928 case DeclarationName::CXXConversionFunctionName:
929 case DeclarationName::CXXUsingDirective:
937 ASTDeclContextNameLookupTrait::data_type
938 ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
939 const unsigned char* d,
941 using namespace llvm::support;
942 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
943 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
944 const_cast<unsigned char *>(d));
945 return std::make_pair(Start, Start + NumDecls);
948 bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
949 BitstreamCursor &Cursor,
950 const std::pair<uint64_t, uint64_t> &Offsets,
951 DeclContextInfo &Info) {
952 SavedStreamPosition SavedPosition(Cursor);
953 // First the lexical decls.
954 if (Offsets.first != 0) {
955 Cursor.JumpToBit(Offsets.first);
959 unsigned Code = Cursor.ReadCode();
960 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
961 if (RecCode != DECL_CONTEXT_LEXICAL) {
962 Error("Expected lexical block");
966 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
967 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
970 // Now the lookup table.
971 if (Offsets.second != 0) {
972 Cursor.JumpToBit(Offsets.second);
976 unsigned Code = Cursor.ReadCode();
977 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
978 if (RecCode != DECL_CONTEXT_VISIBLE) {
979 Error("Expected visible lookup table block");
982 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
983 (const unsigned char *)Blob.data() + Record[0],
984 (const unsigned char *)Blob.data() + sizeof(uint32_t),
985 (const unsigned char *)Blob.data(),
986 ASTDeclContextNameLookupTrait(*this, M));
992 void ASTReader::Error(StringRef Msg) {
993 Error(diag::err_fe_pch_malformed, Msg);
994 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
995 Diag(diag::note_module_cache_path)
996 << PP.getHeaderSearchInfo().getModuleCachePath();
1000 void ASTReader::Error(unsigned DiagID,
1001 StringRef Arg1, StringRef Arg2) {
1002 if (Diags.isDiagnosticInFlight())
1003 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1005 Diag(DiagID) << Arg1 << Arg2;
1008 //===----------------------------------------------------------------------===//
1009 // Source Manager Deserialization
1010 //===----------------------------------------------------------------------===//
1012 /// \brief Read the line table in the source manager block.
1013 /// \returns true if there was an error.
1014 bool ASTReader::ParseLineTable(ModuleFile &F,
1015 SmallVectorImpl<uint64_t> &Record) {
1017 LineTableInfo &LineTable = SourceMgr.getLineTable();
1019 // Parse the file names
1020 std::map<int, int> FileIDs;
1021 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1022 // Extract the file name
1023 unsigned FilenameLen = Record[Idx++];
1024 std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
1026 MaybeAddSystemRootToFilename(F, Filename);
1027 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1030 // Parse the line entries
1031 std::vector<LineEntry> Entries;
1032 while (Idx < Record.size()) {
1033 int FID = Record[Idx++];
1034 assert(FID >= 0 && "Serialized line entries for non-local file.");
1035 // Remap FileID from 1-based old view.
1036 FID += F.SLocEntryBaseID - 1;
1038 // Extract the line entries
1039 unsigned NumEntries = Record[Idx++];
1040 assert(NumEntries && "Numentries is 00000");
1042 Entries.reserve(NumEntries);
1043 for (unsigned I = 0; I != NumEntries; ++I) {
1044 unsigned FileOffset = Record[Idx++];
1045 unsigned LineNo = Record[Idx++];
1046 int FilenameID = FileIDs[Record[Idx++]];
1047 SrcMgr::CharacteristicKind FileKind
1048 = (SrcMgr::CharacteristicKind)Record[Idx++];
1049 unsigned IncludeOffset = Record[Idx++];
1050 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1051 FileKind, IncludeOffset));
1053 LineTable.AddEntry(FileID::get(FID), Entries);
1059 /// \brief Read a source manager block
1060 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1061 using namespace SrcMgr;
1063 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1065 // Set the source-location entry cursor to the current position in
1066 // the stream. This cursor will be used to read the contents of the
1067 // source manager block initially, and then lazily read
1068 // source-location entries as needed.
1069 SLocEntryCursor = F.Stream;
1071 // The stream itself is going to skip over the source manager block.
1072 if (F.Stream.SkipBlock()) {
1073 Error("malformed block record in AST file");
1077 // Enter the source manager block.
1078 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1079 Error("malformed source manager block record in AST file");
1085 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1088 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1089 case llvm::BitstreamEntry::Error:
1090 Error("malformed block record in AST file");
1092 case llvm::BitstreamEntry::EndBlock:
1094 case llvm::BitstreamEntry::Record:
1095 // The interesting case.
1102 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1103 default: // Default behavior: ignore.
1106 case SM_SLOC_FILE_ENTRY:
1107 case SM_SLOC_BUFFER_ENTRY:
1108 case SM_SLOC_EXPANSION_ENTRY:
1109 // Once we hit one of the source location entries, we're done.
1115 /// \brief If a header file is not found at the path that we expect it to be
1116 /// and the PCH file was moved from its original location, try to resolve the
1117 /// file by assuming that header+PCH were moved together and the header is in
1118 /// the same place relative to the PCH.
1120 resolveFileRelativeToOriginalDir(const std::string &Filename,
1121 const std::string &OriginalDir,
1122 const std::string &CurrDir) {
1123 assert(OriginalDir != CurrDir &&
1124 "No point trying to resolve the file if the PCH dir didn't change");
1125 using namespace llvm::sys;
1126 SmallString<128> filePath(Filename);
1127 fs::make_absolute(filePath);
1128 assert(path::is_absolute(OriginalDir));
1129 SmallString<128> currPCHPath(CurrDir);
1131 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1132 fileDirE = path::end(path::parent_path(filePath));
1133 path::const_iterator origDirI = path::begin(OriginalDir),
1134 origDirE = path::end(OriginalDir);
1135 // Skip the common path components from filePath and OriginalDir.
1136 while (fileDirI != fileDirE && origDirI != origDirE &&
1137 *fileDirI == *origDirI) {
1141 for (; origDirI != origDirE; ++origDirI)
1142 path::append(currPCHPath, "..");
1143 path::append(currPCHPath, fileDirI, fileDirE);
1144 path::append(currPCHPath, path::filename(Filename));
1145 return currPCHPath.str();
1148 bool ASTReader::ReadSLocEntry(int ID) {
1152 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1153 Error("source location entry ID out-of-range for AST file");
1157 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1158 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1159 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1160 unsigned BaseOffset = F->SLocEntryBaseOffset;
1162 ++NumSLocEntriesRead;
1163 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1164 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1165 Error("incorrectly-formatted source location entry in AST file");
1171 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1173 Error("incorrectly-formatted source location entry in AST file");
1176 case SM_SLOC_FILE_ENTRY: {
1177 // We will detect whether a file changed and return 'Failure' for it, but
1178 // we will also try to fail gracefully by setting up the SLocEntry.
1179 unsigned InputID = Record[4];
1180 InputFile IF = getInputFile(*F, InputID);
1181 const FileEntry *File = IF.getFile();
1182 bool OverriddenBuffer = IF.isOverridden();
1184 // Note that we only check if a File was returned. If it was out-of-date
1185 // we have complained but we will continue creating a FileID to recover
1190 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1191 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1192 // This is the module's main file.
1193 IncludeLoc = getImportLocation(F);
1195 SrcMgr::CharacteristicKind
1196 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1197 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1198 ID, BaseOffset + Record[0]);
1199 SrcMgr::FileInfo &FileInfo =
1200 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1201 FileInfo.NumCreatedFIDs = Record[5];
1203 FileInfo.setHasLineDirectives();
1205 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1206 unsigned NumFileDecls = Record[7];
1208 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1209 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1213 const SrcMgr::ContentCache *ContentCache
1214 = SourceMgr.getOrCreateContentCache(File,
1215 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1216 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1217 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1218 unsigned Code = SLocEntryCursor.ReadCode();
1220 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1222 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1223 Error("AST record has invalid code");
1227 std::unique_ptr<llvm::MemoryBuffer> Buffer
1228 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
1229 SourceMgr.overrideFileContents(File, std::move(Buffer));
1235 case SM_SLOC_BUFFER_ENTRY: {
1236 const char *Name = Blob.data();
1237 unsigned Offset = Record[0];
1238 SrcMgr::CharacteristicKind
1239 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1240 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1241 if (IncludeLoc.isInvalid() && F->Kind == MK_Module) {
1242 IncludeLoc = getImportLocation(F);
1244 unsigned Code = SLocEntryCursor.ReadCode();
1247 = SLocEntryCursor.readRecord(Code, Record, &Blob);
1249 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1250 Error("AST record has invalid code");
1254 std::unique_ptr<llvm::MemoryBuffer> Buffer =
1255 llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
1256 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1257 BaseOffset + Offset, IncludeLoc);
1261 case SM_SLOC_EXPANSION_ENTRY: {
1262 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1263 SourceMgr.createExpansionLoc(SpellingLoc,
1264 ReadSourceLocation(*F, Record[2]),
1265 ReadSourceLocation(*F, Record[3]),
1268 BaseOffset + Record[0]);
1276 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1278 return std::make_pair(SourceLocation(), "");
1280 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1281 Error("source location entry ID out-of-range for AST file");
1282 return std::make_pair(SourceLocation(), "");
1285 // Find which module file this entry lands in.
1286 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1287 if (M->Kind != MK_Module)
1288 return std::make_pair(SourceLocation(), "");
1290 // FIXME: Can we map this down to a particular submodule? That would be
1292 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1295 /// \brief Find the location where the module F is imported.
1296 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1297 if (F->ImportLoc.isValid())
1298 return F->ImportLoc;
1300 // Otherwise we have a PCH. It's considered to be "imported" at the first
1301 // location of its includer.
1302 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1303 // Main file is the importer.
1304 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1305 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1307 return F->ImportedBy[0]->FirstLoc;
1310 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1311 /// specified cursor. Read the abbreviations that are at the top of the block
1312 /// and then leave the cursor pointing into the block.
1313 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1314 if (Cursor.EnterSubBlock(BlockID)) {
1315 Error("malformed block record in AST file");
1320 uint64_t Offset = Cursor.GetCurrentBitNo();
1321 unsigned Code = Cursor.ReadCode();
1323 // We expect all abbrevs to be at the start of the block.
1324 if (Code != llvm::bitc::DEFINE_ABBREV) {
1325 Cursor.JumpToBit(Offset);
1328 Cursor.ReadAbbrevRecord();
1332 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1336 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1337 Tok.setLength(Record[Idx++]);
1338 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1339 Tok.setIdentifierInfo(II);
1340 Tok.setKind((tok::TokenKind)Record[Idx++]);
1341 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1345 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1346 BitstreamCursor &Stream = F.MacroCursor;
1348 // Keep track of where we are in the stream, then jump back there
1349 // after reading this macro.
1350 SavedStreamPosition SavedPosition(Stream);
1352 Stream.JumpToBit(Offset);
1354 SmallVector<IdentifierInfo*, 16> MacroArgs;
1355 MacroInfo *Macro = nullptr;
1358 // Advance to the next record, but if we get to the end of the block, don't
1359 // pop it (removing all the abbreviations from the cursor) since we want to
1360 // be able to reseek within the block and read entries.
1361 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1362 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1364 switch (Entry.Kind) {
1365 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1366 case llvm::BitstreamEntry::Error:
1367 Error("malformed block record in AST file");
1369 case llvm::BitstreamEntry::EndBlock:
1371 case llvm::BitstreamEntry::Record:
1372 // The interesting case.
1378 PreprocessorRecordTypes RecType =
1379 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1381 case PP_MACRO_DIRECTIVE_HISTORY:
1384 case PP_MACRO_OBJECT_LIKE:
1385 case PP_MACRO_FUNCTION_LIKE: {
1386 // If we already have a macro, that means that we've hit the end
1387 // of the definition of the macro we were looking for. We're
1392 unsigned NextIndex = 1; // Skip identifier ID.
1393 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
1394 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1395 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
1396 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1397 MI->setIsUsed(Record[NextIndex++]);
1398 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1400 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1401 // Decode function-like macro info.
1402 bool isC99VarArgs = Record[NextIndex++];
1403 bool isGNUVarArgs = Record[NextIndex++];
1404 bool hasCommaPasting = Record[NextIndex++];
1406 unsigned NumArgs = Record[NextIndex++];
1407 for (unsigned i = 0; i != NumArgs; ++i)
1408 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1410 // Install function-like macro info.
1411 MI->setIsFunctionLike();
1412 if (isC99VarArgs) MI->setIsC99Varargs();
1413 if (isGNUVarArgs) MI->setIsGNUVarargs();
1414 if (hasCommaPasting) MI->setHasCommaPasting();
1415 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1416 PP.getPreprocessorAllocator());
1419 // Remember that we saw this macro last so that we add the tokens that
1420 // form its body to it.
1423 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1424 Record[NextIndex]) {
1425 // We have a macro definition. Register the association
1426 PreprocessedEntityID
1427 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1428 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1429 PreprocessingRecord::PPEntityID
1430 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1431 MacroDefinition *PPDef =
1432 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1434 PPRec.RegisterMacroDefinition(Macro, PPDef);
1442 // If we see a TOKEN before a PP_MACRO_*, then the file is
1443 // erroneous, just pretend we didn't see this.
1447 Token Tok = ReadToken(F, Record, Idx);
1448 Macro->AddTokenToBody(Tok);
1455 PreprocessedEntityID
1456 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1457 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1458 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1459 assert(I != M.PreprocessedEntityRemap.end()
1460 && "Invalid index into preprocessed entity index remap");
1462 return LocalID + I->second;
1465 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1466 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1469 HeaderFileInfoTrait::internal_key_type
1470 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1471 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
1476 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1477 if (a.Size != b.Size || a.ModTime != b.ModTime)
1480 if (strcmp(a.Filename, b.Filename) == 0)
1483 // Determine whether the actual files are equivalent.
1484 FileManager &FileMgr = Reader.getFileManager();
1485 const FileEntry *FEA = FileMgr.getFile(a.Filename);
1486 const FileEntry *FEB = FileMgr.getFile(b.Filename);
1487 return (FEA && FEA == FEB);
1490 std::pair<unsigned, unsigned>
1491 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1492 using namespace llvm::support;
1493 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1494 unsigned DataLen = (unsigned) *d++;
1495 return std::make_pair(KeyLen, DataLen);
1498 HeaderFileInfoTrait::internal_key_type
1499 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1500 using namespace llvm::support;
1501 internal_key_type ikey;
1502 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1503 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1504 ikey.Filename = (const char *)d;
1508 HeaderFileInfoTrait::data_type
1509 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1511 const unsigned char *End = d + DataLen;
1512 using namespace llvm::support;
1514 unsigned Flags = *d++;
1515 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1516 ((Flags >> 6) & 0x03);
1517 HFI.isImport = (Flags >> 5) & 0x01;
1518 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1519 HFI.DirInfo = (Flags >> 2) & 0x03;
1520 HFI.Resolved = (Flags >> 1) & 0x01;
1521 HFI.IndexHeaderMapHeader = Flags & 0x01;
1522 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1523 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1524 M, endian::readNext<uint32_t, little, unaligned>(d));
1525 if (unsigned FrameworkOffset =
1526 endian::readNext<uint32_t, little, unaligned>(d)) {
1527 // The framework offset is 1 greater than the actual offset,
1528 // since 0 is used as an indicator for "no framework name".
1529 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1530 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1534 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1536 // This header is part of a module. Associate it with the module to enable
1537 // implicit module import.
1538 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1539 Module *Mod = Reader.getSubmodule(GlobalSMID);
1540 HFI.isModuleHeader = true;
1541 FileManager &FileMgr = Reader.getFileManager();
1543 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1544 ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole());
1548 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1551 // This HeaderFileInfo was externally loaded.
1552 HFI.External = true;
1557 ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1558 GlobalMacroID GMacID,
1559 ArrayRef<SubmoduleID> Overrides) {
1560 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1561 SubmoduleID *OverrideData = nullptr;
1562 if (!Overrides.empty()) {
1563 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1564 OverrideData[0] = Overrides.size();
1565 for (unsigned I = 0; I != Overrides.size(); ++I)
1566 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1568 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
1571 void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1573 uint64_t MacroDirectivesOffset) {
1574 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1575 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1578 void ASTReader::ReadDefinedMacros() {
1579 // Note that we are loading defined macros.
1580 Deserializing Macros(this);
1582 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1583 E = ModuleMgr.rend(); I != E; ++I) {
1584 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
1586 // If there was no preprocessor block, skip this file.
1587 if (!MacroCursor.getBitStreamReader())
1590 BitstreamCursor Cursor = MacroCursor;
1591 Cursor.JumpToBit((*I)->MacroStartOffset);
1595 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1598 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1599 case llvm::BitstreamEntry::Error:
1600 Error("malformed block record in AST file");
1602 case llvm::BitstreamEntry::EndBlock:
1605 case llvm::BitstreamEntry::Record:
1607 switch (Cursor.readRecord(E.ID, Record)) {
1608 default: // Default behavior: ignore.
1611 case PP_MACRO_OBJECT_LIKE:
1612 case PP_MACRO_FUNCTION_LIKE:
1613 getLocalIdentifier(**I, Record[0]);
1628 /// \brief Visitor class used to look up identifirs in an AST file.
1629 class IdentifierLookupVisitor {
1631 unsigned PriorGeneration;
1632 unsigned &NumIdentifierLookups;
1633 unsigned &NumIdentifierLookupHits;
1634 IdentifierInfo *Found;
1637 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1638 unsigned &NumIdentifierLookups,
1639 unsigned &NumIdentifierLookupHits)
1640 : Name(Name), PriorGeneration(PriorGeneration),
1641 NumIdentifierLookups(NumIdentifierLookups),
1642 NumIdentifierLookupHits(NumIdentifierLookupHits),
1647 static bool visit(ModuleFile &M, void *UserData) {
1648 IdentifierLookupVisitor *This
1649 = static_cast<IdentifierLookupVisitor *>(UserData);
1651 // If we've already searched this module file, skip it now.
1652 if (M.Generation <= This->PriorGeneration)
1655 ASTIdentifierLookupTable *IdTable
1656 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1660 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1662 ++This->NumIdentifierLookups;
1663 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
1664 if (Pos == IdTable->end())
1667 // Dereferencing the iterator has the effect of building the
1668 // IdentifierInfo node and populating it with the various
1669 // declarations it needs.
1670 ++This->NumIdentifierLookupHits;
1675 // \brief Retrieve the identifier info found within the module
1677 IdentifierInfo *getIdentifierInfo() const { return Found; }
1681 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1682 // Note that we are loading an identifier.
1683 Deserializing AnIdentifier(this);
1685 unsigned PriorGeneration = 0;
1686 if (getContext().getLangOpts().Modules)
1687 PriorGeneration = IdentifierGeneration[&II];
1689 // If there is a global index, look there first to determine which modules
1690 // provably do not have any results for this identifier.
1691 GlobalModuleIndex::HitSet Hits;
1692 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1693 if (!loadGlobalIndex()) {
1694 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1699 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1700 NumIdentifierLookups,
1701 NumIdentifierLookupHits);
1702 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
1703 markIdentifierUpToDate(&II);
1706 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1710 II->setOutOfDate(false);
1712 // Update the generation for this identifier.
1713 if (getContext().getLangOpts().Modules)
1714 IdentifierGeneration[II] = getGeneration();
1717 struct ASTReader::ModuleMacroInfo {
1718 SubmoduleID SubModID;
1720 SubmoduleID *Overrides;
1721 // FIXME: Remove this.
1724 bool isDefine() const { return MI; }
1726 SubmoduleID getSubmoduleID() const { return SubModID; }
1728 ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
1731 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1734 MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
1736 return PP.AllocateUndefMacroDirective(ImportLoc, SubModID,
1737 getOverriddenSubmodules());
1738 return PP.AllocateDefMacroDirective(MI, ImportLoc, SubModID,
1739 getOverriddenSubmodules());
1743 ASTReader::ModuleMacroInfo *
1744 ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1745 ModuleMacroInfo Info;
1747 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1749 // Macro undefinition.
1750 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
1753 // Macro definition.
1754 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1757 // If this macro has already been loaded, don't do so again.
1758 // FIXME: This is highly dubious. Multiple macro definitions can have the
1759 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1760 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
1763 Info.MI = getMacro(GMacID);
1764 Info.SubModID = Info.MI->getOwningModuleID();
1766 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1769 return new (Context) ModuleMacroInfo(Info);
1772 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1773 const PendingMacroInfo &PMInfo) {
1776 if (PMInfo.M->Kind != MK_Module) {
1777 installPCHMacroDirectives(II, *PMInfo.M,
1778 PMInfo.PCHMacroData.MacroDirectivesOffset);
1784 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1788 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1789 if (Owner && Owner->NameVisibility == Module::Hidden) {
1790 // Macros in the owning module are hidden. Just remember this macro to
1791 // install if we make this module visible.
1792 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1794 installImportedMacro(II, MMI, Owner);
1798 void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1799 ModuleFile &M, uint64_t Offset) {
1800 assert(M.Kind != MK_Module);
1802 BitstreamCursor &Cursor = M.MacroCursor;
1803 SavedStreamPosition SavedPosition(Cursor);
1804 Cursor.JumpToBit(Offset);
1806 llvm::BitstreamEntry Entry =
1807 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1808 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1809 Error("malformed block record in AST file");
1814 PreprocessorRecordTypes RecType =
1815 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1816 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1817 Error("malformed block record in AST file");
1821 // Deserialize the macro directives history in reverse source-order.
1822 MacroDirective *Latest = nullptr, *Earliest = nullptr;
1823 unsigned Idx = 0, N = Record.size();
1825 MacroDirective *MD = nullptr;
1826 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
1827 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1829 case MacroDirective::MD_Define: {
1830 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1831 MacroInfo *MI = getMacro(GMacID);
1832 SubmoduleID ImportedFrom = Record[Idx++];
1833 bool IsAmbiguous = Record[Idx++];
1834 llvm::SmallVector<unsigned, 4> Overrides;
1836 Overrides.insert(Overrides.end(),
1837 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1838 Idx += Overrides.size() + 1;
1840 DefMacroDirective *DefMD =
1841 PP.AllocateDefMacroDirective(MI, Loc, ImportedFrom, Overrides);
1842 DefMD->setAmbiguous(IsAmbiguous);
1846 case MacroDirective::MD_Undefine: {
1847 SubmoduleID ImportedFrom = Record[Idx++];
1848 llvm::SmallVector<unsigned, 4> Overrides;
1850 Overrides.insert(Overrides.end(),
1851 &Record[Idx] + 1, &Record[Idx] + 1 + Record[Idx]);
1852 Idx += Overrides.size() + 1;
1854 MD = PP.AllocateUndefMacroDirective(Loc, ImportedFrom, Overrides);
1857 case MacroDirective::MD_Visibility:
1858 bool isPublic = Record[Idx++];
1859 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1866 Earliest->setPrevious(MD);
1870 PP.setLoadedMacroDirective(II, Latest);
1873 /// \brief For the given macro definitions, check if they are both in system
1875 static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
1876 Module *NewOwner, ASTReader &Reader) {
1877 assert(PrevMI && NewMI);
1878 Module *PrevOwner = nullptr;
1879 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1880 PrevOwner = Reader.getSubmodule(PrevModID);
1881 SourceManager &SrcMgr = Reader.getSourceManager();
1883 = PrevOwner? PrevOwner->IsSystem
1884 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1886 = NewOwner? NewOwner->IsSystem
1887 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1888 if (PrevOwner && PrevOwner == NewOwner)
1890 return PrevInSystem && NewInSystem;
1893 void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
1894 SourceLocation ImportLoc,
1895 AmbiguousMacros &Ambig,
1896 ArrayRef<SubmoduleID> Overrides) {
1897 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1898 SubmoduleID OwnerID = Overrides[OI];
1900 // If this macro is not yet visible, remove it from the hidden names list.
1901 // It won't be there if we're in the middle of making the owner visible.
1902 Module *Owner = getSubmodule(OwnerID);
1903 auto HiddenIt = HiddenNamesMap.find(Owner);
1904 if (HiddenIt != HiddenNamesMap.end()) {
1905 HiddenNames &Hidden = HiddenIt->second;
1906 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1907 if (HI != Hidden.HiddenMacros.end()) {
1908 // Register the macro now so we don't lose it when we re-export.
1909 PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc));
1911 auto SubOverrides = HI->second->getOverriddenSubmodules();
1912 Hidden.HiddenMacros.erase(HI);
1913 removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides);
1917 // If this macro is already in our list of conflicts, remove it from there.
1919 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1920 return MD->getInfo()->getOwningModuleID() == OwnerID;
1926 ASTReader::AmbiguousMacros *
1927 ASTReader::removeOverriddenMacros(IdentifierInfo *II,
1928 SourceLocation ImportLoc,
1929 ArrayRef<SubmoduleID> Overrides) {
1930 MacroDirective *Prev = PP.getMacroDirective(II);
1931 if (!Prev && Overrides.empty())
1934 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
1936 if (PrevDef && PrevDef->isAmbiguous()) {
1937 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
1938 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
1939 Ambig.push_back(PrevDef);
1941 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
1946 AmbiguousMacroDefs.erase(II);
1948 // There's no ambiguity yet. Maybe we're introducing one.
1949 AmbiguousMacros Ambig;
1951 Ambig.push_back(PrevDef);
1953 removeOverriddenMacros(II, ImportLoc, Ambig, Overrides);
1955 if (!Ambig.empty()) {
1956 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
1957 std::swap(Result, Ambig);
1962 // We ended up with no ambiguity.
1966 void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
1968 assert(II && Owner);
1970 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
1971 if (ImportLoc.isInvalid()) {
1972 // FIXME: If we made macros from this module visible but didn't provide a
1973 // source location for the import, we don't have a location for the macro.
1974 // Use the location at which the containing module file was first imported
1976 ImportLoc = MMI->F->DirectImportLoc;
1977 assert(ImportLoc.isValid() && "no import location for a visible macro?");
1980 AmbiguousMacros *Prev =
1981 removeOverriddenMacros(II, ImportLoc, MMI->getOverriddenSubmodules());
1983 // Create a synthetic macro definition corresponding to the import (or null
1984 // if this was an undefinition of the macro).
1985 MacroDirective *Imported = MMI->import(PP, ImportLoc);
1986 DefMacroDirective *MD = dyn_cast<DefMacroDirective>(Imported);
1988 // If there's no ambiguity, just install the macro.
1990 PP.appendMacroDirective(II, Imported);
1993 assert(!Prev->empty());
1996 // We imported a #undef that didn't remove all prior definitions. The most
1997 // recent prior definition remains, and we install it in the place of the
1998 // imported directive, as if by a local #pragma pop_macro.
1999 MacroInfo *NewMI = Prev->back()->getInfo();
2001 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc);
2003 // Install our #undef first so that we don't lose track of it. We'll replace
2004 // this with whichever macro definition ends up winning.
2005 PP.appendMacroDirective(II, Imported);
2008 // We're introducing a macro definition that creates or adds to an ambiguity.
2009 // We can resolve that ambiguity if this macro is token-for-token identical to
2010 // all of the existing definitions.
2011 MacroInfo *NewMI = MD->getInfo();
2012 assert(NewMI && "macro definition with no MacroInfo?");
2013 while (!Prev->empty()) {
2014 MacroInfo *PrevMI = Prev->back()->getInfo();
2015 assert(PrevMI && "macro definition with no MacroInfo?");
2017 // Before marking the macros as ambiguous, check if this is a case where
2018 // both macros are in system headers. If so, we trust that the system
2019 // did not get it wrong. This also handles cases where Clang's own
2020 // headers have a different spelling of certain system macros:
2021 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
2022 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
2024 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2025 // overrides the system limits.h's macros, so there's no conflict here.
2026 if (NewMI != PrevMI &&
2027 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2028 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2031 // The previous definition is the same as this one (or both are defined in
2032 // system modules so we can assume they're equivalent); we don't need to
2033 // track it any more.
2038 MD->setAmbiguous(true);
2040 PP.appendMacroDirective(II, MD);
2043 ASTReader::InputFileInfo
2044 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2045 // Go find this input file.
2046 BitstreamCursor &Cursor = F.InputFilesCursor;
2047 SavedStreamPosition SavedPosition(Cursor);
2048 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2050 unsigned Code = Cursor.ReadCode();
2054 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2055 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2056 "invalid record type for input file");
2059 std::string Filename;
2064 assert(Record[0] == ID && "Bogus stored ID or offset");
2065 StoredSize = static_cast<off_t>(Record[1]);
2066 StoredTime = static_cast<time_t>(Record[2]);
2067 Overridden = static_cast<bool>(Record[3]);
2069 MaybeAddSystemRootToFilename(F, Filename);
2071 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2075 std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
2076 return readInputFileInfo(F, ID).Filename;
2079 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2080 // If this ID is bogus, just return an empty input file.
2081 if (ID == 0 || ID > F.InputFilesLoaded.size())
2084 // If we've already loaded this input file, return it.
2085 if (F.InputFilesLoaded[ID-1].getFile())
2086 return F.InputFilesLoaded[ID-1];
2088 if (F.InputFilesLoaded[ID-1].isNotFound())
2091 // Go find this input file.
2092 BitstreamCursor &Cursor = F.InputFilesCursor;
2093 SavedStreamPosition SavedPosition(Cursor);
2094 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2096 InputFileInfo FI = readInputFileInfo(F, ID);
2097 off_t StoredSize = FI.StoredSize;
2098 time_t StoredTime = FI.StoredTime;
2099 bool Overridden = FI.Overridden;
2100 StringRef Filename = FI.Filename;
2102 const FileEntry *File
2103 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2104 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2106 // If we didn't find the file, resolve it relative to the
2107 // original directory from which this AST file was created.
2108 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
2109 F.OriginalDir != CurrentDir) {
2110 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2113 if (!Resolved.empty())
2114 File = FileMgr.getFile(Resolved);
2117 // For an overridden file, create a virtual file with the stored
2119 if (Overridden && File == nullptr) {
2120 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2123 if (File == nullptr) {
2125 std::string ErrorStr = "could not find file '";
2126 ErrorStr += Filename;
2127 ErrorStr += "' referenced by AST file";
2128 Error(ErrorStr.c_str());
2130 // Record that we didn't find the file.
2131 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2135 // Check if there was a request to override the contents of the file
2136 // that was part of the precompiled header. Overridding such a file
2137 // can lead to problems when lexing using the source locations from the
2139 SourceManager &SM = getSourceManager();
2140 if (!Overridden && SM.isFileOverridden(File)) {
2142 Error(diag::err_fe_pch_file_overridden, Filename);
2143 // After emitting the diagnostic, recover by disabling the override so
2144 // that the original file will be used.
2145 SM.disableFileContentsOverride(File);
2146 // The FileEntry is a virtual file entry with the size of the contents
2147 // that would override the original contents. Set it to the original's
2149 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2150 StoredSize, StoredTime);
2153 bool IsOutOfDate = false;
2155 // For an overridden file, there is nothing to validate.
2156 if (!Overridden && (StoredSize != File->getSize()
2157 #if !defined(LLVM_ON_WIN32)
2158 // In our regression testing, the Windows file system seems to
2159 // have inconsistent modification times that sometimes
2160 // erroneously trigger this error-handling path.
2161 || StoredTime != File->getModificationTime()
2165 // Build a list of the PCH imports that got us here (in reverse).
2166 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2167 while (ImportStack.back()->ImportedBy.size() > 0)
2168 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2170 // The top-level PCH is stale.
2171 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2172 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2174 // Print the import stack.
2175 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2176 Diag(diag::note_pch_required_by)
2177 << Filename << ImportStack[0]->FileName;
2178 for (unsigned I = 1; I < ImportStack.size(); ++I)
2179 Diag(diag::note_pch_required_by)
2180 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2183 if (!Diags.isDiagnosticInFlight())
2184 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2190 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2192 // Note that we've loaded this input file.
2193 F.InputFilesLoaded[ID-1] = IF;
2197 const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
2198 ModuleFile &M = ModuleMgr.getPrimaryModule();
2199 std::string Filename = filenameStrRef;
2200 MaybeAddSystemRootToFilename(M, Filename);
2201 const FileEntry *File = FileMgr.getFile(Filename);
2202 if (File == nullptr && !M.OriginalDir.empty() && !CurrentDir.empty() &&
2203 M.OriginalDir != CurrentDir) {
2204 std::string resolved = resolveFileRelativeToOriginalDir(Filename,
2207 if (!resolved.empty())
2208 File = FileMgr.getFile(resolved);
2214 /// \brief If we are loading a relocatable PCH file, and the filename is
2215 /// not an absolute path, add the system root to the beginning of the file
2217 void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
2218 std::string &Filename) {
2219 // If this is not a relocatable PCH file, there's nothing to do.
2220 if (!M.RelocatablePCH)
2223 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2226 if (isysroot.empty()) {
2227 // If no system root was given, default to '/'
2228 Filename.insert(Filename.begin(), '/');
2232 unsigned Length = isysroot.size();
2233 if (isysroot[Length - 1] != '/')
2234 Filename.insert(Filename.begin(), '/');
2236 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
2239 ASTReader::ASTReadResult
2240 ASTReader::ReadControlBlock(ModuleFile &F,
2241 SmallVectorImpl<ImportedModule> &Loaded,
2242 const ModuleFile *ImportedBy,
2243 unsigned ClientLoadCapabilities) {
2244 BitstreamCursor &Stream = F.Stream;
2246 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2247 Error("malformed block record in AST file");
2251 // Read all of the records and blocks in the control block.
2254 llvm::BitstreamEntry Entry = Stream.advance();
2256 switch (Entry.Kind) {
2257 case llvm::BitstreamEntry::Error:
2258 Error("malformed block record in AST file");
2260 case llvm::BitstreamEntry::EndBlock: {
2261 // Validate input files.
2262 const HeaderSearchOptions &HSOpts =
2263 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2265 // All user input files reside at the index range [0, Record[1]), and
2266 // system input files reside at [Record[1], Record[0]).
2267 // Record is the one from INPUT_FILE_OFFSETS.
2268 unsigned NumInputs = Record[0];
2269 unsigned NumUserInputs = Record[1];
2271 if (!DisableValidation &&
2272 (ValidateSystemInputs || !HSOpts.ModulesValidateOncePerBuildSession ||
2273 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp)) {
2274 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2276 // If we are reading a module, we will create a verification timestamp,
2277 // so we verify all input files. Otherwise, verify only user input
2280 unsigned N = NumUserInputs;
2281 if (ValidateSystemInputs ||
2282 (HSOpts.ModulesValidateOncePerBuildSession && F.Kind == MK_Module))
2285 for (unsigned I = 0; I < N; ++I) {
2286 InputFile IF = getInputFile(F, I+1, Complain);
2287 if (!IF.getFile() || IF.isOutOfDate())
2293 Listener->visitModuleFile(F.FileName);
2295 if (Listener && Listener->needsInputFileVisitation()) {
2296 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2298 for (unsigned I = 0; I < N; ++I) {
2299 bool IsSystem = I >= NumUserInputs;
2300 InputFileInfo FI = readInputFileInfo(F, I+1);
2301 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2308 case llvm::BitstreamEntry::SubBlock:
2310 case INPUT_FILES_BLOCK_ID:
2311 F.InputFilesCursor = Stream;
2312 if (Stream.SkipBlock() || // Skip with the main cursor
2313 // Read the abbreviations
2314 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2315 Error("malformed block record in AST file");
2321 if (Stream.SkipBlock()) {
2322 Error("malformed block record in AST file");
2328 case llvm::BitstreamEntry::Record:
2329 // The interesting case.
2333 // Read and process a record.
2336 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2338 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2339 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2340 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2341 : diag::err_pch_version_too_new);
2342 return VersionMismatch;
2345 bool hasErrors = Record[5];
2346 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2347 Diag(diag::err_pch_with_compiler_errors);
2351 F.RelocatablePCH = Record[4];
2353 const std::string &CurBranch = getClangFullRepositoryVersion();
2354 StringRef ASTBranch = Blob;
2355 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2356 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2357 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2358 return VersionMismatch;
2364 // Load each of the imported PCH files.
2365 unsigned Idx = 0, N = Record.size();
2367 // Read information about the AST file.
2368 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2369 // The import location will be the local one for now; we will adjust
2370 // all import locations of module imports after the global source
2371 // location info are setup.
2372 SourceLocation ImportLoc =
2373 SourceLocation::getFromRawEncoding(Record[Idx++]);
2374 off_t StoredSize = (off_t)Record[Idx++];
2375 time_t StoredModTime = (time_t)Record[Idx++];
2376 unsigned Length = Record[Idx++];
2377 SmallString<128> ImportedFile(Record.begin() + Idx,
2378 Record.begin() + Idx + Length);
2381 // Load the AST file.
2382 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
2383 StoredSize, StoredModTime,
2384 ClientLoadCapabilities)) {
2385 case Failure: return Failure;
2386 // If we have to ignore the dependency, we'll have to ignore this too.
2388 case OutOfDate: return OutOfDate;
2389 case VersionMismatch: return VersionMismatch;
2390 case ConfigurationMismatch: return ConfigurationMismatch;
2391 case HadErrors: return HadErrors;
2392 case Success: break;
2398 case LANGUAGE_OPTIONS: {
2399 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2400 if (Listener && &F == *ModuleMgr.begin() &&
2401 ParseLanguageOptions(Record, Complain, *Listener) &&
2402 !DisableValidation && !AllowConfigurationMismatch)
2403 return ConfigurationMismatch;
2407 case TARGET_OPTIONS: {
2408 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2409 if (Listener && &F == *ModuleMgr.begin() &&
2410 ParseTargetOptions(Record, Complain, *Listener) &&
2411 !DisableValidation && !AllowConfigurationMismatch)
2412 return ConfigurationMismatch;
2416 case DIAGNOSTIC_OPTIONS: {
2417 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
2418 if (Listener && &F == *ModuleMgr.begin() &&
2419 ParseDiagnosticOptions(Record, Complain, *Listener) &&
2425 case FILE_SYSTEM_OPTIONS: {
2426 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2427 if (Listener && &F == *ModuleMgr.begin() &&
2428 ParseFileSystemOptions(Record, Complain, *Listener) &&
2429 !DisableValidation && !AllowConfigurationMismatch)
2430 return ConfigurationMismatch;
2434 case HEADER_SEARCH_OPTIONS: {
2435 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2436 if (Listener && &F == *ModuleMgr.begin() &&
2437 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
2438 !DisableValidation && !AllowConfigurationMismatch)
2439 return ConfigurationMismatch;
2443 case PREPROCESSOR_OPTIONS: {
2444 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2445 if (Listener && &F == *ModuleMgr.begin() &&
2446 ParsePreprocessorOptions(Record, Complain, *Listener,
2447 SuggestedPredefines) &&
2448 !DisableValidation && !AllowConfigurationMismatch)
2449 return ConfigurationMismatch;
2454 F.OriginalSourceFileID = FileID::get(Record[0]);
2455 F.ActualOriginalSourceFileName = Blob;
2456 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2457 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
2460 case ORIGINAL_FILE_ID:
2461 F.OriginalSourceFileID = FileID::get(Record[0]);
2464 case ORIGINAL_PCH_DIR:
2465 F.OriginalDir = Blob;
2469 F.ModuleName = Blob;
2471 Listener->ReadModuleName(F.ModuleName);
2474 case MODULE_MAP_FILE:
2475 if (ASTReadResult Result =
2476 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2478 case INPUT_FILE_OFFSETS:
2479 F.InputFileOffsets = (const uint32_t *)Blob.data();
2480 F.InputFilesLoaded.resize(Record[0]);
2486 ASTReader::ASTReadResult
2487 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2488 BitstreamCursor &Stream = F.Stream;
2490 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2491 Error("malformed block record in AST file");
2495 // Read all of the records and blocks for the AST file.
2498 llvm::BitstreamEntry Entry = Stream.advance();
2500 switch (Entry.Kind) {
2501 case llvm::BitstreamEntry::Error:
2502 Error("error at end of module block in AST file");
2504 case llvm::BitstreamEntry::EndBlock: {
2505 // Outside of C++, we do not store a lookup map for the translation unit.
2506 // Instead, mark it as needing a lookup map to be built if this module
2507 // contains any declarations lexically within it (which it always does!).
2508 // This usually has no cost, since we very rarely need the lookup map for
2509 // the translation unit outside C++.
2510 DeclContext *DC = Context.getTranslationUnitDecl();
2511 if (DC->hasExternalLexicalStorage() &&
2512 !getContext().getLangOpts().CPlusPlus)
2513 DC->setMustBuildLookupTable();
2517 case llvm::BitstreamEntry::SubBlock:
2519 case DECLTYPES_BLOCK_ID:
2520 // We lazily load the decls block, but we want to set up the
2521 // DeclsCursor cursor to point into it. Clone our current bitcode
2522 // cursor to it, enter the block and read the abbrevs in that block.
2523 // With the main cursor, we just skip over it.
2524 F.DeclsCursor = Stream;
2525 if (Stream.SkipBlock() || // Skip with the main cursor.
2526 // Read the abbrevs.
2527 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2528 Error("malformed block record in AST file");
2533 case PREPROCESSOR_BLOCK_ID:
2534 F.MacroCursor = Stream;
2535 if (!PP.getExternalSource())
2536 PP.setExternalSource(this);
2538 if (Stream.SkipBlock() ||
2539 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2540 Error("malformed block record in AST file");
2543 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2546 case PREPROCESSOR_DETAIL_BLOCK_ID:
2547 F.PreprocessorDetailCursor = Stream;
2548 if (Stream.SkipBlock() ||
2549 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2550 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2551 Error("malformed preprocessor detail record in AST file");
2554 F.PreprocessorDetailStartOffset
2555 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2557 if (!PP.getPreprocessingRecord())
2558 PP.createPreprocessingRecord();
2559 if (!PP.getPreprocessingRecord()->getExternalSource())
2560 PP.getPreprocessingRecord()->SetExternalSource(*this);
2563 case SOURCE_MANAGER_BLOCK_ID:
2564 if (ReadSourceManagerBlock(F))
2568 case SUBMODULE_BLOCK_ID:
2569 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2573 case COMMENTS_BLOCK_ID: {
2574 BitstreamCursor C = Stream;
2575 if (Stream.SkipBlock() ||
2576 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2577 Error("malformed comments block in AST file");
2580 CommentsCursors.push_back(std::make_pair(C, &F));
2585 if (Stream.SkipBlock()) {
2586 Error("malformed block record in AST file");
2593 case llvm::BitstreamEntry::Record:
2594 // The interesting case.
2598 // Read and process a record.
2601 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2602 default: // Default behavior: ignore.
2606 if (F.LocalNumTypes != 0) {
2607 Error("duplicate TYPE_OFFSET record in AST file");
2610 F.TypeOffsets = (const uint32_t *)Blob.data();
2611 F.LocalNumTypes = Record[0];
2612 unsigned LocalBaseTypeIndex = Record[1];
2613 F.BaseTypeIndex = getTotalNumTypes();
2615 if (F.LocalNumTypes > 0) {
2616 // Introduce the global -> local mapping for types within this module.
2617 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2619 // Introduce the local -> global mapping for types within this module.
2620 F.TypeRemap.insertOrReplace(
2621 std::make_pair(LocalBaseTypeIndex,
2622 F.BaseTypeIndex - LocalBaseTypeIndex));
2624 // Increase size by >= 1 so we get a unique base index in the next module.
2625 TypesLoaded.resize(TypesLoaded.size() + std::max(F.LocalNumTypes, 1U));
2630 if (F.LocalNumDecls != 0) {
2631 Error("duplicate DECL_OFFSET record in AST file");
2634 F.DeclOffsets = (const DeclOffset *)Blob.data();
2635 F.LocalNumDecls = Record[0];
2636 unsigned LocalBaseDeclID = Record[1];
2637 F.BaseDeclID = getTotalNumDecls();
2639 if (F.LocalNumDecls > 0) {
2640 // Introduce the global -> local mapping for declarations within this
2642 GlobalDeclMap.insert(
2643 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2645 // Introduce the local -> global mapping for declarations within this
2647 F.DeclRemap.insertOrReplace(
2648 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2650 // Introduce the global -> local mapping for declarations within this
2652 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2655 // Increase size by >= 1 so we get a unique base index in the next module.
2656 DeclsLoaded.resize(DeclsLoaded.size() + std::max(F.LocalNumDecls, 1U));
2660 case TU_UPDATE_LEXICAL: {
2661 DeclContext *TU = Context.getTranslationUnitDecl();
2662 DeclContextInfo &Info = F.DeclContextInfos[TU];
2663 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
2664 Info.NumLexicalDecls
2665 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
2666 TU->setHasExternalLexicalStorage(true);
2670 case UPDATE_VISIBLE: {
2672 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2673 ASTDeclContextNameLookupTable *Table =
2674 ASTDeclContextNameLookupTable::Create(
2675 (const unsigned char *)Blob.data() + Record[Idx++],
2676 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2677 (const unsigned char *)Blob.data(),
2678 ASTDeclContextNameLookupTrait(*this, F));
2679 if (Decl *D = GetExistingDecl(ID)) {
2680 auto *DC = cast<DeclContext>(D);
2681 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
2682 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2684 LookupTable = Table;
2686 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2690 case IDENTIFIER_TABLE:
2691 F.IdentifierTableData = Blob.data();
2693 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2694 (const unsigned char *)F.IdentifierTableData + Record[0],
2695 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2696 (const unsigned char *)F.IdentifierTableData,
2697 ASTIdentifierLookupTrait(*this, F));
2699 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2703 case IDENTIFIER_OFFSET: {
2704 if (F.LocalNumIdentifiers != 0) {
2705 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2708 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2709 F.LocalNumIdentifiers = Record[0];
2710 unsigned LocalBaseIdentifierID = Record[1];
2711 F.BaseIdentifierID = getTotalNumIdentifiers();
2713 if (F.LocalNumIdentifiers > 0) {
2714 // Introduce the global -> local mapping for identifiers within this
2716 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2719 // Introduce the local -> global mapping for identifiers within this
2721 F.IdentifierRemap.insertOrReplace(
2722 std::make_pair(LocalBaseIdentifierID,
2723 F.BaseIdentifierID - LocalBaseIdentifierID));
2726 // Increase size by >= 1 so we get a unique base index in the next module.
2727 IdentifiersLoaded.resize(IdentifiersLoaded.size() +
2728 std::max(F.LocalNumIdentifiers, 1U));
2732 case EAGERLY_DESERIALIZED_DECLS:
2733 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2734 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2738 if (SpecialTypes.empty()) {
2739 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2740 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2744 if (SpecialTypes.size() != Record.size()) {
2745 Error("invalid special-types record");
2749 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2750 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2751 if (!SpecialTypes[I])
2752 SpecialTypes[I] = ID;
2753 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2759 TotalNumStatements += Record[0];
2760 TotalNumMacros += Record[1];
2761 TotalLexicalDeclContexts += Record[2];
2762 TotalVisibleDeclContexts += Record[3];
2765 case UNUSED_FILESCOPED_DECLS:
2766 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2767 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2770 case DELEGATING_CTORS:
2771 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2772 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2775 case WEAK_UNDECLARED_IDENTIFIERS:
2776 if (Record.size() % 4 != 0) {
2777 Error("invalid weak identifiers record");
2781 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2782 // files. This isn't the way to do it :)
2783 WeakUndeclaredIdentifiers.clear();
2785 // Translate the weak, undeclared identifiers into global IDs.
2786 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2787 WeakUndeclaredIdentifiers.push_back(
2788 getGlobalIdentifierID(F, Record[I++]));
2789 WeakUndeclaredIdentifiers.push_back(
2790 getGlobalIdentifierID(F, Record[I++]));
2791 WeakUndeclaredIdentifiers.push_back(
2792 ReadSourceLocation(F, Record, I).getRawEncoding());
2793 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2797 case LOCALLY_SCOPED_EXTERN_C_DECLS:
2798 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2799 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
2802 case SELECTOR_OFFSETS: {
2803 F.SelectorOffsets = (const uint32_t *)Blob.data();
2804 F.LocalNumSelectors = Record[0];
2805 unsigned LocalBaseSelectorID = Record[1];
2806 F.BaseSelectorID = getTotalNumSelectors();
2808 if (F.LocalNumSelectors > 0) {
2809 // Introduce the global -> local mapping for selectors within this
2811 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2813 // Introduce the local -> global mapping for selectors within this
2815 F.SelectorRemap.insertOrReplace(
2816 std::make_pair(LocalBaseSelectorID,
2817 F.BaseSelectorID - LocalBaseSelectorID));
2819 // Increase size by >= 1 so we get a unique base index in the next module.
2820 SelectorsLoaded.resize(SelectorsLoaded.size() +
2821 std::max(F.LocalNumSelectors, 1U));
2826 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
2828 F.SelectorLookupTable
2829 = ASTSelectorLookupTable::Create(
2830 F.SelectorLookupTableData + Record[0],
2831 F.SelectorLookupTableData,
2832 ASTSelectorLookupTrait(*this, F));
2833 TotalNumMethodPoolEntries += Record[1];
2836 case REFERENCED_SELECTOR_POOL:
2837 if (!Record.empty()) {
2838 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2839 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2841 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2847 case PP_COUNTER_VALUE:
2848 if (!Record.empty() && Listener)
2849 Listener->ReadCounter(F, Record[0]);
2852 case FILE_SORTED_DECLS:
2853 F.FileSortedDecls = (const DeclID *)Blob.data();
2854 F.NumFileSortedDecls = Record[0];
2857 case SOURCE_LOCATION_OFFSETS: {
2858 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
2859 F.LocalNumSLocEntries = Record[0];
2860 unsigned SLocSpaceSize = Record[1];
2862 // Increase size by >= 1 so we get a unique base index in the next module.
2863 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2864 SourceMgr.AllocateLoadedSLocEntries(std::max(F.LocalNumSLocEntries, 1U),
2866 // Make our entry in the range map. BaseID is negative and growing, so
2867 // we invert it. Because we invert it, though, we need the other end of
2869 unsigned RangeStart =
2870 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2871 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2872 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2874 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2875 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2876 GlobalSLocOffsetMap.insert(
2877 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2878 - SLocSpaceSize,&F));
2880 // Initialize the remapping table.
2881 // Invalid stays invalid.
2882 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
2883 // This module. Base was 2 when being compiled.
2884 F.SLocRemap.insertOrReplace(std::make_pair(2U,
2885 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2887 TotalNumSLocEntries += F.LocalNumSLocEntries;
2891 case MODULE_OFFSET_MAP: {
2892 // Additional remapping information.
2893 const unsigned char *Data = (const unsigned char*)Blob.data();
2894 const unsigned char *DataEnd = Data + Blob.size();
2896 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2897 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2898 F.SLocRemap.insert(std::make_pair(0U, 0));
2899 F.SLocRemap.insert(std::make_pair(2U, 1));
2902 // Continuous range maps we may be updating in our module.
2903 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2905 RemapBuilder SLocRemap(F.SLocRemap);
2906 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2907 RemapBuilder MacroRemap(F.MacroRemap);
2908 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2909 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
2910 RemapBuilder SelectorRemap(F.SelectorRemap);
2911 RemapBuilder DeclRemap(F.DeclRemap);
2912 RemapBuilder TypeRemap(F.TypeRemap);
2914 while(Data < DataEnd) {
2915 using namespace llvm::support;
2916 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
2917 StringRef Name = StringRef((const char*)Data, Len);
2919 ModuleFile *OM = ModuleMgr.lookup(Name);
2921 Error("SourceLocation remap refers to unknown module");
2925 uint32_t SLocOffset =
2926 endian::readNext<uint32_t, little, unaligned>(Data);
2927 uint32_t IdentifierIDOffset =
2928 endian::readNext<uint32_t, little, unaligned>(Data);
2929 uint32_t MacroIDOffset =
2930 endian::readNext<uint32_t, little, unaligned>(Data);
2931 uint32_t PreprocessedEntityIDOffset =
2932 endian::readNext<uint32_t, little, unaligned>(Data);
2933 uint32_t SubmoduleIDOffset =
2934 endian::readNext<uint32_t, little, unaligned>(Data);
2935 uint32_t SelectorIDOffset =
2936 endian::readNext<uint32_t, little, unaligned>(Data);
2937 uint32_t DeclIDOffset =
2938 endian::readNext<uint32_t, little, unaligned>(Data);
2939 uint32_t TypeIndexOffset =
2940 endian::readNext<uint32_t, little, unaligned>(Data);
2942 uint32_t None = std::numeric_limits<uint32_t>::max();
2944 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
2945 RemapBuilder &Remap) {
2947 Remap.insert(std::make_pair(Offset,
2948 static_cast<int>(BaseOffset - Offset)));
2950 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
2951 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
2952 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
2953 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
2954 PreprocessedEntityRemap);
2955 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
2956 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
2957 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
2958 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
2960 // Global -> local mappings.
2961 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2966 case SOURCE_MANAGER_LINE_TABLE:
2967 if (ParseLineTable(F, Record))
2971 case SOURCE_LOCATION_PRELOADS: {
2972 // Need to transform from the local view (1-based IDs) to the global view,
2973 // which is based off F.SLocEntryBaseID.
2974 if (!F.PreloadSLocEntries.empty()) {
2975 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2979 F.PreloadSLocEntries.swap(Record);
2983 case EXT_VECTOR_DECLS:
2984 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2985 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2989 if (Record.size() % 3 != 0) {
2990 Error("Invalid VTABLE_USES record");
2994 // Later tables overwrite earlier ones.
2995 // FIXME: Modules will have some trouble with this. This is clearly not
2996 // the right way to do this.
2999 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3000 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3001 VTableUses.push_back(
3002 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3003 VTableUses.push_back(Record[Idx++]);
3007 case DYNAMIC_CLASSES:
3008 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3009 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3012 case PENDING_IMPLICIT_INSTANTIATIONS:
3013 if (PendingInstantiations.size() % 2 != 0) {
3014 Error("Invalid existing PendingInstantiations");
3018 if (Record.size() % 2 != 0) {
3019 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3023 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3024 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3025 PendingInstantiations.push_back(
3026 ReadSourceLocation(F, Record, I).getRawEncoding());
3030 case SEMA_DECL_REFS:
3031 if (Record.size() != 2) {
3032 Error("Invalid SEMA_DECL_REFS block");
3035 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3036 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3039 case PPD_ENTITIES_OFFSETS: {
3040 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3041 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3042 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3044 unsigned LocalBasePreprocessedEntityID = Record[0];
3046 unsigned StartingID;
3047 if (!PP.getPreprocessingRecord())
3048 PP.createPreprocessingRecord();
3049 if (!PP.getPreprocessingRecord()->getExternalSource())
3050 PP.getPreprocessingRecord()->SetExternalSource(*this);
3052 // Increase size by >= 1 so we get a unique base index in the next module.
3054 = PP.getPreprocessingRecord()
3055 ->allocateLoadedEntities(std::max(F.NumPreprocessedEntities, 1U));
3056 F.BasePreprocessedEntityID = StartingID;
3058 if (F.NumPreprocessedEntities > 0) {
3059 // Introduce the global -> local mapping for preprocessed entities in
3061 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3063 // Introduce the local -> global mapping for preprocessed entities in
3065 F.PreprocessedEntityRemap.insertOrReplace(
3066 std::make_pair(LocalBasePreprocessedEntityID,
3067 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3073 case DECL_UPDATE_OFFSETS: {
3074 if (Record.size() % 2 != 0) {
3075 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3078 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3079 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3080 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3082 // If we've already loaded the decl, perform the updates when we finish
3083 // loading this block.
3084 if (Decl *D = GetExistingDecl(ID))
3085 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3090 case DECL_REPLACEMENTS: {
3091 if (Record.size() % 3 != 0) {
3092 Error("invalid DECL_REPLACEMENTS block in AST file");
3095 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3096 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3097 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3101 case OBJC_CATEGORIES_MAP: {
3102 if (F.LocalNumObjCCategoriesInMap != 0) {
3103 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3107 F.LocalNumObjCCategoriesInMap = Record[0];
3108 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3112 case OBJC_CATEGORIES:
3113 F.ObjCCategories.swap(Record);
3116 case CXX_BASE_SPECIFIER_OFFSETS: {
3117 if (F.LocalNumCXXBaseSpecifiers != 0) {
3118 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
3122 F.LocalNumCXXBaseSpecifiers = Record[0];
3123 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
3124 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3128 case DIAG_PRAGMA_MAPPINGS:
3129 if (F.PragmaDiagMappings.empty())
3130 F.PragmaDiagMappings.swap(Record);
3132 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3133 Record.begin(), Record.end());
3136 case CUDA_SPECIAL_DECL_REFS:
3137 // Later tables overwrite earlier ones.
3138 // FIXME: Modules will have trouble with this.
3139 CUDASpecialDeclRefs.clear();
3140 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3141 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3144 case HEADER_SEARCH_TABLE: {
3145 F.HeaderFileInfoTableData = Blob.data();
3146 F.LocalNumHeaderFileInfos = Record[1];
3148 F.HeaderFileInfoTable
3149 = HeaderFileInfoLookupTable::Create(
3150 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3151 (const unsigned char *)F.HeaderFileInfoTableData,
3152 HeaderFileInfoTrait(*this, F,
3153 &PP.getHeaderSearchInfo(),
3154 Blob.data() + Record[2]));
3156 PP.getHeaderSearchInfo().SetExternalSource(this);
3157 if (!PP.getHeaderSearchInfo().getExternalLookup())
3158 PP.getHeaderSearchInfo().SetExternalLookup(this);
3163 case FP_PRAGMA_OPTIONS:
3164 // Later tables overwrite earlier ones.
3165 FPPragmaOptions.swap(Record);
3168 case OPENCL_EXTENSIONS:
3169 // Later tables overwrite earlier ones.
3170 OpenCLExtensions.swap(Record);
3173 case TENTATIVE_DEFINITIONS:
3174 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3175 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3178 case KNOWN_NAMESPACES:
3179 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3180 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3183 case UNDEFINED_BUT_USED:
3184 if (UndefinedButUsed.size() % 2 != 0) {
3185 Error("Invalid existing UndefinedButUsed");
3189 if (Record.size() % 2 != 0) {
3190 Error("invalid undefined-but-used record");
3193 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3194 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3195 UndefinedButUsed.push_back(
3196 ReadSourceLocation(F, Record, I).getRawEncoding());
3200 case IMPORTED_MODULES: {
3201 if (F.Kind != MK_Module) {
3202 // If we aren't loading a module (which has its own exports), make
3203 // all of the imported modules visible.
3204 // FIXME: Deal with macros-only imports.
3205 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3206 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3207 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3209 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3215 case LOCAL_REDECLARATIONS: {
3216 F.RedeclarationChains.swap(Record);
3220 case LOCAL_REDECLARATIONS_MAP: {
3221 if (F.LocalNumRedeclarationsInMap != 0) {
3222 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
3226 F.LocalNumRedeclarationsInMap = Record[0];
3227 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
3231 case MERGED_DECLARATIONS: {
3232 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3233 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3234 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3235 for (unsigned N = Record[Idx++]; N > 0; --N)
3236 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3241 case MACRO_OFFSET: {
3242 if (F.LocalNumMacros != 0) {
3243 Error("duplicate MACRO_OFFSET record in AST file");
3246 F.MacroOffsets = (const uint32_t *)Blob.data();
3247 F.LocalNumMacros = Record[0];
3248 unsigned LocalBaseMacroID = Record[1];
3249 F.BaseMacroID = getTotalNumMacros();
3251 if (F.LocalNumMacros > 0) {
3252 // Introduce the global -> local mapping for macros within this module.
3253 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3255 // Introduce the local -> global mapping for macros within this module.
3256 F.MacroRemap.insertOrReplace(
3257 std::make_pair(LocalBaseMacroID,
3258 F.BaseMacroID - LocalBaseMacroID));
3260 // Increase size by >= 1 so we get a unique base index in the next module.
3261 MacrosLoaded.resize(MacrosLoaded.size() + std::max(F.LocalNumMacros, 1U));
3266 // FIXME: Not used yet.
3270 case LATE_PARSED_TEMPLATE: {
3271 LateParsedTemplates.append(Record.begin(), Record.end());
3275 case OPTIMIZE_PRAGMA_OPTIONS:
3276 if (Record.size() != 1) {
3277 Error("invalid pragma optimize record");
3280 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3283 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3284 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3285 UnusedLocalTypedefNameCandidates.push_back(
3286 getGlobalDeclID(F, Record[I]));
3292 ASTReader::ASTReadResult
3293 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3294 const ModuleFile *ImportedBy,
3295 unsigned ClientLoadCapabilities) {
3297 F.ModuleMapPath = ReadString(Record, Idx);
3299 // Try to resolve ModuleName in the current header search context and
3300 // verify that it is found in the same module map file as we saved. If the
3301 // top-level AST file is a main file, skip this check because there is no
3302 // usable header search context.
3303 assert(!F.ModuleName.empty() &&
3304 "MODULE_NAME should come before MOUDLE_MAP_FILE");
3305 if (F.Kind == MK_Module && (*ModuleMgr.begin())->Kind != MK_MainFile) {
3306 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3308 assert(ImportedBy && "top-level import should be verified");
3309 if ((ClientLoadCapabilities & ARR_Missing) == 0)
3310 Diag(diag::err_imported_module_not_found)
3311 << F.ModuleName << ImportedBy->FileName;
3315 // Check the primary module map file.
3316 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3317 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3318 const FileEntry *ModMap = Map.getModuleMapFileForUniquing(M);
3319 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3320 assert(ModMap && "found module is missing module map file");
3321 assert(M->Name == F.ModuleName && "found module with different name");
3322 assert(ImportedBy && "top-level import should be verified");
3323 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3324 Diag(diag::err_imported_module_modmap_changed)
3325 << F.ModuleName << ImportedBy->FileName
3326 << ModMap->getName() << F.ModuleMapPath;
3330 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3331 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3332 // FIXME: we should use input files rather than storing names.
3333 std::string Filename = ReadString(Record, Idx);
3334 const FileEntry *F =
3335 FileMgr.getFile(Filename, false, false);
3337 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3338 Error("could not find file '" + Filename +"' referenced by AST file");
3341 AdditionalStoredMaps.insert(F);
3344 // Check any additional module map files (e.g. module.private.modulemap)
3345 // that are not in the pcm.
3346 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3347 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3348 // Remove files that match
3349 // Note: SmallPtrSet::erase is really remove
3350 if (!AdditionalStoredMaps.erase(ModMap)) {
3351 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3352 Diag(diag::err_module_different_modmap)
3353 << F.ModuleName << /*new*/0 << ModMap->getName();
3359 // Check any additional module map files that are in the pcm, but not
3360 // found in header search. Cases that match are already removed.
3361 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3362 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3363 Diag(diag::err_module_different_modmap)
3364 << F.ModuleName << /*not new*/1 << ModMap->getName();
3370 Listener->ReadModuleMapFile(F.ModuleMapPath);
3375 /// \brief Move the given method to the back of the global list of methods.
3376 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3377 // Find the entry for this selector in the method pool.
3378 Sema::GlobalMethodPool::iterator Known
3379 = S.MethodPool.find(Method->getSelector());
3380 if (Known == S.MethodPool.end())
3383 // Retrieve the appropriate method list.
3384 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3385 : Known->second.second;
3387 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3389 if (List->Method == Method) {
3397 if (List->getNext())
3398 List->Method = List->getNext()->Method;
3400 List->Method = Method;
3404 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner,
3405 bool FromFinalization) {
3406 // FIXME: Only do this if Owner->NameVisibility == AllVisible.
3407 for (Decl *D : Names.HiddenDecls) {
3408 bool wasHidden = D->Hidden;
3411 if (wasHidden && SemaObj) {
3412 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3413 moveMethodToBackOfGlobalList(*SemaObj, Method);
3418 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) &&
3419 "nothing to make visible?");
3420 for (const auto &Macro : Names.HiddenMacros) {
3421 if (FromFinalization)
3422 PP.appendMacroDirective(Macro.first,
3423 Macro.second->import(PP, SourceLocation()));
3425 installImportedMacro(Macro.first, Macro.second, Owner);
3429 void ASTReader::makeModuleVisible(Module *Mod,
3430 Module::NameVisibilityKind NameVisibility,
3431 SourceLocation ImportLoc,
3433 llvm::SmallPtrSet<Module *, 4> Visited;
3434 SmallVector<Module *, 4> Stack;
3435 Stack.push_back(Mod);
3436 while (!Stack.empty()) {
3437 Mod = Stack.pop_back_val();
3439 if (NameVisibility <= Mod->NameVisibility) {
3440 // This module already has this level of visibility (or greater), so
3441 // there is nothing more to do.
3445 if (!Mod->isAvailable()) {
3446 // Modules that aren't available cannot be made visible.
3450 // Update the module's name visibility.
3451 if (NameVisibility >= Module::MacrosVisible &&
3452 Mod->NameVisibility < Module::MacrosVisible)
3453 Mod->MacroVisibilityLoc = ImportLoc;
3454 Mod->NameVisibility = NameVisibility;
3456 // If we've already deserialized any names from this module,
3457 // mark them as visible.
3458 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3459 if (Hidden != HiddenNamesMap.end()) {
3460 auto HiddenNames = std::move(*Hidden);
3461 HiddenNamesMap.erase(Hidden);
3462 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3463 /*FromFinalization*/false);
3464 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3465 "making names visible added hidden names");
3468 // Push any exported modules onto the stack to be marked as visible.
3469 SmallVector<Module *, 16> Exports;
3470 Mod->getExportedModules(Exports);
3471 for (SmallVectorImpl<Module *>::iterator
3472 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3473 Module *Exported = *I;
3474 if (Visited.insert(Exported))
3475 Stack.push_back(Exported);
3478 // Detect any conflicts.
3480 assert(ImportLoc.isValid() && "Missing import location");
3481 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3482 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3483 Diag(ImportLoc, diag::warn_module_conflict)
3484 << Mod->getFullModuleName()
3485 << Mod->Conflicts[I].Other->getFullModuleName()
3486 << Mod->Conflicts[I].Message;
3487 // FIXME: Need note where the other module was imported.
3494 bool ASTReader::loadGlobalIndex() {
3498 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3499 !Context.getLangOpts().Modules)
3502 // Try to load the global index.
3503 TriedLoadingGlobalIndex = true;
3504 StringRef ModuleCachePath
3505 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3506 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3507 = GlobalModuleIndex::readIndex(ModuleCachePath);
3511 GlobalIndex.reset(Result.first);
3512 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3516 bool ASTReader::isGlobalIndexUnavailable() const {
3517 return Context.getLangOpts().Modules && UseGlobalIndex &&
3518 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3521 static void updateModuleTimestamp(ModuleFile &MF) {
3522 // Overwrite the timestamp file contents so that file's mtime changes.
3523 std::string TimestampFilename = MF.getTimestampFilename();
3525 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3528 OS << "Timestamp file\n";
3531 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3533 SourceLocation ImportLoc,
3534 unsigned ClientLoadCapabilities) {
3535 llvm::SaveAndRestore<SourceLocation>
3536 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3538 // Defer any pending actions until we get to the end of reading the AST file.
3539 Deserializing AnASTFile(this);
3541 // Bump the generation number.
3542 unsigned PreviousGeneration = incrementGeneration(Context);
3544 unsigned NumModules = ModuleMgr.size();
3545 SmallVector<ImportedModule, 4> Loaded;
3546 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
3547 /*ImportedBy=*/nullptr, Loaded,
3549 ClientLoadCapabilities)) {
3553 case VersionMismatch:
3554 case ConfigurationMismatch:
3556 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3557 for (const ImportedModule &IM : Loaded)
3558 LoadedSet.insert(IM.Mod);
3560 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
3562 Context.getLangOpts().Modules
3563 ? &PP.getHeaderSearchInfo().getModuleMap()
3566 // If we find that any modules are unusable, the global index is going
3567 // to be out-of-date. Just remove it.
3568 GlobalIndex.reset();
3569 ModuleMgr.setGlobalIndex(nullptr);
3576 // Here comes stuff that we only do once the entire chain is loaded.
3578 // Load the AST blocks of all of the modules that we loaded.
3579 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3580 MEnd = Loaded.end();
3582 ModuleFile &F = *M->Mod;
3584 // Read the AST block.
3585 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3588 // Once read, set the ModuleFile bit base offset and update the size in
3589 // bits of all files we've seen.
3590 F.GlobalBitOffset = TotalModulesSizeInBits;
3591 TotalModulesSizeInBits += F.SizeInBits;
3592 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3594 // Preload SLocEntries.
3595 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3596 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3597 // Load it through the SourceManager and don't call ReadSLocEntry()
3598 // directly because the entry may have already been loaded in which case
3599 // calling ReadSLocEntry() directly would trigger an assertion in
3601 SourceMgr.getLoadedSLocEntryByID(Index);
3605 // Setup the import locations and notify the module manager that we've
3606 // committed to these module files.
3607 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3608 MEnd = Loaded.end();
3610 ModuleFile &F = *M->Mod;
3612 ModuleMgr.moduleFileAccepted(&F);
3614 // Set the import location.
3615 F.DirectImportLoc = ImportLoc;
3617 F.ImportLoc = M->ImportLoc;
3619 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3620 M->ImportLoc.getRawEncoding());
3623 // Mark all of the identifiers in the identifier table as being out of date,
3624 // so that various accessors know to check the loaded modules when the
3625 // identifier is used.
3626 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3627 IdEnd = PP.getIdentifierTable().end();
3629 Id->second->setOutOfDate(true);
3631 // Resolve any unresolved module exports.
3632 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3633 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
3634 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3635 Module *ResolvedMod = getSubmodule(GlobalID);
3637 switch (Unresolved.Kind) {
3638 case UnresolvedModuleRef::Conflict:
3640 Module::Conflict Conflict;
3641 Conflict.Other = ResolvedMod;
3642 Conflict.Message = Unresolved.String.str();
3643 Unresolved.Mod->Conflicts.push_back(Conflict);
3647 case UnresolvedModuleRef::Import:
3649 Unresolved.Mod->Imports.push_back(ResolvedMod);
3652 case UnresolvedModuleRef::Export:
3653 if (ResolvedMod || Unresolved.IsWildcard)
3654 Unresolved.Mod->Exports.push_back(
3655 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3659 UnresolvedModuleRefs.clear();
3661 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3662 // Might be unnecessary as use declarations are only used to build the
3665 InitializeContext();
3670 if (DeserializationListener)
3671 DeserializationListener->ReaderInitialized(this);
3673 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3674 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3675 PrimaryModule.OriginalSourceFileID
3676 = FileID::get(PrimaryModule.SLocEntryBaseID
3677 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3679 // If this AST file is a precompiled preamble, then set the
3680 // preamble file ID of the source manager to the file source file
3681 // from which the preamble was built.
3682 if (Type == MK_Preamble) {
3683 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3684 } else if (Type == MK_MainFile) {
3685 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3689 // For any Objective-C class definitions we have already loaded, make sure
3690 // that we load any additional categories.
3691 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3692 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3693 ObjCClassesLoaded[I],
3694 PreviousGeneration);
3697 if (PP.getHeaderSearchInfo()
3698 .getHeaderSearchOpts()
3699 .ModulesValidateOncePerBuildSession) {
3700 // Now we are certain that the module and all modules it depends on are
3701 // up to date. Create or update timestamp files for modules that are
3702 // located in the module cache (not for PCH files that could be anywhere
3703 // in the filesystem).
3704 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3705 ImportedModule &M = Loaded[I];
3706 if (M.Mod->Kind == MK_Module) {
3707 updateModuleTimestamp(*M.Mod);
3715 ASTReader::ASTReadResult
3716 ASTReader::ReadASTCore(StringRef FileName,
3718 SourceLocation ImportLoc,
3719 ModuleFile *ImportedBy,
3720 SmallVectorImpl<ImportedModule> &Loaded,
3721 off_t ExpectedSize, time_t ExpectedModTime,
3722 unsigned ClientLoadCapabilities) {
3724 std::string ErrorStr;
3725 ModuleManager::AddModuleResult AddResult
3726 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
3727 getGeneration(), ExpectedSize, ExpectedModTime,
3730 switch (AddResult) {
3731 case ModuleManager::AlreadyLoaded:
3734 case ModuleManager::NewlyLoaded:
3735 // Load module file below.
3738 case ModuleManager::Missing:
3739 // The module file was missing; if the client handle handle, that, return
3741 if (ClientLoadCapabilities & ARR_Missing)
3744 // Otherwise, return an error.
3746 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3752 case ModuleManager::OutOfDate:
3753 // We couldn't load the module file because it is out-of-date. If the
3754 // client can handle out-of-date, return it.
3755 if (ClientLoadCapabilities & ARR_OutOfDate)
3758 // Otherwise, return an error.
3760 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3767 assert(M && "Missing module file");
3769 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3771 if (FileName != "-") {
3772 CurrentDir = llvm::sys::path::parent_path(FileName);
3773 if (CurrentDir.empty()) CurrentDir = ".";
3777 BitstreamCursor &Stream = F.Stream;
3778 Stream.init(F.StreamFile);
3779 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3781 // Sniff for the signature.
3782 if (Stream.Read(8) != 'C' ||
3783 Stream.Read(8) != 'P' ||
3784 Stream.Read(8) != 'C' ||
3785 Stream.Read(8) != 'H') {
3786 Diag(diag::err_not_a_pch_file) << FileName;
3790 // This is used for compatibility with older PCH formats.
3791 bool HaveReadControlBlock = false;
3794 llvm::BitstreamEntry Entry = Stream.advance();
3796 switch (Entry.Kind) {
3797 case llvm::BitstreamEntry::Error:
3798 case llvm::BitstreamEntry::EndBlock:
3799 case llvm::BitstreamEntry::Record:
3800 Error("invalid record at top-level of AST file");
3803 case llvm::BitstreamEntry::SubBlock:
3807 // We only know the control subblock ID.
3809 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3810 if (Stream.ReadBlockInfoBlock()) {
3811 Error("malformed BlockInfoBlock in AST file");
3815 case CONTROL_BLOCK_ID:
3816 HaveReadControlBlock = true;
3817 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
3821 case Failure: return Failure;
3822 case Missing: return Missing;
3823 case OutOfDate: return OutOfDate;
3824 case VersionMismatch: return VersionMismatch;
3825 case ConfigurationMismatch: return ConfigurationMismatch;
3826 case HadErrors: return HadErrors;
3830 if (!HaveReadControlBlock) {
3831 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3832 Diag(diag::err_pch_version_too_old);
3833 return VersionMismatch;
3836 // Record that we've loaded this module.
3837 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3841 if (Stream.SkipBlock()) {
3842 Error("malformed block record in AST file");
3852 void ASTReader::InitializeContext() {
3853 // If there's a listener, notify them that we "read" the translation unit.
3854 if (DeserializationListener)
3855 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3856 Context.getTranslationUnitDecl());
3858 // FIXME: Find a better way to deal with collisions between these
3859 // built-in types. Right now, we just ignore the problem.
3861 // Load the special types.
3862 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3863 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3864 if (!Context.CFConstantStringTypeDecl)
3865 Context.setCFConstantStringType(GetType(String));
3868 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3869 QualType FileType = GetType(File);
3870 if (FileType.isNull()) {
3871 Error("FILE type is NULL");
3875 if (!Context.FILEDecl) {
3876 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3877 Context.setFILEDecl(Typedef->getDecl());
3879 const TagType *Tag = FileType->getAs<TagType>();
3881 Error("Invalid FILE type in AST file");
3884 Context.setFILEDecl(Tag->getDecl());
3889 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3890 QualType Jmp_bufType = GetType(Jmp_buf);
3891 if (Jmp_bufType.isNull()) {
3892 Error("jmp_buf type is NULL");
3896 if (!Context.jmp_bufDecl) {
3897 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3898 Context.setjmp_bufDecl(Typedef->getDecl());
3900 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3902 Error("Invalid jmp_buf type in AST file");
3905 Context.setjmp_bufDecl(Tag->getDecl());
3910 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3911 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3912 if (Sigjmp_bufType.isNull()) {
3913 Error("sigjmp_buf type is NULL");
3917 if (!Context.sigjmp_bufDecl) {
3918 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3919 Context.setsigjmp_bufDecl(Typedef->getDecl());
3921 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3922 assert(Tag && "Invalid sigjmp_buf type in AST file");
3923 Context.setsigjmp_bufDecl(Tag->getDecl());
3928 if (unsigned ObjCIdRedef
3929 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3930 if (Context.ObjCIdRedefinitionType.isNull())
3931 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3934 if (unsigned ObjCClassRedef
3935 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3936 if (Context.ObjCClassRedefinitionType.isNull())
3937 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3940 if (unsigned ObjCSelRedef
3941 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3942 if (Context.ObjCSelRedefinitionType.isNull())
3943 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3946 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3947 QualType Ucontext_tType = GetType(Ucontext_t);
3948 if (Ucontext_tType.isNull()) {
3949 Error("ucontext_t type is NULL");
3953 if (!Context.ucontext_tDecl) {
3954 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3955 Context.setucontext_tDecl(Typedef->getDecl());
3957 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3958 assert(Tag && "Invalid ucontext_t type in AST file");
3959 Context.setucontext_tDecl(Tag->getDecl());
3965 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3967 // If there were any CUDA special declarations, deserialize them.
3968 if (!CUDASpecialDeclRefs.empty()) {
3969 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3970 Context.setcudaConfigureCallDecl(
3971 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3974 // Re-export any modules that were imported by a non-module AST file.
3975 // FIXME: This does not make macro-only imports visible again. It also doesn't
3976 // make #includes mapped to module imports visible.
3977 for (auto &Import : ImportedModules) {
3978 if (Module *Imported = getSubmodule(Import.ID))
3979 makeModuleVisible(Imported, Module::AllVisible,
3980 /*ImportLoc=*/Import.ImportLoc,
3981 /*Complain=*/false);
3983 ImportedModules.clear();
3986 void ASTReader::finalizeForWriting() {
3987 while (!HiddenNamesMap.empty()) {
3988 auto HiddenNames = std::move(*HiddenNamesMap.begin());
3989 HiddenNamesMap.erase(HiddenNamesMap.begin());
3990 makeNamesVisible(HiddenNames.second, HiddenNames.first,
3991 /*FromFinalization*/true);
3995 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3996 /// cursor into the start of the given block ID, returning false on success and
3997 /// true on failure.
3998 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
4000 llvm::BitstreamEntry Entry = Cursor.advance();
4001 switch (Entry.Kind) {
4002 case llvm::BitstreamEntry::Error:
4003 case llvm::BitstreamEntry::EndBlock:
4006 case llvm::BitstreamEntry::Record:
4007 // Ignore top-level records.
4008 Cursor.skipRecord(Entry.ID);
4011 case llvm::BitstreamEntry::SubBlock:
4012 if (Entry.ID == BlockID) {
4013 if (Cursor.EnterSubBlock(BlockID))
4019 if (Cursor.SkipBlock())
4025 /// \brief Retrieve the name of the original source file name
4026 /// directly from the AST file, without actually loading the AST
4028 std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
4029 FileManager &FileMgr,
4030 DiagnosticsEngine &Diags) {
4031 // Open the AST file.
4033 std::unique_ptr<llvm::MemoryBuffer> Buffer =
4034 FileMgr.getBufferForFile(ASTFileName, &ErrStr);
4036 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
4037 return std::string();
4040 // Initialize the stream
4041 llvm::BitstreamReader StreamFile;
4042 BitstreamCursor Stream;
4043 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4044 (const unsigned char *)Buffer->getBufferEnd());
4045 Stream.init(StreamFile);
4047 // Sniff for the signature.
4048 if (Stream.Read(8) != 'C' ||
4049 Stream.Read(8) != 'P' ||
4050 Stream.Read(8) != 'C' ||
4051 Stream.Read(8) != 'H') {
4052 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4053 return std::string();
4056 // Scan for the CONTROL_BLOCK_ID block.
4057 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
4058 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4059 return std::string();
4062 // Scan for ORIGINAL_FILE inside the control block.
4065 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4066 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4067 return std::string();
4069 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4070 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4071 return std::string();
4076 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4082 class SimplePCHValidator : public ASTReaderListener {
4083 const LangOptions &ExistingLangOpts;
4084 const TargetOptions &ExistingTargetOpts;
4085 const PreprocessorOptions &ExistingPPOpts;
4086 FileManager &FileMgr;
4089 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4090 const TargetOptions &ExistingTargetOpts,
4091 const PreprocessorOptions &ExistingPPOpts,
4092 FileManager &FileMgr)
4093 : ExistingLangOpts(ExistingLangOpts),
4094 ExistingTargetOpts(ExistingTargetOpts),
4095 ExistingPPOpts(ExistingPPOpts),
4100 bool ReadLanguageOptions(const LangOptions &LangOpts,
4101 bool Complain) override {
4102 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr);
4104 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4105 bool Complain) override {
4106 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
4108 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4110 std::string &SuggestedPredefines) override {
4111 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4112 SuggestedPredefines, ExistingLangOpts);
4117 bool ASTReader::readASTFileControlBlock(StringRef Filename,
4118 FileManager &FileMgr,
4119 ASTReaderListener &Listener) {
4120 // Open the AST file.
4122 std::unique_ptr<llvm::MemoryBuffer> Buffer =
4123 FileMgr.getBufferForFile(Filename, &ErrStr);
4128 // Initialize the stream
4129 llvm::BitstreamReader StreamFile;
4130 BitstreamCursor Stream;
4131 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4132 (const unsigned char *)Buffer->getBufferEnd());
4133 Stream.init(StreamFile);
4135 // Sniff for the signature.
4136 if (Stream.Read(8) != 'C' ||
4137 Stream.Read(8) != 'P' ||
4138 Stream.Read(8) != 'C' ||
4139 Stream.Read(8) != 'H') {
4143 // Scan for the CONTROL_BLOCK_ID block.
4144 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4147 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4148 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4149 BitstreamCursor InputFilesCursor;
4150 if (NeedsInputFiles) {
4151 InputFilesCursor = Stream;
4152 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4155 // Read the abbreviations
4157 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4158 unsigned Code = InputFilesCursor.ReadCode();
4160 // We expect all abbrevs to be at the start of the block.
4161 if (Code != llvm::bitc::DEFINE_ABBREV) {
4162 InputFilesCursor.JumpToBit(Offset);
4165 InputFilesCursor.ReadAbbrevRecord();
4169 // Scan for ORIGINAL_FILE inside the control block.
4172 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4173 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4176 if (Entry.Kind != llvm::BitstreamEntry::Record)
4181 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4182 switch ((ControlRecordTypes)RecCode) {
4184 if (Record[0] != VERSION_MAJOR)
4187 if (Listener.ReadFullVersionInformation(Blob))
4193 Listener.ReadModuleName(Blob);
4195 case MODULE_MAP_FILE: {
4197 Listener.ReadModuleMapFile(ReadString(Record, Idx));
4200 case LANGUAGE_OPTIONS:
4201 if (ParseLanguageOptions(Record, false, Listener))
4205 case TARGET_OPTIONS:
4206 if (ParseTargetOptions(Record, false, Listener))
4210 case DIAGNOSTIC_OPTIONS:
4211 if (ParseDiagnosticOptions(Record, false, Listener))
4215 case FILE_SYSTEM_OPTIONS:
4216 if (ParseFileSystemOptions(Record, false, Listener))
4220 case HEADER_SEARCH_OPTIONS:
4221 if (ParseHeaderSearchOptions(Record, false, Listener))
4225 case PREPROCESSOR_OPTIONS: {
4226 std::string IgnoredSuggestedPredefines;
4227 if (ParsePreprocessorOptions(Record, false, Listener,
4228 IgnoredSuggestedPredefines))
4233 case INPUT_FILE_OFFSETS: {
4234 if (!NeedsInputFiles)
4237 unsigned NumInputFiles = Record[0];
4238 unsigned NumUserFiles = Record[1];
4239 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4240 for (unsigned I = 0; I != NumInputFiles; ++I) {
4241 // Go find this input file.
4242 bool isSystemFile = I >= NumUserFiles;
4244 if (isSystemFile && !NeedsSystemInputFiles)
4245 break; // the rest are system input files
4247 BitstreamCursor &Cursor = InputFilesCursor;
4248 SavedStreamPosition SavedPosition(Cursor);
4249 Cursor.JumpToBit(InputFileOffs[I]);
4251 unsigned Code = Cursor.ReadCode();
4254 bool shouldContinue = false;
4255 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4257 bool Overridden = static_cast<bool>(Record[3]);
4258 shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden);
4261 if (!shouldContinue)
4268 // No other validation to perform.
4275 bool ASTReader::isAcceptableASTFile(StringRef Filename,
4276 FileManager &FileMgr,
4277 const LangOptions &LangOpts,
4278 const TargetOptions &TargetOpts,
4279 const PreprocessorOptions &PPOpts) {
4280 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4281 return !readASTFileControlBlock(Filename, FileMgr, validator);
4284 ASTReader::ASTReadResult
4285 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4286 // Enter the submodule block.
4287 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4288 Error("malformed submodule block record in AST file");
4292 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4294 Module *CurrentModule = nullptr;
4297 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4299 switch (Entry.Kind) {
4300 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4301 case llvm::BitstreamEntry::Error:
4302 Error("malformed block record in AST file");
4304 case llvm::BitstreamEntry::EndBlock:
4306 case llvm::BitstreamEntry::Record:
4307 // The interesting case.
4314 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
4315 default: // Default behavior: ignore.
4318 case SUBMODULE_DEFINITION: {
4320 Error("missing submodule metadata record at beginning of block");
4324 if (Record.size() < 8) {
4325 Error("malformed module definition");
4329 StringRef Name = Blob;
4331 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4332 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4333 bool IsFramework = Record[Idx++];
4334 bool IsExplicit = Record[Idx++];
4335 bool IsSystem = Record[Idx++];
4336 bool IsExternC = Record[Idx++];
4337 bool InferSubmodules = Record[Idx++];
4338 bool InferExplicitSubmodules = Record[Idx++];
4339 bool InferExportWildcard = Record[Idx++];
4340 bool ConfigMacrosExhaustive = Record[Idx++];
4342 Module *ParentModule = nullptr;
4344 ParentModule = getSubmodule(Parent);
4346 // Retrieve this (sub)module from the module map, creating it if
4348 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
4351 // FIXME: set the definition loc for CurrentModule, or call
4352 // ModMap.setInferredModuleAllowedBy()
4354 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4355 if (GlobalIndex >= SubmodulesLoaded.size() ||
4356 SubmodulesLoaded[GlobalIndex]) {
4357 Error("too many submodules");
4361 if (!ParentModule) {
4362 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4363 if (CurFile != F.File) {
4364 if (!Diags.isDiagnosticInFlight()) {
4365 Diag(diag::err_module_file_conflict)
4366 << CurrentModule->getTopLevelModuleName()
4367 << CurFile->getName()
4368 << F.File->getName();
4374 CurrentModule->setASTFile(F.File);
4377 CurrentModule->IsFromModuleFile = true;
4378 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
4379 CurrentModule->IsExternC = IsExternC;
4380 CurrentModule->InferSubmodules = InferSubmodules;
4381 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4382 CurrentModule->InferExportWildcard = InferExportWildcard;
4383 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
4384 if (DeserializationListener)
4385 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4387 SubmodulesLoaded[GlobalIndex] = CurrentModule;
4389 // Clear out data that will be replaced by what is the module file.
4390 CurrentModule->LinkLibraries.clear();
4391 CurrentModule->ConfigMacros.clear();
4392 CurrentModule->UnresolvedConflicts.clear();
4393 CurrentModule->Conflicts.clear();
4397 case SUBMODULE_UMBRELLA_HEADER: {
4399 Error("missing submodule metadata record at beginning of block");
4406 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
4407 if (!CurrentModule->getUmbrellaHeader())
4408 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4409 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
4410 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4411 Error("mismatched umbrella headers in submodule");
4418 case SUBMODULE_HEADER: {
4420 Error("missing submodule metadata record at beginning of block");
4427 // We lazily associate headers with their modules via the HeaderInfoTable.
4428 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4429 // of complete filenames or remove it entirely.
4433 case SUBMODULE_EXCLUDED_HEADER: {
4435 Error("missing submodule metadata record at beginning of block");
4442 // We lazily associate headers with their modules via the HeaderInfoTable.
4443 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4444 // of complete filenames or remove it entirely.
4448 case SUBMODULE_PRIVATE_HEADER: {
4450 Error("missing submodule metadata record at beginning of block");
4457 // We lazily associate headers with their modules via the HeaderInfoTable.
4458 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4459 // of complete filenames or remove it entirely.
4463 case SUBMODULE_TOPHEADER: {
4465 Error("missing submodule metadata record at beginning of block");
4472 CurrentModule->addTopHeaderFilename(Blob);
4476 case SUBMODULE_UMBRELLA_DIR: {
4478 Error("missing submodule metadata record at beginning of block");
4485 if (const DirectoryEntry *Umbrella
4486 = PP.getFileManager().getDirectory(Blob)) {
4487 if (!CurrentModule->getUmbrellaDir())
4488 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4489 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
4490 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4491 Error("mismatched umbrella directories in submodule");
4498 case SUBMODULE_METADATA: {
4500 Error("submodule metadata record not at beginning of block");
4505 F.BaseSubmoduleID = getTotalNumSubmodules();
4506 F.LocalNumSubmodules = Record[0];
4507 unsigned LocalBaseSubmoduleID = Record[1];
4508 if (F.LocalNumSubmodules > 0) {
4509 // Introduce the global -> local mapping for submodules within this
4511 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4513 // Introduce the local -> global mapping for submodules within this
4515 F.SubmoduleRemap.insertOrReplace(
4516 std::make_pair(LocalBaseSubmoduleID,
4517 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4520 // Increase size by >= 1 so we get a unique base index in the next module.
4521 SubmodulesLoaded.resize(SubmodulesLoaded.size() +
4522 std::max(F.LocalNumSubmodules, 1U));
4526 case SUBMODULE_IMPORTS: {
4528 Error("missing submodule metadata record at beginning of block");
4535 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
4536 UnresolvedModuleRef Unresolved;
4537 Unresolved.File = &F;
4538 Unresolved.Mod = CurrentModule;
4539 Unresolved.ID = Record[Idx];
4540 Unresolved.Kind = UnresolvedModuleRef::Import;
4541 Unresolved.IsWildcard = false;
4542 UnresolvedModuleRefs.push_back(Unresolved);
4547 case SUBMODULE_EXPORTS: {
4549 Error("missing submodule metadata record at beginning of block");
4556 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
4557 UnresolvedModuleRef Unresolved;
4558 Unresolved.File = &F;
4559 Unresolved.Mod = CurrentModule;
4560 Unresolved.ID = Record[Idx];
4561 Unresolved.Kind = UnresolvedModuleRef::Export;
4562 Unresolved.IsWildcard = Record[Idx + 1];
4563 UnresolvedModuleRefs.push_back(Unresolved);
4566 // Once we've loaded the set of exports, there's no reason to keep
4567 // the parsed, unresolved exports around.
4568 CurrentModule->UnresolvedExports.clear();
4571 case SUBMODULE_REQUIRES: {
4573 Error("missing submodule metadata record at beginning of block");
4580 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
4581 Context.getTargetInfo());
4585 case SUBMODULE_LINK_LIBRARY:
4587 Error("missing submodule metadata record at beginning of block");
4594 CurrentModule->LinkLibraries.push_back(
4595 Module::LinkLibrary(Blob, Record[0]));
4598 case SUBMODULE_CONFIG_MACRO:
4600 Error("missing submodule metadata record at beginning of block");
4607 CurrentModule->ConfigMacros.push_back(Blob.str());
4610 case SUBMODULE_CONFLICT: {
4612 Error("missing submodule metadata record at beginning of block");
4619 UnresolvedModuleRef Unresolved;
4620 Unresolved.File = &F;
4621 Unresolved.Mod = CurrentModule;
4622 Unresolved.ID = Record[0];
4623 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4624 Unresolved.IsWildcard = false;
4625 Unresolved.String = Blob;
4626 UnresolvedModuleRefs.push_back(Unresolved);
4633 /// \brief Parse the record that corresponds to a LangOptions data
4636 /// This routine parses the language options from the AST file and then gives
4637 /// them to the AST listener if one is set.
4639 /// \returns true if the listener deems the file unacceptable, false otherwise.
4640 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4642 ASTReaderListener &Listener) {
4643 LangOptions LangOpts;
4645 #define LANGOPT(Name, Bits, Default, Description) \
4646 LangOpts.Name = Record[Idx++];
4647 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4648 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4649 #include "clang/Basic/LangOptions.def"
4650 #define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
4651 #include "clang/Basic/Sanitizers.def"
4653 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4654 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4655 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4657 unsigned Length = Record[Idx++];
4658 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4659 Record.begin() + Idx + Length);
4664 for (unsigned N = Record[Idx++]; N; --N) {
4665 LangOpts.CommentOpts.BlockCommandNames.push_back(
4666 ReadString(Record, Idx));
4668 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
4670 return Listener.ReadLanguageOptions(LangOpts, Complain);
4673 bool ASTReader::ParseTargetOptions(const RecordData &Record,
4675 ASTReaderListener &Listener) {
4677 TargetOptions TargetOpts;
4678 TargetOpts.Triple = ReadString(Record, Idx);
4679 TargetOpts.CPU = ReadString(Record, Idx);
4680 TargetOpts.ABI = ReadString(Record, Idx);
4681 for (unsigned N = Record[Idx++]; N; --N) {
4682 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4684 for (unsigned N = Record[Idx++]; N; --N) {
4685 TargetOpts.Features.push_back(ReadString(Record, Idx));
4688 return Listener.ReadTargetOptions(TargetOpts, Complain);
4691 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4692 ASTReaderListener &Listener) {
4693 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
4695 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
4696 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
4697 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
4698 #include "clang/Basic/DiagnosticOptions.def"
4700 for (unsigned N = Record[Idx++]; N; --N)
4701 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
4702 for (unsigned N = Record[Idx++]; N; --N)
4703 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
4705 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4708 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4709 ASTReaderListener &Listener) {
4710 FileSystemOptions FSOpts;
4712 FSOpts.WorkingDir = ReadString(Record, Idx);
4713 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4716 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4718 ASTReaderListener &Listener) {
4719 HeaderSearchOptions HSOpts;
4721 HSOpts.Sysroot = ReadString(Record, Idx);
4724 for (unsigned N = Record[Idx++]; N; --N) {
4725 std::string Path = ReadString(Record, Idx);
4726 frontend::IncludeDirGroup Group
4727 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
4728 bool IsFramework = Record[Idx++];
4729 bool IgnoreSysRoot = Record[Idx++];
4730 HSOpts.UserEntries.push_back(
4731 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
4734 // System header prefixes.
4735 for (unsigned N = Record[Idx++]; N; --N) {
4736 std::string Prefix = ReadString(Record, Idx);
4737 bool IsSystemHeader = Record[Idx++];
4738 HSOpts.SystemHeaderPrefixes.push_back(
4739 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4742 HSOpts.ResourceDir = ReadString(Record, Idx);
4743 HSOpts.ModuleCachePath = ReadString(Record, Idx);
4744 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
4745 HSOpts.DisableModuleHash = Record[Idx++];
4746 HSOpts.UseBuiltinIncludes = Record[Idx++];
4747 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4748 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4749 HSOpts.UseLibcxx = Record[Idx++];
4751 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4754 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4756 ASTReaderListener &Listener,
4757 std::string &SuggestedPredefines) {
4758 PreprocessorOptions PPOpts;
4761 // Macro definitions/undefs
4762 for (unsigned N = Record[Idx++]; N; --N) {
4763 std::string Macro = ReadString(Record, Idx);
4764 bool IsUndef = Record[Idx++];
4765 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4769 for (unsigned N = Record[Idx++]; N; --N) {
4770 PPOpts.Includes.push_back(ReadString(Record, Idx));
4774 for (unsigned N = Record[Idx++]; N; --N) {
4775 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4778 PPOpts.UsePredefines = Record[Idx++];
4779 PPOpts.DetailedRecord = Record[Idx++];
4780 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4781 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4782 PPOpts.ObjCXXARCStandardLibrary =
4783 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4784 SuggestedPredefines.clear();
4785 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4786 SuggestedPredefines);
4789 std::pair<ModuleFile *, unsigned>
4790 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4791 GlobalPreprocessedEntityMapType::iterator
4792 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4793 assert(I != GlobalPreprocessedEntityMap.end() &&
4794 "Corrupted global preprocessed entity map");
4795 ModuleFile *M = I->second;
4796 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4797 return std::make_pair(M, LocalIndex);
4800 std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
4801 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4802 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4803 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4804 Mod.NumPreprocessedEntities);
4806 return std::make_pair(PreprocessingRecord::iterator(),
4807 PreprocessingRecord::iterator());
4810 std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
4811 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4812 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4813 ModuleDeclIterator(this, &Mod,
4814 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4817 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4818 PreprocessedEntityID PPID = Index+1;
4819 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4820 ModuleFile &M = *PPInfo.first;
4821 unsigned LocalIndex = PPInfo.second;
4822 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4824 if (!PP.getPreprocessingRecord()) {
4825 Error("no preprocessing record");
4829 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4830 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4832 llvm::BitstreamEntry Entry =
4833 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4834 if (Entry.Kind != llvm::BitstreamEntry::Record)
4838 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4839 ReadSourceLocation(M, PPOffs.End));
4840 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
4843 PreprocessorDetailRecordTypes RecType =
4844 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4845 Entry.ID, Record, &Blob);
4847 case PPD_MACRO_EXPANSION: {
4848 bool isBuiltin = Record[0];
4849 IdentifierInfo *Name = nullptr;
4850 MacroDefinition *Def = nullptr;
4852 Name = getLocalIdentifier(M, Record[1]);
4854 PreprocessedEntityID
4855 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4856 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4861 ME = new (PPRec) MacroExpansion(Name, Range);
4863 ME = new (PPRec) MacroExpansion(Def, Range);
4868 case PPD_MACRO_DEFINITION: {
4869 // Decode the identifier info and then check again; if the macro is
4870 // still defined and associated with the identifier,
4871 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4873 = new (PPRec) MacroDefinition(II, Range);
4875 if (DeserializationListener)
4876 DeserializationListener->MacroDefinitionRead(PPID, MD);
4881 case PPD_INCLUSION_DIRECTIVE: {
4882 const char *FullFileNameStart = Blob.data() + Record[0];
4883 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
4884 const FileEntry *File = nullptr;
4885 if (!FullFileName.empty())
4886 File = PP.getFileManager().getFile(FullFileName);
4888 // FIXME: Stable encoding
4889 InclusionDirective::InclusionKind Kind
4890 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4891 InclusionDirective *ID
4892 = new (PPRec) InclusionDirective(PPRec, Kind,
4893 StringRef(Blob.data(), Record[0]),
4894 Record[1], Record[3],
4901 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4904 /// \brief \arg SLocMapI points at a chunk of a module that contains no
4905 /// preprocessed entities or the entities it contains are not the ones we are
4906 /// looking for. Find the next module that contains entities and return the ID
4907 /// of the first entry.
4908 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4909 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4911 for (GlobalSLocOffsetMapType::const_iterator
4912 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4913 ModuleFile &M = *SLocMapI->second;
4914 if (M.NumPreprocessedEntities)
4915 return M.BasePreprocessedEntityID;
4918 return getTotalNumPreprocessedEntities();
4923 template <unsigned PPEntityOffset::*PPLoc>
4924 struct PPEntityComp {
4925 const ASTReader &Reader;
4928 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4930 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4931 SourceLocation LHS = getLoc(L);
4932 SourceLocation RHS = getLoc(R);
4933 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4936 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4937 SourceLocation LHS = getLoc(L);
4938 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4941 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4942 SourceLocation RHS = getLoc(R);
4943 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4946 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4947 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4953 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4954 bool EndsAfter) const {
4955 if (SourceMgr.isLocalSourceLocation(Loc))
4956 return getTotalNumPreprocessedEntities();
4958 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4959 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
4960 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4961 "Corrupted global sloc offset map");
4963 if (SLocMapI->second->NumPreprocessedEntities == 0)
4964 return findNextPreprocessedEntity(SLocMapI);
4966 ModuleFile &M = *SLocMapI->second;
4967 typedef const PPEntityOffset *pp_iterator;
4968 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4969 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4971 size_t Count = M.NumPreprocessedEntities;
4973 pp_iterator First = pp_begin;
4977 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4978 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4980 // Do a binary search manually instead of using std::lower_bound because
4981 // The end locations of entities may be unordered (when a macro expansion
4982 // is inside another macro argument), but for this case it is not important
4983 // whether we get the first macro expansion or its containing macro.
4987 std::advance(PPI, Half);
4988 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4992 Count = Count - Half - 1;
4999 return findNextPreprocessedEntity(SLocMapI);
5001 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5004 /// \brief Returns a pair of [Begin, End) indices of preallocated
5005 /// preprocessed entities that \arg Range encompasses.
5006 std::pair<unsigned, unsigned>
5007 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5008 if (Range.isInvalid())
5009 return std::make_pair(0,0);
5010 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5012 PreprocessedEntityID BeginID =
5013 findPreprocessedEntity(Range.getBegin(), false);
5014 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
5015 return std::make_pair(BeginID, EndID);
5018 /// \brief Optionally returns true or false if the preallocated preprocessed
5019 /// entity with index \arg Index came from file \arg FID.
5020 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
5022 if (FID.isInvalid())
5025 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5026 ModuleFile &M = *PPInfo.first;
5027 unsigned LocalIndex = PPInfo.second;
5028 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5030 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
5031 if (Loc.isInvalid())
5034 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5041 /// \brief Visitor used to search for information about a header file.
5042 class HeaderFileInfoVisitor {
5043 const FileEntry *FE;
5045 Optional<HeaderFileInfo> HFI;
5048 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5051 static bool visit(ModuleFile &M, void *UserData) {
5052 HeaderFileInfoVisitor *This
5053 = static_cast<HeaderFileInfoVisitor *>(UserData);
5055 HeaderFileInfoLookupTable *Table
5056 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5060 // Look in the on-disk hash table for an entry for this file name.
5061 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
5062 if (Pos == Table->end())
5069 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
5073 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
5074 HeaderFileInfoVisitor Visitor(FE);
5075 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
5076 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
5079 return HeaderFileInfo();
5082 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5083 // FIXME: Make it work properly with modules.
5084 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
5085 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5086 ModuleFile &F = *(*I);
5089 assert(!Diag.DiagStates.empty());
5090 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5091 while (Idx < F.PragmaDiagMappings.size()) {
5092 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5093 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5094 if (DiagStateID != 0) {
5095 Diag.DiagStatePoints.push_back(
5096 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5097 FullSourceLoc(Loc, SourceMgr)));
5101 assert(DiagStateID == 0);
5102 // A new DiagState was created here.
5103 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5104 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5105 DiagStates.push_back(NewState);
5106 Diag.DiagStatePoints.push_back(
5107 DiagnosticsEngine::DiagStatePoint(NewState,
5108 FullSourceLoc(Loc, SourceMgr)));
5110 assert(Idx < F.PragmaDiagMappings.size() &&
5111 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5112 if (Idx >= F.PragmaDiagMappings.size()) {
5113 break; // Something is messed up but at least avoid infinite loop in
5116 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5117 if (DiagID == (unsigned)-1) {
5118 break; // no more diag/map pairs for this location.
5120 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5121 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5122 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
5128 /// \brief Get the correct cursor and offset for loading a type.
5129 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5130 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5131 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5132 ModuleFile *M = I->second;
5133 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5136 /// \brief Read and return the type with the given index..
5138 /// The index is the type ID, shifted and minus the number of predefs. This
5139 /// routine actually reads the record corresponding to the type at the given
5140 /// location. It is a helper routine for GetType, which deals with reading type
5142 QualType ASTReader::readTypeRecord(unsigned Index) {
5143 RecordLocation Loc = TypeCursorForIndex(Index);
5144 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5146 // Keep track of where we are in the stream, then jump back there
5147 // after reading this type.
5148 SavedStreamPosition SavedPosition(DeclsCursor);
5150 ReadingKindTracker ReadingKind(Read_Type, *this);
5152 // Note that we are loading a type record.
5153 Deserializing AType(this);
5156 DeclsCursor.JumpToBit(Loc.Offset);
5158 unsigned Code = DeclsCursor.ReadCode();
5159 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5160 case TYPE_EXT_QUAL: {
5161 if (Record.size() != 2) {
5162 Error("Incorrect encoding of extended qualifier type");
5165 QualType Base = readType(*Loc.F, Record, Idx);
5166 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5167 return Context.getQualifiedType(Base, Quals);
5170 case TYPE_COMPLEX: {
5171 if (Record.size() != 1) {
5172 Error("Incorrect encoding of complex type");
5175 QualType ElemType = readType(*Loc.F, Record, Idx);
5176 return Context.getComplexType(ElemType);
5179 case TYPE_POINTER: {
5180 if (Record.size() != 1) {
5181 Error("Incorrect encoding of pointer type");
5184 QualType PointeeType = readType(*Loc.F, Record, Idx);
5185 return Context.getPointerType(PointeeType);
5188 case TYPE_DECAYED: {
5189 if (Record.size() != 1) {
5190 Error("Incorrect encoding of decayed type");
5193 QualType OriginalType = readType(*Loc.F, Record, Idx);
5194 QualType DT = Context.getAdjustedParameterType(OriginalType);
5195 if (!isa<DecayedType>(DT))
5196 Error("Decayed type does not decay");
5200 case TYPE_ADJUSTED: {
5201 if (Record.size() != 2) {
5202 Error("Incorrect encoding of adjusted type");
5205 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5206 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5207 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5210 case TYPE_BLOCK_POINTER: {
5211 if (Record.size() != 1) {
5212 Error("Incorrect encoding of block pointer type");
5215 QualType PointeeType = readType(*Loc.F, Record, Idx);
5216 return Context.getBlockPointerType(PointeeType);
5219 case TYPE_LVALUE_REFERENCE: {
5220 if (Record.size() != 2) {
5221 Error("Incorrect encoding of lvalue reference type");
5224 QualType PointeeType = readType(*Loc.F, Record, Idx);
5225 return Context.getLValueReferenceType(PointeeType, Record[1]);
5228 case TYPE_RVALUE_REFERENCE: {
5229 if (Record.size() != 1) {
5230 Error("Incorrect encoding of rvalue reference type");
5233 QualType PointeeType = readType(*Loc.F, Record, Idx);
5234 return Context.getRValueReferenceType(PointeeType);
5237 case TYPE_MEMBER_POINTER: {
5238 if (Record.size() != 2) {
5239 Error("Incorrect encoding of member pointer type");
5242 QualType PointeeType = readType(*Loc.F, Record, Idx);
5243 QualType ClassType = readType(*Loc.F, Record, Idx);
5244 if (PointeeType.isNull() || ClassType.isNull())
5247 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5250 case TYPE_CONSTANT_ARRAY: {
5251 QualType ElementType = readType(*Loc.F, Record, Idx);
5252 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5253 unsigned IndexTypeQuals = Record[2];
5255 llvm::APInt Size = ReadAPInt(Record, Idx);
5256 return Context.getConstantArrayType(ElementType, Size,
5257 ASM, IndexTypeQuals);
5260 case TYPE_INCOMPLETE_ARRAY: {
5261 QualType ElementType = readType(*Loc.F, Record, Idx);
5262 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5263 unsigned IndexTypeQuals = Record[2];
5264 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5267 case TYPE_VARIABLE_ARRAY: {
5268 QualType ElementType = readType(*Loc.F, Record, Idx);
5269 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5270 unsigned IndexTypeQuals = Record[2];
5271 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5272 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5273 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5274 ASM, IndexTypeQuals,
5275 SourceRange(LBLoc, RBLoc));
5279 if (Record.size() != 3) {
5280 Error("incorrect encoding of vector type in AST file");
5284 QualType ElementType = readType(*Loc.F, Record, Idx);
5285 unsigned NumElements = Record[1];
5286 unsigned VecKind = Record[2];
5287 return Context.getVectorType(ElementType, NumElements,
5288 (VectorType::VectorKind)VecKind);
5291 case TYPE_EXT_VECTOR: {
5292 if (Record.size() != 3) {
5293 Error("incorrect encoding of extended vector type in AST file");
5297 QualType ElementType = readType(*Loc.F, Record, Idx);
5298 unsigned NumElements = Record[1];
5299 return Context.getExtVectorType(ElementType, NumElements);
5302 case TYPE_FUNCTION_NO_PROTO: {
5303 if (Record.size() != 6) {
5304 Error("incorrect encoding of no-proto function type");
5307 QualType ResultType = readType(*Loc.F, Record, Idx);
5308 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5309 (CallingConv)Record[4], Record[5]);
5310 return Context.getFunctionNoProtoType(ResultType, Info);
5313 case TYPE_FUNCTION_PROTO: {
5314 QualType ResultType = readType(*Loc.F, Record, Idx);
5316 FunctionProtoType::ExtProtoInfo EPI;
5317 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5318 /*hasregparm*/ Record[2],
5319 /*regparm*/ Record[3],
5320 static_cast<CallingConv>(Record[4]),
5321 /*produces*/ Record[5]);
5325 EPI.Variadic = Record[Idx++];
5326 EPI.HasTrailingReturn = Record[Idx++];
5327 EPI.TypeQuals = Record[Idx++];
5328 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
5329 SmallVector<QualType, 8> ExceptionStorage;
5330 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
5332 unsigned NumParams = Record[Idx++];
5333 SmallVector<QualType, 16> ParamTypes;
5334 for (unsigned I = 0; I != NumParams; ++I)
5335 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5337 return Context.getFunctionType(ResultType, ParamTypes, EPI);
5340 case TYPE_UNRESOLVED_USING: {
5342 return Context.getTypeDeclType(
5343 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5346 case TYPE_TYPEDEF: {
5347 if (Record.size() != 2) {
5348 Error("incorrect encoding of typedef type");
5352 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5353 QualType Canonical = readType(*Loc.F, Record, Idx);
5354 if (!Canonical.isNull())
5355 Canonical = Context.getCanonicalType(Canonical);
5356 return Context.getTypedefType(Decl, Canonical);
5359 case TYPE_TYPEOF_EXPR:
5360 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5363 if (Record.size() != 1) {
5364 Error("incorrect encoding of typeof(type) in AST file");
5367 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5368 return Context.getTypeOfType(UnderlyingType);
5371 case TYPE_DECLTYPE: {
5372 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5373 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5376 case TYPE_UNARY_TRANSFORM: {
5377 QualType BaseType = readType(*Loc.F, Record, Idx);
5378 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5379 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5380 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5384 QualType Deduced = readType(*Loc.F, Record, Idx);
5385 bool IsDecltypeAuto = Record[Idx++];
5386 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
5387 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
5391 if (Record.size() != 2) {
5392 Error("incorrect encoding of record type");
5396 bool IsDependent = Record[Idx++];
5397 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5398 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5399 QualType T = Context.getRecordType(RD);
5400 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5405 if (Record.size() != 2) {
5406 Error("incorrect encoding of enum type");
5410 bool IsDependent = Record[Idx++];
5412 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5413 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5417 case TYPE_ATTRIBUTED: {
5418 if (Record.size() != 3) {
5419 Error("incorrect encoding of attributed type");
5422 QualType modifiedType = readType(*Loc.F, Record, Idx);
5423 QualType equivalentType = readType(*Loc.F, Record, Idx);
5424 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5425 return Context.getAttributedType(kind, modifiedType, equivalentType);
5429 if (Record.size() != 1) {
5430 Error("incorrect encoding of paren type");
5433 QualType InnerType = readType(*Loc.F, Record, Idx);
5434 return Context.getParenType(InnerType);
5437 case TYPE_PACK_EXPANSION: {
5438 if (Record.size() != 2) {
5439 Error("incorrect encoding of pack expansion type");
5442 QualType Pattern = readType(*Loc.F, Record, Idx);
5443 if (Pattern.isNull())
5445 Optional<unsigned> NumExpansions;
5447 NumExpansions = Record[1] - 1;
5448 return Context.getPackExpansionType(Pattern, NumExpansions);
5451 case TYPE_ELABORATED: {
5453 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5454 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5455 QualType NamedType = readType(*Loc.F, Record, Idx);
5456 return Context.getElaboratedType(Keyword, NNS, NamedType);
5459 case TYPE_OBJC_INTERFACE: {
5461 ObjCInterfaceDecl *ItfD
5462 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5463 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5466 case TYPE_OBJC_OBJECT: {
5468 QualType Base = readType(*Loc.F, Record, Idx);
5469 unsigned NumProtos = Record[Idx++];
5470 SmallVector<ObjCProtocolDecl*, 4> Protos;
5471 for (unsigned I = 0; I != NumProtos; ++I)
5472 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5473 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5476 case TYPE_OBJC_OBJECT_POINTER: {
5478 QualType Pointee = readType(*Loc.F, Record, Idx);
5479 return Context.getObjCObjectPointerType(Pointee);
5482 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5484 QualType Parm = readType(*Loc.F, Record, Idx);
5485 QualType Replacement = readType(*Loc.F, Record, Idx);
5486 return Context.getSubstTemplateTypeParmType(
5487 cast<TemplateTypeParmType>(Parm),
5488 Context.getCanonicalType(Replacement));
5491 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5493 QualType Parm = readType(*Loc.F, Record, Idx);
5494 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5495 return Context.getSubstTemplateTypeParmPackType(
5496 cast<TemplateTypeParmType>(Parm),
5500 case TYPE_INJECTED_CLASS_NAME: {
5501 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5502 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5503 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5504 // for AST reading, too much interdependencies.
5506 if (const Type *Existing = D->getTypeForDecl())
5508 else if (auto *Prev = D->getPreviousDecl())
5509 T = Prev->getTypeForDecl();
5511 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5512 return QualType(T, 0);
5515 case TYPE_TEMPLATE_TYPE_PARM: {
5517 unsigned Depth = Record[Idx++];
5518 unsigned Index = Record[Idx++];
5519 bool Pack = Record[Idx++];
5520 TemplateTypeParmDecl *D
5521 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5522 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5525 case TYPE_DEPENDENT_NAME: {
5527 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5528 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5529 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5530 QualType Canon = readType(*Loc.F, Record, Idx);
5531 if (!Canon.isNull())
5532 Canon = Context.getCanonicalType(Canon);
5533 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5536 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5538 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5539 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5540 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5541 unsigned NumArgs = Record[Idx++];
5542 SmallVector<TemplateArgument, 8> Args;
5543 Args.reserve(NumArgs);
5545 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5546 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5547 Args.size(), Args.data());
5550 case TYPE_DEPENDENT_SIZED_ARRAY: {
5554 QualType ElementType = readType(*Loc.F, Record, Idx);
5555 ArrayType::ArraySizeModifier ASM
5556 = (ArrayType::ArraySizeModifier)Record[Idx++];
5557 unsigned IndexTypeQuals = Record[Idx++];
5559 // DependentSizedArrayType
5560 Expr *NumElts = ReadExpr(*Loc.F);
5561 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5563 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5564 IndexTypeQuals, Brackets);
5567 case TYPE_TEMPLATE_SPECIALIZATION: {
5569 bool IsDependent = Record[Idx++];
5570 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5571 SmallVector<TemplateArgument, 8> Args;
5572 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5573 QualType Underlying = readType(*Loc.F, Record, Idx);
5575 if (Underlying.isNull())
5576 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5579 T = Context.getTemplateSpecializationType(Name, Args.data(),
5580 Args.size(), Underlying);
5581 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5586 if (Record.size() != 1) {
5587 Error("Incorrect encoding of atomic type");
5590 QualType ValueType = readType(*Loc.F, Record, Idx);
5591 return Context.getAtomicType(ValueType);
5594 llvm_unreachable("Invalid TypeCode!");
5597 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5598 SmallVectorImpl<QualType> &Exceptions,
5599 FunctionProtoType::ExceptionSpecInfo &ESI,
5600 const RecordData &Record, unsigned &Idx) {
5601 ExceptionSpecificationType EST =
5602 static_cast<ExceptionSpecificationType>(Record[Idx++]);
5604 if (EST == EST_Dynamic) {
5605 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
5606 Exceptions.push_back(readType(ModuleFile, Record, Idx));
5607 ESI.Exceptions = Exceptions;
5608 } else if (EST == EST_ComputedNoexcept) {
5609 ESI.NoexceptExpr = ReadExpr(ModuleFile);
5610 } else if (EST == EST_Uninstantiated) {
5611 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5612 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5613 } else if (EST == EST_Unevaluated) {
5614 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5618 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5621 const ASTReader::RecordData &Record;
5624 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5626 return Reader.ReadSourceLocation(F, R, I);
5629 template<typename T>
5630 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5631 return Reader.ReadDeclAs<T>(F, Record, Idx);
5635 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5636 const ASTReader::RecordData &Record, unsigned &Idx)
5637 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5640 // We want compile-time assurance that we've enumerated all of
5641 // these, so unfortunately we have to declare them first, then
5642 // define them out-of-line.
5643 #define ABSTRACT_TYPELOC(CLASS, PARENT)
5644 #define TYPELOC(CLASS, PARENT) \
5645 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5646 #include "clang/AST/TypeLocNodes.def"
5648 void VisitFunctionTypeLoc(FunctionTypeLoc);
5649 void VisitArrayTypeLoc(ArrayTypeLoc);
5652 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5655 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5656 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5657 if (TL.needsExtraLocalData()) {
5658 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5659 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5660 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5661 TL.setModeAttr(Record[Idx++]);
5664 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5665 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5667 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5668 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5670 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5673 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5676 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5677 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5679 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5680 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5682 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5683 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5685 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5686 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5687 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5689 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5690 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5691 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5693 TL.setSizeExpr(Reader.ReadExpr(F));
5695 TL.setSizeExpr(nullptr);
5697 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5698 VisitArrayTypeLoc(TL);
5700 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5701 VisitArrayTypeLoc(TL);
5703 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5704 VisitArrayTypeLoc(TL);
5706 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5707 DependentSizedArrayTypeLoc TL) {
5708 VisitArrayTypeLoc(TL);
5710 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5711 DependentSizedExtVectorTypeLoc TL) {
5712 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5714 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5715 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5717 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5718 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5720 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5721 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5722 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5723 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5724 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
5725 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5726 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
5729 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5730 VisitFunctionTypeLoc(TL);
5732 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5733 VisitFunctionTypeLoc(TL);
5735 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5736 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5738 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5739 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5741 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5742 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5743 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5744 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5746 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5747 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5748 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5749 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5750 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5752 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5753 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5755 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5756 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5757 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5758 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5759 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5761 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5762 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5764 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5765 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5767 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5768 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5770 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5771 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5772 if (TL.hasAttrOperand()) {
5774 range.setBegin(ReadSourceLocation(Record, Idx));
5775 range.setEnd(ReadSourceLocation(Record, Idx));
5776 TL.setAttrOperandParensRange(range);
5778 if (TL.hasAttrExprOperand()) {
5780 TL.setAttrExprOperand(Reader.ReadExpr(F));
5782 TL.setAttrExprOperand(nullptr);
5783 } else if (TL.hasAttrEnumOperand())
5784 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5786 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5787 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5789 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5790 SubstTemplateTypeParmTypeLoc TL) {
5791 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5793 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5794 SubstTemplateTypeParmPackTypeLoc TL) {
5795 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5797 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5798 TemplateSpecializationTypeLoc TL) {
5799 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5800 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5801 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5802 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5803 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5805 Reader.GetTemplateArgumentLocInfo(F,
5806 TL.getTypePtr()->getArg(i).getKind(),
5809 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5810 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5811 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5813 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5814 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5815 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5817 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5818 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5820 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5821 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5822 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5823 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5825 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5826 DependentTemplateSpecializationTypeLoc TL) {
5827 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5828 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5829 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5830 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5831 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5832 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5833 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5835 Reader.GetTemplateArgumentLocInfo(F,
5836 TL.getTypePtr()->getArg(I).getKind(),
5839 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5840 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5842 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5843 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5845 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5846 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5847 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5848 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5849 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5850 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5852 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5853 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5855 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5856 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5857 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5858 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5861 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5862 const RecordData &Record,
5864 QualType InfoTy = readType(F, Record, Idx);
5865 if (InfoTy.isNull())
5868 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5869 TypeLocReader TLR(*this, F, Record, Idx);
5870 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5875 QualType ASTReader::GetType(TypeID ID) {
5876 unsigned FastQuals = ID & Qualifiers::FastMask;
5877 unsigned Index = ID >> Qualifiers::FastWidth;
5879 if (Index < NUM_PREDEF_TYPE_IDS) {
5881 switch ((PredefinedTypeIDs)Index) {
5882 case PREDEF_TYPE_NULL_ID: return QualType();
5883 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5884 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5886 case PREDEF_TYPE_CHAR_U_ID:
5887 case PREDEF_TYPE_CHAR_S_ID:
5888 // FIXME: Check that the signedness of CharTy is correct!
5892 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5893 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5894 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5895 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5896 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5897 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5898 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5899 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5900 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5901 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5902 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5903 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5904 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5905 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5906 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5907 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5908 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5909 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5910 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5911 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5912 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5913 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5914 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5915 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5916 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5917 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5918 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5919 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
5920 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5921 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5922 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5923 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5924 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5925 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
5926 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
5927 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
5928 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5930 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5931 T = Context.getAutoRRefDeductType();
5934 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5935 T = Context.ARCUnbridgedCastTy;
5938 case PREDEF_TYPE_VA_LIST_TAG:
5939 T = Context.getVaListTagType();
5942 case PREDEF_TYPE_BUILTIN_FN:
5943 T = Context.BuiltinFnTy;
5947 assert(!T.isNull() && "Unknown predefined type");
5948 return T.withFastQualifiers(FastQuals);
5951 Index -= NUM_PREDEF_TYPE_IDS;
5952 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5953 if (TypesLoaded[Index].isNull()) {
5954 TypesLoaded[Index] = readTypeRecord(Index);
5955 if (TypesLoaded[Index].isNull())
5958 TypesLoaded[Index]->setFromAST();
5959 if (DeserializationListener)
5960 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5961 TypesLoaded[Index]);
5964 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5967 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5968 return GetType(getGlobalTypeID(F, LocalID));
5971 serialization::TypeID
5972 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5973 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5974 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5976 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5979 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5980 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5981 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5983 unsigned GlobalIndex = LocalIndex + I->second;
5984 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5987 TemplateArgumentLocInfo
5988 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5989 TemplateArgument::ArgKind Kind,
5990 const RecordData &Record,
5993 case TemplateArgument::Expression:
5995 case TemplateArgument::Type:
5996 return GetTypeSourceInfo(F, Record, Index);
5997 case TemplateArgument::Template: {
5998 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6000 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6001 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6004 case TemplateArgument::TemplateExpansion: {
6005 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6007 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6008 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6009 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6012 case TemplateArgument::Null:
6013 case TemplateArgument::Integral:
6014 case TemplateArgument::Declaration:
6015 case TemplateArgument::NullPtr:
6016 case TemplateArgument::Pack:
6017 // FIXME: Is this right?
6018 return TemplateArgumentLocInfo();
6020 llvm_unreachable("unexpected template argument loc");
6024 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6025 const RecordData &Record, unsigned &Index) {
6026 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6028 if (Arg.getKind() == TemplateArgument::Expression) {
6029 if (Record[Index++]) // bool InfoHasSameExpr.
6030 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6032 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6036 const ASTTemplateArgumentListInfo*
6037 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6038 const RecordData &Record,
6040 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6041 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6042 unsigned NumArgsAsWritten = Record[Index++];
6043 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6044 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6045 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6046 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6049 Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6053 void ASTReader::CompleteRedeclChain(const Decl *D) {
6054 if (NumCurrentElementsDeserializing) {
6055 // We arrange to not care about the complete redeclaration chain while we're
6056 // deserializing. Just remember that the AST has marked this one as complete
6057 // but that it's not actually complete yet, so we know we still need to
6058 // complete it later.
6059 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6063 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6065 // If this is a named declaration, complete it by looking it up
6066 // within its context.
6068 // FIXME: Merging a function definition should merge
6069 // all mergeable entities within it.
6070 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6071 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6072 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6073 auto *II = Name.getAsIdentifierInfo();
6074 if (isa<TranslationUnitDecl>(DC) && II) {
6075 // Outside of C++, we don't have a lookup table for the TU, so update
6076 // the identifier instead. In C++, either way should work fine.
6077 if (II->isOutOfDate())
6078 updateOutOfDateIdentifier(*II);
6081 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6082 // FIXME: It'd be nice to do something a bit more targeted here.
6083 D->getDeclContext()->decls_begin();
6088 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6089 const RecordData &Record,
6091 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6092 Error("malformed AST file: missing C++ base specifier");
6096 unsigned LocalID = Record[Idx++];
6097 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6100 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6101 RecordLocation Loc = getLocalBitOffset(Offset);
6102 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6103 SavedStreamPosition SavedPosition(Cursor);
6104 Cursor.JumpToBit(Loc.Offset);
6105 ReadingKindTracker ReadingKind(Read_Decl, *this);
6107 unsigned Code = Cursor.ReadCode();
6108 unsigned RecCode = Cursor.readRecord(Code, Record);
6109 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
6110 Error("malformed AST file: missing C++ base specifiers");
6115 unsigned NumBases = Record[Idx++];
6116 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6117 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6118 for (unsigned I = 0; I != NumBases; ++I)
6119 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6123 serialization::DeclID
6124 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6125 if (LocalID < NUM_PREDEF_DECL_IDS)
6128 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6129 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6130 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6132 return LocalID + I->second;
6135 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6136 ModuleFile &M) const {
6137 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6138 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6139 return &M == I->second;
6142 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
6143 if (!D->isFromASTFile())
6145 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6146 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6150 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6151 if (ID < NUM_PREDEF_DECL_IDS)
6152 return SourceLocation();
6154 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6156 if (Index > DeclsLoaded.size()) {
6157 Error("declaration ID out-of-range for AST file");
6158 return SourceLocation();
6161 if (Decl *D = DeclsLoaded[Index])
6162 return D->getLocation();
6164 unsigned RawLocation = 0;
6165 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6166 return ReadSourceLocation(*Rec.F, RawLocation);
6169 Decl *ASTReader::GetExistingDecl(DeclID ID) {
6170 if (ID < NUM_PREDEF_DECL_IDS) {
6171 switch ((PredefinedDeclIDs)ID) {
6172 case PREDEF_DECL_NULL_ID:
6175 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6176 return Context.getTranslationUnitDecl();
6178 case PREDEF_DECL_OBJC_ID_ID:
6179 return Context.getObjCIdDecl();
6181 case PREDEF_DECL_OBJC_SEL_ID:
6182 return Context.getObjCSelDecl();
6184 case PREDEF_DECL_OBJC_CLASS_ID:
6185 return Context.getObjCClassDecl();
6187 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6188 return Context.getObjCProtocolDecl();
6190 case PREDEF_DECL_INT_128_ID:
6191 return Context.getInt128Decl();
6193 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6194 return Context.getUInt128Decl();
6196 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6197 return Context.getObjCInstanceTypeDecl();
6199 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6200 return Context.getBuiltinVaListDecl();
6204 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6206 if (Index >= DeclsLoaded.size()) {
6207 assert(0 && "declaration ID out-of-range for AST file");
6208 Error("declaration ID out-of-range for AST file");
6212 return DeclsLoaded[Index];
6215 Decl *ASTReader::GetDecl(DeclID ID) {
6216 if (ID < NUM_PREDEF_DECL_IDS)
6217 return GetExistingDecl(ID);
6219 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6221 if (Index >= DeclsLoaded.size()) {
6222 assert(0 && "declaration ID out-of-range for AST file");
6223 Error("declaration ID out-of-range for AST file");
6227 if (!DeclsLoaded[Index]) {
6229 if (DeserializationListener)
6230 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6233 return DeclsLoaded[Index];
6236 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6238 if (GlobalID < NUM_PREDEF_DECL_IDS)
6241 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6242 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6243 ModuleFile *Owner = I->second;
6245 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6246 = M.GlobalToLocalDeclIDs.find(Owner);
6247 if (Pos == M.GlobalToLocalDeclIDs.end())
6250 return GlobalID - Owner->BaseDeclID + Pos->second;
6253 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6254 const RecordData &Record,
6256 if (Idx >= Record.size()) {
6257 Error("Corrupted AST file");
6261 return getGlobalDeclID(F, Record[Idx++]);
6264 /// \brief Resolve the offset of a statement into a statement.
6266 /// This operation will read a new statement from the external
6267 /// source each time it is called, and is meant to be used via a
6268 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6269 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6270 // Switch case IDs are per Decl.
6271 ClearSwitchCaseIDs();
6273 // Offset here is a global offset across the entire chain.
6274 RecordLocation Loc = getLocalBitOffset(Offset);
6275 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6276 return ReadStmtFromStream(*Loc.F);
6280 class FindExternalLexicalDeclsVisitor {
6282 const DeclContext *DC;
6283 bool (*isKindWeWant)(Decl::Kind);
6285 SmallVectorImpl<Decl*> &Decls;
6286 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6289 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6290 bool (*isKindWeWant)(Decl::Kind),
6291 SmallVectorImpl<Decl*> &Decls)
6292 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6294 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6295 PredefsVisited[I] = false;
6298 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6302 FindExternalLexicalDeclsVisitor *This
6303 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6305 ModuleFile::DeclContextInfosMap::iterator Info
6306 = M.DeclContextInfos.find(This->DC);
6307 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6310 // Load all of the declaration IDs
6311 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6312 *IDE = ID + Info->second.NumLexicalDecls;
6314 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6317 // Don't add predefined declarations to the lexical context more
6319 if (ID->second < NUM_PREDEF_DECL_IDS) {
6320 if (This->PredefsVisited[ID->second])
6323 This->PredefsVisited[ID->second] = true;
6326 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6327 if (!This->DC->isDeclInLexicalTraversal(D))
6328 This->Decls.push_back(D);
6337 ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6338 bool (*isKindWeWant)(Decl::Kind),
6339 SmallVectorImpl<Decl*> &Decls) {
6340 // There might be lexical decls in multiple modules, for the TU at
6341 // least. Walk all of the modules in the order they were loaded.
6342 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6343 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6344 ++NumLexicalDeclContextsRead;
6355 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6357 bool operator()(LocalDeclID L, LocalDeclID R) const {
6358 SourceLocation LHS = getLocation(L);
6359 SourceLocation RHS = getLocation(R);
6360 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6363 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6364 SourceLocation RHS = getLocation(R);
6365 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6368 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6369 SourceLocation LHS = getLocation(L);
6370 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6373 SourceLocation getLocation(LocalDeclID ID) const {
6374 return Reader.getSourceManager().getFileLoc(
6375 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6381 void ASTReader::FindFileRegionDecls(FileID File,
6382 unsigned Offset, unsigned Length,
6383 SmallVectorImpl<Decl *> &Decls) {
6384 SourceManager &SM = getSourceManager();
6386 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6387 if (I == FileDeclIDs.end())
6390 FileDeclsInfo &DInfo = I->second;
6391 if (DInfo.Decls.empty())
6395 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6396 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6398 DeclIDComp DIDComp(*this, *DInfo.Mod);
6399 ArrayRef<serialization::LocalDeclID>::iterator
6400 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6402 if (BeginIt != DInfo.Decls.begin())
6405 // If we are pointing at a top-level decl inside an objc container, we need
6406 // to backtrack until we find it otherwise we will fail to report that the
6407 // region overlaps with an objc container.
6408 while (BeginIt != DInfo.Decls.begin() &&
6409 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6410 ->isTopLevelDeclInObjCContainer())
6413 ArrayRef<serialization::LocalDeclID>::iterator
6414 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6416 if (EndIt != DInfo.Decls.end())
6419 for (ArrayRef<serialization::LocalDeclID>::iterator
6420 DIt = BeginIt; DIt != EndIt; ++DIt)
6421 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6425 /// \brief ModuleFile visitor used to perform name lookup into a
6426 /// declaration context.
6427 class DeclContextNameLookupVisitor {
6429 ArrayRef<const DeclContext *> Contexts;
6430 DeclarationName Name;
6431 SmallVectorImpl<NamedDecl *> &Decls;
6434 DeclContextNameLookupVisitor(ASTReader &Reader,
6435 ArrayRef<const DeclContext *> Contexts,
6436 DeclarationName Name,
6437 SmallVectorImpl<NamedDecl *> &Decls)
6438 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6440 static bool visit(ModuleFile &M, void *UserData) {
6441 DeclContextNameLookupVisitor *This
6442 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6444 // Check whether we have any visible declaration information for
6445 // this context in this module.
6446 ModuleFile::DeclContextInfosMap::iterator Info;
6447 bool FoundInfo = false;
6448 for (auto *DC : This->Contexts) {
6449 Info = M.DeclContextInfos.find(DC);
6450 if (Info != M.DeclContextInfos.end() &&
6451 Info->second.NameLookupTableData) {
6460 // Look for this name within this module.
6461 ASTDeclContextNameLookupTable *LookupTable =
6462 Info->second.NameLookupTableData;
6463 ASTDeclContextNameLookupTable::iterator Pos
6464 = LookupTable->find(This->Name);
6465 if (Pos == LookupTable->end())
6468 bool FoundAnything = false;
6469 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6470 for (; Data.first != Data.second; ++Data.first) {
6471 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6475 if (ND->getDeclName() != This->Name) {
6476 // A name might be null because the decl's redeclarable part is
6477 // currently read before reading its name. The lookup is triggered by
6478 // building that decl (likely indirectly), and so it is later in the
6479 // sense of "already existing" and can be ignored here.
6480 // FIXME: This should not happen; deserializing declarations should
6481 // not perform lookups since that can lead to deserialization cycles.
6485 // Record this declaration.
6486 FoundAnything = true;
6487 This->Decls.push_back(ND);
6490 return FoundAnything;
6495 /// \brief Retrieve the "definitive" module file for the definition of the
6496 /// given declaration context, if there is one.
6498 /// The "definitive" module file is the only place where we need to look to
6499 /// find information about the declarations within the given declaration
6500 /// context. For example, C++ and Objective-C classes, C structs/unions, and
6501 /// Objective-C protocols, categories, and extensions are all defined in a
6502 /// single place in the source code, so they have definitive module files
6503 /// associated with them. C++ namespaces, on the other hand, can have
6504 /// definitions in multiple different module files.
6506 /// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6507 /// NDEBUG checking.
6508 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6509 ASTReader &Reader) {
6510 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6511 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
6517 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6518 DeclarationName Name) {
6519 assert(DC->hasExternalVisibleStorage() &&
6520 "DeclContext has no visible decls in storage");
6524 Deserializing LookupResults(this);
6526 SmallVector<NamedDecl *, 64> Decls;
6528 // Compute the declaration contexts we need to look into. Multiple such
6529 // declaration contexts occur when two declaration contexts from disjoint
6530 // modules get merged, e.g., when two namespaces with the same name are
6531 // independently defined in separate modules.
6532 SmallVector<const DeclContext *, 2> Contexts;
6533 Contexts.push_back(DC);
6535 if (DC->isNamespace()) {
6536 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6537 if (Merged != MergedDecls.end()) {
6538 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6539 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6543 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) {
6544 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
6546 // If we can definitively determine which module file to look into,
6547 // only look there. Otherwise, look in all module files.
6548 ModuleFile *Definitive;
6549 if (Contexts.size() == 1 &&
6550 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) {
6551 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6553 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6557 LookUpInContexts(Contexts);
6559 // If this might be an implicit special member function, then also search
6560 // all merged definitions of the surrounding class. We need to search them
6561 // individually, because finding an entity in one of them doesn't imply that
6562 // we can't find a different entity in another one.
6563 if (isa<CXXRecordDecl>(DC)) {
6564 auto Kind = Name.getNameKind();
6565 if (Kind == DeclarationName::CXXConstructorName ||
6566 Kind == DeclarationName::CXXDestructorName ||
6567 (Kind == DeclarationName::CXXOperatorName &&
6568 Name.getCXXOverloadedOperator() == OO_Equal)) {
6569 auto Merged = MergedLookups.find(DC);
6570 if (Merged != MergedLookups.end())
6571 for (auto *MergedDC : Merged->second)
6572 LookUpInContexts(MergedDC);
6576 ++NumVisibleDeclContextsRead;
6577 SetExternalVisibleDeclsForName(DC, Name, Decls);
6578 return !Decls.empty();
6582 /// \brief ModuleFile visitor used to retrieve all visible names in a
6583 /// declaration context.
6584 class DeclContextAllNamesVisitor {
6586 SmallVectorImpl<const DeclContext *> &Contexts;
6591 DeclContextAllNamesVisitor(ASTReader &Reader,
6592 SmallVectorImpl<const DeclContext *> &Contexts,
6593 DeclsMap &Decls, bool VisitAll)
6594 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
6596 static bool visit(ModuleFile &M, void *UserData) {
6597 DeclContextAllNamesVisitor *This
6598 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6600 // Check whether we have any visible declaration information for
6601 // this context in this module.
6602 ModuleFile::DeclContextInfosMap::iterator Info;
6603 bool FoundInfo = false;
6604 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6605 Info = M.DeclContextInfos.find(This->Contexts[I]);
6606 if (Info != M.DeclContextInfos.end() &&
6607 Info->second.NameLookupTableData) {
6616 ASTDeclContextNameLookupTable *LookupTable =
6617 Info->second.NameLookupTableData;
6618 bool FoundAnything = false;
6619 for (ASTDeclContextNameLookupTable::data_iterator
6620 I = LookupTable->data_begin(), E = LookupTable->data_end();
6623 ASTDeclContextNameLookupTrait::data_type Data = *I;
6624 for (; Data.first != Data.second; ++Data.first) {
6625 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6630 // Record this declaration.
6631 FoundAnything = true;
6632 This->Decls[ND->getDeclName()].push_back(ND);
6636 return FoundAnything && !This->VisitAll;
6641 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6642 if (!DC->hasExternalVisibleStorage())
6646 // Compute the declaration contexts we need to look into. Multiple such
6647 // declaration contexts occur when two declaration contexts from disjoint
6648 // modules get merged, e.g., when two namespaces with the same name are
6649 // independently defined in separate modules.
6650 SmallVector<const DeclContext *, 2> Contexts;
6651 Contexts.push_back(DC);
6653 if (DC->isNamespace()) {
6654 MergedDeclsMap::iterator Merged
6655 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6656 if (Merged != MergedDecls.end()) {
6657 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6658 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6662 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6663 /*VisitAll=*/DC->isFileContext());
6664 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6665 ++NumVisibleDeclContextsRead;
6667 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
6668 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6670 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6673 /// \brief Under non-PCH compilation the consumer receives the objc methods
6674 /// before receiving the implementation, and codegen depends on this.
6675 /// We simulate this by deserializing and passing to consumer the methods of the
6676 /// implementation before passing the deserialized implementation decl.
6677 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6678 ASTConsumer *Consumer) {
6679 assert(ImplD && Consumer);
6681 for (auto *I : ImplD->methods())
6682 Consumer->HandleInterestingDecl(DeclGroupRef(I));
6684 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6687 void ASTReader::PassInterestingDeclsToConsumer() {
6690 if (PassingDeclsToConsumer)
6693 // Guard variable to avoid recursively redoing the process of passing
6694 // decls to consumer.
6695 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6698 while (!InterestingDecls.empty()) {
6699 Decl *D = InterestingDecls.front();
6700 InterestingDecls.pop_front();
6702 PassInterestingDeclToConsumer(D);
6706 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6707 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6708 PassObjCImplDeclToConsumer(ImplD, Consumer);
6710 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6713 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6714 this->Consumer = Consumer;
6719 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
6720 // Force deserialization of this decl, which will cause it to be queued for
6721 // passing to the consumer.
6722 GetDecl(EagerlyDeserializedDecls[I]);
6724 EagerlyDeserializedDecls.clear();
6726 PassInterestingDeclsToConsumer();
6729 void ASTReader::PrintStats() {
6730 std::fprintf(stderr, "*** AST File Statistics:\n");
6732 unsigned NumTypesLoaded
6733 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6735 unsigned NumDeclsLoaded
6736 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
6738 unsigned NumIdentifiersLoaded
6739 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6740 IdentifiersLoaded.end(),
6741 (IdentifierInfo *)nullptr);
6742 unsigned NumMacrosLoaded
6743 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6745 (MacroInfo *)nullptr);
6746 unsigned NumSelectorsLoaded
6747 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6748 SelectorsLoaded.end(),
6751 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6752 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6753 NumSLocEntriesRead, TotalNumSLocEntries,
6754 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6755 if (!TypesLoaded.empty())
6756 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6757 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6758 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6759 if (!DeclsLoaded.empty())
6760 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6761 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6762 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6763 if (!IdentifiersLoaded.empty())
6764 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6765 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6766 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6767 if (!MacrosLoaded.empty())
6768 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6769 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6770 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6771 if (!SelectorsLoaded.empty())
6772 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6773 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6774 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6775 if (TotalNumStatements)
6776 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6777 NumStatementsRead, TotalNumStatements,
6778 ((float)NumStatementsRead/TotalNumStatements * 100));
6780 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6781 NumMacrosRead, TotalNumMacros,
6782 ((float)NumMacrosRead/TotalNumMacros * 100));
6783 if (TotalLexicalDeclContexts)
6784 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6785 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6786 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6788 if (TotalVisibleDeclContexts)
6789 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6790 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6791 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6793 if (TotalNumMethodPoolEntries) {
6794 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6795 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6796 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6799 if (NumMethodPoolLookups) {
6800 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6801 NumMethodPoolHits, NumMethodPoolLookups,
6802 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6804 if (NumMethodPoolTableLookups) {
6805 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6806 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6807 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6811 if (NumIdentifierLookupHits) {
6812 std::fprintf(stderr,
6813 " %u / %u identifier table lookups succeeded (%f%%)\n",
6814 NumIdentifierLookupHits, NumIdentifierLookups,
6815 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6819 std::fprintf(stderr, "\n");
6820 GlobalIndex->printStats();
6823 std::fprintf(stderr, "\n");
6825 std::fprintf(stderr, "\n");
6828 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6830 dumpModuleIDMap(StringRef Name,
6831 const ContinuousRangeMap<Key, ModuleFile *,
6832 InitialCapacity> &Map) {
6833 if (Map.begin() == Map.end())
6836 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6837 llvm::errs() << Name << ":\n";
6838 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6840 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6845 void ASTReader::dump() {
6846 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6847 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6848 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6849 dumpModuleIDMap("Global type map", GlobalTypeMap);
6850 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6851 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6852 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6853 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6854 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6855 dumpModuleIDMap("Global preprocessed entity map",
6856 GlobalPreprocessedEntityMap);
6858 llvm::errs() << "\n*** PCH/Modules Loaded:";
6859 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6860 MEnd = ModuleMgr.end();
6865 /// Return the amount of memory used by memory buffers, breaking down
6866 /// by heap-backed versus mmap'ed memory.
6867 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6868 for (ModuleConstIterator I = ModuleMgr.begin(),
6869 E = ModuleMgr.end(); I != E; ++I) {
6870 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6871 size_t bytes = buf->getBufferSize();
6872 switch (buf->getBufferKind()) {
6873 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6874 sizes.malloc_bytes += bytes;
6876 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6877 sizes.mmap_bytes += bytes;
6884 void ASTReader::InitializeSema(Sema &S) {
6886 S.addExternalSource(this);
6888 // Makes sure any declarations that were deserialized "too early"
6889 // still get added to the identifier's declaration chains.
6890 for (uint64_t ID : PreloadedDeclIDs) {
6891 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
6892 pushExternalDeclIntoScope(D, D->getDeclName());
6894 PreloadedDeclIDs.clear();
6896 // FIXME: What happens if these are changed by a module import?
6897 if (!FPPragmaOptions.empty()) {
6898 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6899 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6902 // FIXME: What happens if these are changed by a module import?
6903 if (!OpenCLExtensions.empty()) {
6905 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6906 #include "clang/Basic/OpenCLExtensions.def"
6908 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6914 void ASTReader::UpdateSema() {
6915 assert(SemaObj && "no Sema to update");
6917 // Load the offsets of the declarations that Sema references.
6918 // They will be lazily deserialized when needed.
6919 if (!SemaDeclRefs.empty()) {
6920 assert(SemaDeclRefs.size() % 2 == 0);
6921 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6922 if (!SemaObj->StdNamespace)
6923 SemaObj->StdNamespace = SemaDeclRefs[I];
6924 if (!SemaObj->StdBadAlloc)
6925 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6927 SemaDeclRefs.clear();
6930 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6931 // encountered the pragma in the source.
6932 if(OptimizeOffPragmaLocation.isValid())
6933 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
6936 IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6937 // Note that we are loading an identifier.
6938 Deserializing AnIdentifier(this);
6939 StringRef Name(NameStart, NameEnd - NameStart);
6941 // If there is a global index, look there first to determine which modules
6942 // provably do not have any results for this identifier.
6943 GlobalModuleIndex::HitSet Hits;
6944 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
6945 if (!loadGlobalIndex()) {
6946 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6950 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
6951 NumIdentifierLookups,
6952 NumIdentifierLookupHits);
6953 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
6954 IdentifierInfo *II = Visitor.getIdentifierInfo();
6955 markIdentifierUpToDate(II);
6960 /// \brief An identifier-lookup iterator that enumerates all of the
6961 /// identifiers stored within a set of AST files.
6962 class ASTIdentifierIterator : public IdentifierIterator {
6963 /// \brief The AST reader whose identifiers are being enumerated.
6964 const ASTReader &Reader;
6966 /// \brief The current index into the chain of AST files stored in
6970 /// \brief The current position within the identifier lookup table
6971 /// of the current AST file.
6972 ASTIdentifierLookupTable::key_iterator Current;
6974 /// \brief The end position within the identifier lookup table of
6975 /// the current AST file.
6976 ASTIdentifierLookupTable::key_iterator End;
6979 explicit ASTIdentifierIterator(const ASTReader &Reader);
6981 StringRef Next() override;
6985 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6986 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6987 ASTIdentifierLookupTable *IdTable
6988 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6989 Current = IdTable->key_begin();
6990 End = IdTable->key_end();
6993 StringRef ASTIdentifierIterator::Next() {
6994 while (Current == End) {
6995 // If we have exhausted all of our AST files, we're done.
7000 ASTIdentifierLookupTable *IdTable
7001 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7002 IdentifierLookupTable;
7003 Current = IdTable->key_begin();
7004 End = IdTable->key_end();
7007 // We have any identifiers remaining in the current AST file; return
7009 StringRef Result = *Current;
7014 IdentifierIterator *ASTReader::getIdentifiers() {
7015 if (!loadGlobalIndex())
7016 return GlobalIndex->createIdentifierIterator();
7018 return new ASTIdentifierIterator(*this);
7021 namespace clang { namespace serialization {
7022 class ReadMethodPoolVisitor {
7025 unsigned PriorGeneration;
7026 unsigned InstanceBits;
7027 unsigned FactoryBits;
7028 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7029 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
7032 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7033 unsigned PriorGeneration)
7034 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7035 InstanceBits(0), FactoryBits(0) { }
7037 static bool visit(ModuleFile &M, void *UserData) {
7038 ReadMethodPoolVisitor *This
7039 = static_cast<ReadMethodPoolVisitor *>(UserData);
7041 if (!M.SelectorLookupTable)
7044 // If we've already searched this module file, skip it now.
7045 if (M.Generation <= This->PriorGeneration)
7048 ++This->Reader.NumMethodPoolTableLookups;
7049 ASTSelectorLookupTable *PoolTable
7050 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7051 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
7052 if (Pos == PoolTable->end())
7055 ++This->Reader.NumMethodPoolTableHits;
7056 ++This->Reader.NumSelectorsRead;
7057 // FIXME: Not quite happy with the statistics here. We probably should
7058 // disable this tracking when called via LoadSelector.
7059 // Also, should entries without methods count as misses?
7060 ++This->Reader.NumMethodPoolEntriesRead;
7061 ASTSelectorLookupTrait::data_type Data = *Pos;
7062 if (This->Reader.DeserializationListener)
7063 This->Reader.DeserializationListener->SelectorRead(Data.ID,
7066 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7067 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
7068 This->InstanceBits = Data.InstanceBits;
7069 This->FactoryBits = Data.FactoryBits;
7073 /// \brief Retrieve the instance methods found by this visitor.
7074 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7075 return InstanceMethods;
7078 /// \brief Retrieve the instance methods found by this visitor.
7079 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7080 return FactoryMethods;
7083 unsigned getInstanceBits() const { return InstanceBits; }
7084 unsigned getFactoryBits() const { return FactoryBits; }
7086 } } // end namespace clang::serialization
7088 /// \brief Add the given set of methods to the method list.
7089 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7090 ObjCMethodList &List) {
7091 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7092 S.addMethodToGlobalList(&List, Methods[I]);
7096 void ASTReader::ReadMethodPool(Selector Sel) {
7097 // Get the selector generation and update it to the current generation.
7098 unsigned &Generation = SelectorGeneration[Sel];
7099 unsigned PriorGeneration = Generation;
7100 Generation = getGeneration();
7102 // Search for methods defined with this selector.
7103 ++NumMethodPoolLookups;
7104 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7105 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7107 if (Visitor.getInstanceMethods().empty() &&
7108 Visitor.getFactoryMethods().empty())
7111 ++NumMethodPoolHits;
7116 Sema &S = *getSema();
7117 Sema::GlobalMethodPool::iterator Pos
7118 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7120 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7121 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
7122 Pos->second.first.setBits(Visitor.getInstanceBits());
7123 Pos->second.second.setBits(Visitor.getFactoryBits());
7126 void ASTReader::ReadKnownNamespaces(
7127 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7130 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7131 if (NamespaceDecl *Namespace
7132 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7133 Namespaces.push_back(Namespace);
7137 void ASTReader::ReadUndefinedButUsed(
7138 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
7139 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7140 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
7141 SourceLocation Loc =
7142 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
7143 Undefined.insert(std::make_pair(D, Loc));
7147 void ASTReader::ReadTentativeDefinitions(
7148 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7149 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7150 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7152 TentativeDefs.push_back(Var);
7154 TentativeDefinitions.clear();
7157 void ASTReader::ReadUnusedFileScopedDecls(
7158 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7159 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7161 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7165 UnusedFileScopedDecls.clear();
7168 void ASTReader::ReadDelegatingConstructors(
7169 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7170 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7171 CXXConstructorDecl *D
7172 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7176 DelegatingCtorDecls.clear();
7179 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7180 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7182 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7186 ExtVectorDecls.clear();
7189 void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7190 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7192 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7196 DynamicClasses.clear();
7199 void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7200 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7201 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7203 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7204 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7208 UnusedLocalTypedefNameCandidates.clear();
7212 ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7213 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7215 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
7219 LocallyScopedExternCDecls.clear();
7222 void ASTReader::ReadReferencedSelectors(
7223 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7224 if (ReferencedSelectorsData.empty())
7227 // If there are @selector references added them to its pool. This is for
7228 // implementation of -Wselector.
7229 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7231 while (I < DataSize) {
7232 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7233 SourceLocation SelLoc
7234 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7235 Sels.push_back(std::make_pair(Sel, SelLoc));
7237 ReferencedSelectorsData.clear();
7240 void ASTReader::ReadWeakUndeclaredIdentifiers(
7241 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7242 if (WeakUndeclaredIdentifiers.empty())
7245 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7246 IdentifierInfo *WeakId
7247 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7248 IdentifierInfo *AliasId
7249 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7251 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7252 bool Used = WeakUndeclaredIdentifiers[I++];
7253 WeakInfo WI(AliasId, Loc);
7255 WeakIDs.push_back(std::make_pair(WeakId, WI));
7257 WeakUndeclaredIdentifiers.clear();
7260 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7261 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7262 ExternalVTableUse VT;
7263 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7264 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7265 VT.DefinitionRequired = VTableUses[Idx++];
7266 VTables.push_back(VT);
7272 void ASTReader::ReadPendingInstantiations(
7273 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7274 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7275 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7277 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7279 Pending.push_back(std::make_pair(D, Loc));
7281 PendingInstantiations.clear();
7284 void ASTReader::ReadLateParsedTemplates(
7285 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7286 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7288 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7290 LateParsedTemplate *LT = new LateParsedTemplate;
7291 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7293 ModuleFile *F = getOwningModuleFile(LT->D);
7294 assert(F && "No module");
7296 unsigned TokN = LateParsedTemplates[Idx++];
7297 LT->Toks.reserve(TokN);
7298 for (unsigned T = 0; T < TokN; ++T)
7299 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7304 LateParsedTemplates.clear();
7307 void ASTReader::LoadSelector(Selector Sel) {
7308 // It would be complicated to avoid reading the methods anyway. So don't.
7309 ReadMethodPool(Sel);
7312 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7313 assert(ID && "Non-zero identifier ID required");
7314 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7315 IdentifiersLoaded[ID - 1] = II;
7316 if (DeserializationListener)
7317 DeserializationListener->IdentifierRead(ID, II);
7320 /// \brief Set the globally-visible declarations associated with the given
7323 /// If the AST reader is currently in a state where the given declaration IDs
7324 /// cannot safely be resolved, they are queued until it is safe to resolve
7327 /// \param II an IdentifierInfo that refers to one or more globally-visible
7330 /// \param DeclIDs the set of declaration IDs with the name @p II that are
7331 /// visible at global scope.
7333 /// \param Decls if non-null, this vector will be populated with the set of
7334 /// deserialized declarations. These declarations will not be pushed into
7337 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7338 const SmallVectorImpl<uint32_t> &DeclIDs,
7339 SmallVectorImpl<Decl *> *Decls) {
7340 if (NumCurrentElementsDeserializing && !Decls) {
7341 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
7345 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7347 // Queue this declaration so that it will be added to the
7348 // translation unit scope and identifier's declaration chain
7349 // once a Sema object is known.
7350 PreloadedDeclIDs.push_back(DeclIDs[I]);
7354 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7356 // If we're simply supposed to record the declarations, do so now.
7358 Decls->push_back(D);
7362 // Introduce this declaration into the translation-unit scope
7363 // and add it to the declaration chain for this identifier, so
7364 // that (unqualified) name lookup will find it.
7365 pushExternalDeclIntoScope(D, II);
7369 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
7373 if (IdentifiersLoaded.empty()) {
7374 Error("no identifier table in AST file");
7379 if (!IdentifiersLoaded[ID]) {
7380 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7381 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7382 ModuleFile *M = I->second;
7383 unsigned Index = ID - M->BaseIdentifierID;
7384 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7386 // All of the strings in the AST file are preceded by a 16-bit length.
7387 // Extract that 16-bit length to avoid having to execute strlen().
7388 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7389 // unsigned integers. This is important to avoid integer overflow when
7390 // we cast them to 'unsigned'.
7391 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7392 unsigned StrLen = (((unsigned) StrLenPtr[0])
7393 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
7394 IdentifiersLoaded[ID]
7395 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
7396 if (DeserializationListener)
7397 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7400 return IdentifiersLoaded[ID];
7403 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7404 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
7407 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7408 if (LocalID < NUM_PREDEF_IDENT_IDS)
7411 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7412 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7413 assert(I != M.IdentifierRemap.end()
7414 && "Invalid index into identifier index remap");
7416 return LocalID + I->second;
7419 MacroInfo *ASTReader::getMacro(MacroID ID) {
7423 if (MacrosLoaded.empty()) {
7424 Error("no macro table in AST file");
7428 ID -= NUM_PREDEF_MACRO_IDS;
7429 if (!MacrosLoaded[ID]) {
7430 GlobalMacroMapType::iterator I
7431 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7432 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7433 ModuleFile *M = I->second;
7434 unsigned Index = ID - M->BaseMacroID;
7435 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7437 if (DeserializationListener)
7438 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7442 return MacrosLoaded[ID];
7445 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7446 if (LocalID < NUM_PREDEF_MACRO_IDS)
7449 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7450 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7451 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7453 return LocalID + I->second;
7456 serialization::SubmoduleID
7457 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7458 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7461 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7462 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7463 assert(I != M.SubmoduleRemap.end()
7464 && "Invalid index into submodule index remap");
7466 return LocalID + I->second;
7469 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7470 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7471 assert(GlobalID == 0 && "Unhandled global submodule ID");
7475 if (GlobalID > SubmodulesLoaded.size()) {
7476 Error("submodule ID out of range in AST file");
7480 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7483 Module *ASTReader::getModule(unsigned ID) {
7484 return getSubmodule(ID);
7487 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7488 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7491 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7495 if (ID > SelectorsLoaded.size()) {
7496 Error("selector ID out of range in AST file");
7500 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
7501 // Load this selector from the selector table.
7502 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7503 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7504 ModuleFile &M = *I->second;
7505 ASTSelectorLookupTrait Trait(*this, M);
7506 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7507 SelectorsLoaded[ID - 1] =
7508 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7509 if (DeserializationListener)
7510 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7513 return SelectorsLoaded[ID - 1];
7516 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7517 return DecodeSelector(ID);
7520 uint32_t ASTReader::GetNumExternalSelectors() {
7521 // ID 0 (the null selector) is considered an external selector.
7522 return getTotalNumSelectors() + 1;
7525 serialization::SelectorID
7526 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7527 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7530 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7531 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7532 assert(I != M.SelectorRemap.end()
7533 && "Invalid index into selector index remap");
7535 return LocalID + I->second;
7539 ASTReader::ReadDeclarationName(ModuleFile &F,
7540 const RecordData &Record, unsigned &Idx) {
7541 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7543 case DeclarationName::Identifier:
7544 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
7546 case DeclarationName::ObjCZeroArgSelector:
7547 case DeclarationName::ObjCOneArgSelector:
7548 case DeclarationName::ObjCMultiArgSelector:
7549 return DeclarationName(ReadSelector(F, Record, Idx));
7551 case DeclarationName::CXXConstructorName:
7552 return Context.DeclarationNames.getCXXConstructorName(
7553 Context.getCanonicalType(readType(F, Record, Idx)));
7555 case DeclarationName::CXXDestructorName:
7556 return Context.DeclarationNames.getCXXDestructorName(
7557 Context.getCanonicalType(readType(F, Record, Idx)));
7559 case DeclarationName::CXXConversionFunctionName:
7560 return Context.DeclarationNames.getCXXConversionFunctionName(
7561 Context.getCanonicalType(readType(F, Record, Idx)));
7563 case DeclarationName::CXXOperatorName:
7564 return Context.DeclarationNames.getCXXOperatorName(
7565 (OverloadedOperatorKind)Record[Idx++]);
7567 case DeclarationName::CXXLiteralOperatorName:
7568 return Context.DeclarationNames.getCXXLiteralOperatorName(
7569 GetIdentifierInfo(F, Record, Idx));
7571 case DeclarationName::CXXUsingDirective:
7572 return DeclarationName::getUsingDirectiveName();
7575 llvm_unreachable("Invalid NameKind!");
7578 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7579 DeclarationNameLoc &DNLoc,
7580 DeclarationName Name,
7581 const RecordData &Record, unsigned &Idx) {
7582 switch (Name.getNameKind()) {
7583 case DeclarationName::CXXConstructorName:
7584 case DeclarationName::CXXDestructorName:
7585 case DeclarationName::CXXConversionFunctionName:
7586 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7589 case DeclarationName::CXXOperatorName:
7590 DNLoc.CXXOperatorName.BeginOpNameLoc
7591 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7592 DNLoc.CXXOperatorName.EndOpNameLoc
7593 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7596 case DeclarationName::CXXLiteralOperatorName:
7597 DNLoc.CXXLiteralOperatorName.OpNameLoc
7598 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7601 case DeclarationName::Identifier:
7602 case DeclarationName::ObjCZeroArgSelector:
7603 case DeclarationName::ObjCOneArgSelector:
7604 case DeclarationName::ObjCMultiArgSelector:
7605 case DeclarationName::CXXUsingDirective:
7610 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7611 DeclarationNameInfo &NameInfo,
7612 const RecordData &Record, unsigned &Idx) {
7613 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7614 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7615 DeclarationNameLoc DNLoc;
7616 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7617 NameInfo.setInfo(DNLoc);
7620 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7621 const RecordData &Record, unsigned &Idx) {
7622 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7623 unsigned NumTPLists = Record[Idx++];
7624 Info.NumTemplParamLists = NumTPLists;
7626 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7627 for (unsigned i=0; i != NumTPLists; ++i)
7628 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7633 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7635 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7637 case TemplateName::Template:
7638 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7640 case TemplateName::OverloadedTemplate: {
7641 unsigned size = Record[Idx++];
7642 UnresolvedSet<8> Decls;
7644 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7646 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7649 case TemplateName::QualifiedTemplate: {
7650 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7651 bool hasTemplKeyword = Record[Idx++];
7652 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7653 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7656 case TemplateName::DependentTemplate: {
7657 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7658 if (Record[Idx++]) // isIdentifier
7659 return Context.getDependentTemplateName(NNS,
7660 GetIdentifierInfo(F, Record,
7662 return Context.getDependentTemplateName(NNS,
7663 (OverloadedOperatorKind)Record[Idx++]);
7666 case TemplateName::SubstTemplateTemplateParm: {
7667 TemplateTemplateParmDecl *param
7668 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7669 if (!param) return TemplateName();
7670 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7671 return Context.getSubstTemplateTemplateParm(param, replacement);
7674 case TemplateName::SubstTemplateTemplateParmPack: {
7675 TemplateTemplateParmDecl *Param
7676 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7678 return TemplateName();
7680 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7681 if (ArgPack.getKind() != TemplateArgument::Pack)
7682 return TemplateName();
7684 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7688 llvm_unreachable("Unhandled template name kind!");
7692 ASTReader::ReadTemplateArgument(ModuleFile &F,
7693 const RecordData &Record, unsigned &Idx) {
7694 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7696 case TemplateArgument::Null:
7697 return TemplateArgument();
7698 case TemplateArgument::Type:
7699 return TemplateArgument(readType(F, Record, Idx));
7700 case TemplateArgument::Declaration: {
7701 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7702 return TemplateArgument(D, readType(F, Record, Idx));
7704 case TemplateArgument::NullPtr:
7705 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7706 case TemplateArgument::Integral: {
7707 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7708 QualType T = readType(F, Record, Idx);
7709 return TemplateArgument(Context, Value, T);
7711 case TemplateArgument::Template:
7712 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7713 case TemplateArgument::TemplateExpansion: {
7714 TemplateName Name = ReadTemplateName(F, Record, Idx);
7715 Optional<unsigned> NumTemplateExpansions;
7716 if (unsigned NumExpansions = Record[Idx++])
7717 NumTemplateExpansions = NumExpansions - 1;
7718 return TemplateArgument(Name, NumTemplateExpansions);
7720 case TemplateArgument::Expression:
7721 return TemplateArgument(ReadExpr(F));
7722 case TemplateArgument::Pack: {
7723 unsigned NumArgs = Record[Idx++];
7724 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7725 for (unsigned I = 0; I != NumArgs; ++I)
7726 Args[I] = ReadTemplateArgument(F, Record, Idx);
7727 return TemplateArgument(Args, NumArgs);
7731 llvm_unreachable("Unhandled template argument kind!");
7734 TemplateParameterList *
7735 ASTReader::ReadTemplateParameterList(ModuleFile &F,
7736 const RecordData &Record, unsigned &Idx) {
7737 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7738 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7739 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7741 unsigned NumParams = Record[Idx++];
7742 SmallVector<NamedDecl *, 16> Params;
7743 Params.reserve(NumParams);
7745 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7747 TemplateParameterList* TemplateParams =
7748 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7749 Params.data(), Params.size(), RAngleLoc);
7750 return TemplateParams;
7755 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
7756 ModuleFile &F, const RecordData &Record,
7758 unsigned NumTemplateArgs = Record[Idx++];
7759 TemplArgs.reserve(NumTemplateArgs);
7760 while (NumTemplateArgs--)
7761 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7764 /// \brief Read a UnresolvedSet structure.
7765 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
7766 const RecordData &Record, unsigned &Idx) {
7767 unsigned NumDecls = Record[Idx++];
7768 Set.reserve(Context, NumDecls);
7769 while (NumDecls--) {
7770 DeclID ID = ReadDeclID(F, Record, Idx);
7771 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
7772 Set.addLazyDecl(Context, ID, AS);
7777 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7778 const RecordData &Record, unsigned &Idx) {
7779 bool isVirtual = static_cast<bool>(Record[Idx++]);
7780 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7781 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7782 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7783 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7784 SourceRange Range = ReadSourceRange(F, Record, Idx);
7785 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7786 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7788 Result.setInheritConstructors(inheritConstructors);
7792 std::pair<CXXCtorInitializer **, unsigned>
7793 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7795 CXXCtorInitializer **CtorInitializers = nullptr;
7796 unsigned NumInitializers = Record[Idx++];
7797 if (NumInitializers) {
7799 = new (Context) CXXCtorInitializer*[NumInitializers];
7800 for (unsigned i=0; i != NumInitializers; ++i) {
7801 TypeSourceInfo *TInfo = nullptr;
7802 bool IsBaseVirtual = false;
7803 FieldDecl *Member = nullptr;
7804 IndirectFieldDecl *IndirectMember = nullptr;
7806 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7808 case CTOR_INITIALIZER_BASE:
7809 TInfo = GetTypeSourceInfo(F, Record, Idx);
7810 IsBaseVirtual = Record[Idx++];
7813 case CTOR_INITIALIZER_DELEGATING:
7814 TInfo = GetTypeSourceInfo(F, Record, Idx);
7817 case CTOR_INITIALIZER_MEMBER:
7818 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7821 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7822 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7826 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7827 Expr *Init = ReadExpr(F);
7828 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7829 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7830 bool IsWritten = Record[Idx++];
7831 unsigned SourceOrderOrNumArrayIndices;
7832 SmallVector<VarDecl *, 8> Indices;
7834 SourceOrderOrNumArrayIndices = Record[Idx++];
7836 SourceOrderOrNumArrayIndices = Record[Idx++];
7837 Indices.reserve(SourceOrderOrNumArrayIndices);
7838 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7839 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7842 CXXCtorInitializer *BOMInit;
7843 if (Type == CTOR_INITIALIZER_BASE) {
7844 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7845 LParenLoc, Init, RParenLoc,
7846 MemberOrEllipsisLoc);
7847 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7848 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7850 } else if (IsWritten) {
7852 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7853 LParenLoc, Init, RParenLoc);
7855 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7856 MemberOrEllipsisLoc, LParenLoc,
7859 if (IndirectMember) {
7860 assert(Indices.empty() && "Indirect field improperly initialized");
7861 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7862 MemberOrEllipsisLoc, LParenLoc,
7865 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7866 LParenLoc, Init, RParenLoc,
7867 Indices.data(), Indices.size());
7872 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7873 CtorInitializers[i] = BOMInit;
7877 return std::make_pair(CtorInitializers, NumInitializers);
7880 NestedNameSpecifier *
7881 ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7882 const RecordData &Record, unsigned &Idx) {
7883 unsigned N = Record[Idx++];
7884 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
7885 for (unsigned I = 0; I != N; ++I) {
7886 NestedNameSpecifier::SpecifierKind Kind
7887 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7889 case NestedNameSpecifier::Identifier: {
7890 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7891 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7895 case NestedNameSpecifier::Namespace: {
7896 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7897 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7901 case NestedNameSpecifier::NamespaceAlias: {
7902 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7903 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7907 case NestedNameSpecifier::TypeSpec:
7908 case NestedNameSpecifier::TypeSpecWithTemplate: {
7909 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7913 bool Template = Record[Idx++];
7914 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7918 case NestedNameSpecifier::Global: {
7919 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7920 // No associated value, and there can't be a prefix.
7924 case NestedNameSpecifier::Super: {
7925 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
7926 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
7935 NestedNameSpecifierLoc
7936 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7938 unsigned N = Record[Idx++];
7939 NestedNameSpecifierLocBuilder Builder;
7940 for (unsigned I = 0; I != N; ++I) {
7941 NestedNameSpecifier::SpecifierKind Kind
7942 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7944 case NestedNameSpecifier::Identifier: {
7945 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7946 SourceRange Range = ReadSourceRange(F, Record, Idx);
7947 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7951 case NestedNameSpecifier::Namespace: {
7952 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7953 SourceRange Range = ReadSourceRange(F, Record, Idx);
7954 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7958 case NestedNameSpecifier::NamespaceAlias: {
7959 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7960 SourceRange Range = ReadSourceRange(F, Record, Idx);
7961 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7965 case NestedNameSpecifier::TypeSpec:
7966 case NestedNameSpecifier::TypeSpecWithTemplate: {
7967 bool Template = Record[Idx++];
7968 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7970 return NestedNameSpecifierLoc();
7971 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7973 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7974 Builder.Extend(Context,
7975 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7976 T->getTypeLoc(), ColonColonLoc);
7980 case NestedNameSpecifier::Global: {
7981 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7982 Builder.MakeGlobal(Context, ColonColonLoc);
7986 case NestedNameSpecifier::Super: {
7987 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
7988 SourceRange Range = ReadSourceRange(F, Record, Idx);
7989 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
7995 return Builder.getWithLocInContext(Context);
7999 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8001 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8002 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8003 return SourceRange(beg, end);
8006 /// \brief Read an integral value
8007 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8008 unsigned BitWidth = Record[Idx++];
8009 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8010 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8015 /// \brief Read a signed integral value
8016 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8017 bool isUnsigned = Record[Idx++];
8018 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8021 /// \brief Read a floating-point value
8022 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8023 const llvm::fltSemantics &Sem,
8025 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
8028 // \brief Read a string
8029 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8030 unsigned Len = Record[Idx++];
8031 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8036 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8038 unsigned Major = Record[Idx++];
8039 unsigned Minor = Record[Idx++];
8040 unsigned Subminor = Record[Idx++];
8042 return VersionTuple(Major);
8044 return VersionTuple(Major, Minor - 1);
8045 return VersionTuple(Major, Minor - 1, Subminor - 1);
8048 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8049 const RecordData &Record,
8051 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8052 return CXXTemporary::Create(Context, Decl);
8055 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
8056 return Diag(CurrentImportLoc, DiagID);
8059 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8060 return Diags.Report(Loc, DiagID);
8063 /// \brief Retrieve the identifier table associated with the
8065 IdentifierTable &ASTReader::getIdentifierTable() {
8066 return PP.getIdentifierTable();
8069 /// \brief Record that the given ID maps to the given switch-case
8071 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
8072 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
8073 "Already have a SwitchCase with this ID");
8074 (*CurrSwitchCaseStmts)[ID] = SC;
8077 /// \brief Retrieve the switch-case statement with the given ID.
8078 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
8079 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
8080 return (*CurrSwitchCaseStmts)[ID];
8083 void ASTReader::ClearSwitchCaseIDs() {
8084 CurrSwitchCaseStmts->clear();
8087 void ASTReader::ReadComments() {
8088 std::vector<RawComment *> Comments;
8089 for (SmallVectorImpl<std::pair<BitstreamCursor,
8090 serialization::ModuleFile *> >::iterator
8091 I = CommentsCursors.begin(),
8092 E = CommentsCursors.end();
8095 BitstreamCursor &Cursor = I->first;
8096 serialization::ModuleFile &F = *I->second;
8097 SavedStreamPosition SavedPosition(Cursor);
8101 llvm::BitstreamEntry Entry =
8102 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
8104 switch (Entry.Kind) {
8105 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8106 case llvm::BitstreamEntry::Error:
8107 Error("malformed block record in AST file");
8109 case llvm::BitstreamEntry::EndBlock:
8111 case llvm::BitstreamEntry::Record:
8112 // The interesting case.
8118 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
8119 case COMMENTS_RAW_COMMENT: {
8121 SourceRange SR = ReadSourceRange(F, Record, Idx);
8122 RawComment::CommentKind Kind =
8123 (RawComment::CommentKind) Record[Idx++];
8124 bool IsTrailingComment = Record[Idx++];
8125 bool IsAlmostTrailingComment = Record[Idx++];
8126 Comments.push_back(new (Context) RawComment(
8127 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8128 Context.getLangOpts().CommentOpts.ParseAllComments));
8134 Context.Comments.addDeserializedComments(Comments);
8138 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8139 // If we know the owning module, use it.
8140 if (Module *M = D->getOwningModule())
8141 return M->getFullModuleName();
8143 // Otherwise, use the name of the top-level module the decl is within.
8144 if (ModuleFile *M = getOwningModuleFile(D))
8145 return M->ModuleName;
8147 // Not from a module.
8151 void ASTReader::finishPendingActions() {
8152 while (!PendingIdentifierInfos.empty() ||
8153 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
8154 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
8155 !PendingUpdateRecords.empty()) {
8156 // If any identifiers with corresponding top-level declarations have
8157 // been loaded, load those declarations now.
8158 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8160 TopLevelDeclsMap TopLevelDecls;
8162 while (!PendingIdentifierInfos.empty()) {
8163 IdentifierInfo *II = PendingIdentifierInfos.back().first;
8164 SmallVector<uint32_t, 4> DeclIDs =
8165 std::move(PendingIdentifierInfos.back().second);
8166 PendingIdentifierInfos.pop_back();
8168 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
8171 // For each decl chain that we wanted to complete while deserializing, mark
8172 // it as "still needs to be completed".
8173 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8174 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8176 PendingIncompleteDeclChains.clear();
8178 // Load pending declaration chains.
8179 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8180 loadPendingDeclChain(PendingDeclChains[I]);
8181 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8183 PendingDeclChains.clear();
8185 // Make the most recent of the top-level declarations visible.
8186 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8187 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
8188 IdentifierInfo *II = TLD->first;
8189 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
8190 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
8194 // Load any pending macro definitions.
8195 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
8196 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8197 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8198 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8199 // Initialize the macro history from chained-PCHs ahead of module imports.
8200 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8202 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8203 if (Info.M->Kind != MK_Module)
8204 resolvePendingMacro(II, Info);
8206 // Handle module imports.
8207 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8209 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8210 if (Info.M->Kind == MK_Module)
8211 resolvePendingMacro(II, Info);
8214 PendingMacroIDs.clear();
8216 // Wire up the DeclContexts for Decls that we delayed setting until
8217 // recursive loading is completed.
8218 while (!PendingDeclContextInfos.empty()) {
8219 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8220 PendingDeclContextInfos.pop_front();
8221 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8222 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8223 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8226 // Perform any pending declaration updates.
8227 while (!PendingUpdateRecords.empty()) {
8228 auto Update = PendingUpdateRecords.pop_back_val();
8229 ReadingKindTracker ReadingKind(Read_Decl, *this);
8230 loadDeclUpdateRecords(Update.first, Update.second);
8234 // If we deserialized any C++ or Objective-C class definitions, any
8235 // Objective-C protocol definitions, or any redeclarable templates, make sure
8236 // that all redeclarations point to the definitions. Note that this can only
8237 // happen now, after the redeclaration chains have been fully wired.
8238 for (Decl *D : PendingDefinitions) {
8239 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
8240 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
8241 // Make sure that the TagType points at the definition.
8242 const_cast<TagType*>(TagT)->decl = TD;
8245 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
8246 for (auto R : RD->redecls()) {
8247 assert((R == D) == R->isThisDeclarationADefinition() &&
8248 "declaration thinks it's the definition but it isn't");
8249 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
8256 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
8257 // Make sure that the ObjCInterfaceType points at the definition.
8258 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8261 for (auto R : ID->redecls())
8267 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
8268 for (auto R : PD->redecls())
8274 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
8275 for (auto R : RTD->redecls())
8276 R->Common = RTD->Common;
8278 PendingDefinitions.clear();
8280 // Load the bodies of any functions or methods we've encountered. We do
8281 // this now (delayed) so that we can be sure that the declaration chains
8282 // have been fully wired up.
8283 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8284 PBEnd = PendingBodies.end();
8285 PB != PBEnd; ++PB) {
8286 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8287 // FIXME: Check for =delete/=default?
8288 // FIXME: Complain about ODR violations here?
8289 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8290 FD->setLazyBody(PB->second);
8294 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8295 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8296 MD->setLazyBody(PB->second);
8298 PendingBodies.clear();
8301 void ASTReader::diagnoseOdrViolations() {
8302 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8305 // Trigger the import of the full definition of each class that had any
8306 // odr-merging problems, so we can produce better diagnostics for them.
8307 // These updates may in turn find and diagnose some ODR failures, so take
8308 // ownership of the set first.
8309 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8310 PendingOdrMergeFailures.clear();
8311 for (auto &Merge : OdrMergeFailures) {
8312 Merge.first->buildLookup();
8313 Merge.first->decls_begin();
8314 Merge.first->bases_begin();
8315 Merge.first->vbases_begin();
8316 for (auto *RD : Merge.second) {
8323 // For each declaration from a merged context, check that the canonical
8324 // definition of that context also contains a declaration of the same
8327 // Caution: this loop does things that might invalidate iterators into
8328 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8329 while (!PendingOdrMergeChecks.empty()) {
8330 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8332 // FIXME: Skip over implicit declarations for now. This matters for things
8333 // like implicitly-declared special member functions. This isn't entirely
8334 // correct; we can end up with multiple unmerged declarations of the same
8336 if (D->isImplicit())
8339 DeclContext *CanonDef = D->getDeclContext();
8342 const Decl *DCanon = D->getCanonicalDecl();
8344 for (auto RI : D->redecls()) {
8345 if (RI->getLexicalDeclContext() == CanonDef) {
8353 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8354 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
8355 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8356 !Found && I != E; ++I) {
8357 for (auto RI : (*I)->redecls()) {
8358 if (RI->getLexicalDeclContext() == CanonDef) {
8359 // This declaration is present in the canonical definition. If it's
8360 // in the same redecl chain, it's the one we're looking for.
8361 if (RI->getCanonicalDecl() == DCanon)
8364 Candidates.push_back(cast<NamedDecl>(RI));
8371 // The AST doesn't like TagDecls becoming invalid after they've been
8372 // completed. We only really need to mark FieldDecls as invalid here.
8373 if (!isa<TagDecl>(D))
8374 D->setInvalidDecl();
8376 std::string CanonDefModule =
8377 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8378 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8379 << D << getOwningModuleNameForDiagnostic(D)
8380 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8382 if (Candidates.empty())
8383 Diag(cast<Decl>(CanonDef)->getLocation(),
8384 diag::note_module_odr_violation_no_possible_decls) << D;
8386 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8387 Diag(Candidates[I]->getLocation(),
8388 diag::note_module_odr_violation_possible_decl)
8392 DiagnosedOdrMergeFailures.insert(CanonDef);
8396 // Issue any pending ODR-failure diagnostics.
8397 for (auto &Merge : OdrMergeFailures) {
8398 // If we've already pointed out a specific problem with this class, don't
8399 // bother issuing a general "something's different" diagnostic.
8400 if (!DiagnosedOdrMergeFailures.insert(Merge.first))
8403 bool Diagnosed = false;
8404 for (auto *RD : Merge.second) {
8405 // Multiple different declarations got merged together; tell the user
8406 // where they came from.
8407 if (Merge.first != RD) {
8408 // FIXME: Walk the definition, figure out what's different,
8409 // and diagnose that.
8411 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8412 Diag(Merge.first->getLocation(),
8413 diag::err_module_odr_violation_different_definitions)
8414 << Merge.first << Module.empty() << Module;
8418 Diag(RD->getLocation(),
8419 diag::note_module_odr_violation_different_definitions)
8420 << getOwningModuleNameForDiagnostic(RD);
8425 // All definitions are updates to the same declaration. This happens if a
8426 // module instantiates the declaration of a class template specialization
8427 // and two or more other modules instantiate its definition.
8429 // FIXME: Indicate which modules had instantiations of this definition.
8430 // FIXME: How can this even happen?
8431 Diag(Merge.first->getLocation(),
8432 diag::err_module_odr_violation_different_instantiations)
8438 void ASTReader::FinishedDeserializing() {
8439 assert(NumCurrentElementsDeserializing &&
8440 "FinishedDeserializing not paired with StartedDeserializing");
8441 if (NumCurrentElementsDeserializing == 1) {
8442 // We decrease NumCurrentElementsDeserializing only after pending actions
8443 // are finished, to avoid recursively re-calling finishPendingActions().
8444 finishPendingActions();
8446 --NumCurrentElementsDeserializing;
8448 if (NumCurrentElementsDeserializing == 0) {
8449 diagnoseOdrViolations();
8451 // We are not in recursive loading, so it's safe to pass the "interesting"
8452 // decls to the consumer.
8454 PassInterestingDeclsToConsumer();
8458 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
8459 D = D->getMostRecentDecl();
8461 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8462 SemaObj->TUScope->AddDecl(D);
8463 } else if (SemaObj->TUScope) {
8464 // Adding the decl to IdResolver may have failed because it was already in
8465 // (even though it was not added in scope). If it is already in, make sure
8466 // it gets in the scope as well.
8467 if (std::find(SemaObj->IdResolver.begin(Name),
8468 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8469 SemaObj->TUScope->AddDecl(D);
8473 ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8474 bool DisableValidation, bool AllowASTWithCompilerErrors,
8475 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
8476 bool UseGlobalIndex)
8477 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
8478 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
8479 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8480 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8481 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8482 DisableValidation(DisableValidation),
8483 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8484 AllowConfigurationMismatch(AllowConfigurationMismatch),
8485 ValidateSystemInputs(ValidateSystemInputs),
8486 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
8487 CurrSwitchCaseStmts(&SwitchCaseStmts),
8488 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8489 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8490 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8491 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8492 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8493 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8494 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8495 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8496 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8497 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8498 ReadingKind(Read_None) {
8499 SourceMgr.setExternalSLocEntrySource(this);
8502 ASTReader::~ASTReader() {
8503 if (OwnsDeserializationListener)
8504 delete DeserializationListener;
8506 for (DeclContextVisibleUpdatesPending::iterator
8507 I = PendingVisibleUpdates.begin(),
8508 E = PendingVisibleUpdates.end();
8510 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8511 F = I->second.end();