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/Frontend/PCHContainerOperations.h"
23 #include "clang/AST/ASTMutationListener.h"
24 #include "clang/AST/NestedNameSpecifier.h"
25 #include "clang/AST/Type.h"
26 #include "clang/AST/TypeLocVisitor.h"
27 #include "clang/Basic/DiagnosticOptions.h"
28 #include "clang/Basic/FileManager.h"
29 #include "clang/Basic/SourceManager.h"
30 #include "clang/Basic/SourceManagerInternals.h"
31 #include "clang/Basic/TargetInfo.h"
32 #include "clang/Basic/TargetOptions.h"
33 #include "clang/Basic/Version.h"
34 #include "clang/Basic/VersionTuple.h"
35 #include "clang/Frontend/Utils.h"
36 #include "clang/Lex/HeaderSearch.h"
37 #include "clang/Lex/HeaderSearchOptions.h"
38 #include "clang/Lex/MacroInfo.h"
39 #include "clang/Lex/PreprocessingRecord.h"
40 #include "clang/Lex/Preprocessor.h"
41 #include "clang/Lex/PreprocessorOptions.h"
42 #include "clang/Sema/Scope.h"
43 #include "clang/Sema/Sema.h"
44 #include "clang/Serialization/ASTDeserializationListener.h"
45 #include "clang/Serialization/GlobalModuleIndex.h"
46 #include "clang/Serialization/ModuleManager.h"
47 #include "clang/Serialization/SerializationDiagnostic.h"
48 #include "llvm/ADT/Hashing.h"
49 #include "llvm/ADT/StringExtras.h"
50 #include "llvm/Bitcode/BitstreamReader.h"
51 #include "llvm/Support/Compression.h"
52 #include "llvm/Support/ErrorHandling.h"
53 #include "llvm/Support/FileSystem.h"
54 #include "llvm/Support/MemoryBuffer.h"
55 #include "llvm/Support/Path.h"
56 #include "llvm/Support/SaveAndRestore.h"
57 #include "llvm/Support/raw_ostream.h"
61 #include <system_error>
63 using namespace clang;
64 using namespace clang::serialization;
65 using namespace clang::serialization::reader;
66 using llvm::BitstreamCursor;
69 //===----------------------------------------------------------------------===//
70 // ChainedASTReaderListener implementation
71 //===----------------------------------------------------------------------===//
74 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
75 return First->ReadFullVersionInformation(FullVersion) ||
76 Second->ReadFullVersionInformation(FullVersion);
78 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
79 First->ReadModuleName(ModuleName);
80 Second->ReadModuleName(ModuleName);
82 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
83 First->ReadModuleMapFile(ModuleMapPath);
84 Second->ReadModuleMapFile(ModuleMapPath);
87 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
89 bool AllowCompatibleDifferences) {
90 return First->ReadLanguageOptions(LangOpts, Complain,
91 AllowCompatibleDifferences) ||
92 Second->ReadLanguageOptions(LangOpts, Complain,
93 AllowCompatibleDifferences);
95 bool ChainedASTReaderListener::ReadTargetOptions(
96 const TargetOptions &TargetOpts, bool Complain,
97 bool AllowCompatibleDifferences) {
98 return First->ReadTargetOptions(TargetOpts, Complain,
99 AllowCompatibleDifferences) ||
100 Second->ReadTargetOptions(TargetOpts, Complain,
101 AllowCompatibleDifferences);
103 bool ChainedASTReaderListener::ReadDiagnosticOptions(
104 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
105 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
106 Second->ReadDiagnosticOptions(DiagOpts, Complain);
109 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
111 return First->ReadFileSystemOptions(FSOpts, Complain) ||
112 Second->ReadFileSystemOptions(FSOpts, Complain);
115 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
116 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
118 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
120 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
123 bool ChainedASTReaderListener::ReadPreprocessorOptions(
124 const PreprocessorOptions &PPOpts, bool Complain,
125 std::string &SuggestedPredefines) {
126 return First->ReadPreprocessorOptions(PPOpts, Complain,
127 SuggestedPredefines) ||
128 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
130 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
132 First->ReadCounter(M, Value);
133 Second->ReadCounter(M, Value);
135 bool ChainedASTReaderListener::needsInputFileVisitation() {
136 return First->needsInputFileVisitation() ||
137 Second->needsInputFileVisitation();
139 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
140 return First->needsSystemInputFileVisitation() ||
141 Second->needsSystemInputFileVisitation();
143 void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
145 First->visitModuleFile(Filename, Kind);
146 Second->visitModuleFile(Filename, Kind);
148 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
151 bool isExplicitModule) {
152 bool Continue = false;
153 if (First->needsInputFileVisitation() &&
154 (!isSystem || First->needsSystemInputFileVisitation()))
155 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
157 if (Second->needsInputFileVisitation() &&
158 (!isSystem || Second->needsSystemInputFileVisitation()))
159 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
164 void ChainedASTReaderListener::readModuleFileExtension(
165 const ModuleFileExtensionMetadata &Metadata) {
166 First->readModuleFileExtension(Metadata);
167 Second->readModuleFileExtension(Metadata);
170 //===----------------------------------------------------------------------===//
171 // PCH validator implementation
172 //===----------------------------------------------------------------------===//
174 ASTReaderListener::~ASTReaderListener() {}
176 /// \brief Compare the given set of language options against an existing set of
177 /// language options.
179 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
180 /// \param AllowCompatibleDifferences If true, differences between compatible
181 /// language options will be permitted.
183 /// \returns true if the languagae options mis-match, false otherwise.
184 static bool checkLanguageOptions(const LangOptions &LangOpts,
185 const LangOptions &ExistingLangOpts,
186 DiagnosticsEngine *Diags,
187 bool AllowCompatibleDifferences = true) {
188 #define LANGOPT(Name, Bits, Default, Description) \
189 if (ExistingLangOpts.Name != LangOpts.Name) { \
191 Diags->Report(diag::err_pch_langopt_mismatch) \
192 << Description << LangOpts.Name << ExistingLangOpts.Name; \
196 #define VALUE_LANGOPT(Name, Bits, Default, Description) \
197 if (ExistingLangOpts.Name != LangOpts.Name) { \
199 Diags->Report(diag::err_pch_langopt_value_mismatch) \
204 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
205 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
207 Diags->Report(diag::err_pch_langopt_value_mismatch) \
212 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
213 if (!AllowCompatibleDifferences) \
214 LANGOPT(Name, Bits, Default, Description)
216 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
217 if (!AllowCompatibleDifferences) \
218 ENUM_LANGOPT(Name, Bits, Default, Description)
220 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
221 if (!AllowCompatibleDifferences) \
222 VALUE_LANGOPT(Name, Bits, Default, Description)
224 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
225 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
226 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description)
227 #include "clang/Basic/LangOptions.def"
229 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
231 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
235 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
237 Diags->Report(diag::err_pch_langopt_value_mismatch)
238 << "target Objective-C runtime";
242 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
243 LangOpts.CommentOpts.BlockCommandNames) {
245 Diags->Report(diag::err_pch_langopt_value_mismatch)
246 << "block command names";
253 /// \brief Compare the given set of target options against an existing set of
256 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
258 /// \returns true if the target options mis-match, false otherwise.
259 static bool checkTargetOptions(const TargetOptions &TargetOpts,
260 const TargetOptions &ExistingTargetOpts,
261 DiagnosticsEngine *Diags,
262 bool AllowCompatibleDifferences = true) {
263 #define CHECK_TARGET_OPT(Field, Name) \
264 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
266 Diags->Report(diag::err_pch_targetopt_mismatch) \
267 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
271 // The triple and ABI must match exactly.
272 CHECK_TARGET_OPT(Triple, "target");
273 CHECK_TARGET_OPT(ABI, "target ABI");
275 // We can tolerate different CPUs in many cases, notably when one CPU
276 // supports a strict superset of another. When allowing compatible
277 // differences skip this check.
278 if (!AllowCompatibleDifferences)
279 CHECK_TARGET_OPT(CPU, "target CPU");
281 #undef CHECK_TARGET_OPT
283 // Compare feature sets.
284 SmallVector<StringRef, 4> ExistingFeatures(
285 ExistingTargetOpts.FeaturesAsWritten.begin(),
286 ExistingTargetOpts.FeaturesAsWritten.end());
287 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
288 TargetOpts.FeaturesAsWritten.end());
289 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
290 std::sort(ReadFeatures.begin(), ReadFeatures.end());
292 // We compute the set difference in both directions explicitly so that we can
293 // diagnose the differences differently.
294 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
296 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
297 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
298 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
299 ExistingFeatures.begin(), ExistingFeatures.end(),
300 std::back_inserter(UnmatchedReadFeatures));
302 // If we are allowing compatible differences and the read feature set is
303 // a strict subset of the existing feature set, there is nothing to diagnose.
304 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
308 for (StringRef Feature : UnmatchedReadFeatures)
309 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
310 << /* is-existing-feature */ false << Feature;
311 for (StringRef Feature : UnmatchedExistingFeatures)
312 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
313 << /* is-existing-feature */ true << Feature;
316 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
320 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
322 bool AllowCompatibleDifferences) {
323 const LangOptions &ExistingLangOpts = PP.getLangOpts();
324 return checkLanguageOptions(LangOpts, ExistingLangOpts,
325 Complain ? &Reader.Diags : nullptr,
326 AllowCompatibleDifferences);
329 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
331 bool AllowCompatibleDifferences) {
332 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
333 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
334 Complain ? &Reader.Diags : nullptr,
335 AllowCompatibleDifferences);
339 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
341 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
345 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
346 DiagnosticsEngine &Diags,
348 typedef DiagnosticsEngine::Level Level;
350 // Check current mappings for new -Werror mappings, and the stored mappings
351 // for cases that were explicitly mapped to *not* be errors that are now
352 // errors because of options like -Werror.
353 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
355 for (DiagnosticsEngine *MappingSource : MappingSources) {
356 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
357 diag::kind DiagID = DiagIDMappingPair.first;
358 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
359 if (CurLevel < DiagnosticsEngine::Error)
360 continue; // not significant
362 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
363 if (StoredLevel < DiagnosticsEngine::Error) {
365 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
366 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
375 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
376 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
377 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
379 return Ext >= diag::Severity::Error;
382 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
383 DiagnosticsEngine &Diags,
384 bool IsSystem, bool Complain) {
387 if (Diags.getSuppressSystemWarnings())
389 // If -Wsystem-headers was not enabled before, be conservative
390 if (StoredDiags.getSuppressSystemWarnings()) {
392 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
397 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
399 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
403 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
404 !StoredDiags.getEnableAllWarnings()) {
406 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
410 if (isExtHandlingFromDiagsError(Diags) &&
411 !isExtHandlingFromDiagsError(StoredDiags)) {
413 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
417 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
420 bool PCHValidator::ReadDiagnosticOptions(
421 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
422 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
423 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
424 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
425 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
426 // This should never fail, because we would have processed these options
427 // before writing them to an ASTFile.
428 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
430 ModuleManager &ModuleMgr = Reader.getModuleManager();
431 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
433 // If the original import came from a file explicitly generated by the user,
434 // don't check the diagnostic mappings.
435 // FIXME: currently this is approximated by checking whether this is not a
436 // module import of an implicitly-loaded module file.
437 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
438 // the transitive closure of its imports, since unrelated modules cannot be
439 // imported until after this module finishes validation.
440 ModuleFile *TopImport = *ModuleMgr.rbegin();
441 while (!TopImport->ImportedBy.empty())
442 TopImport = TopImport->ImportedBy[0];
443 if (TopImport->Kind != MK_ImplicitModule)
446 StringRef ModuleName = TopImport->ModuleName;
447 assert(!ModuleName.empty() && "diagnostic options read before module name");
449 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
450 assert(M && "missing module");
452 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
453 // contains the union of their flags.
454 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
457 /// \brief Collect the macro definitions provided by the given preprocessor
460 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
461 MacroDefinitionsMap &Macros,
462 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
463 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
464 StringRef Macro = PPOpts.Macros[I].first;
465 bool IsUndef = PPOpts.Macros[I].second;
467 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
468 StringRef MacroName = MacroPair.first;
469 StringRef MacroBody = MacroPair.second;
471 // For an #undef'd macro, we only care about the name.
473 if (MacroNames && !Macros.count(MacroName))
474 MacroNames->push_back(MacroName);
476 Macros[MacroName] = std::make_pair("", true);
480 // For a #define'd macro, figure out the actual definition.
481 if (MacroName.size() == Macro.size())
484 // Note: GCC drops anything following an end-of-line character.
485 StringRef::size_type End = MacroBody.find_first_of("\n\r");
486 MacroBody = MacroBody.substr(0, End);
489 if (MacroNames && !Macros.count(MacroName))
490 MacroNames->push_back(MacroName);
491 Macros[MacroName] = std::make_pair(MacroBody, false);
495 /// \brief Check the preprocessor options deserialized from the control block
496 /// against the preprocessor options in an existing preprocessor.
498 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
499 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
500 const PreprocessorOptions &ExistingPPOpts,
501 DiagnosticsEngine *Diags,
502 FileManager &FileMgr,
503 std::string &SuggestedPredefines,
504 const LangOptions &LangOpts) {
505 // Check macro definitions.
506 MacroDefinitionsMap ASTFileMacros;
507 collectMacroDefinitions(PPOpts, ASTFileMacros);
508 MacroDefinitionsMap ExistingMacros;
509 SmallVector<StringRef, 4> ExistingMacroNames;
510 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
512 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
513 // Dig out the macro definition in the existing preprocessor options.
514 StringRef MacroName = ExistingMacroNames[I];
515 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
517 // Check whether we know anything about this macro name or not.
518 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
519 = ASTFileMacros.find(MacroName);
520 if (Known == ASTFileMacros.end()) {
521 // FIXME: Check whether this identifier was referenced anywhere in the
522 // AST file. If so, we should reject the AST file. Unfortunately, this
523 // information isn't in the control block. What shall we do about it?
525 if (Existing.second) {
526 SuggestedPredefines += "#undef ";
527 SuggestedPredefines += MacroName.str();
528 SuggestedPredefines += '\n';
530 SuggestedPredefines += "#define ";
531 SuggestedPredefines += MacroName.str();
532 SuggestedPredefines += ' ';
533 SuggestedPredefines += Existing.first.str();
534 SuggestedPredefines += '\n';
539 // If the macro was defined in one but undef'd in the other, we have a
541 if (Existing.second != Known->second.second) {
543 Diags->Report(diag::err_pch_macro_def_undef)
544 << MacroName << Known->second.second;
549 // If the macro was #undef'd in both, or if the macro bodies are identical,
551 if (Existing.second || Existing.first == Known->second.first)
554 // The macro bodies differ; complain.
556 Diags->Report(diag::err_pch_macro_def_conflict)
557 << MacroName << Known->second.first << Existing.first;
562 // Check whether we're using predefines.
563 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
565 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
570 // Detailed record is important since it is used for the module cache hash.
571 if (LangOpts.Modules &&
572 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
574 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
579 // Compute the #include and #include_macros lines we need.
580 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
581 StringRef File = ExistingPPOpts.Includes[I];
582 if (File == ExistingPPOpts.ImplicitPCHInclude)
585 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
586 != PPOpts.Includes.end())
589 SuggestedPredefines += "#include \"";
590 SuggestedPredefines += File;
591 SuggestedPredefines += "\"\n";
594 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
595 StringRef File = ExistingPPOpts.MacroIncludes[I];
596 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
598 != PPOpts.MacroIncludes.end())
601 SuggestedPredefines += "#__include_macros \"";
602 SuggestedPredefines += File;
603 SuggestedPredefines += "\"\n##\n";
609 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
611 std::string &SuggestedPredefines) {
612 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
614 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
615 Complain? &Reader.Diags : nullptr,
621 /// Check the header search options deserialized from the control block
622 /// against the header search options in an existing preprocessor.
624 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
625 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
626 StringRef SpecificModuleCachePath,
627 StringRef ExistingModuleCachePath,
628 DiagnosticsEngine *Diags,
629 const LangOptions &LangOpts) {
630 if (LangOpts.Modules) {
631 if (SpecificModuleCachePath != ExistingModuleCachePath) {
633 Diags->Report(diag::err_pch_modulecache_mismatch)
634 << SpecificModuleCachePath << ExistingModuleCachePath;
642 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
643 StringRef SpecificModuleCachePath,
645 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
646 PP.getHeaderSearchInfo().getModuleCachePath(),
647 Complain ? &Reader.Diags : nullptr,
651 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
652 PP.setCounterValue(Value);
655 //===----------------------------------------------------------------------===//
656 // AST reader implementation
657 //===----------------------------------------------------------------------===//
659 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
660 bool TakeOwnership) {
661 DeserializationListener = Listener;
662 OwnsDeserializationListener = TakeOwnership;
667 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
668 return serialization::ComputeHash(Sel);
672 std::pair<unsigned, unsigned>
673 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
674 using namespace llvm::support;
675 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
676 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
677 return std::make_pair(KeyLen, DataLen);
680 ASTSelectorLookupTrait::internal_key_type
681 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
682 using namespace llvm::support;
683 SelectorTable &SelTable = Reader.getContext().Selectors;
684 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
685 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
686 F, endian::readNext<uint32_t, little, unaligned>(d));
688 return SelTable.getNullarySelector(FirstII);
690 return SelTable.getUnarySelector(FirstII);
692 SmallVector<IdentifierInfo *, 16> Args;
693 Args.push_back(FirstII);
694 for (unsigned I = 1; I != N; ++I)
695 Args.push_back(Reader.getLocalIdentifier(
696 F, endian::readNext<uint32_t, little, unaligned>(d)));
698 return SelTable.getSelector(N, Args.data());
701 ASTSelectorLookupTrait::data_type
702 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
704 using namespace llvm::support;
708 Result.ID = Reader.getGlobalSelectorID(
709 F, endian::readNext<uint32_t, little, unaligned>(d));
710 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
711 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
712 Result.InstanceBits = FullInstanceBits & 0x3;
713 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
714 Result.FactoryBits = FullFactoryBits & 0x3;
715 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
716 unsigned NumInstanceMethods = FullInstanceBits >> 3;
717 unsigned NumFactoryMethods = FullFactoryBits >> 3;
719 // Load instance methods
720 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
721 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
722 F, endian::readNext<uint32_t, little, unaligned>(d)))
723 Result.Instance.push_back(Method);
726 // Load factory methods
727 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
728 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
729 F, endian::readNext<uint32_t, little, unaligned>(d)))
730 Result.Factory.push_back(Method);
736 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
737 return llvm::HashString(a);
740 std::pair<unsigned, unsigned>
741 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
742 using namespace llvm::support;
743 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
744 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
745 return std::make_pair(KeyLen, DataLen);
748 ASTIdentifierLookupTraitBase::internal_key_type
749 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
750 assert(n >= 2 && d[n-1] == '\0');
751 return StringRef((const char*) d, n-1);
754 /// \brief Whether the given identifier is "interesting".
755 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
757 return II.hadMacroDefinition() ||
759 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) ||
760 II.hasRevertedTokenIDToIdentifier() ||
761 (!(IsModule && Reader.getContext().getLangOpts().CPlusPlus) &&
762 II.getFETokenInfo<void>());
765 static bool readBit(unsigned &Bits) {
766 bool Value = Bits & 0x1;
771 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
772 using namespace llvm::support;
773 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
774 return Reader.getGlobalIdentifierID(F, RawID >> 1);
777 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
778 if (!II.isFromAST()) {
780 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
781 if (isInterestingIdentifier(Reader, II, IsModule))
782 II.setChangedSinceDeserialization();
786 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
787 const unsigned char* d,
789 using namespace llvm::support;
790 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
791 bool IsInteresting = RawID & 0x01;
793 // Wipe out the "is interesting" bit.
796 // Build the IdentifierInfo and link the identifier ID with it.
797 IdentifierInfo *II = KnownII;
799 II = &Reader.getIdentifierTable().getOwn(k);
802 markIdentifierFromAST(Reader, *II);
803 Reader.markIdentifierUpToDate(II);
805 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
806 if (!IsInteresting) {
807 // For uninteresting identifiers, there's nothing else to do. Just notify
808 // the reader that we've finished loading this identifier.
809 Reader.SetIdentifierInfo(ID, II);
813 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
814 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
815 bool CPlusPlusOperatorKeyword = readBit(Bits);
816 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
817 bool HasRevertedBuiltin = readBit(Bits);
818 bool Poisoned = readBit(Bits);
819 bool ExtensionToken = readBit(Bits);
820 bool HadMacroDefinition = readBit(Bits);
822 assert(Bits == 0 && "Extra bits in the identifier?");
825 // Set or check the various bits in the IdentifierInfo structure.
826 // Token IDs are read-only.
827 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
828 II->revertTokenIDToIdentifier();
830 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
831 else if (HasRevertedBuiltin && II->getBuiltinID()) {
833 assert((II->hasRevertedBuiltin() ||
834 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) &&
835 "Incorrect ObjC keyword or builtin ID");
837 assert(II->isExtensionToken() == ExtensionToken &&
838 "Incorrect extension token flag");
839 (void)ExtensionToken;
841 II->setIsPoisoned(true);
842 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
843 "Incorrect C++ operator keyword flag");
844 (void)CPlusPlusOperatorKeyword;
846 // If this identifier is a macro, deserialize the macro
848 if (HadMacroDefinition) {
849 uint32_t MacroDirectivesOffset =
850 endian::readNext<uint32_t, little, unaligned>(d);
853 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
856 Reader.SetIdentifierInfo(ID, II);
858 // Read all of the declarations visible at global scope with this
861 SmallVector<uint32_t, 4> DeclIDs;
862 for (; DataLen > 0; DataLen -= 4)
863 DeclIDs.push_back(Reader.getGlobalDeclID(
864 F, endian::readNext<uint32_t, little, unaligned>(d)));
865 Reader.SetGloballyVisibleDecls(II, DeclIDs);
871 DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
872 : Kind(Name.getNameKind()) {
874 case DeclarationName::Identifier:
875 Data = (uint64_t)Name.getAsIdentifierInfo();
877 case DeclarationName::ObjCZeroArgSelector:
878 case DeclarationName::ObjCOneArgSelector:
879 case DeclarationName::ObjCMultiArgSelector:
880 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
882 case DeclarationName::CXXOperatorName:
883 Data = Name.getCXXOverloadedOperator();
885 case DeclarationName::CXXLiteralOperatorName:
886 Data = (uint64_t)Name.getCXXLiteralIdentifier();
888 case DeclarationName::CXXConstructorName:
889 case DeclarationName::CXXDestructorName:
890 case DeclarationName::CXXConversionFunctionName:
891 case DeclarationName::CXXUsingDirective:
897 unsigned DeclarationNameKey::getHash() const {
898 llvm::FoldingSetNodeID ID;
902 case DeclarationName::Identifier:
903 case DeclarationName::CXXLiteralOperatorName:
904 ID.AddString(((IdentifierInfo*)Data)->getName());
906 case DeclarationName::ObjCZeroArgSelector:
907 case DeclarationName::ObjCOneArgSelector:
908 case DeclarationName::ObjCMultiArgSelector:
909 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
911 case DeclarationName::CXXOperatorName:
912 ID.AddInteger((OverloadedOperatorKind)Data);
914 case DeclarationName::CXXConstructorName:
915 case DeclarationName::CXXDestructorName:
916 case DeclarationName::CXXConversionFunctionName:
917 case DeclarationName::CXXUsingDirective:
921 return ID.ComputeHash();
925 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
926 using namespace llvm::support;
927 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
928 return Reader.getLocalModuleFile(F, ModuleFileID);
931 std::pair<unsigned, unsigned>
932 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
933 using namespace llvm::support;
934 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
935 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
936 return std::make_pair(KeyLen, DataLen);
939 ASTDeclContextNameLookupTrait::internal_key_type
940 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
941 using namespace llvm::support;
943 auto Kind = (DeclarationName::NameKind)*d++;
946 case DeclarationName::Identifier:
947 Data = (uint64_t)Reader.getLocalIdentifier(
948 F, endian::readNext<uint32_t, little, unaligned>(d));
950 case DeclarationName::ObjCZeroArgSelector:
951 case DeclarationName::ObjCOneArgSelector:
952 case DeclarationName::ObjCMultiArgSelector:
954 (uint64_t)Reader.getLocalSelector(
955 F, endian::readNext<uint32_t, little, unaligned>(
956 d)).getAsOpaquePtr();
958 case DeclarationName::CXXOperatorName:
959 Data = *d++; // OverloadedOperatorKind
961 case DeclarationName::CXXLiteralOperatorName:
962 Data = (uint64_t)Reader.getLocalIdentifier(
963 F, endian::readNext<uint32_t, little, unaligned>(d));
965 case DeclarationName::CXXConstructorName:
966 case DeclarationName::CXXDestructorName:
967 case DeclarationName::CXXConversionFunctionName:
968 case DeclarationName::CXXUsingDirective:
973 return DeclarationNameKey(Kind, Data);
976 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
977 const unsigned char *d,
979 data_type_builder &Val) {
980 using namespace llvm::support;
981 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
982 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
983 Val.insert(Reader.getGlobalDeclID(F, LocalID));
987 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
988 BitstreamCursor &Cursor,
993 SavedStreamPosition SavedPosition(Cursor);
994 Cursor.JumpToBit(Offset);
998 unsigned Code = Cursor.ReadCode();
999 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1000 if (RecCode != DECL_CONTEXT_LEXICAL) {
1001 Error("Expected lexical block");
1005 assert(!isa<TranslationUnitDecl>(DC) &&
1006 "expected a TU_UPDATE_LEXICAL record for TU");
1007 // If we are handling a C++ class template instantiation, we can see multiple
1008 // lexical updates for the same record. It's important that we select only one
1009 // of them, so that field numbering works properly. Just pick the first one we
1011 auto &Lex = LexicalDecls[DC];
1013 Lex = std::make_pair(
1014 &M, llvm::makeArrayRef(
1015 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1019 DC->setHasExternalLexicalStorage(true);
1023 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1024 BitstreamCursor &Cursor,
1027 assert(Offset != 0);
1029 SavedStreamPosition SavedPosition(Cursor);
1030 Cursor.JumpToBit(Offset);
1034 unsigned Code = Cursor.ReadCode();
1035 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1036 if (RecCode != DECL_CONTEXT_VISIBLE) {
1037 Error("Expected visible lookup table block");
1041 // We can't safely determine the primary context yet, so delay attaching the
1042 // lookup table until we're done with recursive deserialization.
1043 auto *Data = (const unsigned char*)Blob.data();
1044 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1048 void ASTReader::Error(StringRef Msg) {
1049 Error(diag::err_fe_pch_malformed, Msg);
1050 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1051 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1052 Diag(diag::note_module_cache_path)
1053 << PP.getHeaderSearchInfo().getModuleCachePath();
1057 void ASTReader::Error(unsigned DiagID,
1058 StringRef Arg1, StringRef Arg2) {
1059 if (Diags.isDiagnosticInFlight())
1060 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1062 Diag(DiagID) << Arg1 << Arg2;
1065 //===----------------------------------------------------------------------===//
1066 // Source Manager Deserialization
1067 //===----------------------------------------------------------------------===//
1069 /// \brief Read the line table in the source manager block.
1070 /// \returns true if there was an error.
1071 bool ASTReader::ParseLineTable(ModuleFile &F,
1072 const RecordData &Record) {
1074 LineTableInfo &LineTable = SourceMgr.getLineTable();
1076 // Parse the file names
1077 std::map<int, int> FileIDs;
1078 for (unsigned I = 0; Record[Idx]; ++I) {
1079 // Extract the file name
1080 auto Filename = ReadPath(F, Record, Idx);
1081 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1085 // Parse the line entries
1086 std::vector<LineEntry> Entries;
1087 while (Idx < Record.size()) {
1088 int FID = Record[Idx++];
1089 assert(FID >= 0 && "Serialized line entries for non-local file.");
1090 // Remap FileID from 1-based old view.
1091 FID += F.SLocEntryBaseID - 1;
1093 // Extract the line entries
1094 unsigned NumEntries = Record[Idx++];
1095 assert(NumEntries && "no line entries for file ID");
1097 Entries.reserve(NumEntries);
1098 for (unsigned I = 0; I != NumEntries; ++I) {
1099 unsigned FileOffset = Record[Idx++];
1100 unsigned LineNo = Record[Idx++];
1101 int FilenameID = FileIDs[Record[Idx++]];
1102 SrcMgr::CharacteristicKind FileKind
1103 = (SrcMgr::CharacteristicKind)Record[Idx++];
1104 unsigned IncludeOffset = Record[Idx++];
1105 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1106 FileKind, IncludeOffset));
1108 LineTable.AddEntry(FileID::get(FID), Entries);
1114 /// \brief Read a source manager block
1115 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1116 using namespace SrcMgr;
1118 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1120 // Set the source-location entry cursor to the current position in
1121 // the stream. This cursor will be used to read the contents of the
1122 // source manager block initially, and then lazily read
1123 // source-location entries as needed.
1124 SLocEntryCursor = F.Stream;
1126 // The stream itself is going to skip over the source manager block.
1127 if (F.Stream.SkipBlock()) {
1128 Error("malformed block record in AST file");
1132 // Enter the source manager block.
1133 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1134 Error("malformed source manager block record in AST file");
1140 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1143 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1144 case llvm::BitstreamEntry::Error:
1145 Error("malformed block record in AST file");
1147 case llvm::BitstreamEntry::EndBlock:
1149 case llvm::BitstreamEntry::Record:
1150 // The interesting case.
1157 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1158 default: // Default behavior: ignore.
1161 case SM_SLOC_FILE_ENTRY:
1162 case SM_SLOC_BUFFER_ENTRY:
1163 case SM_SLOC_EXPANSION_ENTRY:
1164 // Once we hit one of the source location entries, we're done.
1170 /// \brief If a header file is not found at the path that we expect it to be
1171 /// and the PCH file was moved from its original location, try to resolve the
1172 /// file by assuming that header+PCH were moved together and the header is in
1173 /// the same place relative to the PCH.
1175 resolveFileRelativeToOriginalDir(const std::string &Filename,
1176 const std::string &OriginalDir,
1177 const std::string &CurrDir) {
1178 assert(OriginalDir != CurrDir &&
1179 "No point trying to resolve the file if the PCH dir didn't change");
1180 using namespace llvm::sys;
1181 SmallString<128> filePath(Filename);
1182 fs::make_absolute(filePath);
1183 assert(path::is_absolute(OriginalDir));
1184 SmallString<128> currPCHPath(CurrDir);
1186 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1187 fileDirE = path::end(path::parent_path(filePath));
1188 path::const_iterator origDirI = path::begin(OriginalDir),
1189 origDirE = path::end(OriginalDir);
1190 // Skip the common path components from filePath and OriginalDir.
1191 while (fileDirI != fileDirE && origDirI != origDirE &&
1192 *fileDirI == *origDirI) {
1196 for (; origDirI != origDirE; ++origDirI)
1197 path::append(currPCHPath, "..");
1198 path::append(currPCHPath, fileDirI, fileDirE);
1199 path::append(currPCHPath, path::filename(Filename));
1200 return currPCHPath.str();
1203 bool ASTReader::ReadSLocEntry(int ID) {
1207 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1208 Error("source location entry ID out-of-range for AST file");
1212 // Local helper to read the (possibly-compressed) buffer data following the
1214 auto ReadBuffer = [this](
1215 BitstreamCursor &SLocEntryCursor,
1216 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1219 unsigned Code = SLocEntryCursor.ReadCode();
1220 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1222 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1223 SmallString<0> Uncompressed;
1224 if (llvm::zlib::uncompress(Blob, Uncompressed, Record[0]) !=
1225 llvm::zlib::StatusOK) {
1226 Error("could not decompress embedded file contents");
1229 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name);
1230 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1231 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1233 Error("AST record has invalid code");
1238 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1239 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1240 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1241 unsigned BaseOffset = F->SLocEntryBaseOffset;
1243 ++NumSLocEntriesRead;
1244 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1245 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1246 Error("incorrectly-formatted source location entry in AST file");
1252 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1254 Error("incorrectly-formatted source location entry in AST file");
1257 case SM_SLOC_FILE_ENTRY: {
1258 // We will detect whether a file changed and return 'Failure' for it, but
1259 // we will also try to fail gracefully by setting up the SLocEntry.
1260 unsigned InputID = Record[4];
1261 InputFile IF = getInputFile(*F, InputID);
1262 const FileEntry *File = IF.getFile();
1263 bool OverriddenBuffer = IF.isOverridden();
1265 // Note that we only check if a File was returned. If it was out-of-date
1266 // we have complained but we will continue creating a FileID to recover
1271 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1272 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1273 // This is the module's main file.
1274 IncludeLoc = getImportLocation(F);
1276 SrcMgr::CharacteristicKind
1277 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1278 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1279 ID, BaseOffset + Record[0]);
1280 SrcMgr::FileInfo &FileInfo =
1281 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1282 FileInfo.NumCreatedFIDs = Record[5];
1284 FileInfo.setHasLineDirectives();
1286 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1287 unsigned NumFileDecls = Record[7];
1289 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1290 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1294 const SrcMgr::ContentCache *ContentCache
1295 = SourceMgr.getOrCreateContentCache(File,
1296 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1297 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1298 ContentCache->ContentsEntry == ContentCache->OrigEntry &&
1299 !ContentCache->getRawBuffer()) {
1300 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1303 SourceMgr.overrideFileContents(File, std::move(Buffer));
1309 case SM_SLOC_BUFFER_ENTRY: {
1310 const char *Name = Blob.data();
1311 unsigned Offset = Record[0];
1312 SrcMgr::CharacteristicKind
1313 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1314 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1315 if (IncludeLoc.isInvalid() &&
1316 (F->Kind == MK_ImplicitModule || F->Kind == MK_ExplicitModule)) {
1317 IncludeLoc = getImportLocation(F);
1320 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1323 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1324 BaseOffset + Offset, IncludeLoc);
1328 case SM_SLOC_EXPANSION_ENTRY: {
1329 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1330 SourceMgr.createExpansionLoc(SpellingLoc,
1331 ReadSourceLocation(*F, Record[2]),
1332 ReadSourceLocation(*F, Record[3]),
1335 BaseOffset + Record[0]);
1343 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1345 return std::make_pair(SourceLocation(), "");
1347 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1348 Error("source location entry ID out-of-range for AST file");
1349 return std::make_pair(SourceLocation(), "");
1352 // Find which module file this entry lands in.
1353 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1354 if (M->Kind != MK_ImplicitModule && M->Kind != MK_ExplicitModule)
1355 return std::make_pair(SourceLocation(), "");
1357 // FIXME: Can we map this down to a particular submodule? That would be
1359 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1362 /// \brief Find the location where the module F is imported.
1363 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1364 if (F->ImportLoc.isValid())
1365 return F->ImportLoc;
1367 // Otherwise we have a PCH. It's considered to be "imported" at the first
1368 // location of its includer.
1369 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1370 // Main file is the importer.
1371 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
1372 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1374 return F->ImportedBy[0]->FirstLoc;
1377 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1378 /// specified cursor. Read the abbreviations that are at the top of the block
1379 /// and then leave the cursor pointing into the block.
1380 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1381 if (Cursor.EnterSubBlock(BlockID))
1385 uint64_t Offset = Cursor.GetCurrentBitNo();
1386 unsigned Code = Cursor.ReadCode();
1388 // We expect all abbrevs to be at the start of the block.
1389 if (Code != llvm::bitc::DEFINE_ABBREV) {
1390 Cursor.JumpToBit(Offset);
1393 Cursor.ReadAbbrevRecord();
1397 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1401 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1402 Tok.setLength(Record[Idx++]);
1403 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1404 Tok.setIdentifierInfo(II);
1405 Tok.setKind((tok::TokenKind)Record[Idx++]);
1406 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1410 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1411 BitstreamCursor &Stream = F.MacroCursor;
1413 // Keep track of where we are in the stream, then jump back there
1414 // after reading this macro.
1415 SavedStreamPosition SavedPosition(Stream);
1417 Stream.JumpToBit(Offset);
1419 SmallVector<IdentifierInfo*, 16> MacroArgs;
1420 MacroInfo *Macro = nullptr;
1423 // Advance to the next record, but if we get to the end of the block, don't
1424 // pop it (removing all the abbreviations from the cursor) since we want to
1425 // be able to reseek within the block and read entries.
1426 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1427 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1429 switch (Entry.Kind) {
1430 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1431 case llvm::BitstreamEntry::Error:
1432 Error("malformed block record in AST file");
1434 case llvm::BitstreamEntry::EndBlock:
1436 case llvm::BitstreamEntry::Record:
1437 // The interesting case.
1443 PreprocessorRecordTypes RecType =
1444 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1446 case PP_MODULE_MACRO:
1447 case PP_MACRO_DIRECTIVE_HISTORY:
1450 case PP_MACRO_OBJECT_LIKE:
1451 case PP_MACRO_FUNCTION_LIKE: {
1452 // If we already have a macro, that means that we've hit the end
1453 // of the definition of the macro we were looking for. We're
1458 unsigned NextIndex = 1; // Skip identifier ID.
1459 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
1460 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1461 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
1462 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1463 MI->setIsUsed(Record[NextIndex++]);
1464 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1466 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1467 // Decode function-like macro info.
1468 bool isC99VarArgs = Record[NextIndex++];
1469 bool isGNUVarArgs = Record[NextIndex++];
1470 bool hasCommaPasting = Record[NextIndex++];
1472 unsigned NumArgs = Record[NextIndex++];
1473 for (unsigned i = 0; i != NumArgs; ++i)
1474 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1476 // Install function-like macro info.
1477 MI->setIsFunctionLike();
1478 if (isC99VarArgs) MI->setIsC99Varargs();
1479 if (isGNUVarArgs) MI->setIsGNUVarargs();
1480 if (hasCommaPasting) MI->setHasCommaPasting();
1481 MI->setArgumentList(MacroArgs, PP.getPreprocessorAllocator());
1484 // Remember that we saw this macro last so that we add the tokens that
1485 // form its body to it.
1488 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1489 Record[NextIndex]) {
1490 // We have a macro definition. Register the association
1491 PreprocessedEntityID
1492 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1493 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1494 PreprocessingRecord::PPEntityID PPID =
1495 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1496 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1497 PPRec.getPreprocessedEntity(PPID));
1499 PPRec.RegisterMacroDefinition(Macro, PPDef);
1507 // If we see a TOKEN before a PP_MACRO_*, then the file is
1508 // erroneous, just pretend we didn't see this.
1512 Token Tok = ReadToken(F, Record, Idx);
1513 Macro->AddTokenToBody(Tok);
1520 PreprocessedEntityID
1521 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1522 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1523 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1524 assert(I != M.PreprocessedEntityRemap.end()
1525 && "Invalid index into preprocessed entity index remap");
1527 return LocalID + I->second;
1530 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1531 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1534 HeaderFileInfoTrait::internal_key_type
1535 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1536 internal_key_type ikey = {FE->getSize(),
1537 M.HasTimestamps ? FE->getModificationTime() : 0,
1538 FE->getName(), /*Imported*/ false};
1542 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1543 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
1546 if (llvm::sys::path::is_absolute(a.Filename) &&
1547 strcmp(a.Filename, b.Filename) == 0)
1550 // Determine whether the actual files are equivalent.
1551 FileManager &FileMgr = Reader.getFileManager();
1552 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1554 return FileMgr.getFile(Key.Filename);
1556 std::string Resolved = Key.Filename;
1557 Reader.ResolveImportedPath(M, Resolved);
1558 return FileMgr.getFile(Resolved);
1561 const FileEntry *FEA = GetFile(a);
1562 const FileEntry *FEB = GetFile(b);
1563 return FEA && FEA == FEB;
1566 std::pair<unsigned, unsigned>
1567 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1568 using namespace llvm::support;
1569 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1570 unsigned DataLen = (unsigned) *d++;
1571 return std::make_pair(KeyLen, DataLen);
1574 HeaderFileInfoTrait::internal_key_type
1575 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1576 using namespace llvm::support;
1577 internal_key_type ikey;
1578 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1579 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1580 ikey.Filename = (const char *)d;
1581 ikey.Imported = true;
1585 HeaderFileInfoTrait::data_type
1586 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1588 const unsigned char *End = d + DataLen;
1589 using namespace llvm::support;
1591 unsigned Flags = *d++;
1592 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
1593 HFI.isImport |= (Flags >> 4) & 0x01;
1594 HFI.isPragmaOnce |= (Flags >> 3) & 0x01;
1595 HFI.DirInfo = (Flags >> 1) & 0x03;
1596 HFI.IndexHeaderMapHeader = Flags & 0x01;
1597 // FIXME: Find a better way to handle this. Maybe just store a
1598 // "has been included" flag?
1599 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1601 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1602 M, endian::readNext<uint32_t, little, unaligned>(d));
1603 if (unsigned FrameworkOffset =
1604 endian::readNext<uint32_t, little, unaligned>(d)) {
1605 // The framework offset is 1 greater than the actual offset,
1606 // since 0 is used as an indicator for "no framework name".
1607 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1608 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1611 assert((End - d) % 4 == 0 &&
1612 "Wrong data length in HeaderFileInfo deserialization");
1614 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1615 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1618 // This header is part of a module. Associate it with the module to enable
1619 // implicit module import.
1620 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1621 Module *Mod = Reader.getSubmodule(GlobalSMID);
1622 FileManager &FileMgr = Reader.getFileManager();
1624 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1626 std::string Filename = key.Filename;
1628 Reader.ResolveImportedPath(M, Filename);
1629 // FIXME: This is not always the right filename-as-written, but we're not
1630 // going to use this information to rebuild the module, so it doesn't make
1631 // a lot of difference.
1632 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
1633 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1634 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
1637 // This HeaderFileInfo was externally loaded.
1638 HFI.External = true;
1643 void ASTReader::addPendingMacro(IdentifierInfo *II,
1645 uint64_t MacroDirectivesOffset) {
1646 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1647 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1650 void ASTReader::ReadDefinedMacros() {
1651 // Note that we are loading defined macros.
1652 Deserializing Macros(this);
1654 for (auto &I : llvm::reverse(ModuleMgr)) {
1655 BitstreamCursor &MacroCursor = I->MacroCursor;
1657 // If there was no preprocessor block, skip this file.
1658 if (!MacroCursor.getBitStreamReader())
1661 BitstreamCursor Cursor = MacroCursor;
1662 Cursor.JumpToBit(I->MacroStartOffset);
1666 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1669 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1670 case llvm::BitstreamEntry::Error:
1671 Error("malformed block record in AST file");
1673 case llvm::BitstreamEntry::EndBlock:
1676 case llvm::BitstreamEntry::Record:
1678 switch (Cursor.readRecord(E.ID, Record)) {
1679 default: // Default behavior: ignore.
1682 case PP_MACRO_OBJECT_LIKE:
1683 case PP_MACRO_FUNCTION_LIKE:
1684 getLocalIdentifier(*I, Record[0]);
1699 /// \brief Visitor class used to look up identifirs in an AST file.
1700 class IdentifierLookupVisitor {
1703 unsigned PriorGeneration;
1704 unsigned &NumIdentifierLookups;
1705 unsigned &NumIdentifierLookupHits;
1706 IdentifierInfo *Found;
1709 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1710 unsigned &NumIdentifierLookups,
1711 unsigned &NumIdentifierLookupHits)
1712 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
1713 PriorGeneration(PriorGeneration),
1714 NumIdentifierLookups(NumIdentifierLookups),
1715 NumIdentifierLookupHits(NumIdentifierLookupHits),
1720 bool operator()(ModuleFile &M) {
1721 // If we've already searched this module file, skip it now.
1722 if (M.Generation <= PriorGeneration)
1725 ASTIdentifierLookupTable *IdTable
1726 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1730 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
1732 ++NumIdentifierLookups;
1733 ASTIdentifierLookupTable::iterator Pos =
1734 IdTable->find_hashed(Name, NameHash, &Trait);
1735 if (Pos == IdTable->end())
1738 // Dereferencing the iterator has the effect of building the
1739 // IdentifierInfo node and populating it with the various
1740 // declarations it needs.
1741 ++NumIdentifierLookupHits;
1746 // \brief Retrieve the identifier info found within the module
1748 IdentifierInfo *getIdentifierInfo() const { return Found; }
1752 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1753 // Note that we are loading an identifier.
1754 Deserializing AnIdentifier(this);
1756 unsigned PriorGeneration = 0;
1757 if (getContext().getLangOpts().Modules)
1758 PriorGeneration = IdentifierGeneration[&II];
1760 // If there is a global index, look there first to determine which modules
1761 // provably do not have any results for this identifier.
1762 GlobalModuleIndex::HitSet Hits;
1763 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1764 if (!loadGlobalIndex()) {
1765 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1770 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1771 NumIdentifierLookups,
1772 NumIdentifierLookupHits);
1773 ModuleMgr.visit(Visitor, HitsPtr);
1774 markIdentifierUpToDate(&II);
1777 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1781 II->setOutOfDate(false);
1783 // Update the generation for this identifier.
1784 if (getContext().getLangOpts().Modules)
1785 IdentifierGeneration[II] = getGeneration();
1788 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1789 const PendingMacroInfo &PMInfo) {
1790 ModuleFile &M = *PMInfo.M;
1792 BitstreamCursor &Cursor = M.MacroCursor;
1793 SavedStreamPosition SavedPosition(Cursor);
1794 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset);
1796 struct ModuleMacroRecord {
1797 SubmoduleID SubModID;
1799 SmallVector<SubmoduleID, 8> Overrides;
1801 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
1803 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
1804 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
1808 llvm::BitstreamEntry Entry =
1809 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1810 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1811 Error("malformed block record in AST file");
1816 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
1817 case PP_MACRO_DIRECTIVE_HISTORY:
1820 case PP_MODULE_MACRO: {
1821 ModuleMacros.push_back(ModuleMacroRecord());
1822 auto &Info = ModuleMacros.back();
1823 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
1824 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
1825 for (int I = 2, N = Record.size(); I != N; ++I)
1826 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
1831 Error("malformed block record in AST file");
1835 // We found the macro directive history; that's the last record
1840 // Module macros are listed in reverse dependency order.
1842 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
1843 llvm::SmallVector<ModuleMacro*, 8> Overrides;
1844 for (auto &MMR : ModuleMacros) {
1846 for (unsigned ModID : MMR.Overrides) {
1847 Module *Mod = getSubmodule(ModID);
1848 auto *Macro = PP.getModuleMacro(Mod, II);
1849 assert(Macro && "missing definition for overridden macro");
1850 Overrides.push_back(Macro);
1853 bool Inserted = false;
1854 Module *Owner = getSubmodule(MMR.SubModID);
1855 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
1859 // Don't read the directive history for a module; we don't have anywhere
1861 if (M.Kind == MK_ImplicitModule || M.Kind == MK_ExplicitModule)
1864 // Deserialize the macro directives history in reverse source-order.
1865 MacroDirective *Latest = nullptr, *Earliest = nullptr;
1866 unsigned Idx = 0, N = Record.size();
1868 MacroDirective *MD = nullptr;
1869 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
1870 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1872 case MacroDirective::MD_Define: {
1873 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
1874 MD = PP.AllocateDefMacroDirective(MI, Loc);
1877 case MacroDirective::MD_Undefine: {
1878 MD = PP.AllocateUndefMacroDirective(Loc);
1881 case MacroDirective::MD_Visibility:
1882 bool isPublic = Record[Idx++];
1883 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1890 Earliest->setPrevious(MD);
1895 PP.setLoadedMacroDirective(II, Latest);
1898 ASTReader::InputFileInfo
1899 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
1900 // Go find this input file.
1901 BitstreamCursor &Cursor = F.InputFilesCursor;
1902 SavedStreamPosition SavedPosition(Cursor);
1903 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1905 unsigned Code = Cursor.ReadCode();
1909 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
1910 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
1911 "invalid record type for input file");
1914 assert(Record[0] == ID && "Bogus stored ID or offset");
1916 R.StoredSize = static_cast<off_t>(Record[1]);
1917 R.StoredTime = static_cast<time_t>(Record[2]);
1918 R.Overridden = static_cast<bool>(Record[3]);
1919 R.Transient = static_cast<bool>(Record[4]);
1921 ResolveImportedPath(F, R.Filename);
1925 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
1926 // If this ID is bogus, just return an empty input file.
1927 if (ID == 0 || ID > F.InputFilesLoaded.size())
1930 // If we've already loaded this input file, return it.
1931 if (F.InputFilesLoaded[ID-1].getFile())
1932 return F.InputFilesLoaded[ID-1];
1934 if (F.InputFilesLoaded[ID-1].isNotFound())
1937 // Go find this input file.
1938 BitstreamCursor &Cursor = F.InputFilesCursor;
1939 SavedStreamPosition SavedPosition(Cursor);
1940 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1942 InputFileInfo FI = readInputFileInfo(F, ID);
1943 off_t StoredSize = FI.StoredSize;
1944 time_t StoredTime = FI.StoredTime;
1945 bool Overridden = FI.Overridden;
1946 bool Transient = FI.Transient;
1947 StringRef Filename = FI.Filename;
1949 const FileEntry *File = FileMgr.getFile(Filename, /*OpenFile=*/false);
1951 // If we didn't find the file, resolve it relative to the
1952 // original directory from which this AST file was created.
1953 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
1954 F.OriginalDir != CurrentDir) {
1955 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
1958 if (!Resolved.empty())
1959 File = FileMgr.getFile(Resolved);
1962 // For an overridden file, create a virtual file with the stored
1964 if ((Overridden || Transient) && File == nullptr)
1965 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
1967 if (File == nullptr) {
1969 std::string ErrorStr = "could not find file '";
1970 ErrorStr += Filename;
1971 ErrorStr += "' referenced by AST file '";
1972 ErrorStr += F.FileName;
1974 Error(ErrorStr.c_str());
1976 // Record that we didn't find the file.
1977 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
1981 // Check if there was a request to override the contents of the file
1982 // that was part of the precompiled header. Overridding such a file
1983 // can lead to problems when lexing using the source locations from the
1985 SourceManager &SM = getSourceManager();
1986 // FIXME: Reject if the overrides are different.
1987 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
1989 Error(diag::err_fe_pch_file_overridden, Filename);
1990 // After emitting the diagnostic, recover by disabling the override so
1991 // that the original file will be used.
1993 // FIXME: This recovery is just as broken as the original state; there may
1994 // be another precompiled module that's using the overridden contents, or
1995 // we might be half way through parsing it. Instead, we should treat the
1996 // overridden contents as belonging to a separate FileEntry.
1997 SM.disableFileContentsOverride(File);
1998 // The FileEntry is a virtual file entry with the size of the contents
1999 // that would override the original contents. Set it to the original's
2001 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2002 StoredSize, StoredTime);
2005 bool IsOutOfDate = false;
2007 // For an overridden file, there is nothing to validate.
2008 if (!Overridden && //
2009 (StoredSize != File->getSize() ||
2010 #if defined(LLVM_ON_WIN32)
2013 // In our regression testing, the Windows file system seems to
2014 // have inconsistent modification times that sometimes
2015 // erroneously trigger this error-handling path.
2017 // FIXME: This probably also breaks HeaderFileInfo lookups on Windows.
2018 (StoredTime && StoredTime != File->getModificationTime() &&
2023 // Build a list of the PCH imports that got us here (in reverse).
2024 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2025 while (ImportStack.back()->ImportedBy.size() > 0)
2026 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2028 // The top-level PCH is stale.
2029 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2030 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2032 // Print the import stack.
2033 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2034 Diag(diag::note_pch_required_by)
2035 << Filename << ImportStack[0]->FileName;
2036 for (unsigned I = 1; I < ImportStack.size(); ++I)
2037 Diag(diag::note_pch_required_by)
2038 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2041 if (!Diags.isDiagnosticInFlight())
2042 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2047 // FIXME: If the file is overridden and we've already opened it,
2048 // issue an error (or split it into a separate FileEntry).
2050 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate);
2052 // Note that we've loaded this input file.
2053 F.InputFilesLoaded[ID-1] = IF;
2057 /// \brief If we are loading a relocatable PCH or module file, and the filename
2058 /// is not an absolute path, add the system or module root to the beginning of
2060 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2061 // Resolve relative to the base directory, if we have one.
2062 if (!M.BaseDirectory.empty())
2063 return ResolveImportedPath(Filename, M.BaseDirectory);
2066 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2067 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2070 SmallString<128> Buffer;
2071 llvm::sys::path::append(Buffer, Prefix, Filename);
2072 Filename.assign(Buffer.begin(), Buffer.end());
2075 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2077 case ASTReader::Failure: return true;
2078 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2079 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2080 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2081 case ASTReader::ConfigurationMismatch:
2082 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2083 case ASTReader::HadErrors: return true;
2084 case ASTReader::Success: return false;
2087 llvm_unreachable("unknown ASTReadResult");
2090 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2091 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2092 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2093 std::string &SuggestedPredefines) {
2094 if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID))
2097 // Read all of the records in the options block.
2099 ASTReadResult Result = Success;
2101 llvm::BitstreamEntry Entry = Stream.advance();
2103 switch (Entry.Kind) {
2104 case llvm::BitstreamEntry::Error:
2105 case llvm::BitstreamEntry::SubBlock:
2108 case llvm::BitstreamEntry::EndBlock:
2111 case llvm::BitstreamEntry::Record:
2112 // The interesting case.
2116 // Read and process a record.
2118 switch ((OptionsRecordTypes)Stream.readRecord(Entry.ID, Record)) {
2119 case LANGUAGE_OPTIONS: {
2120 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2121 if (ParseLanguageOptions(Record, Complain, Listener,
2122 AllowCompatibleConfigurationMismatch))
2123 Result = ConfigurationMismatch;
2127 case TARGET_OPTIONS: {
2128 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2129 if (ParseTargetOptions(Record, Complain, Listener,
2130 AllowCompatibleConfigurationMismatch))
2131 Result = ConfigurationMismatch;
2135 case DIAGNOSTIC_OPTIONS: {
2136 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2137 if (!AllowCompatibleConfigurationMismatch &&
2138 ParseDiagnosticOptions(Record, Complain, Listener))
2143 case FILE_SYSTEM_OPTIONS: {
2144 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2145 if (!AllowCompatibleConfigurationMismatch &&
2146 ParseFileSystemOptions(Record, Complain, Listener))
2147 Result = ConfigurationMismatch;
2151 case HEADER_SEARCH_OPTIONS: {
2152 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2153 if (!AllowCompatibleConfigurationMismatch &&
2154 ParseHeaderSearchOptions(Record, Complain, Listener))
2155 Result = ConfigurationMismatch;
2159 case PREPROCESSOR_OPTIONS:
2160 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2161 if (!AllowCompatibleConfigurationMismatch &&
2162 ParsePreprocessorOptions(Record, Complain, Listener,
2163 SuggestedPredefines))
2164 Result = ConfigurationMismatch;
2170 ASTReader::ASTReadResult
2171 ASTReader::ReadControlBlock(ModuleFile &F,
2172 SmallVectorImpl<ImportedModule> &Loaded,
2173 const ModuleFile *ImportedBy,
2174 unsigned ClientLoadCapabilities) {
2175 BitstreamCursor &Stream = F.Stream;
2176 ASTReadResult Result = Success;
2178 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2179 Error("malformed block record in AST file");
2183 // Read all of the records and blocks in the control block.
2185 unsigned NumInputs = 0;
2186 unsigned NumUserInputs = 0;
2188 llvm::BitstreamEntry Entry = Stream.advance();
2190 switch (Entry.Kind) {
2191 case llvm::BitstreamEntry::Error:
2192 Error("malformed block record in AST file");
2194 case llvm::BitstreamEntry::EndBlock: {
2195 // Validate input files.
2196 const HeaderSearchOptions &HSOpts =
2197 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2199 // All user input files reside at the index range [0, NumUserInputs), and
2200 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2201 // loaded module files, ignore missing inputs.
2202 if (!DisableValidation && F.Kind != MK_ExplicitModule) {
2203 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2205 // If we are reading a module, we will create a verification timestamp,
2206 // so we verify all input files. Otherwise, verify only user input
2209 unsigned N = NumUserInputs;
2210 if (ValidateSystemInputs ||
2211 (HSOpts.ModulesValidateOncePerBuildSession &&
2212 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2213 F.Kind == MK_ImplicitModule))
2216 for (unsigned I = 0; I < N; ++I) {
2217 InputFile IF = getInputFile(F, I+1, Complain);
2218 if (!IF.getFile() || IF.isOutOfDate())
2224 Listener->visitModuleFile(F.FileName, F.Kind);
2226 if (Listener && Listener->needsInputFileVisitation()) {
2227 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2229 for (unsigned I = 0; I < N; ++I) {
2230 bool IsSystem = I >= NumUserInputs;
2231 InputFileInfo FI = readInputFileInfo(F, I+1);
2232 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2233 F.Kind == MK_ExplicitModule);
2240 case llvm::BitstreamEntry::SubBlock:
2242 case INPUT_FILES_BLOCK_ID:
2243 F.InputFilesCursor = Stream;
2244 if (Stream.SkipBlock() || // Skip with the main cursor
2245 // Read the abbreviations
2246 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2247 Error("malformed block record in AST file");
2252 case OPTIONS_BLOCK_ID:
2253 // If we're reading the first module for this group, check its options
2254 // are compatible with ours. For modules it imports, no further checking
2255 // is required, because we checked them when we built it.
2256 if (Listener && !ImportedBy) {
2257 // Should we allow the configuration of the module file to differ from
2258 // the configuration of the current translation unit in a compatible
2261 // FIXME: Allow this for files explicitly specified with -include-pch.
2262 bool AllowCompatibleConfigurationMismatch =
2263 F.Kind == MK_ExplicitModule;
2265 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities,
2266 AllowCompatibleConfigurationMismatch,
2267 *Listener, SuggestedPredefines);
2268 if (Result == Failure) {
2269 Error("malformed block record in AST file");
2273 if (DisableValidation ||
2274 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2277 // If we can't load the module, exit early since we likely
2278 // will rebuild the module anyway. The stream may be in the
2279 // middle of a block.
2280 if (Result != Success)
2282 } else if (Stream.SkipBlock()) {
2283 Error("malformed block record in AST file");
2289 if (Stream.SkipBlock()) {
2290 Error("malformed block record in AST file");
2296 case llvm::BitstreamEntry::Record:
2297 // The interesting case.
2301 // Read and process a record.
2304 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2306 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2307 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2308 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2309 : diag::err_pch_version_too_new);
2310 return VersionMismatch;
2313 bool hasErrors = Record[6];
2314 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2315 Diag(diag::err_pch_with_compiler_errors);
2319 F.RelocatablePCH = Record[4];
2320 // Relative paths in a relocatable PCH are relative to our sysroot.
2321 if (F.RelocatablePCH)
2322 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2324 F.HasTimestamps = Record[5];
2326 const std::string &CurBranch = getClangFullRepositoryVersion();
2327 StringRef ASTBranch = Blob;
2328 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2329 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2330 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2331 return VersionMismatch;
2337 assert((!F.Signature || F.Signature == Record[0]) && "signature changed");
2338 F.Signature = Record[0];
2342 // Load each of the imported PCH files.
2343 unsigned Idx = 0, N = Record.size();
2345 // Read information about the AST file.
2346 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2347 // The import location will be the local one for now; we will adjust
2348 // all import locations of module imports after the global source
2349 // location info are setup, in ReadAST.
2350 SourceLocation ImportLoc =
2351 ReadUntranslatedSourceLocation(Record[Idx++]);
2352 off_t StoredSize = (off_t)Record[Idx++];
2353 time_t StoredModTime = (time_t)Record[Idx++];
2354 ASTFileSignature StoredSignature = Record[Idx++];
2355 auto ImportedFile = ReadPath(F, Record, Idx);
2357 // If our client can't cope with us being out of date, we can't cope with
2358 // our dependency being missing.
2359 unsigned Capabilities = ClientLoadCapabilities;
2360 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2361 Capabilities &= ~ARR_Missing;
2363 // Load the AST file.
2364 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2365 Loaded, StoredSize, StoredModTime,
2366 StoredSignature, Capabilities);
2368 // If we diagnosed a problem, produce a backtrace.
2369 if (isDiagnosedResult(Result, Capabilities))
2370 Diag(diag::note_module_file_imported_by)
2371 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2374 case Failure: return Failure;
2375 // If we have to ignore the dependency, we'll have to ignore this too.
2377 case OutOfDate: return OutOfDate;
2378 case VersionMismatch: return VersionMismatch;
2379 case ConfigurationMismatch: return ConfigurationMismatch;
2380 case HadErrors: return HadErrors;
2381 case Success: break;
2388 F.OriginalSourceFileID = FileID::get(Record[0]);
2389 F.ActualOriginalSourceFileName = Blob;
2390 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2391 ResolveImportedPath(F, F.OriginalSourceFileName);
2394 case ORIGINAL_FILE_ID:
2395 F.OriginalSourceFileID = FileID::get(Record[0]);
2398 case ORIGINAL_PCH_DIR:
2399 F.OriginalDir = Blob;
2403 F.ModuleName = Blob;
2405 Listener->ReadModuleName(F.ModuleName);
2408 case MODULE_DIRECTORY: {
2409 assert(!F.ModuleName.empty() &&
2410 "MODULE_DIRECTORY found before MODULE_NAME");
2411 // If we've already loaded a module map file covering this module, we may
2412 // have a better path for it (relative to the current build).
2413 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2414 if (M && M->Directory) {
2415 // If we're implicitly loading a module, the base directory can't
2416 // change between the build and use.
2417 if (F.Kind != MK_ExplicitModule) {
2418 const DirectoryEntry *BuildDir =
2419 PP.getFileManager().getDirectory(Blob);
2420 if (!BuildDir || BuildDir != M->Directory) {
2421 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2422 Diag(diag::err_imported_module_relocated)
2423 << F.ModuleName << Blob << M->Directory->getName();
2427 F.BaseDirectory = M->Directory->getName();
2429 F.BaseDirectory = Blob;
2434 case MODULE_MAP_FILE:
2435 if (ASTReadResult Result =
2436 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2440 case INPUT_FILE_OFFSETS:
2441 NumInputs = Record[0];
2442 NumUserInputs = Record[1];
2443 F.InputFileOffsets =
2444 (const llvm::support::unaligned_uint64_t *)Blob.data();
2445 F.InputFilesLoaded.resize(NumInputs);
2451 ASTReader::ASTReadResult
2452 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2453 BitstreamCursor &Stream = F.Stream;
2455 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2456 Error("malformed block record in AST file");
2460 // Read all of the records and blocks for the AST file.
2463 llvm::BitstreamEntry Entry = Stream.advance();
2465 switch (Entry.Kind) {
2466 case llvm::BitstreamEntry::Error:
2467 Error("error at end of module block in AST file");
2469 case llvm::BitstreamEntry::EndBlock: {
2470 // Outside of C++, we do not store a lookup map for the translation unit.
2471 // Instead, mark it as needing a lookup map to be built if this module
2472 // contains any declarations lexically within it (which it always does!).
2473 // This usually has no cost, since we very rarely need the lookup map for
2474 // the translation unit outside C++.
2475 DeclContext *DC = Context.getTranslationUnitDecl();
2476 if (DC->hasExternalLexicalStorage() &&
2477 !getContext().getLangOpts().CPlusPlus)
2478 DC->setMustBuildLookupTable();
2482 case llvm::BitstreamEntry::SubBlock:
2484 case DECLTYPES_BLOCK_ID:
2485 // We lazily load the decls block, but we want to set up the
2486 // DeclsCursor cursor to point into it. Clone our current bitcode
2487 // cursor to it, enter the block and read the abbrevs in that block.
2488 // With the main cursor, we just skip over it.
2489 F.DeclsCursor = Stream;
2490 if (Stream.SkipBlock() || // Skip with the main cursor.
2491 // Read the abbrevs.
2492 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2493 Error("malformed block record in AST file");
2498 case PREPROCESSOR_BLOCK_ID:
2499 F.MacroCursor = Stream;
2500 if (!PP.getExternalSource())
2501 PP.setExternalSource(this);
2503 if (Stream.SkipBlock() ||
2504 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2505 Error("malformed block record in AST file");
2508 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2511 case PREPROCESSOR_DETAIL_BLOCK_ID:
2512 F.PreprocessorDetailCursor = Stream;
2513 if (Stream.SkipBlock() ||
2514 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2515 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2516 Error("malformed preprocessor detail record in AST file");
2519 F.PreprocessorDetailStartOffset
2520 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2522 if (!PP.getPreprocessingRecord())
2523 PP.createPreprocessingRecord();
2524 if (!PP.getPreprocessingRecord()->getExternalSource())
2525 PP.getPreprocessingRecord()->SetExternalSource(*this);
2528 case SOURCE_MANAGER_BLOCK_ID:
2529 if (ReadSourceManagerBlock(F))
2533 case SUBMODULE_BLOCK_ID:
2534 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2538 case COMMENTS_BLOCK_ID: {
2539 BitstreamCursor C = Stream;
2540 if (Stream.SkipBlock() ||
2541 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2542 Error("malformed comments block in AST file");
2545 CommentsCursors.push_back(std::make_pair(C, &F));
2550 if (Stream.SkipBlock()) {
2551 Error("malformed block record in AST file");
2558 case llvm::BitstreamEntry::Record:
2559 // The interesting case.
2563 // Read and process a record.
2566 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2567 default: // Default behavior: ignore.
2571 if (F.LocalNumTypes != 0) {
2572 Error("duplicate TYPE_OFFSET record in AST file");
2575 F.TypeOffsets = (const uint32_t *)Blob.data();
2576 F.LocalNumTypes = Record[0];
2577 unsigned LocalBaseTypeIndex = Record[1];
2578 F.BaseTypeIndex = getTotalNumTypes();
2580 if (F.LocalNumTypes > 0) {
2581 // Introduce the global -> local mapping for types within this module.
2582 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2584 // Introduce the local -> global mapping for types within this module.
2585 F.TypeRemap.insertOrReplace(
2586 std::make_pair(LocalBaseTypeIndex,
2587 F.BaseTypeIndex - LocalBaseTypeIndex));
2589 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2595 if (F.LocalNumDecls != 0) {
2596 Error("duplicate DECL_OFFSET record in AST file");
2599 F.DeclOffsets = (const DeclOffset *)Blob.data();
2600 F.LocalNumDecls = Record[0];
2601 unsigned LocalBaseDeclID = Record[1];
2602 F.BaseDeclID = getTotalNumDecls();
2604 if (F.LocalNumDecls > 0) {
2605 // Introduce the global -> local mapping for declarations within this
2607 GlobalDeclMap.insert(
2608 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2610 // Introduce the local -> global mapping for declarations within this
2612 F.DeclRemap.insertOrReplace(
2613 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2615 // Introduce the global -> local mapping for declarations within this
2617 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2619 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2624 case TU_UPDATE_LEXICAL: {
2625 DeclContext *TU = Context.getTranslationUnitDecl();
2626 LexicalContents Contents(
2627 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
2629 static_cast<unsigned int>(Blob.size() / 4));
2630 TULexicalDecls.push_back(std::make_pair(&F, Contents));
2631 TU->setHasExternalLexicalStorage(true);
2635 case UPDATE_VISIBLE: {
2637 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2638 auto *Data = (const unsigned char*)Blob.data();
2639 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
2640 // If we've already loaded the decl, perform the updates when we finish
2641 // loading this block.
2642 if (Decl *D = GetExistingDecl(ID))
2643 PendingUpdateRecords.push_back(std::make_pair(ID, D));
2647 case IDENTIFIER_TABLE:
2648 F.IdentifierTableData = Blob.data();
2650 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2651 (const unsigned char *)F.IdentifierTableData + Record[0],
2652 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2653 (const unsigned char *)F.IdentifierTableData,
2654 ASTIdentifierLookupTrait(*this, F));
2656 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2660 case IDENTIFIER_OFFSET: {
2661 if (F.LocalNumIdentifiers != 0) {
2662 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2665 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2666 F.LocalNumIdentifiers = Record[0];
2667 unsigned LocalBaseIdentifierID = Record[1];
2668 F.BaseIdentifierID = getTotalNumIdentifiers();
2670 if (F.LocalNumIdentifiers > 0) {
2671 // Introduce the global -> local mapping for identifiers within this
2673 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2676 // Introduce the local -> global mapping for identifiers within this
2678 F.IdentifierRemap.insertOrReplace(
2679 std::make_pair(LocalBaseIdentifierID,
2680 F.BaseIdentifierID - LocalBaseIdentifierID));
2682 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2683 + F.LocalNumIdentifiers);
2688 case INTERESTING_IDENTIFIERS:
2689 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
2692 case EAGERLY_DESERIALIZED_DECLS:
2693 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2694 // about "interesting" decls (for instance, if we're building a module).
2695 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2696 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2700 if (SpecialTypes.empty()) {
2701 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2702 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2706 if (SpecialTypes.size() != Record.size()) {
2707 Error("invalid special-types record");
2711 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2712 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2713 if (!SpecialTypes[I])
2714 SpecialTypes[I] = ID;
2715 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2721 TotalNumStatements += Record[0];
2722 TotalNumMacros += Record[1];
2723 TotalLexicalDeclContexts += Record[2];
2724 TotalVisibleDeclContexts += Record[3];
2727 case UNUSED_FILESCOPED_DECLS:
2728 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2729 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2732 case DELEGATING_CTORS:
2733 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2734 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2737 case WEAK_UNDECLARED_IDENTIFIERS:
2738 if (Record.size() % 4 != 0) {
2739 Error("invalid weak identifiers record");
2743 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2744 // files. This isn't the way to do it :)
2745 WeakUndeclaredIdentifiers.clear();
2747 // Translate the weak, undeclared identifiers into global IDs.
2748 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2749 WeakUndeclaredIdentifiers.push_back(
2750 getGlobalIdentifierID(F, Record[I++]));
2751 WeakUndeclaredIdentifiers.push_back(
2752 getGlobalIdentifierID(F, Record[I++]));
2753 WeakUndeclaredIdentifiers.push_back(
2754 ReadSourceLocation(F, Record, I).getRawEncoding());
2755 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2759 case SELECTOR_OFFSETS: {
2760 F.SelectorOffsets = (const uint32_t *)Blob.data();
2761 F.LocalNumSelectors = Record[0];
2762 unsigned LocalBaseSelectorID = Record[1];
2763 F.BaseSelectorID = getTotalNumSelectors();
2765 if (F.LocalNumSelectors > 0) {
2766 // Introduce the global -> local mapping for selectors within this
2768 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2770 // Introduce the local -> global mapping for selectors within this
2772 F.SelectorRemap.insertOrReplace(
2773 std::make_pair(LocalBaseSelectorID,
2774 F.BaseSelectorID - LocalBaseSelectorID));
2776 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2782 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
2784 F.SelectorLookupTable
2785 = ASTSelectorLookupTable::Create(
2786 F.SelectorLookupTableData + Record[0],
2787 F.SelectorLookupTableData,
2788 ASTSelectorLookupTrait(*this, F));
2789 TotalNumMethodPoolEntries += Record[1];
2792 case REFERENCED_SELECTOR_POOL:
2793 if (!Record.empty()) {
2794 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2795 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2797 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2803 case PP_COUNTER_VALUE:
2804 if (!Record.empty() && Listener)
2805 Listener->ReadCounter(F, Record[0]);
2808 case FILE_SORTED_DECLS:
2809 F.FileSortedDecls = (const DeclID *)Blob.data();
2810 F.NumFileSortedDecls = Record[0];
2813 case SOURCE_LOCATION_OFFSETS: {
2814 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
2815 F.LocalNumSLocEntries = Record[0];
2816 unsigned SLocSpaceSize = Record[1];
2817 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2818 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2820 if (!F.SLocEntryBaseID) {
2821 Error("ran out of source locations");
2824 // Make our entry in the range map. BaseID is negative and growing, so
2825 // we invert it. Because we invert it, though, we need the other end of
2827 unsigned RangeStart =
2828 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2829 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2830 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2832 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2833 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2834 GlobalSLocOffsetMap.insert(
2835 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2836 - SLocSpaceSize,&F));
2838 // Initialize the remapping table.
2839 // Invalid stays invalid.
2840 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
2841 // This module. Base was 2 when being compiled.
2842 F.SLocRemap.insertOrReplace(std::make_pair(2U,
2843 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2845 TotalNumSLocEntries += F.LocalNumSLocEntries;
2849 case MODULE_OFFSET_MAP: {
2850 // Additional remapping information.
2851 const unsigned char *Data = (const unsigned char*)Blob.data();
2852 const unsigned char *DataEnd = Data + Blob.size();
2854 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2855 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2856 F.SLocRemap.insert(std::make_pair(0U, 0));
2857 F.SLocRemap.insert(std::make_pair(2U, 1));
2860 // Continuous range maps we may be updating in our module.
2861 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2863 RemapBuilder SLocRemap(F.SLocRemap);
2864 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2865 RemapBuilder MacroRemap(F.MacroRemap);
2866 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2867 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
2868 RemapBuilder SelectorRemap(F.SelectorRemap);
2869 RemapBuilder DeclRemap(F.DeclRemap);
2870 RemapBuilder TypeRemap(F.TypeRemap);
2872 while (Data < DataEnd) {
2873 using namespace llvm::support;
2874 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
2875 StringRef Name = StringRef((const char*)Data, Len);
2877 ModuleFile *OM = ModuleMgr.lookup(Name);
2879 Error("SourceLocation remap refers to unknown module");
2883 uint32_t SLocOffset =
2884 endian::readNext<uint32_t, little, unaligned>(Data);
2885 uint32_t IdentifierIDOffset =
2886 endian::readNext<uint32_t, little, unaligned>(Data);
2887 uint32_t MacroIDOffset =
2888 endian::readNext<uint32_t, little, unaligned>(Data);
2889 uint32_t PreprocessedEntityIDOffset =
2890 endian::readNext<uint32_t, little, unaligned>(Data);
2891 uint32_t SubmoduleIDOffset =
2892 endian::readNext<uint32_t, little, unaligned>(Data);
2893 uint32_t SelectorIDOffset =
2894 endian::readNext<uint32_t, little, unaligned>(Data);
2895 uint32_t DeclIDOffset =
2896 endian::readNext<uint32_t, little, unaligned>(Data);
2897 uint32_t TypeIndexOffset =
2898 endian::readNext<uint32_t, little, unaligned>(Data);
2900 uint32_t None = std::numeric_limits<uint32_t>::max();
2902 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
2903 RemapBuilder &Remap) {
2905 Remap.insert(std::make_pair(Offset,
2906 static_cast<int>(BaseOffset - Offset)));
2908 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
2909 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
2910 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
2911 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
2912 PreprocessedEntityRemap);
2913 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
2914 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
2915 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
2916 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
2918 // Global -> local mappings.
2919 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2924 case SOURCE_MANAGER_LINE_TABLE:
2925 if (ParseLineTable(F, Record))
2929 case SOURCE_LOCATION_PRELOADS: {
2930 // Need to transform from the local view (1-based IDs) to the global view,
2931 // which is based off F.SLocEntryBaseID.
2932 if (!F.PreloadSLocEntries.empty()) {
2933 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2937 F.PreloadSLocEntries.swap(Record);
2941 case EXT_VECTOR_DECLS:
2942 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2943 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2947 if (Record.size() % 3 != 0) {
2948 Error("Invalid VTABLE_USES record");
2952 // Later tables overwrite earlier ones.
2953 // FIXME: Modules will have some trouble with this. This is clearly not
2954 // the right way to do this.
2957 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
2958 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
2959 VTableUses.push_back(
2960 ReadSourceLocation(F, Record, Idx).getRawEncoding());
2961 VTableUses.push_back(Record[Idx++]);
2965 case PENDING_IMPLICIT_INSTANTIATIONS:
2966 if (PendingInstantiations.size() % 2 != 0) {
2967 Error("Invalid existing PendingInstantiations");
2971 if (Record.size() % 2 != 0) {
2972 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
2976 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
2977 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
2978 PendingInstantiations.push_back(
2979 ReadSourceLocation(F, Record, I).getRawEncoding());
2983 case SEMA_DECL_REFS:
2984 if (Record.size() != 2) {
2985 Error("Invalid SEMA_DECL_REFS block");
2988 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2989 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
2992 case PPD_ENTITIES_OFFSETS: {
2993 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
2994 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
2995 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
2997 unsigned LocalBasePreprocessedEntityID = Record[0];
2999 unsigned StartingID;
3000 if (!PP.getPreprocessingRecord())
3001 PP.createPreprocessingRecord();
3002 if (!PP.getPreprocessingRecord()->getExternalSource())
3003 PP.getPreprocessingRecord()->SetExternalSource(*this);
3005 = PP.getPreprocessingRecord()
3006 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3007 F.BasePreprocessedEntityID = StartingID;
3009 if (F.NumPreprocessedEntities > 0) {
3010 // Introduce the global -> local mapping for preprocessed entities in
3012 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3014 // Introduce the local -> global mapping for preprocessed entities in
3016 F.PreprocessedEntityRemap.insertOrReplace(
3017 std::make_pair(LocalBasePreprocessedEntityID,
3018 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3024 case DECL_UPDATE_OFFSETS: {
3025 if (Record.size() % 2 != 0) {
3026 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3029 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3030 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3031 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3033 // If we've already loaded the decl, perform the updates when we finish
3034 // loading this block.
3035 if (Decl *D = GetExistingDecl(ID))
3036 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3041 case OBJC_CATEGORIES_MAP: {
3042 if (F.LocalNumObjCCategoriesInMap != 0) {
3043 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3047 F.LocalNumObjCCategoriesInMap = Record[0];
3048 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3052 case OBJC_CATEGORIES:
3053 F.ObjCCategories.swap(Record);
3056 case CXX_BASE_SPECIFIER_OFFSETS: {
3057 if (F.LocalNumCXXBaseSpecifiers != 0) {
3058 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
3062 F.LocalNumCXXBaseSpecifiers = Record[0];
3063 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
3067 case CXX_CTOR_INITIALIZERS_OFFSETS: {
3068 if (F.LocalNumCXXCtorInitializers != 0) {
3069 Error("duplicate CXX_CTOR_INITIALIZERS_OFFSETS record in AST file");
3073 F.LocalNumCXXCtorInitializers = Record[0];
3074 F.CXXCtorInitializersOffsets = (const uint32_t *)Blob.data();
3078 case DIAG_PRAGMA_MAPPINGS:
3079 if (F.PragmaDiagMappings.empty())
3080 F.PragmaDiagMappings.swap(Record);
3082 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3083 Record.begin(), Record.end());
3086 case CUDA_SPECIAL_DECL_REFS:
3087 // Later tables overwrite earlier ones.
3088 // FIXME: Modules will have trouble with this.
3089 CUDASpecialDeclRefs.clear();
3090 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3091 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3094 case HEADER_SEARCH_TABLE: {
3095 F.HeaderFileInfoTableData = Blob.data();
3096 F.LocalNumHeaderFileInfos = Record[1];
3098 F.HeaderFileInfoTable
3099 = HeaderFileInfoLookupTable::Create(
3100 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3101 (const unsigned char *)F.HeaderFileInfoTableData,
3102 HeaderFileInfoTrait(*this, F,
3103 &PP.getHeaderSearchInfo(),
3104 Blob.data() + Record[2]));
3106 PP.getHeaderSearchInfo().SetExternalSource(this);
3107 if (!PP.getHeaderSearchInfo().getExternalLookup())
3108 PP.getHeaderSearchInfo().SetExternalLookup(this);
3113 case FP_PRAGMA_OPTIONS:
3114 // Later tables overwrite earlier ones.
3115 FPPragmaOptions.swap(Record);
3118 case OPENCL_EXTENSIONS:
3119 // Later tables overwrite earlier ones.
3120 OpenCLExtensions.swap(Record);
3123 case TENTATIVE_DEFINITIONS:
3124 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3125 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3128 case KNOWN_NAMESPACES:
3129 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3130 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3133 case UNDEFINED_BUT_USED:
3134 if (UndefinedButUsed.size() % 2 != 0) {
3135 Error("Invalid existing UndefinedButUsed");
3139 if (Record.size() % 2 != 0) {
3140 Error("invalid undefined-but-used record");
3143 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3144 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3145 UndefinedButUsed.push_back(
3146 ReadSourceLocation(F, Record, I).getRawEncoding());
3149 case DELETE_EXPRS_TO_ANALYZE:
3150 for (unsigned I = 0, N = Record.size(); I != N;) {
3151 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3152 const uint64_t Count = Record[I++];
3153 DelayedDeleteExprs.push_back(Count);
3154 for (uint64_t C = 0; C < Count; ++C) {
3155 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3156 bool IsArrayForm = Record[I++] == 1;
3157 DelayedDeleteExprs.push_back(IsArrayForm);
3162 case IMPORTED_MODULES: {
3163 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) {
3164 // If we aren't loading a module (which has its own exports), make
3165 // all of the imported modules visible.
3166 // FIXME: Deal with macros-only imports.
3167 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3168 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3169 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3171 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3177 case MACRO_OFFSET: {
3178 if (F.LocalNumMacros != 0) {
3179 Error("duplicate MACRO_OFFSET record in AST file");
3182 F.MacroOffsets = (const uint32_t *)Blob.data();
3183 F.LocalNumMacros = Record[0];
3184 unsigned LocalBaseMacroID = Record[1];
3185 F.BaseMacroID = getTotalNumMacros();
3187 if (F.LocalNumMacros > 0) {
3188 // Introduce the global -> local mapping for macros within this module.
3189 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3191 // Introduce the local -> global mapping for macros within this module.
3192 F.MacroRemap.insertOrReplace(
3193 std::make_pair(LocalBaseMacroID,
3194 F.BaseMacroID - LocalBaseMacroID));
3196 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3201 case LATE_PARSED_TEMPLATE: {
3202 LateParsedTemplates.append(Record.begin(), Record.end());
3206 case OPTIMIZE_PRAGMA_OPTIONS:
3207 if (Record.size() != 1) {
3208 Error("invalid pragma optimize record");
3211 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3214 case MSSTRUCT_PRAGMA_OPTIONS:
3215 if (Record.size() != 1) {
3216 Error("invalid pragma ms_struct record");
3219 PragmaMSStructState = Record[0];
3222 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3223 if (Record.size() != 2) {
3224 Error("invalid pragma ms_struct record");
3227 PragmaMSPointersToMembersState = Record[0];
3228 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3231 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3232 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3233 UnusedLocalTypedefNameCandidates.push_back(
3234 getGlobalDeclID(F, Record[I]));
3240 ASTReader::ASTReadResult
3241 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3242 const ModuleFile *ImportedBy,
3243 unsigned ClientLoadCapabilities) {
3245 F.ModuleMapPath = ReadPath(F, Record, Idx);
3247 if (F.Kind == MK_ExplicitModule) {
3248 // For an explicitly-loaded module, we don't care whether the original
3249 // module map file exists or matches.
3253 // Try to resolve ModuleName in the current header search context and
3254 // verify that it is found in the same module map file as we saved. If the
3255 // top-level AST file is a main file, skip this check because there is no
3256 // usable header search context.
3257 assert(!F.ModuleName.empty() &&
3258 "MODULE_NAME should come before MODULE_MAP_FILE");
3259 if (F.Kind == MK_ImplicitModule &&
3260 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3261 // An implicitly-loaded module file should have its module listed in some
3262 // module map file that we've already loaded.
3263 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3264 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3265 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3267 assert(ImportedBy && "top-level import should be verified");
3268 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
3269 if (auto *ASTFE = M ? M->getASTFile() : nullptr)
3270 // This module was defined by an imported (explicit) module.
3271 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3272 << ASTFE->getName();
3274 // This module was built with a different module map.
3275 Diag(diag::err_imported_module_not_found)
3276 << F.ModuleName << F.FileName << ImportedBy->FileName
3282 assert(M->Name == F.ModuleName && "found module with different name");
3284 // Check the primary module map file.
3285 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3286 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3287 assert(ModMap && "found module is missing module map file");
3288 assert(ImportedBy && "top-level import should be verified");
3289 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3290 Diag(diag::err_imported_module_modmap_changed)
3291 << F.ModuleName << ImportedBy->FileName
3292 << ModMap->getName() << F.ModuleMapPath;
3296 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3297 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3298 // FIXME: we should use input files rather than storing names.
3299 std::string Filename = ReadPath(F, Record, Idx);
3300 const FileEntry *F =
3301 FileMgr.getFile(Filename, false, false);
3303 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3304 Error("could not find file '" + Filename +"' referenced by AST file");
3307 AdditionalStoredMaps.insert(F);
3310 // Check any additional module map files (e.g. module.private.modulemap)
3311 // that are not in the pcm.
3312 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3313 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3314 // Remove files that match
3315 // Note: SmallPtrSet::erase is really remove
3316 if (!AdditionalStoredMaps.erase(ModMap)) {
3317 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3318 Diag(diag::err_module_different_modmap)
3319 << F.ModuleName << /*new*/0 << ModMap->getName();
3325 // Check any additional module map files that are in the pcm, but not
3326 // found in header search. Cases that match are already removed.
3327 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3328 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3329 Diag(diag::err_module_different_modmap)
3330 << F.ModuleName << /*not new*/1 << ModMap->getName();
3336 Listener->ReadModuleMapFile(F.ModuleMapPath);
3341 /// \brief Move the given method to the back of the global list of methods.
3342 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3343 // Find the entry for this selector in the method pool.
3344 Sema::GlobalMethodPool::iterator Known
3345 = S.MethodPool.find(Method->getSelector());
3346 if (Known == S.MethodPool.end())
3349 // Retrieve the appropriate method list.
3350 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3351 : Known->second.second;
3353 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3355 if (List->getMethod() == Method) {
3363 if (List->getNext())
3364 List->setMethod(List->getNext()->getMethod());
3366 List->setMethod(Method);
3370 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3371 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
3372 for (Decl *D : Names) {
3373 bool wasHidden = D->Hidden;
3376 if (wasHidden && SemaObj) {
3377 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3378 moveMethodToBackOfGlobalList(*SemaObj, Method);
3384 void ASTReader::makeModuleVisible(Module *Mod,
3385 Module::NameVisibilityKind NameVisibility,
3386 SourceLocation ImportLoc) {
3387 llvm::SmallPtrSet<Module *, 4> Visited;
3388 SmallVector<Module *, 4> Stack;
3389 Stack.push_back(Mod);
3390 while (!Stack.empty()) {
3391 Mod = Stack.pop_back_val();
3393 if (NameVisibility <= Mod->NameVisibility) {
3394 // This module already has this level of visibility (or greater), so
3395 // there is nothing more to do.
3399 if (!Mod->isAvailable()) {
3400 // Modules that aren't available cannot be made visible.
3404 // Update the module's name visibility.
3405 Mod->NameVisibility = NameVisibility;
3407 // If we've already deserialized any names from this module,
3408 // mark them as visible.
3409 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3410 if (Hidden != HiddenNamesMap.end()) {
3411 auto HiddenNames = std::move(*Hidden);
3412 HiddenNamesMap.erase(Hidden);
3413 makeNamesVisible(HiddenNames.second, HiddenNames.first);
3414 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3415 "making names visible added hidden names");
3418 // Push any exported modules onto the stack to be marked as visible.
3419 SmallVector<Module *, 16> Exports;
3420 Mod->getExportedModules(Exports);
3421 for (SmallVectorImpl<Module *>::iterator
3422 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3423 Module *Exported = *I;
3424 if (Visited.insert(Exported).second)
3425 Stack.push_back(Exported);
3430 bool ASTReader::loadGlobalIndex() {
3434 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3435 !Context.getLangOpts().Modules)
3438 // Try to load the global index.
3439 TriedLoadingGlobalIndex = true;
3440 StringRef ModuleCachePath
3441 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3442 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3443 = GlobalModuleIndex::readIndex(ModuleCachePath);
3447 GlobalIndex.reset(Result.first);
3448 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3452 bool ASTReader::isGlobalIndexUnavailable() const {
3453 return Context.getLangOpts().Modules && UseGlobalIndex &&
3454 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3457 static void updateModuleTimestamp(ModuleFile &MF) {
3458 // Overwrite the timestamp file contents so that file's mtime changes.
3459 std::string TimestampFilename = MF.getTimestampFilename();
3461 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3464 OS << "Timestamp file\n";
3467 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3468 /// cursor into the start of the given block ID, returning false on success and
3469 /// true on failure.
3470 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3472 llvm::BitstreamEntry Entry = Cursor.advance();
3473 switch (Entry.Kind) {
3474 case llvm::BitstreamEntry::Error:
3475 case llvm::BitstreamEntry::EndBlock:
3478 case llvm::BitstreamEntry::Record:
3479 // Ignore top-level records.
3480 Cursor.skipRecord(Entry.ID);
3483 case llvm::BitstreamEntry::SubBlock:
3484 if (Entry.ID == BlockID) {
3485 if (Cursor.EnterSubBlock(BlockID))
3491 if (Cursor.SkipBlock())
3497 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
3499 SourceLocation ImportLoc,
3500 unsigned ClientLoadCapabilities) {
3501 llvm::SaveAndRestore<SourceLocation>
3502 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3504 // Defer any pending actions until we get to the end of reading the AST file.
3505 Deserializing AnASTFile(this);
3507 // Bump the generation number.
3508 unsigned PreviousGeneration = incrementGeneration(Context);
3510 unsigned NumModules = ModuleMgr.size();
3511 SmallVector<ImportedModule, 4> Loaded;
3512 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
3513 /*ImportedBy=*/nullptr, Loaded,
3515 ClientLoadCapabilities)) {
3519 case VersionMismatch:
3520 case ConfigurationMismatch:
3522 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3523 for (const ImportedModule &IM : Loaded)
3524 LoadedSet.insert(IM.Mod);
3526 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
3528 Context.getLangOpts().Modules
3529 ? &PP.getHeaderSearchInfo().getModuleMap()
3532 // If we find that any modules are unusable, the global index is going
3533 // to be out-of-date. Just remove it.
3534 GlobalIndex.reset();
3535 ModuleMgr.setGlobalIndex(nullptr);
3542 // Here comes stuff that we only do once the entire chain is loaded.
3544 // Load the AST blocks of all of the modules that we loaded.
3545 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3546 MEnd = Loaded.end();
3548 ModuleFile &F = *M->Mod;
3550 // Read the AST block.
3551 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3554 // Read the extension blocks.
3555 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
3556 if (ASTReadResult Result = ReadExtensionBlock(F))
3560 // Once read, set the ModuleFile bit base offset and update the size in
3561 // bits of all files we've seen.
3562 F.GlobalBitOffset = TotalModulesSizeInBits;
3563 TotalModulesSizeInBits += F.SizeInBits;
3564 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3566 // Preload SLocEntries.
3567 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3568 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3569 // Load it through the SourceManager and don't call ReadSLocEntry()
3570 // directly because the entry may have already been loaded in which case
3571 // calling ReadSLocEntry() directly would trigger an assertion in
3573 SourceMgr.getLoadedSLocEntryByID(Index);
3576 // Preload all the pending interesting identifiers by marking them out of
3578 for (auto Offset : F.PreloadIdentifierOffsets) {
3579 const unsigned char *Data = reinterpret_cast<const unsigned char *>(
3580 F.IdentifierTableData + Offset);
3582 ASTIdentifierLookupTrait Trait(*this, F);
3583 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
3584 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
3585 auto &II = PP.getIdentifierTable().getOwn(Key);
3586 II.setOutOfDate(true);
3588 // Mark this identifier as being from an AST file so that we can track
3589 // whether we need to serialize it.
3590 markIdentifierFromAST(*this, II);
3592 // Associate the ID with the identifier so that the writer can reuse it.
3593 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
3594 SetIdentifierInfo(ID, &II);
3598 // Setup the import locations and notify the module manager that we've
3599 // committed to these module files.
3600 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3601 MEnd = Loaded.end();
3603 ModuleFile &F = *M->Mod;
3605 ModuleMgr.moduleFileAccepted(&F);
3607 // Set the import location.
3608 F.DirectImportLoc = ImportLoc;
3609 // FIXME: We assume that locations from PCH / preamble do not need
3612 F.ImportLoc = M->ImportLoc;
3614 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc);
3617 if (!Context.getLangOpts().CPlusPlus ||
3618 (Type != MK_ImplicitModule && Type != MK_ExplicitModule)) {
3619 // Mark all of the identifiers in the identifier table as being out of date,
3620 // so that various accessors know to check the loaded modules when the
3621 // identifier is used.
3623 // For C++ modules, we don't need information on many identifiers (just
3624 // those that provide macros or are poisoned), so we mark all of
3625 // the interesting ones via PreloadIdentifierOffsets.
3626 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3627 IdEnd = PP.getIdentifierTable().end();
3629 Id->second->setOutOfDate(true);
3632 // Resolve any unresolved module exports.
3633 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3634 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
3635 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3636 Module *ResolvedMod = getSubmodule(GlobalID);
3638 switch (Unresolved.Kind) {
3639 case UnresolvedModuleRef::Conflict:
3641 Module::Conflict Conflict;
3642 Conflict.Other = ResolvedMod;
3643 Conflict.Message = Unresolved.String.str();
3644 Unresolved.Mod->Conflicts.push_back(Conflict);
3648 case UnresolvedModuleRef::Import:
3650 Unresolved.Mod->Imports.insert(ResolvedMod);
3653 case UnresolvedModuleRef::Export:
3654 if (ResolvedMod || Unresolved.IsWildcard)
3655 Unresolved.Mod->Exports.push_back(
3656 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3660 UnresolvedModuleRefs.clear();
3662 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3663 // Might be unnecessary as use declarations are only used to build the
3666 InitializeContext();
3671 if (DeserializationListener)
3672 DeserializationListener->ReaderInitialized(this);
3674 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3675 if (PrimaryModule.OriginalSourceFileID.isValid()) {
3676 PrimaryModule.OriginalSourceFileID
3677 = FileID::get(PrimaryModule.SLocEntryBaseID
3678 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3680 // If this AST file is a precompiled preamble, then set the
3681 // preamble file ID of the source manager to the file source file
3682 // from which the preamble was built.
3683 if (Type == MK_Preamble) {
3684 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3685 } else if (Type == MK_MainFile) {
3686 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3690 // For any Objective-C class definitions we have already loaded, make sure
3691 // that we load any additional categories.
3692 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3693 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3694 ObjCClassesLoaded[I],
3695 PreviousGeneration);
3698 if (PP.getHeaderSearchInfo()
3699 .getHeaderSearchOpts()
3700 .ModulesValidateOncePerBuildSession) {
3701 // Now we are certain that the module and all modules it depends on are
3702 // up to date. Create or update timestamp files for modules that are
3703 // located in the module cache (not for PCH files that could be anywhere
3704 // in the filesystem).
3705 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3706 ImportedModule &M = Loaded[I];
3707 if (M.Mod->Kind == MK_ImplicitModule) {
3708 updateModuleTimestamp(*M.Mod);
3716 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile);
3718 /// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
3719 static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
3720 return Stream.Read(8) == 'C' &&
3721 Stream.Read(8) == 'P' &&
3722 Stream.Read(8) == 'C' &&
3723 Stream.Read(8) == 'H';
3726 static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
3730 case MK_ImplicitModule:
3731 case MK_ExplicitModule:
3735 return 2; // main source file
3737 llvm_unreachable("unknown module kind");
3740 ASTReader::ASTReadResult
3741 ASTReader::ReadASTCore(StringRef FileName,
3743 SourceLocation ImportLoc,
3744 ModuleFile *ImportedBy,
3745 SmallVectorImpl<ImportedModule> &Loaded,
3746 off_t ExpectedSize, time_t ExpectedModTime,
3747 ASTFileSignature ExpectedSignature,
3748 unsigned ClientLoadCapabilities) {
3750 std::string ErrorStr;
3751 ModuleManager::AddModuleResult AddResult
3752 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
3753 getGeneration(), ExpectedSize, ExpectedModTime,
3754 ExpectedSignature, readASTFileSignature,
3757 switch (AddResult) {
3758 case ModuleManager::AlreadyLoaded:
3761 case ModuleManager::NewlyLoaded:
3762 // Load module file below.
3765 case ModuleManager::Missing:
3766 // The module file was missing; if the client can handle that, return
3768 if (ClientLoadCapabilities & ARR_Missing)
3771 // Otherwise, return an error.
3772 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type)
3773 << FileName << ErrorStr.empty()
3777 case ModuleManager::OutOfDate:
3778 // We couldn't load the module file because it is out-of-date. If the
3779 // client can handle out-of-date, return it.
3780 if (ClientLoadCapabilities & ARR_OutOfDate)
3783 // Otherwise, return an error.
3784 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type)
3785 << FileName << ErrorStr.empty()
3790 assert(M && "Missing module file");
3792 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3794 if (FileName != "-") {
3795 CurrentDir = llvm::sys::path::parent_path(FileName);
3796 if (CurrentDir.empty()) CurrentDir = ".";
3800 BitstreamCursor &Stream = F.Stream;
3801 PCHContainerRdr.ExtractPCH(F.Buffer->getMemBufferRef(), F.StreamFile);
3802 Stream.init(&F.StreamFile);
3803 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3805 // Sniff for the signature.
3806 if (!startsWithASTFileMagic(Stream)) {
3807 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type)
3812 // This is used for compatibility with older PCH formats.
3813 bool HaveReadControlBlock = false;
3815 llvm::BitstreamEntry Entry = Stream.advance();
3817 switch (Entry.Kind) {
3818 case llvm::BitstreamEntry::Error:
3819 case llvm::BitstreamEntry::Record:
3820 case llvm::BitstreamEntry::EndBlock:
3821 Error("invalid record at top-level of AST file");
3824 case llvm::BitstreamEntry::SubBlock:
3829 case CONTROL_BLOCK_ID:
3830 HaveReadControlBlock = true;
3831 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
3833 // Check that we didn't try to load a non-module AST file as a module.
3835 // FIXME: Should we also perform the converse check? Loading a module as
3836 // a PCH file sort of works, but it's a bit wonky.
3837 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule) &&
3838 F.ModuleName.empty()) {
3839 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
3840 if (Result != OutOfDate ||
3841 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
3842 Diag(diag::err_module_file_not_module) << FileName;
3847 case Failure: return Failure;
3848 case Missing: return Missing;
3849 case OutOfDate: return OutOfDate;
3850 case VersionMismatch: return VersionMismatch;
3851 case ConfigurationMismatch: return ConfigurationMismatch;
3852 case HadErrors: return HadErrors;
3857 if (!HaveReadControlBlock) {
3858 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3859 Diag(diag::err_pch_version_too_old);
3860 return VersionMismatch;
3863 // Record that we've loaded this module.
3864 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3868 if (Stream.SkipBlock()) {
3869 Error("malformed block record in AST file");
3879 /// Parse a record and blob containing module file extension metadata.
3880 static bool parseModuleFileExtensionMetadata(
3881 const SmallVectorImpl<uint64_t> &Record,
3883 ModuleFileExtensionMetadata &Metadata) {
3884 if (Record.size() < 4) return true;
3886 Metadata.MajorVersion = Record[0];
3887 Metadata.MinorVersion = Record[1];
3889 unsigned BlockNameLen = Record[2];
3890 unsigned UserInfoLen = Record[3];
3892 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
3894 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
3895 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
3896 Blob.data() + BlockNameLen + UserInfoLen);
3900 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
3901 BitstreamCursor &Stream = F.Stream;
3905 llvm::BitstreamEntry Entry = Stream.advance();
3906 switch (Entry.Kind) {
3907 case llvm::BitstreamEntry::SubBlock:
3908 if (Stream.SkipBlock())
3913 case llvm::BitstreamEntry::EndBlock:
3916 case llvm::BitstreamEntry::Error:
3919 case llvm::BitstreamEntry::Record:
3925 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
3927 case EXTENSION_METADATA: {
3928 ModuleFileExtensionMetadata Metadata;
3929 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
3932 // Find a module file extension with this block name.
3933 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
3934 if (Known == ModuleFileExtensions.end()) break;
3937 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
3939 F.ExtensionReaders.push_back(std::move(Reader));
3950 void ASTReader::InitializeContext() {
3951 // If there's a listener, notify them that we "read" the translation unit.
3952 if (DeserializationListener)
3953 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3954 Context.getTranslationUnitDecl());
3956 // FIXME: Find a better way to deal with collisions between these
3957 // built-in types. Right now, we just ignore the problem.
3959 // Load the special types.
3960 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3961 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3962 if (!Context.CFConstantStringTypeDecl)
3963 Context.setCFConstantStringType(GetType(String));
3966 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3967 QualType FileType = GetType(File);
3968 if (FileType.isNull()) {
3969 Error("FILE type is NULL");
3973 if (!Context.FILEDecl) {
3974 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3975 Context.setFILEDecl(Typedef->getDecl());
3977 const TagType *Tag = FileType->getAs<TagType>();
3979 Error("Invalid FILE type in AST file");
3982 Context.setFILEDecl(Tag->getDecl());
3987 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3988 QualType Jmp_bufType = GetType(Jmp_buf);
3989 if (Jmp_bufType.isNull()) {
3990 Error("jmp_buf type is NULL");
3994 if (!Context.jmp_bufDecl) {
3995 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3996 Context.setjmp_bufDecl(Typedef->getDecl());
3998 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4000 Error("Invalid jmp_buf type in AST file");
4003 Context.setjmp_bufDecl(Tag->getDecl());
4008 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4009 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4010 if (Sigjmp_bufType.isNull()) {
4011 Error("sigjmp_buf type is NULL");
4015 if (!Context.sigjmp_bufDecl) {
4016 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4017 Context.setsigjmp_bufDecl(Typedef->getDecl());
4019 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4020 assert(Tag && "Invalid sigjmp_buf type in AST file");
4021 Context.setsigjmp_bufDecl(Tag->getDecl());
4026 if (unsigned ObjCIdRedef
4027 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4028 if (Context.ObjCIdRedefinitionType.isNull())
4029 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4032 if (unsigned ObjCClassRedef
4033 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4034 if (Context.ObjCClassRedefinitionType.isNull())
4035 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4038 if (unsigned ObjCSelRedef
4039 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4040 if (Context.ObjCSelRedefinitionType.isNull())
4041 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4044 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4045 QualType Ucontext_tType = GetType(Ucontext_t);
4046 if (Ucontext_tType.isNull()) {
4047 Error("ucontext_t type is NULL");
4051 if (!Context.ucontext_tDecl) {
4052 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4053 Context.setucontext_tDecl(Typedef->getDecl());
4055 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4056 assert(Tag && "Invalid ucontext_t type in AST file");
4057 Context.setucontext_tDecl(Tag->getDecl());
4063 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4065 // If there were any CUDA special declarations, deserialize them.
4066 if (!CUDASpecialDeclRefs.empty()) {
4067 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4068 Context.setcudaConfigureCallDecl(
4069 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4072 // Re-export any modules that were imported by a non-module AST file.
4073 // FIXME: This does not make macro-only imports visible again.
4074 for (auto &Import : ImportedModules) {
4075 if (Module *Imported = getSubmodule(Import.ID)) {
4076 makeModuleVisible(Imported, Module::AllVisible,
4077 /*ImportLoc=*/Import.ImportLoc);
4078 if (Import.ImportLoc.isValid())
4079 PP.makeModuleVisible(Imported, Import.ImportLoc);
4080 // FIXME: should we tell Sema to make the module visible too?
4083 ImportedModules.clear();
4086 void ASTReader::finalizeForWriting() {
4087 // Nothing to do for now.
4090 /// \brief Reads and return the signature record from \p StreamFile's control
4091 /// block, or else returns 0.
4092 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){
4093 BitstreamCursor Stream(StreamFile);
4094 if (!startsWithASTFileMagic(Stream))
4097 // Scan for the CONTROL_BLOCK_ID block.
4098 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4101 // Scan for SIGNATURE inside the control block.
4102 ASTReader::RecordData Record;
4104 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4105 if (Entry.Kind == llvm::BitstreamEntry::EndBlock ||
4106 Entry.Kind != llvm::BitstreamEntry::Record)
4111 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4116 /// \brief Retrieve the name of the original source file name
4117 /// directly from the AST file, without actually loading the AST
4119 std::string ASTReader::getOriginalSourceFile(
4120 const std::string &ASTFileName, FileManager &FileMgr,
4121 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
4122 // Open the AST file.
4123 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
4125 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4126 << ASTFileName << Buffer.getError().message();
4127 return std::string();
4130 // Initialize the stream
4131 llvm::BitstreamReader StreamFile;
4132 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
4133 BitstreamCursor Stream(StreamFile);
4135 // Sniff for the signature.
4136 if (!startsWithASTFileMagic(Stream)) {
4137 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4138 return std::string();
4141 // Scan for the CONTROL_BLOCK_ID block.
4142 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
4143 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4144 return std::string();
4147 // Scan for ORIGINAL_FILE inside the control block.
4150 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4151 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4152 return std::string();
4154 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4155 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4156 return std::string();
4161 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4167 class SimplePCHValidator : public ASTReaderListener {
4168 const LangOptions &ExistingLangOpts;
4169 const TargetOptions &ExistingTargetOpts;
4170 const PreprocessorOptions &ExistingPPOpts;
4171 std::string ExistingModuleCachePath;
4172 FileManager &FileMgr;
4175 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4176 const TargetOptions &ExistingTargetOpts,
4177 const PreprocessorOptions &ExistingPPOpts,
4178 StringRef ExistingModuleCachePath,
4179 FileManager &FileMgr)
4180 : ExistingLangOpts(ExistingLangOpts),
4181 ExistingTargetOpts(ExistingTargetOpts),
4182 ExistingPPOpts(ExistingPPOpts),
4183 ExistingModuleCachePath(ExistingModuleCachePath),
4188 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4189 bool AllowCompatibleDifferences) override {
4190 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4191 AllowCompatibleDifferences);
4193 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4194 bool AllowCompatibleDifferences) override {
4195 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4196 AllowCompatibleDifferences);
4198 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4199 StringRef SpecificModuleCachePath,
4200 bool Complain) override {
4201 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4202 ExistingModuleCachePath,
4203 nullptr, ExistingLangOpts);
4205 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4207 std::string &SuggestedPredefines) override {
4208 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4209 SuggestedPredefines, ExistingLangOpts);
4214 bool ASTReader::readASTFileControlBlock(
4215 StringRef Filename, FileManager &FileMgr,
4216 const PCHContainerReader &PCHContainerRdr,
4217 bool FindModuleFileExtensions,
4218 ASTReaderListener &Listener) {
4219 // Open the AST file.
4220 // FIXME: This allows use of the VFS; we do not allow use of the
4221 // VFS when actually loading a module.
4222 auto Buffer = FileMgr.getBufferForFile(Filename);
4227 // Initialize the stream
4228 llvm::BitstreamReader StreamFile;
4229 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile);
4230 BitstreamCursor Stream(StreamFile);
4232 // Sniff for the signature.
4233 if (!startsWithASTFileMagic(Stream))
4236 // Scan for the CONTROL_BLOCK_ID block.
4237 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4240 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4241 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4242 bool NeedsImports = Listener.needsImportVisitation();
4243 BitstreamCursor InputFilesCursor;
4246 std::string ModuleDir;
4247 bool DoneWithControlBlock = false;
4248 while (!DoneWithControlBlock) {
4249 llvm::BitstreamEntry Entry = Stream.advance();
4251 switch (Entry.Kind) {
4252 case llvm::BitstreamEntry::SubBlock: {
4254 case OPTIONS_BLOCK_ID: {
4255 std::string IgnoredSuggestedPredefines;
4256 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
4257 /*AllowCompatibleConfigurationMismatch*/ false,
4258 Listener, IgnoredSuggestedPredefines) != Success)
4263 case INPUT_FILES_BLOCK_ID:
4264 InputFilesCursor = Stream;
4265 if (Stream.SkipBlock() ||
4267 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)))
4272 if (Stream.SkipBlock())
4280 case llvm::BitstreamEntry::EndBlock:
4281 DoneWithControlBlock = true;
4284 case llvm::BitstreamEntry::Error:
4287 case llvm::BitstreamEntry::Record:
4291 if (DoneWithControlBlock) break;
4295 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4296 switch ((ControlRecordTypes)RecCode) {
4298 if (Record[0] != VERSION_MAJOR)
4301 if (Listener.ReadFullVersionInformation(Blob))
4307 Listener.ReadModuleName(Blob);
4309 case MODULE_DIRECTORY:
4312 case MODULE_MAP_FILE: {
4314 auto Path = ReadString(Record, Idx);
4315 ResolveImportedPath(Path, ModuleDir);
4316 Listener.ReadModuleMapFile(Path);
4319 case INPUT_FILE_OFFSETS: {
4320 if (!NeedsInputFiles)
4323 unsigned NumInputFiles = Record[0];
4324 unsigned NumUserFiles = Record[1];
4325 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
4326 for (unsigned I = 0; I != NumInputFiles; ++I) {
4327 // Go find this input file.
4328 bool isSystemFile = I >= NumUserFiles;
4330 if (isSystemFile && !NeedsSystemInputFiles)
4331 break; // the rest are system input files
4333 BitstreamCursor &Cursor = InputFilesCursor;
4334 SavedStreamPosition SavedPosition(Cursor);
4335 Cursor.JumpToBit(InputFileOffs[I]);
4337 unsigned Code = Cursor.ReadCode();
4340 bool shouldContinue = false;
4341 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4343 bool Overridden = static_cast<bool>(Record[3]);
4344 std::string Filename = Blob;
4345 ResolveImportedPath(Filename, ModuleDir);
4346 shouldContinue = Listener.visitInputFile(
4347 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
4350 if (!shouldContinue)
4360 unsigned Idx = 0, N = Record.size();
4362 // Read information about the AST file.
4363 Idx += 5; // ImportLoc, Size, ModTime, Signature
4364 std::string Filename = ReadString(Record, Idx);
4365 ResolveImportedPath(Filename, ModuleDir);
4366 Listener.visitImport(Filename);
4372 // No other validation to perform.
4377 // Look for module file extension blocks, if requested.
4378 if (FindModuleFileExtensions) {
4379 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
4380 bool DoneWithExtensionBlock = false;
4381 while (!DoneWithExtensionBlock) {
4382 llvm::BitstreamEntry Entry = Stream.advance();
4384 switch (Entry.Kind) {
4385 case llvm::BitstreamEntry::SubBlock:
4386 if (Stream.SkipBlock())
4391 case llvm::BitstreamEntry::EndBlock:
4392 DoneWithExtensionBlock = true;
4395 case llvm::BitstreamEntry::Error:
4398 case llvm::BitstreamEntry::Record:
4404 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4406 case EXTENSION_METADATA: {
4407 ModuleFileExtensionMetadata Metadata;
4408 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4411 Listener.readModuleFileExtension(Metadata);
4422 bool ASTReader::isAcceptableASTFile(
4423 StringRef Filename, FileManager &FileMgr,
4424 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
4425 const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts,
4426 std::string ExistingModuleCachePath) {
4427 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4428 ExistingModuleCachePath, FileMgr);
4429 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
4430 /*FindModuleFileExtensions=*/false,
4434 ASTReader::ASTReadResult
4435 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4436 // Enter the submodule block.
4437 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4438 Error("malformed submodule block record in AST file");
4442 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4444 Module *CurrentModule = nullptr;
4447 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4449 switch (Entry.Kind) {
4450 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4451 case llvm::BitstreamEntry::Error:
4452 Error("malformed block record in AST file");
4454 case llvm::BitstreamEntry::EndBlock:
4456 case llvm::BitstreamEntry::Record:
4457 // The interesting case.
4464 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4466 if ((Kind == SUBMODULE_METADATA) != First) {
4467 Error("submodule metadata record should be at beginning of block");
4472 // Submodule information is only valid if we have a current module.
4473 // FIXME: Should we error on these cases?
4474 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4475 Kind != SUBMODULE_DEFINITION)
4479 default: // Default behavior: ignore.
4482 case SUBMODULE_DEFINITION: {
4483 if (Record.size() < 8) {
4484 Error("malformed module definition");
4488 StringRef Name = Blob;
4490 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4491 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4492 bool IsFramework = Record[Idx++];
4493 bool IsExplicit = Record[Idx++];
4494 bool IsSystem = Record[Idx++];
4495 bool IsExternC = Record[Idx++];
4496 bool InferSubmodules = Record[Idx++];
4497 bool InferExplicitSubmodules = Record[Idx++];
4498 bool InferExportWildcard = Record[Idx++];
4499 bool ConfigMacrosExhaustive = Record[Idx++];
4501 Module *ParentModule = nullptr;
4503 ParentModule = getSubmodule(Parent);
4505 // Retrieve this (sub)module from the module map, creating it if
4507 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
4510 // FIXME: set the definition loc for CurrentModule, or call
4511 // ModMap.setInferredModuleAllowedBy()
4513 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4514 if (GlobalIndex >= SubmodulesLoaded.size() ||
4515 SubmodulesLoaded[GlobalIndex]) {
4516 Error("too many submodules");
4520 if (!ParentModule) {
4521 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4522 if (CurFile != F.File) {
4523 if (!Diags.isDiagnosticInFlight()) {
4524 Diag(diag::err_module_file_conflict)
4525 << CurrentModule->getTopLevelModuleName()
4526 << CurFile->getName()
4527 << F.File->getName();
4533 CurrentModule->setASTFile(F.File);
4536 CurrentModule->Signature = F.Signature;
4537 CurrentModule->IsFromModuleFile = true;
4538 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
4539 CurrentModule->IsExternC = IsExternC;
4540 CurrentModule->InferSubmodules = InferSubmodules;
4541 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4542 CurrentModule->InferExportWildcard = InferExportWildcard;
4543 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
4544 if (DeserializationListener)
4545 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4547 SubmodulesLoaded[GlobalIndex] = CurrentModule;
4549 // Clear out data that will be replaced by what is in the module file.
4550 CurrentModule->LinkLibraries.clear();
4551 CurrentModule->ConfigMacros.clear();
4552 CurrentModule->UnresolvedConflicts.clear();
4553 CurrentModule->Conflicts.clear();
4555 // The module is available unless it's missing a requirement; relevant
4556 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
4557 // Missing headers that were present when the module was built do not
4558 // make it unavailable -- if we got this far, this must be an explicitly
4559 // imported module file.
4560 CurrentModule->Requirements.clear();
4561 CurrentModule->MissingHeaders.clear();
4562 CurrentModule->IsMissingRequirement =
4563 ParentModule && ParentModule->IsMissingRequirement;
4564 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement;
4568 case SUBMODULE_UMBRELLA_HEADER: {
4569 std::string Filename = Blob;
4570 ResolveImportedPath(F, Filename);
4571 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) {
4572 if (!CurrentModule->getUmbrellaHeader())
4573 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob);
4574 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) {
4575 // This can be a spurious difference caused by changing the VFS to
4576 // point to a different copy of the file, and it is too late to
4577 // to rebuild safely.
4578 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4579 // after input file validation only real problems would remain and we
4580 // could just error. For now, assume it's okay.
4587 case SUBMODULE_HEADER:
4588 case SUBMODULE_EXCLUDED_HEADER:
4589 case SUBMODULE_PRIVATE_HEADER:
4590 // We lazily associate headers with their modules via the HeaderInfo table.
4591 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4592 // of complete filenames or remove it entirely.
4595 case SUBMODULE_TEXTUAL_HEADER:
4596 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4597 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4601 case SUBMODULE_TOPHEADER: {
4602 CurrentModule->addTopHeaderFilename(Blob);
4606 case SUBMODULE_UMBRELLA_DIR: {
4607 std::string Dirname = Blob;
4608 ResolveImportedPath(F, Dirname);
4609 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) {
4610 if (!CurrentModule->getUmbrellaDir())
4611 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob);
4612 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) {
4613 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4614 Error("mismatched umbrella directories in submodule");
4621 case SUBMODULE_METADATA: {
4622 F.BaseSubmoduleID = getTotalNumSubmodules();
4623 F.LocalNumSubmodules = Record[0];
4624 unsigned LocalBaseSubmoduleID = Record[1];
4625 if (F.LocalNumSubmodules > 0) {
4626 // Introduce the global -> local mapping for submodules within this
4628 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4630 // Introduce the local -> global mapping for submodules within this
4632 F.SubmoduleRemap.insertOrReplace(
4633 std::make_pair(LocalBaseSubmoduleID,
4634 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4636 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4641 case SUBMODULE_IMPORTS: {
4642 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
4643 UnresolvedModuleRef Unresolved;
4644 Unresolved.File = &F;
4645 Unresolved.Mod = CurrentModule;
4646 Unresolved.ID = Record[Idx];
4647 Unresolved.Kind = UnresolvedModuleRef::Import;
4648 Unresolved.IsWildcard = false;
4649 UnresolvedModuleRefs.push_back(Unresolved);
4654 case SUBMODULE_EXPORTS: {
4655 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
4656 UnresolvedModuleRef Unresolved;
4657 Unresolved.File = &F;
4658 Unresolved.Mod = CurrentModule;
4659 Unresolved.ID = Record[Idx];
4660 Unresolved.Kind = UnresolvedModuleRef::Export;
4661 Unresolved.IsWildcard = Record[Idx + 1];
4662 UnresolvedModuleRefs.push_back(Unresolved);
4665 // Once we've loaded the set of exports, there's no reason to keep
4666 // the parsed, unresolved exports around.
4667 CurrentModule->UnresolvedExports.clear();
4670 case SUBMODULE_REQUIRES: {
4671 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
4672 Context.getTargetInfo());
4676 case SUBMODULE_LINK_LIBRARY:
4677 CurrentModule->LinkLibraries.push_back(
4678 Module::LinkLibrary(Blob, Record[0]));
4681 case SUBMODULE_CONFIG_MACRO:
4682 CurrentModule->ConfigMacros.push_back(Blob.str());
4685 case SUBMODULE_CONFLICT: {
4686 UnresolvedModuleRef Unresolved;
4687 Unresolved.File = &F;
4688 Unresolved.Mod = CurrentModule;
4689 Unresolved.ID = Record[0];
4690 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4691 Unresolved.IsWildcard = false;
4692 Unresolved.String = Blob;
4693 UnresolvedModuleRefs.push_back(Unresolved);
4700 /// \brief Parse the record that corresponds to a LangOptions data
4703 /// This routine parses the language options from the AST file and then gives
4704 /// them to the AST listener if one is set.
4706 /// \returns true if the listener deems the file unacceptable, false otherwise.
4707 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4709 ASTReaderListener &Listener,
4710 bool AllowCompatibleDifferences) {
4711 LangOptions LangOpts;
4713 #define LANGOPT(Name, Bits, Default, Description) \
4714 LangOpts.Name = Record[Idx++];
4715 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4716 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4717 #include "clang/Basic/LangOptions.def"
4718 #define SANITIZER(NAME, ID) \
4719 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
4720 #include "clang/Basic/Sanitizers.def"
4722 for (unsigned N = Record[Idx++]; N; --N)
4723 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
4725 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4726 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4727 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4729 LangOpts.CurrentModule = ReadString(Record, Idx);
4732 for (unsigned N = Record[Idx++]; N; --N) {
4733 LangOpts.CommentOpts.BlockCommandNames.push_back(
4734 ReadString(Record, Idx));
4736 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
4738 // OpenMP offloading options.
4739 for (unsigned N = Record[Idx++]; N; --N) {
4740 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
4743 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
4745 return Listener.ReadLanguageOptions(LangOpts, Complain,
4746 AllowCompatibleDifferences);
4749 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
4750 ASTReaderListener &Listener,
4751 bool AllowCompatibleDifferences) {
4753 TargetOptions TargetOpts;
4754 TargetOpts.Triple = ReadString(Record, Idx);
4755 TargetOpts.CPU = ReadString(Record, Idx);
4756 TargetOpts.ABI = ReadString(Record, Idx);
4757 for (unsigned N = Record[Idx++]; N; --N) {
4758 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4760 for (unsigned N = Record[Idx++]; N; --N) {
4761 TargetOpts.Features.push_back(ReadString(Record, Idx));
4764 return Listener.ReadTargetOptions(TargetOpts, Complain,
4765 AllowCompatibleDifferences);
4768 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4769 ASTReaderListener &Listener) {
4770 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
4772 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
4773 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
4774 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
4775 #include "clang/Basic/DiagnosticOptions.def"
4777 for (unsigned N = Record[Idx++]; N; --N)
4778 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
4779 for (unsigned N = Record[Idx++]; N; --N)
4780 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
4782 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4785 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4786 ASTReaderListener &Listener) {
4787 FileSystemOptions FSOpts;
4789 FSOpts.WorkingDir = ReadString(Record, Idx);
4790 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4793 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4795 ASTReaderListener &Listener) {
4796 HeaderSearchOptions HSOpts;
4798 HSOpts.Sysroot = ReadString(Record, Idx);
4801 for (unsigned N = Record[Idx++]; N; --N) {
4802 std::string Path = ReadString(Record, Idx);
4803 frontend::IncludeDirGroup Group
4804 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
4805 bool IsFramework = Record[Idx++];
4806 bool IgnoreSysRoot = Record[Idx++];
4807 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
4811 // System header prefixes.
4812 for (unsigned N = Record[Idx++]; N; --N) {
4813 std::string Prefix = ReadString(Record, Idx);
4814 bool IsSystemHeader = Record[Idx++];
4815 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
4818 HSOpts.ResourceDir = ReadString(Record, Idx);
4819 HSOpts.ModuleCachePath = ReadString(Record, Idx);
4820 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
4821 HSOpts.DisableModuleHash = Record[Idx++];
4822 HSOpts.UseBuiltinIncludes = Record[Idx++];
4823 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4824 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4825 HSOpts.UseLibcxx = Record[Idx++];
4826 std::string SpecificModuleCachePath = ReadString(Record, Idx);
4828 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4832 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4834 ASTReaderListener &Listener,
4835 std::string &SuggestedPredefines) {
4836 PreprocessorOptions PPOpts;
4839 // Macro definitions/undefs
4840 for (unsigned N = Record[Idx++]; N; --N) {
4841 std::string Macro = ReadString(Record, Idx);
4842 bool IsUndef = Record[Idx++];
4843 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4847 for (unsigned N = Record[Idx++]; N; --N) {
4848 PPOpts.Includes.push_back(ReadString(Record, Idx));
4852 for (unsigned N = Record[Idx++]; N; --N) {
4853 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4856 PPOpts.UsePredefines = Record[Idx++];
4857 PPOpts.DetailedRecord = Record[Idx++];
4858 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4859 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4860 PPOpts.ObjCXXARCStandardLibrary =
4861 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4862 SuggestedPredefines.clear();
4863 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4864 SuggestedPredefines);
4867 std::pair<ModuleFile *, unsigned>
4868 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4869 GlobalPreprocessedEntityMapType::iterator
4870 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4871 assert(I != GlobalPreprocessedEntityMap.end() &&
4872 "Corrupted global preprocessed entity map");
4873 ModuleFile *M = I->second;
4874 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4875 return std::make_pair(M, LocalIndex);
4878 llvm::iterator_range<PreprocessingRecord::iterator>
4879 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4880 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4881 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4882 Mod.NumPreprocessedEntities);
4884 return llvm::make_range(PreprocessingRecord::iterator(),
4885 PreprocessingRecord::iterator());
4888 llvm::iterator_range<ASTReader::ModuleDeclIterator>
4889 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4890 return llvm::make_range(
4891 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4892 ModuleDeclIterator(this, &Mod,
4893 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4896 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4897 PreprocessedEntityID PPID = Index+1;
4898 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4899 ModuleFile &M = *PPInfo.first;
4900 unsigned LocalIndex = PPInfo.second;
4901 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4903 if (!PP.getPreprocessingRecord()) {
4904 Error("no preprocessing record");
4908 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4909 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4911 llvm::BitstreamEntry Entry =
4912 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4913 if (Entry.Kind != llvm::BitstreamEntry::Record)
4917 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
4918 TranslateSourceLocation(M, PPOffs.getEnd()));
4919 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
4922 PreprocessorDetailRecordTypes RecType =
4923 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4924 Entry.ID, Record, &Blob);
4926 case PPD_MACRO_EXPANSION: {
4927 bool isBuiltin = Record[0];
4928 IdentifierInfo *Name = nullptr;
4929 MacroDefinitionRecord *Def = nullptr;
4931 Name = getLocalIdentifier(M, Record[1]);
4933 PreprocessedEntityID GlobalID =
4934 getGlobalPreprocessedEntityID(M, Record[1]);
4935 Def = cast<MacroDefinitionRecord>(
4936 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
4941 ME = new (PPRec) MacroExpansion(Name, Range);
4943 ME = new (PPRec) MacroExpansion(Def, Range);
4948 case PPD_MACRO_DEFINITION: {
4949 // Decode the identifier info and then check again; if the macro is
4950 // still defined and associated with the identifier,
4951 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4952 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
4954 if (DeserializationListener)
4955 DeserializationListener->MacroDefinitionRead(PPID, MD);
4960 case PPD_INCLUSION_DIRECTIVE: {
4961 const char *FullFileNameStart = Blob.data() + Record[0];
4962 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
4963 const FileEntry *File = nullptr;
4964 if (!FullFileName.empty())
4965 File = PP.getFileManager().getFile(FullFileName);
4967 // FIXME: Stable encoding
4968 InclusionDirective::InclusionKind Kind
4969 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4970 InclusionDirective *ID
4971 = new (PPRec) InclusionDirective(PPRec, Kind,
4972 StringRef(Blob.data(), Record[0]),
4973 Record[1], Record[3],
4980 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4983 /// \brief \arg SLocMapI points at a chunk of a module that contains no
4984 /// preprocessed entities or the entities it contains are not the ones we are
4985 /// looking for. Find the next module that contains entities and return the ID
4986 /// of the first entry.
4987 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4988 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4990 for (GlobalSLocOffsetMapType::const_iterator
4991 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4992 ModuleFile &M = *SLocMapI->second;
4993 if (M.NumPreprocessedEntities)
4994 return M.BasePreprocessedEntityID;
4997 return getTotalNumPreprocessedEntities();
5002 struct PPEntityComp {
5003 const ASTReader &Reader;
5006 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
5008 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5009 SourceLocation LHS = getLoc(L);
5010 SourceLocation RHS = getLoc(R);
5011 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5014 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5015 SourceLocation LHS = getLoc(L);
5016 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5019 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5020 SourceLocation RHS = getLoc(R);
5021 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5024 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5025 return Reader.TranslateSourceLocation(M, PPE.getBegin());
5031 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5032 bool EndsAfter) const {
5033 if (SourceMgr.isLocalSourceLocation(Loc))
5034 return getTotalNumPreprocessedEntities();
5036 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5037 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
5038 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
5039 "Corrupted global sloc offset map");
5041 if (SLocMapI->second->NumPreprocessedEntities == 0)
5042 return findNextPreprocessedEntity(SLocMapI);
5044 ModuleFile &M = *SLocMapI->second;
5045 typedef const PPEntityOffset *pp_iterator;
5046 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5047 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5049 size_t Count = M.NumPreprocessedEntities;
5051 pp_iterator First = pp_begin;
5055 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5056 PPEntityComp(*this, M));
5058 // Do a binary search manually instead of using std::lower_bound because
5059 // The end locations of entities may be unordered (when a macro expansion
5060 // is inside another macro argument), but for this case it is not important
5061 // whether we get the first macro expansion or its containing macro.
5065 std::advance(PPI, Half);
5066 if (SourceMgr.isBeforeInTranslationUnit(
5067 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
5070 Count = Count - Half - 1;
5077 return findNextPreprocessedEntity(SLocMapI);
5079 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5082 /// \brief Returns a pair of [Begin, End) indices of preallocated
5083 /// preprocessed entities that \arg Range encompasses.
5084 std::pair<unsigned, unsigned>
5085 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5086 if (Range.isInvalid())
5087 return std::make_pair(0,0);
5088 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5090 PreprocessedEntityID BeginID =
5091 findPreprocessedEntity(Range.getBegin(), false);
5092 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
5093 return std::make_pair(BeginID, EndID);
5096 /// \brief Optionally returns true or false if the preallocated preprocessed
5097 /// entity with index \arg Index came from file \arg FID.
5098 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
5100 if (FID.isInvalid())
5103 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5104 ModuleFile &M = *PPInfo.first;
5105 unsigned LocalIndex = PPInfo.second;
5106 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5108 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
5109 if (Loc.isInvalid())
5112 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5119 /// \brief Visitor used to search for information about a header file.
5120 class HeaderFileInfoVisitor {
5121 const FileEntry *FE;
5123 Optional<HeaderFileInfo> HFI;
5126 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5129 bool operator()(ModuleFile &M) {
5130 HeaderFileInfoLookupTable *Table
5131 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5135 // Look in the on-disk hash table for an entry for this file name.
5136 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
5137 if (Pos == Table->end())
5144 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
5148 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
5149 HeaderFileInfoVisitor Visitor(FE);
5150 ModuleMgr.visit(Visitor);
5151 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
5154 return HeaderFileInfo();
5157 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5158 // FIXME: Make it work properly with modules.
5159 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
5160 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5161 ModuleFile &F = *(*I);
5164 assert(!Diag.DiagStates.empty());
5165 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5166 while (Idx < F.PragmaDiagMappings.size()) {
5167 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5168 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5169 if (DiagStateID != 0) {
5170 Diag.DiagStatePoints.push_back(
5171 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5172 FullSourceLoc(Loc, SourceMgr)));
5176 assert(DiagStateID == 0);
5177 // A new DiagState was created here.
5178 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5179 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5180 DiagStates.push_back(NewState);
5181 Diag.DiagStatePoints.push_back(
5182 DiagnosticsEngine::DiagStatePoint(NewState,
5183 FullSourceLoc(Loc, SourceMgr)));
5185 assert(Idx < F.PragmaDiagMappings.size() &&
5186 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5187 if (Idx >= F.PragmaDiagMappings.size()) {
5188 break; // Something is messed up but at least avoid infinite loop in
5191 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5192 if (DiagID == (unsigned)-1) {
5193 break; // no more diag/map pairs for this location.
5195 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5196 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5197 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
5203 /// \brief Get the correct cursor and offset for loading a type.
5204 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5205 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5206 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5207 ModuleFile *M = I->second;
5208 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5211 /// \brief Read and return the type with the given index..
5213 /// The index is the type ID, shifted and minus the number of predefs. This
5214 /// routine actually reads the record corresponding to the type at the given
5215 /// location. It is a helper routine for GetType, which deals with reading type
5217 QualType ASTReader::readTypeRecord(unsigned Index) {
5218 RecordLocation Loc = TypeCursorForIndex(Index);
5219 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5221 // Keep track of where we are in the stream, then jump back there
5222 // after reading this type.
5223 SavedStreamPosition SavedPosition(DeclsCursor);
5225 ReadingKindTracker ReadingKind(Read_Type, *this);
5227 // Note that we are loading a type record.
5228 Deserializing AType(this);
5231 DeclsCursor.JumpToBit(Loc.Offset);
5233 unsigned Code = DeclsCursor.ReadCode();
5234 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5235 case TYPE_EXT_QUAL: {
5236 if (Record.size() != 2) {
5237 Error("Incorrect encoding of extended qualifier type");
5240 QualType Base = readType(*Loc.F, Record, Idx);
5241 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5242 return Context.getQualifiedType(Base, Quals);
5245 case TYPE_COMPLEX: {
5246 if (Record.size() != 1) {
5247 Error("Incorrect encoding of complex type");
5250 QualType ElemType = readType(*Loc.F, Record, Idx);
5251 return Context.getComplexType(ElemType);
5254 case TYPE_POINTER: {
5255 if (Record.size() != 1) {
5256 Error("Incorrect encoding of pointer type");
5259 QualType PointeeType = readType(*Loc.F, Record, Idx);
5260 return Context.getPointerType(PointeeType);
5263 case TYPE_DECAYED: {
5264 if (Record.size() != 1) {
5265 Error("Incorrect encoding of decayed type");
5268 QualType OriginalType = readType(*Loc.F, Record, Idx);
5269 QualType DT = Context.getAdjustedParameterType(OriginalType);
5270 if (!isa<DecayedType>(DT))
5271 Error("Decayed type does not decay");
5275 case TYPE_ADJUSTED: {
5276 if (Record.size() != 2) {
5277 Error("Incorrect encoding of adjusted type");
5280 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5281 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5282 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5285 case TYPE_BLOCK_POINTER: {
5286 if (Record.size() != 1) {
5287 Error("Incorrect encoding of block pointer type");
5290 QualType PointeeType = readType(*Loc.F, Record, Idx);
5291 return Context.getBlockPointerType(PointeeType);
5294 case TYPE_LVALUE_REFERENCE: {
5295 if (Record.size() != 2) {
5296 Error("Incorrect encoding of lvalue reference type");
5299 QualType PointeeType = readType(*Loc.F, Record, Idx);
5300 return Context.getLValueReferenceType(PointeeType, Record[1]);
5303 case TYPE_RVALUE_REFERENCE: {
5304 if (Record.size() != 1) {
5305 Error("Incorrect encoding of rvalue reference type");
5308 QualType PointeeType = readType(*Loc.F, Record, Idx);
5309 return Context.getRValueReferenceType(PointeeType);
5312 case TYPE_MEMBER_POINTER: {
5313 if (Record.size() != 2) {
5314 Error("Incorrect encoding of member pointer type");
5317 QualType PointeeType = readType(*Loc.F, Record, Idx);
5318 QualType ClassType = readType(*Loc.F, Record, Idx);
5319 if (PointeeType.isNull() || ClassType.isNull())
5322 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5325 case TYPE_CONSTANT_ARRAY: {
5326 QualType ElementType = readType(*Loc.F, Record, Idx);
5327 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5328 unsigned IndexTypeQuals = Record[2];
5330 llvm::APInt Size = ReadAPInt(Record, Idx);
5331 return Context.getConstantArrayType(ElementType, Size,
5332 ASM, IndexTypeQuals);
5335 case TYPE_INCOMPLETE_ARRAY: {
5336 QualType ElementType = readType(*Loc.F, Record, Idx);
5337 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5338 unsigned IndexTypeQuals = Record[2];
5339 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5342 case TYPE_VARIABLE_ARRAY: {
5343 QualType ElementType = readType(*Loc.F, Record, Idx);
5344 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5345 unsigned IndexTypeQuals = Record[2];
5346 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5347 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5348 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5349 ASM, IndexTypeQuals,
5350 SourceRange(LBLoc, RBLoc));
5354 if (Record.size() != 3) {
5355 Error("incorrect encoding of vector type in AST file");
5359 QualType ElementType = readType(*Loc.F, Record, Idx);
5360 unsigned NumElements = Record[1];
5361 unsigned VecKind = Record[2];
5362 return Context.getVectorType(ElementType, NumElements,
5363 (VectorType::VectorKind)VecKind);
5366 case TYPE_EXT_VECTOR: {
5367 if (Record.size() != 3) {
5368 Error("incorrect encoding of extended vector type in AST file");
5372 QualType ElementType = readType(*Loc.F, Record, Idx);
5373 unsigned NumElements = Record[1];
5374 return Context.getExtVectorType(ElementType, NumElements);
5377 case TYPE_FUNCTION_NO_PROTO: {
5378 if (Record.size() != 6) {
5379 Error("incorrect encoding of no-proto function type");
5382 QualType ResultType = readType(*Loc.F, Record, Idx);
5383 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5384 (CallingConv)Record[4], Record[5]);
5385 return Context.getFunctionNoProtoType(ResultType, Info);
5388 case TYPE_FUNCTION_PROTO: {
5389 QualType ResultType = readType(*Loc.F, Record, Idx);
5391 FunctionProtoType::ExtProtoInfo EPI;
5392 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5393 /*hasregparm*/ Record[2],
5394 /*regparm*/ Record[3],
5395 static_cast<CallingConv>(Record[4]),
5396 /*produces*/ Record[5]);
5400 EPI.Variadic = Record[Idx++];
5401 EPI.HasTrailingReturn = Record[Idx++];
5402 EPI.TypeQuals = Record[Idx++];
5403 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
5404 SmallVector<QualType, 8> ExceptionStorage;
5405 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
5407 unsigned NumParams = Record[Idx++];
5408 SmallVector<QualType, 16> ParamTypes;
5409 for (unsigned I = 0; I != NumParams; ++I)
5410 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5412 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos;
5413 if (Idx != Record.size()) {
5414 for (unsigned I = 0; I != NumParams; ++I)
5415 ExtParameterInfos.push_back(
5416 FunctionProtoType::ExtParameterInfo
5417 ::getFromOpaqueValue(Record[Idx++]));
5418 EPI.ExtParameterInfos = ExtParameterInfos.data();
5421 assert(Idx == Record.size());
5423 return Context.getFunctionType(ResultType, ParamTypes, EPI);
5426 case TYPE_UNRESOLVED_USING: {
5428 return Context.getTypeDeclType(
5429 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5432 case TYPE_TYPEDEF: {
5433 if (Record.size() != 2) {
5434 Error("incorrect encoding of typedef type");
5438 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5439 QualType Canonical = readType(*Loc.F, Record, Idx);
5440 if (!Canonical.isNull())
5441 Canonical = Context.getCanonicalType(Canonical);
5442 return Context.getTypedefType(Decl, Canonical);
5445 case TYPE_TYPEOF_EXPR:
5446 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5449 if (Record.size() != 1) {
5450 Error("incorrect encoding of typeof(type) in AST file");
5453 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5454 return Context.getTypeOfType(UnderlyingType);
5457 case TYPE_DECLTYPE: {
5458 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5459 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5462 case TYPE_UNARY_TRANSFORM: {
5463 QualType BaseType = readType(*Loc.F, Record, Idx);
5464 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5465 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5466 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5470 QualType Deduced = readType(*Loc.F, Record, Idx);
5471 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++];
5472 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
5473 return Context.getAutoType(Deduced, Keyword, IsDependent);
5477 if (Record.size() != 2) {
5478 Error("incorrect encoding of record type");
5482 bool IsDependent = Record[Idx++];
5483 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5484 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5485 QualType T = Context.getRecordType(RD);
5486 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5491 if (Record.size() != 2) {
5492 Error("incorrect encoding of enum type");
5496 bool IsDependent = Record[Idx++];
5498 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5499 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5503 case TYPE_ATTRIBUTED: {
5504 if (Record.size() != 3) {
5505 Error("incorrect encoding of attributed type");
5508 QualType modifiedType = readType(*Loc.F, Record, Idx);
5509 QualType equivalentType = readType(*Loc.F, Record, Idx);
5510 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5511 return Context.getAttributedType(kind, modifiedType, equivalentType);
5515 if (Record.size() != 1) {
5516 Error("incorrect encoding of paren type");
5519 QualType InnerType = readType(*Loc.F, Record, Idx);
5520 return Context.getParenType(InnerType);
5523 case TYPE_PACK_EXPANSION: {
5524 if (Record.size() != 2) {
5525 Error("incorrect encoding of pack expansion type");
5528 QualType Pattern = readType(*Loc.F, Record, Idx);
5529 if (Pattern.isNull())
5531 Optional<unsigned> NumExpansions;
5533 NumExpansions = Record[1] - 1;
5534 return Context.getPackExpansionType(Pattern, NumExpansions);
5537 case TYPE_ELABORATED: {
5539 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5540 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5541 QualType NamedType = readType(*Loc.F, Record, Idx);
5542 return Context.getElaboratedType(Keyword, NNS, NamedType);
5545 case TYPE_OBJC_INTERFACE: {
5547 ObjCInterfaceDecl *ItfD
5548 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5549 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5552 case TYPE_OBJC_OBJECT: {
5554 QualType Base = readType(*Loc.F, Record, Idx);
5555 unsigned NumTypeArgs = Record[Idx++];
5556 SmallVector<QualType, 4> TypeArgs;
5557 for (unsigned I = 0; I != NumTypeArgs; ++I)
5558 TypeArgs.push_back(readType(*Loc.F, Record, Idx));
5559 unsigned NumProtos = Record[Idx++];
5560 SmallVector<ObjCProtocolDecl*, 4> Protos;
5561 for (unsigned I = 0; I != NumProtos; ++I)
5562 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5563 bool IsKindOf = Record[Idx++];
5564 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf);
5567 case TYPE_OBJC_OBJECT_POINTER: {
5569 QualType Pointee = readType(*Loc.F, Record, Idx);
5570 return Context.getObjCObjectPointerType(Pointee);
5573 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5575 QualType Parm = readType(*Loc.F, Record, Idx);
5576 QualType Replacement = readType(*Loc.F, Record, Idx);
5577 return Context.getSubstTemplateTypeParmType(
5578 cast<TemplateTypeParmType>(Parm),
5579 Context.getCanonicalType(Replacement));
5582 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5584 QualType Parm = readType(*Loc.F, Record, Idx);
5585 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5586 return Context.getSubstTemplateTypeParmPackType(
5587 cast<TemplateTypeParmType>(Parm),
5591 case TYPE_INJECTED_CLASS_NAME: {
5592 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5593 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5594 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5595 // for AST reading, too much interdependencies.
5596 const Type *T = nullptr;
5597 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5598 if (const Type *Existing = DI->getTypeForDecl()) {
5604 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5605 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5606 DI->setTypeForDecl(T);
5608 return QualType(T, 0);
5611 case TYPE_TEMPLATE_TYPE_PARM: {
5613 unsigned Depth = Record[Idx++];
5614 unsigned Index = Record[Idx++];
5615 bool Pack = Record[Idx++];
5616 TemplateTypeParmDecl *D
5617 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5618 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5621 case TYPE_DEPENDENT_NAME: {
5623 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5624 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5625 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
5626 QualType Canon = readType(*Loc.F, Record, Idx);
5627 if (!Canon.isNull())
5628 Canon = Context.getCanonicalType(Canon);
5629 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5632 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5634 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5635 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5636 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
5637 unsigned NumArgs = Record[Idx++];
5638 SmallVector<TemplateArgument, 8> Args;
5639 Args.reserve(NumArgs);
5641 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5642 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5643 Args.size(), Args.data());
5646 case TYPE_DEPENDENT_SIZED_ARRAY: {
5650 QualType ElementType = readType(*Loc.F, Record, Idx);
5651 ArrayType::ArraySizeModifier ASM
5652 = (ArrayType::ArraySizeModifier)Record[Idx++];
5653 unsigned IndexTypeQuals = Record[Idx++];
5655 // DependentSizedArrayType
5656 Expr *NumElts = ReadExpr(*Loc.F);
5657 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5659 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5660 IndexTypeQuals, Brackets);
5663 case TYPE_TEMPLATE_SPECIALIZATION: {
5665 bool IsDependent = Record[Idx++];
5666 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5667 SmallVector<TemplateArgument, 8> Args;
5668 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5669 QualType Underlying = readType(*Loc.F, Record, Idx);
5671 if (Underlying.isNull())
5672 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5675 T = Context.getTemplateSpecializationType(Name, Args.data(),
5676 Args.size(), Underlying);
5677 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5682 if (Record.size() != 1) {
5683 Error("Incorrect encoding of atomic type");
5686 QualType ValueType = readType(*Loc.F, Record, Idx);
5687 return Context.getAtomicType(ValueType);
5691 if (Record.size() != 1) {
5692 Error("Incorrect encoding of pipe type");
5696 // Reading the pipe element type.
5697 QualType ElementType = readType(*Loc.F, Record, Idx);
5698 return Context.getPipeType(ElementType);
5701 llvm_unreachable("Invalid TypeCode!");
5704 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5705 SmallVectorImpl<QualType> &Exceptions,
5706 FunctionProtoType::ExceptionSpecInfo &ESI,
5707 const RecordData &Record, unsigned &Idx) {
5708 ExceptionSpecificationType EST =
5709 static_cast<ExceptionSpecificationType>(Record[Idx++]);
5711 if (EST == EST_Dynamic) {
5712 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
5713 Exceptions.push_back(readType(ModuleFile, Record, Idx));
5714 ESI.Exceptions = Exceptions;
5715 } else if (EST == EST_ComputedNoexcept) {
5716 ESI.NoexceptExpr = ReadExpr(ModuleFile);
5717 } else if (EST == EST_Uninstantiated) {
5718 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5719 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5720 } else if (EST == EST_Unevaluated) {
5721 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5725 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5728 const ASTReader::RecordData &Record;
5731 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5733 return Reader.ReadSourceLocation(F, R, I);
5736 template<typename T>
5737 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5738 return Reader.ReadDeclAs<T>(F, Record, Idx);
5742 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5743 const ASTReader::RecordData &Record, unsigned &Idx)
5744 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5747 // We want compile-time assurance that we've enumerated all of
5748 // these, so unfortunately we have to declare them first, then
5749 // define them out-of-line.
5750 #define ABSTRACT_TYPELOC(CLASS, PARENT)
5751 #define TYPELOC(CLASS, PARENT) \
5752 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5753 #include "clang/AST/TypeLocNodes.def"
5755 void VisitFunctionTypeLoc(FunctionTypeLoc);
5756 void VisitArrayTypeLoc(ArrayTypeLoc);
5759 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5762 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5763 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5764 if (TL.needsExtraLocalData()) {
5765 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5766 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5767 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5768 TL.setModeAttr(Record[Idx++]);
5771 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5772 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5774 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5775 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5777 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5780 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5783 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5784 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5786 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5787 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5789 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5790 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5792 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5793 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5794 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5796 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5797 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5798 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5800 TL.setSizeExpr(Reader.ReadExpr(F));
5802 TL.setSizeExpr(nullptr);
5804 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5805 VisitArrayTypeLoc(TL);
5807 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5808 VisitArrayTypeLoc(TL);
5810 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5811 VisitArrayTypeLoc(TL);
5813 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5814 DependentSizedArrayTypeLoc TL) {
5815 VisitArrayTypeLoc(TL);
5817 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5818 DependentSizedExtVectorTypeLoc TL) {
5819 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5821 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5822 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5824 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5825 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5827 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5828 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5829 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5830 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5831 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
5832 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5833 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
5836 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5837 VisitFunctionTypeLoc(TL);
5839 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5840 VisitFunctionTypeLoc(TL);
5842 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5843 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5845 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5846 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5848 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5849 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5850 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5851 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5853 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5854 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5855 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5856 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5857 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5859 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5860 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5862 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5863 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5864 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5865 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5866 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5868 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5869 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5871 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5872 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5874 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5875 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5877 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5878 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5879 if (TL.hasAttrOperand()) {
5881 range.setBegin(ReadSourceLocation(Record, Idx));
5882 range.setEnd(ReadSourceLocation(Record, Idx));
5883 TL.setAttrOperandParensRange(range);
5885 if (TL.hasAttrExprOperand()) {
5887 TL.setAttrExprOperand(Reader.ReadExpr(F));
5889 TL.setAttrExprOperand(nullptr);
5890 } else if (TL.hasAttrEnumOperand())
5891 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5893 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5894 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5896 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5897 SubstTemplateTypeParmTypeLoc TL) {
5898 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5900 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5901 SubstTemplateTypeParmPackTypeLoc TL) {
5902 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5904 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5905 TemplateSpecializationTypeLoc TL) {
5906 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5907 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5908 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5909 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5910 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5912 Reader.GetTemplateArgumentLocInfo(F,
5913 TL.getTypePtr()->getArg(i).getKind(),
5916 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5917 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5918 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5920 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5921 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5922 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5924 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5925 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5927 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5928 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5929 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5930 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5932 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5933 DependentTemplateSpecializationTypeLoc TL) {
5934 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5935 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5936 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5937 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5938 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5939 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5940 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5942 Reader.GetTemplateArgumentLocInfo(F,
5943 TL.getTypePtr()->getArg(I).getKind(),
5946 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5947 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5949 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5950 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5952 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5953 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5954 TL.setTypeArgsLAngleLoc(ReadSourceLocation(Record, Idx));
5955 TL.setTypeArgsRAngleLoc(ReadSourceLocation(Record, Idx));
5956 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
5957 TL.setTypeArgTInfo(i, Reader.GetTypeSourceInfo(F, Record, Idx));
5958 TL.setProtocolLAngleLoc(ReadSourceLocation(Record, Idx));
5959 TL.setProtocolRAngleLoc(ReadSourceLocation(Record, Idx));
5960 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5961 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5963 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5964 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5966 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5967 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5968 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5969 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5971 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
5972 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5975 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5976 const RecordData &Record,
5978 QualType InfoTy = readType(F, Record, Idx);
5979 if (InfoTy.isNull())
5982 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5983 TypeLocReader TLR(*this, F, Record, Idx);
5984 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5989 QualType ASTReader::GetType(TypeID ID) {
5990 unsigned FastQuals = ID & Qualifiers::FastMask;
5991 unsigned Index = ID >> Qualifiers::FastWidth;
5993 if (Index < NUM_PREDEF_TYPE_IDS) {
5995 switch ((PredefinedTypeIDs)Index) {
5996 case PREDEF_TYPE_NULL_ID:
5998 case PREDEF_TYPE_VOID_ID:
6001 case PREDEF_TYPE_BOOL_ID:
6005 case PREDEF_TYPE_CHAR_U_ID:
6006 case PREDEF_TYPE_CHAR_S_ID:
6007 // FIXME: Check that the signedness of CharTy is correct!
6011 case PREDEF_TYPE_UCHAR_ID:
6012 T = Context.UnsignedCharTy;
6014 case PREDEF_TYPE_USHORT_ID:
6015 T = Context.UnsignedShortTy;
6017 case PREDEF_TYPE_UINT_ID:
6018 T = Context.UnsignedIntTy;
6020 case PREDEF_TYPE_ULONG_ID:
6021 T = Context.UnsignedLongTy;
6023 case PREDEF_TYPE_ULONGLONG_ID:
6024 T = Context.UnsignedLongLongTy;
6026 case PREDEF_TYPE_UINT128_ID:
6027 T = Context.UnsignedInt128Ty;
6029 case PREDEF_TYPE_SCHAR_ID:
6030 T = Context.SignedCharTy;
6032 case PREDEF_TYPE_WCHAR_ID:
6033 T = Context.WCharTy;
6035 case PREDEF_TYPE_SHORT_ID:
6036 T = Context.ShortTy;
6038 case PREDEF_TYPE_INT_ID:
6041 case PREDEF_TYPE_LONG_ID:
6044 case PREDEF_TYPE_LONGLONG_ID:
6045 T = Context.LongLongTy;
6047 case PREDEF_TYPE_INT128_ID:
6048 T = Context.Int128Ty;
6050 case PREDEF_TYPE_HALF_ID:
6053 case PREDEF_TYPE_FLOAT_ID:
6054 T = Context.FloatTy;
6056 case PREDEF_TYPE_DOUBLE_ID:
6057 T = Context.DoubleTy;
6059 case PREDEF_TYPE_LONGDOUBLE_ID:
6060 T = Context.LongDoubleTy;
6062 case PREDEF_TYPE_OVERLOAD_ID:
6063 T = Context.OverloadTy;
6065 case PREDEF_TYPE_BOUND_MEMBER:
6066 T = Context.BoundMemberTy;
6068 case PREDEF_TYPE_PSEUDO_OBJECT:
6069 T = Context.PseudoObjectTy;
6071 case PREDEF_TYPE_DEPENDENT_ID:
6072 T = Context.DependentTy;
6074 case PREDEF_TYPE_UNKNOWN_ANY:
6075 T = Context.UnknownAnyTy;
6077 case PREDEF_TYPE_NULLPTR_ID:
6078 T = Context.NullPtrTy;
6080 case PREDEF_TYPE_CHAR16_ID:
6081 T = Context.Char16Ty;
6083 case PREDEF_TYPE_CHAR32_ID:
6084 T = Context.Char32Ty;
6086 case PREDEF_TYPE_OBJC_ID:
6087 T = Context.ObjCBuiltinIdTy;
6089 case PREDEF_TYPE_OBJC_CLASS:
6090 T = Context.ObjCBuiltinClassTy;
6092 case PREDEF_TYPE_OBJC_SEL:
6093 T = Context.ObjCBuiltinSelTy;
6095 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6096 case PREDEF_TYPE_##Id##_ID: \
6097 T = Context.SingletonId; \
6099 #include "clang/Basic/OpenCLImageTypes.def"
6100 case PREDEF_TYPE_SAMPLER_ID:
6101 T = Context.OCLSamplerTy;
6103 case PREDEF_TYPE_EVENT_ID:
6104 T = Context.OCLEventTy;
6106 case PREDEF_TYPE_CLK_EVENT_ID:
6107 T = Context.OCLClkEventTy;
6109 case PREDEF_TYPE_QUEUE_ID:
6110 T = Context.OCLQueueTy;
6112 case PREDEF_TYPE_NDRANGE_ID:
6113 T = Context.OCLNDRangeTy;
6115 case PREDEF_TYPE_RESERVE_ID_ID:
6116 T = Context.OCLReserveIDTy;
6118 case PREDEF_TYPE_AUTO_DEDUCT:
6119 T = Context.getAutoDeductType();
6122 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6123 T = Context.getAutoRRefDeductType();
6126 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6127 T = Context.ARCUnbridgedCastTy;
6130 case PREDEF_TYPE_BUILTIN_FN:
6131 T = Context.BuiltinFnTy;
6134 case PREDEF_TYPE_OMP_ARRAY_SECTION:
6135 T = Context.OMPArraySectionTy;
6139 assert(!T.isNull() && "Unknown predefined type");
6140 return T.withFastQualifiers(FastQuals);
6143 Index -= NUM_PREDEF_TYPE_IDS;
6144 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6145 if (TypesLoaded[Index].isNull()) {
6146 TypesLoaded[Index] = readTypeRecord(Index);
6147 if (TypesLoaded[Index].isNull())
6150 TypesLoaded[Index]->setFromAST();
6151 if (DeserializationListener)
6152 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6153 TypesLoaded[Index]);
6156 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6159 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6160 return GetType(getGlobalTypeID(F, LocalID));
6163 serialization::TypeID
6164 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6165 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6166 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6168 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6171 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6172 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6173 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6175 unsigned GlobalIndex = LocalIndex + I->second;
6176 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6179 TemplateArgumentLocInfo
6180 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6181 TemplateArgument::ArgKind Kind,
6182 const RecordData &Record,
6185 case TemplateArgument::Expression:
6187 case TemplateArgument::Type:
6188 return GetTypeSourceInfo(F, Record, Index);
6189 case TemplateArgument::Template: {
6190 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6192 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6193 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6196 case TemplateArgument::TemplateExpansion: {
6197 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6199 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6200 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6201 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6204 case TemplateArgument::Null:
6205 case TemplateArgument::Integral:
6206 case TemplateArgument::Declaration:
6207 case TemplateArgument::NullPtr:
6208 case TemplateArgument::Pack:
6209 // FIXME: Is this right?
6210 return TemplateArgumentLocInfo();
6212 llvm_unreachable("unexpected template argument loc");
6216 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6217 const RecordData &Record, unsigned &Index) {
6218 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6220 if (Arg.getKind() == TemplateArgument::Expression) {
6221 if (Record[Index++]) // bool InfoHasSameExpr.
6222 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6224 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6228 const ASTTemplateArgumentListInfo*
6229 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6230 const RecordData &Record,
6232 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6233 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6234 unsigned NumArgsAsWritten = Record[Index++];
6235 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6236 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6237 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6238 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6241 Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6245 template<typename TemplateSpecializationDecl>
6246 static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6247 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6248 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6251 void ASTReader::CompleteRedeclChain(const Decl *D) {
6252 if (NumCurrentElementsDeserializing) {
6253 // We arrange to not care about the complete redeclaration chain while we're
6254 // deserializing. Just remember that the AST has marked this one as complete
6255 // but that it's not actually complete yet, so we know we still need to
6256 // complete it later.
6257 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6261 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6263 // If this is a named declaration, complete it by looking it up
6264 // within its context.
6266 // FIXME: Merging a function definition should merge
6267 // all mergeable entities within it.
6268 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6269 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6270 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6271 if (!getContext().getLangOpts().CPlusPlus &&
6272 isa<TranslationUnitDecl>(DC)) {
6273 // Outside of C++, we don't have a lookup table for the TU, so update
6274 // the identifier instead. (For C++ modules, we don't store decls
6275 // in the serialized identifier table, so we do the lookup in the TU.)
6276 auto *II = Name.getAsIdentifierInfo();
6277 assert(II && "non-identifier name in C?");
6278 if (II->isOutOfDate())
6279 updateOutOfDateIdentifier(*II);
6282 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6283 // Find all declarations of this kind from the relevant context.
6284 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
6285 auto *DC = cast<DeclContext>(DCDecl);
6286 SmallVector<Decl*, 8> Decls;
6287 FindExternalLexicalDecls(
6288 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
6293 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6294 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6295 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6296 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6297 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6298 if (auto *Template = FD->getPrimaryTemplate())
6299 Template->LoadLazySpecializations();
6303 uint64_t ASTReader::ReadCXXCtorInitializersRef(ModuleFile &M,
6304 const RecordData &Record,
6306 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXCtorInitializers) {
6307 Error("malformed AST file: missing C++ ctor initializers");
6311 unsigned LocalID = Record[Idx++];
6312 return getGlobalBitOffset(M, M.CXXCtorInitializersOffsets[LocalID - 1]);
6315 CXXCtorInitializer **
6316 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
6317 RecordLocation Loc = getLocalBitOffset(Offset);
6318 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6319 SavedStreamPosition SavedPosition(Cursor);
6320 Cursor.JumpToBit(Loc.Offset);
6321 ReadingKindTracker ReadingKind(Read_Decl, *this);
6324 unsigned Code = Cursor.ReadCode();
6325 unsigned RecCode = Cursor.readRecord(Code, Record);
6326 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
6327 Error("malformed AST file: missing C++ ctor initializers");
6332 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
6335 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6336 const RecordData &Record,
6338 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6339 Error("malformed AST file: missing C++ base specifier");
6343 unsigned LocalID = Record[Idx++];
6344 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6347 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6348 RecordLocation Loc = getLocalBitOffset(Offset);
6349 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6350 SavedStreamPosition SavedPosition(Cursor);
6351 Cursor.JumpToBit(Loc.Offset);
6352 ReadingKindTracker ReadingKind(Read_Decl, *this);
6354 unsigned Code = Cursor.ReadCode();
6355 unsigned RecCode = Cursor.readRecord(Code, Record);
6356 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
6357 Error("malformed AST file: missing C++ base specifiers");
6362 unsigned NumBases = Record[Idx++];
6363 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6364 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6365 for (unsigned I = 0; I != NumBases; ++I)
6366 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6370 serialization::DeclID
6371 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6372 if (LocalID < NUM_PREDEF_DECL_IDS)
6375 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6376 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6377 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6379 return LocalID + I->second;
6382 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6383 ModuleFile &M) const {
6384 // Predefined decls aren't from any module.
6385 if (ID < NUM_PREDEF_DECL_IDS)
6388 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
6389 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
6392 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
6393 if (!D->isFromASTFile())
6395 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6396 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6400 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6401 if (ID < NUM_PREDEF_DECL_IDS)
6402 return SourceLocation();
6404 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6406 if (Index > DeclsLoaded.size()) {
6407 Error("declaration ID out-of-range for AST file");
6408 return SourceLocation();
6411 if (Decl *D = DeclsLoaded[Index])
6412 return D->getLocation();
6415 DeclCursorForID(ID, Loc);
6419 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6421 case PREDEF_DECL_NULL_ID:
6424 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6425 return Context.getTranslationUnitDecl();
6427 case PREDEF_DECL_OBJC_ID_ID:
6428 return Context.getObjCIdDecl();
6430 case PREDEF_DECL_OBJC_SEL_ID:
6431 return Context.getObjCSelDecl();
6433 case PREDEF_DECL_OBJC_CLASS_ID:
6434 return Context.getObjCClassDecl();
6436 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6437 return Context.getObjCProtocolDecl();
6439 case PREDEF_DECL_INT_128_ID:
6440 return Context.getInt128Decl();
6442 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6443 return Context.getUInt128Decl();
6445 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6446 return Context.getObjCInstanceTypeDecl();
6448 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6449 return Context.getBuiltinVaListDecl();
6451 case PREDEF_DECL_VA_LIST_TAG:
6452 return Context.getVaListTagDecl();
6454 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
6455 return Context.getBuiltinMSVaListDecl();
6457 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
6458 return Context.getExternCContextDecl();
6460 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
6461 return Context.getMakeIntegerSeqDecl();
6463 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
6464 return Context.getCFConstantStringDecl();
6466 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
6467 return Context.getCFConstantStringTagDecl();
6469 llvm_unreachable("PredefinedDeclIDs unknown enum value");
6472 Decl *ASTReader::GetExistingDecl(DeclID ID) {
6473 if (ID < NUM_PREDEF_DECL_IDS) {
6474 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6476 // Track that we have merged the declaration with ID \p ID into the
6477 // pre-existing predefined declaration \p D.
6478 auto &Merged = KeyDecls[D->getCanonicalDecl()];
6480 Merged.push_back(ID);
6485 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6487 if (Index >= DeclsLoaded.size()) {
6488 assert(0 && "declaration ID out-of-range for AST file");
6489 Error("declaration ID out-of-range for AST file");
6493 return DeclsLoaded[Index];
6496 Decl *ASTReader::GetDecl(DeclID ID) {
6497 if (ID < NUM_PREDEF_DECL_IDS)
6498 return GetExistingDecl(ID);
6500 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6502 if (Index >= DeclsLoaded.size()) {
6503 assert(0 && "declaration ID out-of-range for AST file");
6504 Error("declaration ID out-of-range for AST file");
6508 if (!DeclsLoaded[Index]) {
6510 if (DeserializationListener)
6511 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6514 return DeclsLoaded[Index];
6517 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6519 if (GlobalID < NUM_PREDEF_DECL_IDS)
6522 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6523 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6524 ModuleFile *Owner = I->second;
6526 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6527 = M.GlobalToLocalDeclIDs.find(Owner);
6528 if (Pos == M.GlobalToLocalDeclIDs.end())
6531 return GlobalID - Owner->BaseDeclID + Pos->second;
6534 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6535 const RecordData &Record,
6537 if (Idx >= Record.size()) {
6538 Error("Corrupted AST file");
6542 return getGlobalDeclID(F, Record[Idx++]);
6545 /// \brief Resolve the offset of a statement into a statement.
6547 /// This operation will read a new statement from the external
6548 /// source each time it is called, and is meant to be used via a
6549 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6550 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6551 // Switch case IDs are per Decl.
6552 ClearSwitchCaseIDs();
6554 // Offset here is a global offset across the entire chain.
6555 RecordLocation Loc = getLocalBitOffset(Offset);
6556 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6557 return ReadStmtFromStream(*Loc.F);
6560 void ASTReader::FindExternalLexicalDecls(
6561 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
6562 SmallVectorImpl<Decl *> &Decls) {
6563 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
6565 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
6566 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
6567 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
6568 auto K = (Decl::Kind)+LexicalDecls[I];
6569 if (!IsKindWeWant(K))
6572 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
6574 // Don't add predefined declarations to the lexical context more
6576 if (ID < NUM_PREDEF_DECL_IDS) {
6577 if (PredefsVisited[ID])
6580 PredefsVisited[ID] = true;
6583 if (Decl *D = GetLocalDecl(*M, ID)) {
6584 assert(D->getKind() == K && "wrong kind for lexical decl");
6585 if (!DC->isDeclInLexicalTraversal(D))
6591 if (isa<TranslationUnitDecl>(DC)) {
6592 for (auto Lexical : TULexicalDecls)
6593 Visit(Lexical.first, Lexical.second);
6595 auto I = LexicalDecls.find(DC);
6596 if (I != LexicalDecls.end())
6597 Visit(I->second.first, I->second.second);
6600 ++NumLexicalDeclContextsRead;
6610 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6612 bool operator()(LocalDeclID L, LocalDeclID R) const {
6613 SourceLocation LHS = getLocation(L);
6614 SourceLocation RHS = getLocation(R);
6615 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6618 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6619 SourceLocation RHS = getLocation(R);
6620 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6623 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6624 SourceLocation LHS = getLocation(L);
6625 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6628 SourceLocation getLocation(LocalDeclID ID) const {
6629 return Reader.getSourceManager().getFileLoc(
6630 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6636 void ASTReader::FindFileRegionDecls(FileID File,
6637 unsigned Offset, unsigned Length,
6638 SmallVectorImpl<Decl *> &Decls) {
6639 SourceManager &SM = getSourceManager();
6641 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6642 if (I == FileDeclIDs.end())
6645 FileDeclsInfo &DInfo = I->second;
6646 if (DInfo.Decls.empty())
6650 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6651 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6653 DeclIDComp DIDComp(*this, *DInfo.Mod);
6654 ArrayRef<serialization::LocalDeclID>::iterator
6655 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6657 if (BeginIt != DInfo.Decls.begin())
6660 // If we are pointing at a top-level decl inside an objc container, we need
6661 // to backtrack until we find it otherwise we will fail to report that the
6662 // region overlaps with an objc container.
6663 while (BeginIt != DInfo.Decls.begin() &&
6664 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6665 ->isTopLevelDeclInObjCContainer())
6668 ArrayRef<serialization::LocalDeclID>::iterator
6669 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6671 if (EndIt != DInfo.Decls.end())
6674 for (ArrayRef<serialization::LocalDeclID>::iterator
6675 DIt = BeginIt; DIt != EndIt; ++DIt)
6676 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6680 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6681 DeclarationName Name) {
6682 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
6683 "DeclContext has no visible decls in storage");
6687 auto It = Lookups.find(DC);
6688 if (It == Lookups.end())
6691 Deserializing LookupResults(this);
6693 // Load the list of declarations.
6694 SmallVector<NamedDecl *, 64> Decls;
6695 for (DeclID ID : It->second.Table.find(Name)) {
6696 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
6697 if (ND->getDeclName() == Name)
6698 Decls.push_back(ND);
6701 ++NumVisibleDeclContextsRead;
6702 SetExternalVisibleDeclsForName(DC, Name, Decls);
6703 return !Decls.empty();
6706 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6707 if (!DC->hasExternalVisibleStorage())
6710 auto It = Lookups.find(DC);
6711 assert(It != Lookups.end() &&
6712 "have external visible storage but no lookup tables");
6716 for (DeclID ID : It->second.Table.findAll()) {
6717 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
6718 Decls[ND->getDeclName()].push_back(ND);
6721 ++NumVisibleDeclContextsRead;
6723 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
6724 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6726 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6729 const serialization::reader::DeclContextLookupTable *
6730 ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
6731 auto I = Lookups.find(Primary);
6732 return I == Lookups.end() ? nullptr : &I->second;
6735 /// \brief Under non-PCH compilation the consumer receives the objc methods
6736 /// before receiving the implementation, and codegen depends on this.
6737 /// We simulate this by deserializing and passing to consumer the methods of the
6738 /// implementation before passing the deserialized implementation decl.
6739 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6740 ASTConsumer *Consumer) {
6741 assert(ImplD && Consumer);
6743 for (auto *I : ImplD->methods())
6744 Consumer->HandleInterestingDecl(DeclGroupRef(I));
6746 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6749 void ASTReader::PassInterestingDeclsToConsumer() {
6752 if (PassingDeclsToConsumer)
6755 // Guard variable to avoid recursively redoing the process of passing
6756 // decls to consumer.
6757 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6760 // Ensure that we've loaded all potentially-interesting declarations
6761 // that need to be eagerly loaded.
6762 for (auto ID : EagerlyDeserializedDecls)
6764 EagerlyDeserializedDecls.clear();
6766 while (!InterestingDecls.empty()) {
6767 Decl *D = InterestingDecls.front();
6768 InterestingDecls.pop_front();
6770 PassInterestingDeclToConsumer(D);
6774 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6775 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6776 PassObjCImplDeclToConsumer(ImplD, Consumer);
6778 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6781 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6782 this->Consumer = Consumer;
6785 PassInterestingDeclsToConsumer();
6787 if (DeserializationListener)
6788 DeserializationListener->ReaderInitialized(this);
6791 void ASTReader::PrintStats() {
6792 std::fprintf(stderr, "*** AST File Statistics:\n");
6794 unsigned NumTypesLoaded
6795 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6797 unsigned NumDeclsLoaded
6798 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
6800 unsigned NumIdentifiersLoaded
6801 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6802 IdentifiersLoaded.end(),
6803 (IdentifierInfo *)nullptr);
6804 unsigned NumMacrosLoaded
6805 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6807 (MacroInfo *)nullptr);
6808 unsigned NumSelectorsLoaded
6809 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6810 SelectorsLoaded.end(),
6813 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6814 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6815 NumSLocEntriesRead, TotalNumSLocEntries,
6816 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6817 if (!TypesLoaded.empty())
6818 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6819 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6820 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6821 if (!DeclsLoaded.empty())
6822 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6823 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6824 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6825 if (!IdentifiersLoaded.empty())
6826 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6827 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6828 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6829 if (!MacrosLoaded.empty())
6830 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6831 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6832 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6833 if (!SelectorsLoaded.empty())
6834 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6835 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6836 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6837 if (TotalNumStatements)
6838 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6839 NumStatementsRead, TotalNumStatements,
6840 ((float)NumStatementsRead/TotalNumStatements * 100));
6842 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6843 NumMacrosRead, TotalNumMacros,
6844 ((float)NumMacrosRead/TotalNumMacros * 100));
6845 if (TotalLexicalDeclContexts)
6846 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6847 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6848 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6850 if (TotalVisibleDeclContexts)
6851 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6852 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6853 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6855 if (TotalNumMethodPoolEntries) {
6856 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6857 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6858 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6861 if (NumMethodPoolLookups) {
6862 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6863 NumMethodPoolHits, NumMethodPoolLookups,
6864 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6866 if (NumMethodPoolTableLookups) {
6867 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6868 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6869 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6873 if (NumIdentifierLookupHits) {
6874 std::fprintf(stderr,
6875 " %u / %u identifier table lookups succeeded (%f%%)\n",
6876 NumIdentifierLookupHits, NumIdentifierLookups,
6877 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6881 std::fprintf(stderr, "\n");
6882 GlobalIndex->printStats();
6885 std::fprintf(stderr, "\n");
6887 std::fprintf(stderr, "\n");
6890 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6892 dumpModuleIDMap(StringRef Name,
6893 const ContinuousRangeMap<Key, ModuleFile *,
6894 InitialCapacity> &Map) {
6895 if (Map.begin() == Map.end())
6898 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6899 llvm::errs() << Name << ":\n";
6900 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6902 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6907 LLVM_DUMP_METHOD void ASTReader::dump() {
6908 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6909 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6910 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6911 dumpModuleIDMap("Global type map", GlobalTypeMap);
6912 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6913 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6914 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6915 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6916 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6917 dumpModuleIDMap("Global preprocessed entity map",
6918 GlobalPreprocessedEntityMap);
6920 llvm::errs() << "\n*** PCH/Modules Loaded:";
6921 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6922 MEnd = ModuleMgr.end();
6927 /// Return the amount of memory used by memory buffers, breaking down
6928 /// by heap-backed versus mmap'ed memory.
6929 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6930 for (ModuleConstIterator I = ModuleMgr.begin(),
6931 E = ModuleMgr.end(); I != E; ++I) {
6932 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6933 size_t bytes = buf->getBufferSize();
6934 switch (buf->getBufferKind()) {
6935 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6936 sizes.malloc_bytes += bytes;
6938 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6939 sizes.mmap_bytes += bytes;
6946 void ASTReader::InitializeSema(Sema &S) {
6948 S.addExternalSource(this);
6950 // Makes sure any declarations that were deserialized "too early"
6951 // still get added to the identifier's declaration chains.
6952 for (uint64_t ID : PreloadedDeclIDs) {
6953 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
6954 pushExternalDeclIntoScope(D, D->getDeclName());
6956 PreloadedDeclIDs.clear();
6958 // FIXME: What happens if these are changed by a module import?
6959 if (!FPPragmaOptions.empty()) {
6960 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6961 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6964 // FIXME: What happens if these are changed by a module import?
6965 if (!OpenCLExtensions.empty()) {
6967 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6968 #include "clang/Basic/OpenCLExtensions.def"
6970 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6976 void ASTReader::UpdateSema() {
6977 assert(SemaObj && "no Sema to update");
6979 // Load the offsets of the declarations that Sema references.
6980 // They will be lazily deserialized when needed.
6981 if (!SemaDeclRefs.empty()) {
6982 assert(SemaDeclRefs.size() % 2 == 0);
6983 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6984 if (!SemaObj->StdNamespace)
6985 SemaObj->StdNamespace = SemaDeclRefs[I];
6986 if (!SemaObj->StdBadAlloc)
6987 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6989 SemaDeclRefs.clear();
6992 // Update the state of pragmas. Use the same API as if we had encountered the
6993 // pragma in the source.
6994 if(OptimizeOffPragmaLocation.isValid())
6995 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
6996 if (PragmaMSStructState != -1)
6997 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
6998 if (PointersToMembersPragmaLocation.isValid()) {
6999 SemaObj->ActOnPragmaMSPointersToMembers(
7000 (LangOptions::PragmaMSPointersToMembersKind)
7001 PragmaMSPointersToMembersState,
7002 PointersToMembersPragmaLocation);
7006 IdentifierInfo *ASTReader::get(StringRef Name) {
7007 // Note that we are loading an identifier.
7008 Deserializing AnIdentifier(this);
7010 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
7011 NumIdentifierLookups,
7012 NumIdentifierLookupHits);
7014 // We don't need to do identifier table lookups in C++ modules (we preload
7015 // all interesting declarations, and don't need to use the scope for name
7016 // lookups). Perform the lookup in PCH files, though, since we don't build
7017 // a complete initial identifier table if we're carrying on from a PCH.
7018 if (Context.getLangOpts().CPlusPlus) {
7019 for (auto F : ModuleMgr.pch_modules())
7023 // If there is a global index, look there first to determine which modules
7024 // provably do not have any results for this identifier.
7025 GlobalModuleIndex::HitSet Hits;
7026 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
7027 if (!loadGlobalIndex()) {
7028 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7033 ModuleMgr.visit(Visitor, HitsPtr);
7036 IdentifierInfo *II = Visitor.getIdentifierInfo();
7037 markIdentifierUpToDate(II);
7042 /// \brief An identifier-lookup iterator that enumerates all of the
7043 /// identifiers stored within a set of AST files.
7044 class ASTIdentifierIterator : public IdentifierIterator {
7045 /// \brief The AST reader whose identifiers are being enumerated.
7046 const ASTReader &Reader;
7048 /// \brief The current index into the chain of AST files stored in
7052 /// \brief The current position within the identifier lookup table
7053 /// of the current AST file.
7054 ASTIdentifierLookupTable::key_iterator Current;
7056 /// \brief The end position within the identifier lookup table of
7057 /// the current AST file.
7058 ASTIdentifierLookupTable::key_iterator End;
7061 explicit ASTIdentifierIterator(const ASTReader &Reader);
7063 StringRef Next() override;
7067 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
7068 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
7069 ASTIdentifierLookupTable *IdTable
7070 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
7071 Current = IdTable->key_begin();
7072 End = IdTable->key_end();
7075 StringRef ASTIdentifierIterator::Next() {
7076 while (Current == End) {
7077 // If we have exhausted all of our AST files, we're done.
7082 ASTIdentifierLookupTable *IdTable
7083 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
7084 IdentifierLookupTable;
7085 Current = IdTable->key_begin();
7086 End = IdTable->key_end();
7089 // We have any identifiers remaining in the current AST file; return
7091 StringRef Result = *Current;
7096 IdentifierIterator *ASTReader::getIdentifiers() {
7097 if (!loadGlobalIndex())
7098 return GlobalIndex->createIdentifierIterator();
7100 return new ASTIdentifierIterator(*this);
7103 namespace clang { namespace serialization {
7104 class ReadMethodPoolVisitor {
7107 unsigned PriorGeneration;
7108 unsigned InstanceBits;
7109 unsigned FactoryBits;
7110 bool InstanceHasMoreThanOneDecl;
7111 bool FactoryHasMoreThanOneDecl;
7112 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7113 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
7116 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7117 unsigned PriorGeneration)
7118 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7119 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7120 FactoryHasMoreThanOneDecl(false) {}
7122 bool operator()(ModuleFile &M) {
7123 if (!M.SelectorLookupTable)
7126 // If we've already searched this module file, skip it now.
7127 if (M.Generation <= PriorGeneration)
7130 ++Reader.NumMethodPoolTableLookups;
7131 ASTSelectorLookupTable *PoolTable
7132 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7133 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
7134 if (Pos == PoolTable->end())
7137 ++Reader.NumMethodPoolTableHits;
7138 ++Reader.NumSelectorsRead;
7139 // FIXME: Not quite happy with the statistics here. We probably should
7140 // disable this tracking when called via LoadSelector.
7141 // Also, should entries without methods count as misses?
7142 ++Reader.NumMethodPoolEntriesRead;
7143 ASTSelectorLookupTrait::data_type Data = *Pos;
7144 if (Reader.DeserializationListener)
7145 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
7147 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7148 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
7149 InstanceBits = Data.InstanceBits;
7150 FactoryBits = Data.FactoryBits;
7151 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7152 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
7156 /// \brief Retrieve the instance methods found by this visitor.
7157 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7158 return InstanceMethods;
7161 /// \brief Retrieve the instance methods found by this visitor.
7162 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7163 return FactoryMethods;
7166 unsigned getInstanceBits() const { return InstanceBits; }
7167 unsigned getFactoryBits() const { return FactoryBits; }
7168 bool instanceHasMoreThanOneDecl() const {
7169 return InstanceHasMoreThanOneDecl;
7171 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
7173 } } // end namespace clang::serialization
7175 /// \brief Add the given set of methods to the method list.
7176 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7177 ObjCMethodList &List) {
7178 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7179 S.addMethodToGlobalList(&List, Methods[I]);
7183 void ASTReader::ReadMethodPool(Selector Sel) {
7184 // Get the selector generation and update it to the current generation.
7185 unsigned &Generation = SelectorGeneration[Sel];
7186 unsigned PriorGeneration = Generation;
7187 Generation = getGeneration();
7189 // Search for methods defined with this selector.
7190 ++NumMethodPoolLookups;
7191 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7192 ModuleMgr.visit(Visitor);
7194 if (Visitor.getInstanceMethods().empty() &&
7195 Visitor.getFactoryMethods().empty())
7198 ++NumMethodPoolHits;
7203 Sema &S = *getSema();
7204 Sema::GlobalMethodPool::iterator Pos
7205 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7207 Pos->second.first.setBits(Visitor.getInstanceBits());
7208 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
7209 Pos->second.second.setBits(Visitor.getFactoryBits());
7210 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
7212 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7213 // when building a module we keep every method individually and may need to
7214 // update hasMoreThanOneDecl as we add the methods.
7215 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7216 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
7219 void ASTReader::ReadKnownNamespaces(
7220 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7223 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7224 if (NamespaceDecl *Namespace
7225 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7226 Namespaces.push_back(Namespace);
7230 void ASTReader::ReadUndefinedButUsed(
7231 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
7232 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7233 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
7234 SourceLocation Loc =
7235 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
7236 Undefined.insert(std::make_pair(D, Loc));
7240 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
7241 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
7243 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
7244 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
7245 uint64_t Count = DelayedDeleteExprs[Idx++];
7246 for (uint64_t C = 0; C < Count; ++C) {
7247 SourceLocation DeleteLoc =
7248 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
7249 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
7250 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
7255 void ASTReader::ReadTentativeDefinitions(
7256 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7257 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7258 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7260 TentativeDefs.push_back(Var);
7262 TentativeDefinitions.clear();
7265 void ASTReader::ReadUnusedFileScopedDecls(
7266 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7267 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7269 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7273 UnusedFileScopedDecls.clear();
7276 void ASTReader::ReadDelegatingConstructors(
7277 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7278 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7279 CXXConstructorDecl *D
7280 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7284 DelegatingCtorDecls.clear();
7287 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7288 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7290 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7294 ExtVectorDecls.clear();
7297 void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7298 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7299 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7301 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7302 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7306 UnusedLocalTypedefNameCandidates.clear();
7309 void ASTReader::ReadReferencedSelectors(
7310 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7311 if (ReferencedSelectorsData.empty())
7314 // If there are @selector references added them to its pool. This is for
7315 // implementation of -Wselector.
7316 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7318 while (I < DataSize) {
7319 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7320 SourceLocation SelLoc
7321 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7322 Sels.push_back(std::make_pair(Sel, SelLoc));
7324 ReferencedSelectorsData.clear();
7327 void ASTReader::ReadWeakUndeclaredIdentifiers(
7328 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7329 if (WeakUndeclaredIdentifiers.empty())
7332 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7333 IdentifierInfo *WeakId
7334 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7335 IdentifierInfo *AliasId
7336 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7338 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7339 bool Used = WeakUndeclaredIdentifiers[I++];
7340 WeakInfo WI(AliasId, Loc);
7342 WeakIDs.push_back(std::make_pair(WeakId, WI));
7344 WeakUndeclaredIdentifiers.clear();
7347 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7348 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7349 ExternalVTableUse VT;
7350 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7351 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7352 VT.DefinitionRequired = VTableUses[Idx++];
7353 VTables.push_back(VT);
7359 void ASTReader::ReadPendingInstantiations(
7360 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7361 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7362 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7364 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7366 Pending.push_back(std::make_pair(D, Loc));
7368 PendingInstantiations.clear();
7371 void ASTReader::ReadLateParsedTemplates(
7372 llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7373 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7375 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7377 LateParsedTemplate *LT = new LateParsedTemplate;
7378 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7380 ModuleFile *F = getOwningModuleFile(LT->D);
7381 assert(F && "No module");
7383 unsigned TokN = LateParsedTemplates[Idx++];
7384 LT->Toks.reserve(TokN);
7385 for (unsigned T = 0; T < TokN; ++T)
7386 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7388 LPTMap.insert(std::make_pair(FD, LT));
7391 LateParsedTemplates.clear();
7394 void ASTReader::LoadSelector(Selector Sel) {
7395 // It would be complicated to avoid reading the methods anyway. So don't.
7396 ReadMethodPool(Sel);
7399 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7400 assert(ID && "Non-zero identifier ID required");
7401 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7402 IdentifiersLoaded[ID - 1] = II;
7403 if (DeserializationListener)
7404 DeserializationListener->IdentifierRead(ID, II);
7407 /// \brief Set the globally-visible declarations associated with the given
7410 /// If the AST reader is currently in a state where the given declaration IDs
7411 /// cannot safely be resolved, they are queued until it is safe to resolve
7414 /// \param II an IdentifierInfo that refers to one or more globally-visible
7417 /// \param DeclIDs the set of declaration IDs with the name @p II that are
7418 /// visible at global scope.
7420 /// \param Decls if non-null, this vector will be populated with the set of
7421 /// deserialized declarations. These declarations will not be pushed into
7424 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7425 const SmallVectorImpl<uint32_t> &DeclIDs,
7426 SmallVectorImpl<Decl *> *Decls) {
7427 if (NumCurrentElementsDeserializing && !Decls) {
7428 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
7432 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7434 // Queue this declaration so that it will be added to the
7435 // translation unit scope and identifier's declaration chain
7436 // once a Sema object is known.
7437 PreloadedDeclIDs.push_back(DeclIDs[I]);
7441 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7443 // If we're simply supposed to record the declarations, do so now.
7445 Decls->push_back(D);
7449 // Introduce this declaration into the translation-unit scope
7450 // and add it to the declaration chain for this identifier, so
7451 // that (unqualified) name lookup will find it.
7452 pushExternalDeclIntoScope(D, II);
7456 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
7460 if (IdentifiersLoaded.empty()) {
7461 Error("no identifier table in AST file");
7466 if (!IdentifiersLoaded[ID]) {
7467 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7468 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7469 ModuleFile *M = I->second;
7470 unsigned Index = ID - M->BaseIdentifierID;
7471 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7473 // All of the strings in the AST file are preceded by a 16-bit length.
7474 // Extract that 16-bit length to avoid having to execute strlen().
7475 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7476 // unsigned integers. This is important to avoid integer overflow when
7477 // we cast them to 'unsigned'.
7478 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7479 unsigned StrLen = (((unsigned) StrLenPtr[0])
7480 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
7481 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen));
7482 IdentifiersLoaded[ID] = &II;
7483 markIdentifierFromAST(*this, II);
7484 if (DeserializationListener)
7485 DeserializationListener->IdentifierRead(ID + 1, &II);
7488 return IdentifiersLoaded[ID];
7491 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7492 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
7495 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7496 if (LocalID < NUM_PREDEF_IDENT_IDS)
7499 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7500 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7501 assert(I != M.IdentifierRemap.end()
7502 && "Invalid index into identifier index remap");
7504 return LocalID + I->second;
7507 MacroInfo *ASTReader::getMacro(MacroID ID) {
7511 if (MacrosLoaded.empty()) {
7512 Error("no macro table in AST file");
7516 ID -= NUM_PREDEF_MACRO_IDS;
7517 if (!MacrosLoaded[ID]) {
7518 GlobalMacroMapType::iterator I
7519 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7520 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7521 ModuleFile *M = I->second;
7522 unsigned Index = ID - M->BaseMacroID;
7523 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7525 if (DeserializationListener)
7526 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7530 return MacrosLoaded[ID];
7533 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7534 if (LocalID < NUM_PREDEF_MACRO_IDS)
7537 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7538 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7539 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7541 return LocalID + I->second;
7544 serialization::SubmoduleID
7545 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7546 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7549 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7550 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7551 assert(I != M.SubmoduleRemap.end()
7552 && "Invalid index into submodule index remap");
7554 return LocalID + I->second;
7557 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7558 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7559 assert(GlobalID == 0 && "Unhandled global submodule ID");
7563 if (GlobalID > SubmodulesLoaded.size()) {
7564 Error("submodule ID out of range in AST file");
7568 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7571 Module *ASTReader::getModule(unsigned ID) {
7572 return getSubmodule(ID);
7575 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
7577 // It's a module, look it up by submodule ID.
7578 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
7579 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
7581 // It's a prefix (preamble, PCH, ...). Look it up by index.
7582 unsigned IndexFromEnd = ID >> 1;
7583 assert(IndexFromEnd && "got reference to unknown module file");
7584 return getModuleManager().pch_modules().end()[-IndexFromEnd];
7588 unsigned ASTReader::getModuleFileID(ModuleFile *F) {
7592 // For a file representing a module, use the submodule ID of the top-level
7593 // module as the file ID. For any other kind of file, the number of such
7594 // files loaded beforehand will be the same on reload.
7595 // FIXME: Is this true even if we have an explicit module file and a PCH?
7597 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
7599 auto PCHModules = getModuleManager().pch_modules();
7600 auto I = std::find(PCHModules.begin(), PCHModules.end(), F);
7601 assert(I != PCHModules.end() && "emitting reference to unknown file");
7602 return (I - PCHModules.end()) << 1;
7605 llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
7606 ASTReader::getSourceDescriptor(unsigned ID) {
7607 if (const Module *M = getSubmodule(ID))
7608 return ExternalASTSource::ASTSourceDescriptor(*M);
7610 // If there is only a single PCH, return it instead.
7611 // Chained PCH are not suported.
7612 if (ModuleMgr.size() == 1) {
7613 ModuleFile &MF = ModuleMgr.getPrimaryModule();
7614 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
7615 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir,
7616 MF.FileName, MF.Signature);
7621 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7622 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7625 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7629 if (ID > SelectorsLoaded.size()) {
7630 Error("selector ID out of range in AST file");
7634 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
7635 // Load this selector from the selector table.
7636 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7637 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7638 ModuleFile &M = *I->second;
7639 ASTSelectorLookupTrait Trait(*this, M);
7640 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7641 SelectorsLoaded[ID - 1] =
7642 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7643 if (DeserializationListener)
7644 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7647 return SelectorsLoaded[ID - 1];
7650 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7651 return DecodeSelector(ID);
7654 uint32_t ASTReader::GetNumExternalSelectors() {
7655 // ID 0 (the null selector) is considered an external selector.
7656 return getTotalNumSelectors() + 1;
7659 serialization::SelectorID
7660 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7661 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7664 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7665 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7666 assert(I != M.SelectorRemap.end()
7667 && "Invalid index into selector index remap");
7669 return LocalID + I->second;
7673 ASTReader::ReadDeclarationName(ModuleFile &F,
7674 const RecordData &Record, unsigned &Idx) {
7675 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7677 case DeclarationName::Identifier:
7678 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
7680 case DeclarationName::ObjCZeroArgSelector:
7681 case DeclarationName::ObjCOneArgSelector:
7682 case DeclarationName::ObjCMultiArgSelector:
7683 return DeclarationName(ReadSelector(F, Record, Idx));
7685 case DeclarationName::CXXConstructorName:
7686 return Context.DeclarationNames.getCXXConstructorName(
7687 Context.getCanonicalType(readType(F, Record, Idx)));
7689 case DeclarationName::CXXDestructorName:
7690 return Context.DeclarationNames.getCXXDestructorName(
7691 Context.getCanonicalType(readType(F, Record, Idx)));
7693 case DeclarationName::CXXConversionFunctionName:
7694 return Context.DeclarationNames.getCXXConversionFunctionName(
7695 Context.getCanonicalType(readType(F, Record, Idx)));
7697 case DeclarationName::CXXOperatorName:
7698 return Context.DeclarationNames.getCXXOperatorName(
7699 (OverloadedOperatorKind)Record[Idx++]);
7701 case DeclarationName::CXXLiteralOperatorName:
7702 return Context.DeclarationNames.getCXXLiteralOperatorName(
7703 GetIdentifierInfo(F, Record, Idx));
7705 case DeclarationName::CXXUsingDirective:
7706 return DeclarationName::getUsingDirectiveName();
7709 llvm_unreachable("Invalid NameKind!");
7712 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7713 DeclarationNameLoc &DNLoc,
7714 DeclarationName Name,
7715 const RecordData &Record, unsigned &Idx) {
7716 switch (Name.getNameKind()) {
7717 case DeclarationName::CXXConstructorName:
7718 case DeclarationName::CXXDestructorName:
7719 case DeclarationName::CXXConversionFunctionName:
7720 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7723 case DeclarationName::CXXOperatorName:
7724 DNLoc.CXXOperatorName.BeginOpNameLoc
7725 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7726 DNLoc.CXXOperatorName.EndOpNameLoc
7727 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7730 case DeclarationName::CXXLiteralOperatorName:
7731 DNLoc.CXXLiteralOperatorName.OpNameLoc
7732 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7735 case DeclarationName::Identifier:
7736 case DeclarationName::ObjCZeroArgSelector:
7737 case DeclarationName::ObjCOneArgSelector:
7738 case DeclarationName::ObjCMultiArgSelector:
7739 case DeclarationName::CXXUsingDirective:
7744 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7745 DeclarationNameInfo &NameInfo,
7746 const RecordData &Record, unsigned &Idx) {
7747 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7748 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7749 DeclarationNameLoc DNLoc;
7750 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7751 NameInfo.setInfo(DNLoc);
7754 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7755 const RecordData &Record, unsigned &Idx) {
7756 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7757 unsigned NumTPLists = Record[Idx++];
7758 Info.NumTemplParamLists = NumTPLists;
7760 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7761 for (unsigned i=0; i != NumTPLists; ++i)
7762 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7767 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7769 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7771 case TemplateName::Template:
7772 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7774 case TemplateName::OverloadedTemplate: {
7775 unsigned size = Record[Idx++];
7776 UnresolvedSet<8> Decls;
7778 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7780 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7783 case TemplateName::QualifiedTemplate: {
7784 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7785 bool hasTemplKeyword = Record[Idx++];
7786 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7787 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7790 case TemplateName::DependentTemplate: {
7791 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7792 if (Record[Idx++]) // isIdentifier
7793 return Context.getDependentTemplateName(NNS,
7794 GetIdentifierInfo(F, Record,
7796 return Context.getDependentTemplateName(NNS,
7797 (OverloadedOperatorKind)Record[Idx++]);
7800 case TemplateName::SubstTemplateTemplateParm: {
7801 TemplateTemplateParmDecl *param
7802 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7803 if (!param) return TemplateName();
7804 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7805 return Context.getSubstTemplateTemplateParm(param, replacement);
7808 case TemplateName::SubstTemplateTemplateParmPack: {
7809 TemplateTemplateParmDecl *Param
7810 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7812 return TemplateName();
7814 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7815 if (ArgPack.getKind() != TemplateArgument::Pack)
7816 return TemplateName();
7818 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7822 llvm_unreachable("Unhandled template name kind!");
7825 TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F,
7826 const RecordData &Record,
7828 bool Canonicalize) {
7830 // The caller wants a canonical template argument. Sometimes the AST only
7831 // wants template arguments in canonical form (particularly as the template
7832 // argument lists of template specializations) so ensure we preserve that
7833 // canonical form across serialization.
7834 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false);
7835 return Context.getCanonicalTemplateArgument(Arg);
7838 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7840 case TemplateArgument::Null:
7841 return TemplateArgument();
7842 case TemplateArgument::Type:
7843 return TemplateArgument(readType(F, Record, Idx));
7844 case TemplateArgument::Declaration: {
7845 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7846 return TemplateArgument(D, readType(F, Record, Idx));
7848 case TemplateArgument::NullPtr:
7849 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7850 case TemplateArgument::Integral: {
7851 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7852 QualType T = readType(F, Record, Idx);
7853 return TemplateArgument(Context, Value, T);
7855 case TemplateArgument::Template:
7856 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7857 case TemplateArgument::TemplateExpansion: {
7858 TemplateName Name = ReadTemplateName(F, Record, Idx);
7859 Optional<unsigned> NumTemplateExpansions;
7860 if (unsigned NumExpansions = Record[Idx++])
7861 NumTemplateExpansions = NumExpansions - 1;
7862 return TemplateArgument(Name, NumTemplateExpansions);
7864 case TemplateArgument::Expression:
7865 return TemplateArgument(ReadExpr(F));
7866 case TemplateArgument::Pack: {
7867 unsigned NumArgs = Record[Idx++];
7868 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7869 for (unsigned I = 0; I != NumArgs; ++I)
7870 Args[I] = ReadTemplateArgument(F, Record, Idx);
7871 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs));
7875 llvm_unreachable("Unhandled template argument kind!");
7878 TemplateParameterList *
7879 ASTReader::ReadTemplateParameterList(ModuleFile &F,
7880 const RecordData &Record, unsigned &Idx) {
7881 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7882 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7883 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7885 unsigned NumParams = Record[Idx++];
7886 SmallVector<NamedDecl *, 16> Params;
7887 Params.reserve(NumParams);
7889 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7891 TemplateParameterList* TemplateParams =
7892 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7894 return TemplateParams;
7899 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
7900 ModuleFile &F, const RecordData &Record,
7901 unsigned &Idx, bool Canonicalize) {
7902 unsigned NumTemplateArgs = Record[Idx++];
7903 TemplArgs.reserve(NumTemplateArgs);
7904 while (NumTemplateArgs--)
7905 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize));
7908 /// \brief Read a UnresolvedSet structure.
7909 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
7910 const RecordData &Record, unsigned &Idx) {
7911 unsigned NumDecls = Record[Idx++];
7912 Set.reserve(Context, NumDecls);
7913 while (NumDecls--) {
7914 DeclID ID = ReadDeclID(F, Record, Idx);
7915 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
7916 Set.addLazyDecl(Context, ID, AS);
7921 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7922 const RecordData &Record, unsigned &Idx) {
7923 bool isVirtual = static_cast<bool>(Record[Idx++]);
7924 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7925 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7926 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7927 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7928 SourceRange Range = ReadSourceRange(F, Record, Idx);
7929 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7930 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7932 Result.setInheritConstructors(inheritConstructors);
7936 CXXCtorInitializer **
7937 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7939 unsigned NumInitializers = Record[Idx++];
7940 assert(NumInitializers && "wrote ctor initializers but have no inits");
7941 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
7942 for (unsigned i = 0; i != NumInitializers; ++i) {
7943 TypeSourceInfo *TInfo = nullptr;
7944 bool IsBaseVirtual = false;
7945 FieldDecl *Member = nullptr;
7946 IndirectFieldDecl *IndirectMember = nullptr;
7948 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7950 case CTOR_INITIALIZER_BASE:
7951 TInfo = GetTypeSourceInfo(F, Record, Idx);
7952 IsBaseVirtual = Record[Idx++];
7955 case CTOR_INITIALIZER_DELEGATING:
7956 TInfo = GetTypeSourceInfo(F, Record, Idx);
7959 case CTOR_INITIALIZER_MEMBER:
7960 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7963 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7964 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7968 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7969 Expr *Init = ReadExpr(F);
7970 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7971 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7972 bool IsWritten = Record[Idx++];
7973 unsigned SourceOrderOrNumArrayIndices;
7974 SmallVector<VarDecl *, 8> Indices;
7976 SourceOrderOrNumArrayIndices = Record[Idx++];
7978 SourceOrderOrNumArrayIndices = Record[Idx++];
7979 Indices.reserve(SourceOrderOrNumArrayIndices);
7980 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7981 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7984 CXXCtorInitializer *BOMInit;
7985 if (Type == CTOR_INITIALIZER_BASE) {
7986 BOMInit = new (Context)
7987 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
7988 RParenLoc, MemberOrEllipsisLoc);
7989 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7990 BOMInit = new (Context)
7991 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
7992 } else if (IsWritten) {
7994 BOMInit = new (Context) CXXCtorInitializer(
7995 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc);
7997 BOMInit = new (Context)
7998 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
7999 LParenLoc, Init, RParenLoc);
8001 if (IndirectMember) {
8002 assert(Indices.empty() && "Indirect field improperly initialized");
8003 BOMInit = new (Context)
8004 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8005 LParenLoc, Init, RParenLoc);
8007 BOMInit = CXXCtorInitializer::Create(
8008 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc,
8009 Indices.data(), Indices.size());
8014 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
8015 CtorInitializers[i] = BOMInit;
8018 return CtorInitializers;
8021 NestedNameSpecifier *
8022 ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8023 const RecordData &Record, unsigned &Idx) {
8024 unsigned N = Record[Idx++];
8025 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
8026 for (unsigned I = 0; I != N; ++I) {
8027 NestedNameSpecifier::SpecifierKind Kind
8028 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8030 case NestedNameSpecifier::Identifier: {
8031 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8032 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8036 case NestedNameSpecifier::Namespace: {
8037 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8038 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8042 case NestedNameSpecifier::NamespaceAlias: {
8043 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8044 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8048 case NestedNameSpecifier::TypeSpec:
8049 case NestedNameSpecifier::TypeSpecWithTemplate: {
8050 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8054 bool Template = Record[Idx++];
8055 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8059 case NestedNameSpecifier::Global: {
8060 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8061 // No associated value, and there can't be a prefix.
8065 case NestedNameSpecifier::Super: {
8066 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8067 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8076 NestedNameSpecifierLoc
8077 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8079 unsigned N = Record[Idx++];
8080 NestedNameSpecifierLocBuilder Builder;
8081 for (unsigned I = 0; I != N; ++I) {
8082 NestedNameSpecifier::SpecifierKind Kind
8083 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8085 case NestedNameSpecifier::Identifier: {
8086 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8087 SourceRange Range = ReadSourceRange(F, Record, Idx);
8088 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8092 case NestedNameSpecifier::Namespace: {
8093 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8094 SourceRange Range = ReadSourceRange(F, Record, Idx);
8095 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8099 case NestedNameSpecifier::NamespaceAlias: {
8100 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8101 SourceRange Range = ReadSourceRange(F, Record, Idx);
8102 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8106 case NestedNameSpecifier::TypeSpec:
8107 case NestedNameSpecifier::TypeSpecWithTemplate: {
8108 bool Template = Record[Idx++];
8109 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8111 return NestedNameSpecifierLoc();
8112 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8114 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8115 Builder.Extend(Context,
8116 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8117 T->getTypeLoc(), ColonColonLoc);
8121 case NestedNameSpecifier::Global: {
8122 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8123 Builder.MakeGlobal(Context, ColonColonLoc);
8127 case NestedNameSpecifier::Super: {
8128 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8129 SourceRange Range = ReadSourceRange(F, Record, Idx);
8130 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8136 return Builder.getWithLocInContext(Context);
8140 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8142 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8143 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8144 return SourceRange(beg, end);
8147 /// \brief Read an integral value
8148 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8149 unsigned BitWidth = Record[Idx++];
8150 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8151 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8156 /// \brief Read a signed integral value
8157 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8158 bool isUnsigned = Record[Idx++];
8159 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8162 /// \brief Read a floating-point value
8163 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8164 const llvm::fltSemantics &Sem,
8166 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
8169 // \brief Read a string
8170 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8171 unsigned Len = Record[Idx++];
8172 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8177 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8179 std::string Filename = ReadString(Record, Idx);
8180 ResolveImportedPath(F, Filename);
8184 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8186 unsigned Major = Record[Idx++];
8187 unsigned Minor = Record[Idx++];
8188 unsigned Subminor = Record[Idx++];
8190 return VersionTuple(Major);
8192 return VersionTuple(Major, Minor - 1);
8193 return VersionTuple(Major, Minor - 1, Subminor - 1);
8196 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8197 const RecordData &Record,
8199 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8200 return CXXTemporary::Create(Context, Decl);
8203 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
8204 return Diag(CurrentImportLoc, DiagID);
8207 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8208 return Diags.Report(Loc, DiagID);
8211 /// \brief Retrieve the identifier table associated with the
8213 IdentifierTable &ASTReader::getIdentifierTable() {
8214 return PP.getIdentifierTable();
8217 /// \brief Record that the given ID maps to the given switch-case
8219 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
8220 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
8221 "Already have a SwitchCase with this ID");
8222 (*CurrSwitchCaseStmts)[ID] = SC;
8225 /// \brief Retrieve the switch-case statement with the given ID.
8226 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
8227 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
8228 return (*CurrSwitchCaseStmts)[ID];
8231 void ASTReader::ClearSwitchCaseIDs() {
8232 CurrSwitchCaseStmts->clear();
8235 void ASTReader::ReadComments() {
8236 std::vector<RawComment *> Comments;
8237 for (SmallVectorImpl<std::pair<BitstreamCursor,
8238 serialization::ModuleFile *> >::iterator
8239 I = CommentsCursors.begin(),
8240 E = CommentsCursors.end();
8243 BitstreamCursor &Cursor = I->first;
8244 serialization::ModuleFile &F = *I->second;
8245 SavedStreamPosition SavedPosition(Cursor);
8249 llvm::BitstreamEntry Entry =
8250 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
8252 switch (Entry.Kind) {
8253 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8254 case llvm::BitstreamEntry::Error:
8255 Error("malformed block record in AST file");
8257 case llvm::BitstreamEntry::EndBlock:
8259 case llvm::BitstreamEntry::Record:
8260 // The interesting case.
8266 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
8267 case COMMENTS_RAW_COMMENT: {
8269 SourceRange SR = ReadSourceRange(F, Record, Idx);
8270 RawComment::CommentKind Kind =
8271 (RawComment::CommentKind) Record[Idx++];
8272 bool IsTrailingComment = Record[Idx++];
8273 bool IsAlmostTrailingComment = Record[Idx++];
8274 Comments.push_back(new (Context) RawComment(
8275 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8276 Context.getLangOpts().CommentOpts.ParseAllComments));
8282 Context.Comments.addDeserializedComments(Comments);
8286 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8287 // If we know the owning module, use it.
8288 if (Module *M = D->getImportedOwningModule())
8289 return M->getFullModuleName();
8291 // Otherwise, use the name of the top-level module the decl is within.
8292 if (ModuleFile *M = getOwningModuleFile(D))
8293 return M->ModuleName;
8295 // Not from a module.
8299 void ASTReader::finishPendingActions() {
8300 while (!PendingIdentifierInfos.empty() ||
8301 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
8302 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
8303 !PendingUpdateRecords.empty()) {
8304 // If any identifiers with corresponding top-level declarations have
8305 // been loaded, load those declarations now.
8306 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8308 TopLevelDeclsMap TopLevelDecls;
8310 while (!PendingIdentifierInfos.empty()) {
8311 IdentifierInfo *II = PendingIdentifierInfos.back().first;
8312 SmallVector<uint32_t, 4> DeclIDs =
8313 std::move(PendingIdentifierInfos.back().second);
8314 PendingIdentifierInfos.pop_back();
8316 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
8319 // For each decl chain that we wanted to complete while deserializing, mark
8320 // it as "still needs to be completed".
8321 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8322 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8324 PendingIncompleteDeclChains.clear();
8326 // Load pending declaration chains.
8327 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
8328 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second);
8329 PendingDeclChains.clear();
8331 // Make the most recent of the top-level declarations visible.
8332 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8333 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
8334 IdentifierInfo *II = TLD->first;
8335 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
8336 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
8340 // Load any pending macro definitions.
8341 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
8342 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8343 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8344 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8345 // Initialize the macro history from chained-PCHs ahead of module imports.
8346 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8348 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8349 if (Info.M->Kind != MK_ImplicitModule &&
8350 Info.M->Kind != MK_ExplicitModule)
8351 resolvePendingMacro(II, Info);
8353 // Handle module imports.
8354 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8356 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8357 if (Info.M->Kind == MK_ImplicitModule ||
8358 Info.M->Kind == MK_ExplicitModule)
8359 resolvePendingMacro(II, Info);
8362 PendingMacroIDs.clear();
8364 // Wire up the DeclContexts for Decls that we delayed setting until
8365 // recursive loading is completed.
8366 while (!PendingDeclContextInfos.empty()) {
8367 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8368 PendingDeclContextInfos.pop_front();
8369 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8370 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8371 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8374 // Perform any pending declaration updates.
8375 while (!PendingUpdateRecords.empty()) {
8376 auto Update = PendingUpdateRecords.pop_back_val();
8377 ReadingKindTracker ReadingKind(Read_Decl, *this);
8378 loadDeclUpdateRecords(Update.first, Update.second);
8382 // At this point, all update records for loaded decls are in place, so any
8383 // fake class definitions should have become real.
8384 assert(PendingFakeDefinitionData.empty() &&
8385 "faked up a class definition but never saw the real one");
8387 // If we deserialized any C++ or Objective-C class definitions, any
8388 // Objective-C protocol definitions, or any redeclarable templates, make sure
8389 // that all redeclarations point to the definitions. Note that this can only
8390 // happen now, after the redeclaration chains have been fully wired.
8391 for (Decl *D : PendingDefinitions) {
8392 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
8393 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
8394 // Make sure that the TagType points at the definition.
8395 const_cast<TagType*>(TagT)->decl = TD;
8398 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
8399 for (auto *R = getMostRecentExistingDecl(RD); R;
8400 R = R->getPreviousDecl()) {
8402 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
8403 "declaration thinks it's the definition but it isn't");
8404 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
8411 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
8412 // Make sure that the ObjCInterfaceType points at the definition.
8413 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8416 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
8417 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
8422 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
8423 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
8424 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
8429 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
8430 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
8431 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
8433 PendingDefinitions.clear();
8435 // Load the bodies of any functions or methods we've encountered. We do
8436 // this now (delayed) so that we can be sure that the declaration chains
8437 // have been fully wired up (hasBody relies on this).
8438 // FIXME: We shouldn't require complete redeclaration chains here.
8439 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8440 PBEnd = PendingBodies.end();
8441 PB != PBEnd; ++PB) {
8442 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8443 // FIXME: Check for =delete/=default?
8444 // FIXME: Complain about ODR violations here?
8445 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8446 FD->setLazyBody(PB->second);
8450 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8451 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8452 MD->setLazyBody(PB->second);
8454 PendingBodies.clear();
8457 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
8458 getContext().deduplicateMergedDefinitonsFor(ND);
8459 PendingMergedDefinitionsToDeduplicate.clear();
8462 void ASTReader::diagnoseOdrViolations() {
8463 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8466 // Trigger the import of the full definition of each class that had any
8467 // odr-merging problems, so we can produce better diagnostics for them.
8468 // These updates may in turn find and diagnose some ODR failures, so take
8469 // ownership of the set first.
8470 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8471 PendingOdrMergeFailures.clear();
8472 for (auto &Merge : OdrMergeFailures) {
8473 Merge.first->buildLookup();
8474 Merge.first->decls_begin();
8475 Merge.first->bases_begin();
8476 Merge.first->vbases_begin();
8477 for (auto *RD : Merge.second) {
8484 // For each declaration from a merged context, check that the canonical
8485 // definition of that context also contains a declaration of the same
8488 // Caution: this loop does things that might invalidate iterators into
8489 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8490 while (!PendingOdrMergeChecks.empty()) {
8491 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8493 // FIXME: Skip over implicit declarations for now. This matters for things
8494 // like implicitly-declared special member functions. This isn't entirely
8495 // correct; we can end up with multiple unmerged declarations of the same
8497 if (D->isImplicit())
8500 DeclContext *CanonDef = D->getDeclContext();
8503 const Decl *DCanon = D->getCanonicalDecl();
8505 for (auto RI : D->redecls()) {
8506 if (RI->getLexicalDeclContext() == CanonDef) {
8514 // Quick check failed, time to do the slow thing. Note, we can't just
8515 // look up the name of D in CanonDef here, because the member that is
8516 // in CanonDef might not be found by name lookup (it might have been
8517 // replaced by a more recent declaration in the lookup table), and we
8518 // can't necessarily find it in the redeclaration chain because it might
8519 // be merely mergeable, not redeclarable.
8520 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8521 for (auto *CanonMember : CanonDef->decls()) {
8522 if (CanonMember->getCanonicalDecl() == DCanon) {
8523 // This can happen if the declaration is merely mergeable and not
8524 // actually redeclarable (we looked for redeclarations earlier).
8526 // FIXME: We should be able to detect this more efficiently, without
8527 // pulling in all of the members of CanonDef.
8531 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
8532 if (ND->getDeclName() == D->getDeclName())
8533 Candidates.push_back(ND);
8537 // The AST doesn't like TagDecls becoming invalid after they've been
8538 // completed. We only really need to mark FieldDecls as invalid here.
8539 if (!isa<TagDecl>(D))
8540 D->setInvalidDecl();
8542 // Ensure we don't accidentally recursively enter deserialization while
8543 // we're producing our diagnostic.
8544 Deserializing RecursionGuard(this);
8546 std::string CanonDefModule =
8547 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8548 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8549 << D << getOwningModuleNameForDiagnostic(D)
8550 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8552 if (Candidates.empty())
8553 Diag(cast<Decl>(CanonDef)->getLocation(),
8554 diag::note_module_odr_violation_no_possible_decls) << D;
8556 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8557 Diag(Candidates[I]->getLocation(),
8558 diag::note_module_odr_violation_possible_decl)
8562 DiagnosedOdrMergeFailures.insert(CanonDef);
8566 if (OdrMergeFailures.empty())
8569 // Ensure we don't accidentally recursively enter deserialization while
8570 // we're producing our diagnostics.
8571 Deserializing RecursionGuard(this);
8573 // Issue any pending ODR-failure diagnostics.
8574 for (auto &Merge : OdrMergeFailures) {
8575 // If we've already pointed out a specific problem with this class, don't
8576 // bother issuing a general "something's different" diagnostic.
8577 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
8580 bool Diagnosed = false;
8581 for (auto *RD : Merge.second) {
8582 // Multiple different declarations got merged together; tell the user
8583 // where they came from.
8584 if (Merge.first != RD) {
8585 // FIXME: Walk the definition, figure out what's different,
8586 // and diagnose that.
8588 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8589 Diag(Merge.first->getLocation(),
8590 diag::err_module_odr_violation_different_definitions)
8591 << Merge.first << Module.empty() << Module;
8595 Diag(RD->getLocation(),
8596 diag::note_module_odr_violation_different_definitions)
8597 << getOwningModuleNameForDiagnostic(RD);
8602 // All definitions are updates to the same declaration. This happens if a
8603 // module instantiates the declaration of a class template specialization
8604 // and two or more other modules instantiate its definition.
8606 // FIXME: Indicate which modules had instantiations of this definition.
8607 // FIXME: How can this even happen?
8608 Diag(Merge.first->getLocation(),
8609 diag::err_module_odr_violation_different_instantiations)
8615 void ASTReader::StartedDeserializing() {
8616 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
8617 ReadTimer->startTimer();
8620 void ASTReader::FinishedDeserializing() {
8621 assert(NumCurrentElementsDeserializing &&
8622 "FinishedDeserializing not paired with StartedDeserializing");
8623 if (NumCurrentElementsDeserializing == 1) {
8624 // We decrease NumCurrentElementsDeserializing only after pending actions
8625 // are finished, to avoid recursively re-calling finishPendingActions().
8626 finishPendingActions();
8628 --NumCurrentElementsDeserializing;
8630 if (NumCurrentElementsDeserializing == 0) {
8631 // Propagate exception specification updates along redeclaration chains.
8632 while (!PendingExceptionSpecUpdates.empty()) {
8633 auto Updates = std::move(PendingExceptionSpecUpdates);
8634 PendingExceptionSpecUpdates.clear();
8635 for (auto Update : Updates) {
8636 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
8637 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
8638 if (auto *Listener = Context.getASTMutationListener())
8639 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
8640 for (auto *Redecl : Update.second->redecls())
8641 Context.adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
8646 ReadTimer->stopTimer();
8648 diagnoseOdrViolations();
8650 // We are not in recursive loading, so it's safe to pass the "interesting"
8651 // decls to the consumer.
8653 PassInterestingDeclsToConsumer();
8657 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
8658 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
8659 // Remove any fake results before adding any real ones.
8660 auto It = PendingFakeLookupResults.find(II);
8661 if (It != PendingFakeLookupResults.end()) {
8662 for (auto *ND : It->second)
8663 SemaObj->IdResolver.RemoveDecl(ND);
8664 // FIXME: this works around module+PCH performance issue.
8665 // Rather than erase the result from the map, which is O(n), just clear
8666 // the vector of NamedDecls.
8671 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8672 SemaObj->TUScope->AddDecl(D);
8673 } else if (SemaObj->TUScope) {
8674 // Adding the decl to IdResolver may have failed because it was already in
8675 // (even though it was not added in scope). If it is already in, make sure
8676 // it gets in the scope as well.
8677 if (std::find(SemaObj->IdResolver.begin(Name),
8678 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8679 SemaObj->TUScope->AddDecl(D);
8683 ASTReader::ASTReader(
8684 Preprocessor &PP, ASTContext &Context,
8685 const PCHContainerReader &PCHContainerRdr,
8686 ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
8687 StringRef isysroot, bool DisableValidation,
8688 bool AllowASTWithCompilerErrors,
8689 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
8690 bool UseGlobalIndex,
8691 std::unique_ptr<llvm::Timer> ReadTimer)
8692 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
8693 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
8694 FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr),
8695 Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context),
8696 Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr),
8697 ReadTimer(std::move(ReadTimer)),
8698 PragmaMSStructState(-1),
8699 PragmaMSPointersToMembersState(-1),
8700 isysroot(isysroot), DisableValidation(DisableValidation),
8701 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8702 AllowConfigurationMismatch(AllowConfigurationMismatch),
8703 ValidateSystemInputs(ValidateSystemInputs),
8704 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
8705 CurrSwitchCaseStmts(&SwitchCaseStmts), NumSLocEntriesRead(0),
8706 TotalNumSLocEntries(0), NumStatementsRead(0), TotalNumStatements(0),
8707 NumMacrosRead(0), TotalNumMacros(0), NumIdentifierLookups(0),
8708 NumIdentifierLookupHits(0), NumSelectorsRead(0),
8709 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8710 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8711 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8712 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8713 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8714 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8715 PassingDeclsToConsumer(false), ReadingKind(Read_None) {
8716 SourceMgr.setExternalSLocEntrySource(this);
8718 for (const auto &Ext : Extensions) {
8719 auto BlockName = Ext->getExtensionMetadata().BlockName;
8720 auto Known = ModuleFileExtensions.find(BlockName);
8721 if (Known != ModuleFileExtensions.end()) {
8722 Diags.Report(diag::warn_duplicate_module_file_extension)
8727 ModuleFileExtensions.insert({BlockName, Ext});
8731 ASTReader::~ASTReader() {
8732 if (OwnsDeserializationListener)
8733 delete DeserializationListener;