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/ASTMutationListener.h"
20 #include "clang/AST/ASTUnresolvedSet.h"
21 #include "clang/AST/Decl.h"
22 #include "clang/AST/DeclCXX.h"
23 #include "clang/AST/DeclGroup.h"
24 #include "clang/AST/DeclObjC.h"
25 #include "clang/AST/DeclTemplate.h"
26 #include "clang/AST/Expr.h"
27 #include "clang/AST/ExprCXX.h"
28 #include "clang/AST/NestedNameSpecifier.h"
29 #include "clang/AST/RawCommentList.h"
30 #include "clang/AST/Type.h"
31 #include "clang/AST/TypeLocVisitor.h"
32 #include "clang/AST/UnresolvedSet.h"
33 #include "clang/Basic/CommentOptions.h"
34 #include "clang/Basic/DiagnosticOptions.h"
35 #include "clang/Basic/ExceptionSpecificationType.h"
36 #include "clang/Basic/FileManager.h"
37 #include "clang/Basic/FileSystemOptions.h"
38 #include "clang/Basic/LangOptions.h"
39 #include "clang/Basic/ObjCRuntime.h"
40 #include "clang/Basic/OperatorKinds.h"
41 #include "clang/Basic/Sanitizers.h"
42 #include "clang/Basic/SourceManager.h"
43 #include "clang/Basic/SourceManagerInternals.h"
44 #include "clang/Basic/Specifiers.h"
45 #include "clang/Basic/TargetInfo.h"
46 #include "clang/Basic/TargetOptions.h"
47 #include "clang/Basic/TokenKinds.h"
48 #include "clang/Basic/Version.h"
49 #include "clang/Basic/VersionTuple.h"
50 #include "clang/Frontend/PCHContainerOperations.h"
51 #include "clang/Lex/HeaderSearch.h"
52 #include "clang/Lex/HeaderSearchOptions.h"
53 #include "clang/Lex/MacroInfo.h"
54 #include "clang/Lex/ModuleMap.h"
55 #include "clang/Lex/PreprocessingRecord.h"
56 #include "clang/Lex/Preprocessor.h"
57 #include "clang/Lex/PreprocessorOptions.h"
58 #include "clang/Sema/Scope.h"
59 #include "clang/Sema/Sema.h"
60 #include "clang/Sema/Weak.h"
61 #include "clang/Serialization/ASTDeserializationListener.h"
62 #include "clang/Serialization/GlobalModuleIndex.h"
63 #include "clang/Serialization/ModuleManager.h"
64 #include "clang/Serialization/SerializationDiagnostic.h"
65 #include "llvm/ADT/APFloat.h"
66 #include "llvm/ADT/APInt.h"
67 #include "llvm/ADT/APSInt.h"
68 #include "llvm/ADT/Hashing.h"
69 #include "llvm/ADT/SmallString.h"
70 #include "llvm/ADT/StringExtras.h"
71 #include "llvm/ADT/Triple.h"
72 #include "llvm/Bitcode/BitstreamReader.h"
73 #include "llvm/Support/Compression.h"
74 #include "llvm/Support/Compiler.h"
75 #include "llvm/Support/ErrorHandling.h"
76 #include "llvm/Support/FileSystem.h"
77 #include "llvm/Support/MemoryBuffer.h"
78 #include "llvm/Support/Path.h"
79 #include "llvm/Support/SaveAndRestore.h"
80 #include "llvm/Support/raw_ostream.h"
93 #include <system_error>
98 using namespace clang;
99 using namespace clang::serialization;
100 using namespace clang::serialization::reader;
101 using llvm::BitstreamCursor;
103 //===----------------------------------------------------------------------===//
104 // ChainedASTReaderListener implementation
105 //===----------------------------------------------------------------------===//
108 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
109 return First->ReadFullVersionInformation(FullVersion) ||
110 Second->ReadFullVersionInformation(FullVersion);
113 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
114 First->ReadModuleName(ModuleName);
115 Second->ReadModuleName(ModuleName);
118 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
119 First->ReadModuleMapFile(ModuleMapPath);
120 Second->ReadModuleMapFile(ModuleMapPath);
124 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
126 bool AllowCompatibleDifferences) {
127 return First->ReadLanguageOptions(LangOpts, Complain,
128 AllowCompatibleDifferences) ||
129 Second->ReadLanguageOptions(LangOpts, Complain,
130 AllowCompatibleDifferences);
133 bool ChainedASTReaderListener::ReadTargetOptions(
134 const TargetOptions &TargetOpts, bool Complain,
135 bool AllowCompatibleDifferences) {
136 return First->ReadTargetOptions(TargetOpts, Complain,
137 AllowCompatibleDifferences) ||
138 Second->ReadTargetOptions(TargetOpts, Complain,
139 AllowCompatibleDifferences);
142 bool ChainedASTReaderListener::ReadDiagnosticOptions(
143 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
144 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
145 Second->ReadDiagnosticOptions(DiagOpts, Complain);
149 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
151 return First->ReadFileSystemOptions(FSOpts, Complain) ||
152 Second->ReadFileSystemOptions(FSOpts, Complain);
155 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
156 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath,
158 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
160 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
164 bool ChainedASTReaderListener::ReadPreprocessorOptions(
165 const PreprocessorOptions &PPOpts, bool Complain,
166 std::string &SuggestedPredefines) {
167 return First->ReadPreprocessorOptions(PPOpts, Complain,
168 SuggestedPredefines) ||
169 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
171 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
173 First->ReadCounter(M, Value);
174 Second->ReadCounter(M, Value);
176 bool ChainedASTReaderListener::needsInputFileVisitation() {
177 return First->needsInputFileVisitation() ||
178 Second->needsInputFileVisitation();
180 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
181 return First->needsSystemInputFileVisitation() ||
182 Second->needsSystemInputFileVisitation();
184 void ChainedASTReaderListener::visitModuleFile(StringRef Filename,
186 First->visitModuleFile(Filename, Kind);
187 Second->visitModuleFile(Filename, Kind);
190 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
193 bool isExplicitModule) {
194 bool Continue = false;
195 if (First->needsInputFileVisitation() &&
196 (!isSystem || First->needsSystemInputFileVisitation()))
197 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
199 if (Second->needsInputFileVisitation() &&
200 (!isSystem || Second->needsSystemInputFileVisitation()))
201 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
206 void ChainedASTReaderListener::readModuleFileExtension(
207 const ModuleFileExtensionMetadata &Metadata) {
208 First->readModuleFileExtension(Metadata);
209 Second->readModuleFileExtension(Metadata);
212 //===----------------------------------------------------------------------===//
213 // PCH validator implementation
214 //===----------------------------------------------------------------------===//
216 ASTReaderListener::~ASTReaderListener() {}
218 /// \brief Compare the given set of language options against an existing set of
219 /// language options.
221 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
222 /// \param AllowCompatibleDifferences If true, differences between compatible
223 /// language options will be permitted.
225 /// \returns true if the languagae options mis-match, false otherwise.
226 static bool checkLanguageOptions(const LangOptions &LangOpts,
227 const LangOptions &ExistingLangOpts,
228 DiagnosticsEngine *Diags,
229 bool AllowCompatibleDifferences = true) {
230 #define LANGOPT(Name, Bits, Default, Description) \
231 if (ExistingLangOpts.Name != LangOpts.Name) { \
233 Diags->Report(diag::err_pch_langopt_mismatch) \
234 << Description << LangOpts.Name << ExistingLangOpts.Name; \
238 #define VALUE_LANGOPT(Name, Bits, Default, Description) \
239 if (ExistingLangOpts.Name != LangOpts.Name) { \
241 Diags->Report(diag::err_pch_langopt_value_mismatch) \
246 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
247 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
249 Diags->Report(diag::err_pch_langopt_value_mismatch) \
254 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \
255 if (!AllowCompatibleDifferences) \
256 LANGOPT(Name, Bits, Default, Description)
258 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \
259 if (!AllowCompatibleDifferences) \
260 ENUM_LANGOPT(Name, Bits, Default, Description)
262 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
263 if (!AllowCompatibleDifferences) \
264 VALUE_LANGOPT(Name, Bits, Default, Description)
266 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
267 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
268 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description)
269 #include "clang/Basic/LangOptions.def"
271 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) {
273 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features";
277 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
279 Diags->Report(diag::err_pch_langopt_value_mismatch)
280 << "target Objective-C runtime";
284 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
285 LangOpts.CommentOpts.BlockCommandNames) {
287 Diags->Report(diag::err_pch_langopt_value_mismatch)
288 << "block command names";
295 /// \brief Compare the given set of target options against an existing set of
298 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
300 /// \returns true if the target options mis-match, false otherwise.
301 static bool checkTargetOptions(const TargetOptions &TargetOpts,
302 const TargetOptions &ExistingTargetOpts,
303 DiagnosticsEngine *Diags,
304 bool AllowCompatibleDifferences = true) {
305 #define CHECK_TARGET_OPT(Field, Name) \
306 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
308 Diags->Report(diag::err_pch_targetopt_mismatch) \
309 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
313 // The triple and ABI must match exactly.
314 CHECK_TARGET_OPT(Triple, "target");
315 CHECK_TARGET_OPT(ABI, "target ABI");
317 // We can tolerate different CPUs in many cases, notably when one CPU
318 // supports a strict superset of another. When allowing compatible
319 // differences skip this check.
320 if (!AllowCompatibleDifferences)
321 CHECK_TARGET_OPT(CPU, "target CPU");
323 #undef CHECK_TARGET_OPT
325 // Compare feature sets.
326 SmallVector<StringRef, 4> ExistingFeatures(
327 ExistingTargetOpts.FeaturesAsWritten.begin(),
328 ExistingTargetOpts.FeaturesAsWritten.end());
329 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
330 TargetOpts.FeaturesAsWritten.end());
331 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
332 std::sort(ReadFeatures.begin(), ReadFeatures.end());
334 // We compute the set difference in both directions explicitly so that we can
335 // diagnose the differences differently.
336 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures;
338 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
339 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
340 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
341 ExistingFeatures.begin(), ExistingFeatures.end(),
342 std::back_inserter(UnmatchedReadFeatures));
344 // If we are allowing compatible differences and the read feature set is
345 // a strict subset of the existing feature set, there is nothing to diagnose.
346 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
350 for (StringRef Feature : UnmatchedReadFeatures)
351 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
352 << /* is-existing-feature */ false << Feature;
353 for (StringRef Feature : UnmatchedExistingFeatures)
354 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
355 << /* is-existing-feature */ true << Feature;
358 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
362 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
364 bool AllowCompatibleDifferences) {
365 const LangOptions &ExistingLangOpts = PP.getLangOpts();
366 return checkLanguageOptions(LangOpts, ExistingLangOpts,
367 Complain ? &Reader.Diags : nullptr,
368 AllowCompatibleDifferences);
371 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
373 bool AllowCompatibleDifferences) {
374 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
375 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
376 Complain ? &Reader.Diags : nullptr,
377 AllowCompatibleDifferences);
382 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
384 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
387 } // end anonymous namespace
389 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
390 DiagnosticsEngine &Diags,
392 typedef DiagnosticsEngine::Level Level;
394 // Check current mappings for new -Werror mappings, and the stored mappings
395 // for cases that were explicitly mapped to *not* be errors that are now
396 // errors because of options like -Werror.
397 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
399 for (DiagnosticsEngine *MappingSource : MappingSources) {
400 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
401 diag::kind DiagID = DiagIDMappingPair.first;
402 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
403 if (CurLevel < DiagnosticsEngine::Error)
404 continue; // not significant
406 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
407 if (StoredLevel < DiagnosticsEngine::Error) {
409 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
410 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
419 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
420 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
421 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
423 return Ext >= diag::Severity::Error;
426 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
427 DiagnosticsEngine &Diags,
428 bool IsSystem, bool Complain) {
431 if (Diags.getSuppressSystemWarnings())
433 // If -Wsystem-headers was not enabled before, be conservative
434 if (StoredDiags.getSuppressSystemWarnings()) {
436 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
441 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
443 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
447 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
448 !StoredDiags.getEnableAllWarnings()) {
450 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
454 if (isExtHandlingFromDiagsError(Diags) &&
455 !isExtHandlingFromDiagsError(StoredDiags)) {
457 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
461 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
464 bool PCHValidator::ReadDiagnosticOptions(
465 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
466 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
467 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
468 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
469 new DiagnosticsEngine(DiagIDs, DiagOpts.get()));
470 // This should never fail, because we would have processed these options
471 // before writing them to an ASTFile.
472 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
474 ModuleManager &ModuleMgr = Reader.getModuleManager();
475 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
477 // If the original import came from a file explicitly generated by the user,
478 // don't check the diagnostic mappings.
479 // FIXME: currently this is approximated by checking whether this is not a
480 // module import of an implicitly-loaded module file.
481 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
482 // the transitive closure of its imports, since unrelated modules cannot be
483 // imported until after this module finishes validation.
484 ModuleFile *TopImport = *ModuleMgr.rbegin();
485 while (!TopImport->ImportedBy.empty())
486 TopImport = TopImport->ImportedBy[0];
487 if (TopImport->Kind != MK_ImplicitModule)
490 StringRef ModuleName = TopImport->ModuleName;
491 assert(!ModuleName.empty() && "diagnostic options read before module name");
493 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
494 assert(M && "missing module");
496 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
497 // contains the union of their flags.
498 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
501 /// \brief Collect the macro definitions provided by the given preprocessor
504 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
505 MacroDefinitionsMap &Macros,
506 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
507 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
508 StringRef Macro = PPOpts.Macros[I].first;
509 bool IsUndef = PPOpts.Macros[I].second;
511 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
512 StringRef MacroName = MacroPair.first;
513 StringRef MacroBody = MacroPair.second;
515 // For an #undef'd macro, we only care about the name.
517 if (MacroNames && !Macros.count(MacroName))
518 MacroNames->push_back(MacroName);
520 Macros[MacroName] = std::make_pair("", true);
524 // For a #define'd macro, figure out the actual definition.
525 if (MacroName.size() == Macro.size())
528 // Note: GCC drops anything following an end-of-line character.
529 StringRef::size_type End = MacroBody.find_first_of("\n\r");
530 MacroBody = MacroBody.substr(0, End);
533 if (MacroNames && !Macros.count(MacroName))
534 MacroNames->push_back(MacroName);
535 Macros[MacroName] = std::make_pair(MacroBody, false);
539 /// \brief Check the preprocessor options deserialized from the control block
540 /// against the preprocessor options in an existing preprocessor.
542 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
543 /// \param Validate If true, validate preprocessor options. If false, allow
544 /// macros defined by \p ExistingPPOpts to override those defined by
545 /// \p PPOpts in SuggestedPredefines.
546 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
547 const PreprocessorOptions &ExistingPPOpts,
548 DiagnosticsEngine *Diags,
549 FileManager &FileMgr,
550 std::string &SuggestedPredefines,
551 const LangOptions &LangOpts,
552 bool Validate = true) {
553 // Check macro definitions.
554 MacroDefinitionsMap ASTFileMacros;
555 collectMacroDefinitions(PPOpts, ASTFileMacros);
556 MacroDefinitionsMap ExistingMacros;
557 SmallVector<StringRef, 4> ExistingMacroNames;
558 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
560 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
561 // Dig out the macro definition in the existing preprocessor options.
562 StringRef MacroName = ExistingMacroNames[I];
563 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
565 // Check whether we know anything about this macro name or not.
566 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
567 = ASTFileMacros.find(MacroName);
568 if (!Validate || Known == ASTFileMacros.end()) {
569 // FIXME: Check whether this identifier was referenced anywhere in the
570 // AST file. If so, we should reject the AST file. Unfortunately, this
571 // information isn't in the control block. What shall we do about it?
573 if (Existing.second) {
574 SuggestedPredefines += "#undef ";
575 SuggestedPredefines += MacroName.str();
576 SuggestedPredefines += '\n';
578 SuggestedPredefines += "#define ";
579 SuggestedPredefines += MacroName.str();
580 SuggestedPredefines += ' ';
581 SuggestedPredefines += Existing.first.str();
582 SuggestedPredefines += '\n';
587 // If the macro was defined in one but undef'd in the other, we have a
589 if (Existing.second != Known->second.second) {
591 Diags->Report(diag::err_pch_macro_def_undef)
592 << MacroName << Known->second.second;
597 // If the macro was #undef'd in both, or if the macro bodies are identical,
599 if (Existing.second || Existing.first == Known->second.first)
602 // The macro bodies differ; complain.
604 Diags->Report(diag::err_pch_macro_def_conflict)
605 << MacroName << Known->second.first << Existing.first;
610 // Check whether we're using predefines.
611 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) {
613 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
618 // Detailed record is important since it is used for the module cache hash.
619 if (LangOpts.Modules &&
620 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) {
622 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
627 // Compute the #include and #include_macros lines we need.
628 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
629 StringRef File = ExistingPPOpts.Includes[I];
630 if (File == ExistingPPOpts.ImplicitPCHInclude)
633 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
634 != PPOpts.Includes.end())
637 SuggestedPredefines += "#include \"";
638 SuggestedPredefines += File;
639 SuggestedPredefines += "\"\n";
642 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
643 StringRef File = ExistingPPOpts.MacroIncludes[I];
644 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
646 != PPOpts.MacroIncludes.end())
649 SuggestedPredefines += "#__include_macros \"";
650 SuggestedPredefines += File;
651 SuggestedPredefines += "\"\n##\n";
657 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
659 std::string &SuggestedPredefines) {
660 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
662 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
663 Complain? &Reader.Diags : nullptr,
669 bool SimpleASTReaderListener::ReadPreprocessorOptions(
670 const PreprocessorOptions &PPOpts,
672 std::string &SuggestedPredefines) {
673 return checkPreprocessorOptions(PPOpts,
674 PP.getPreprocessorOpts(),
682 /// Check the header search options deserialized from the control block
683 /// against the header search options in an existing preprocessor.
685 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
686 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
687 StringRef SpecificModuleCachePath,
688 StringRef ExistingModuleCachePath,
689 DiagnosticsEngine *Diags,
690 const LangOptions &LangOpts) {
691 if (LangOpts.Modules) {
692 if (SpecificModuleCachePath != ExistingModuleCachePath) {
694 Diags->Report(diag::err_pch_modulecache_mismatch)
695 << SpecificModuleCachePath << ExistingModuleCachePath;
703 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
704 StringRef SpecificModuleCachePath,
706 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
707 PP.getHeaderSearchInfo().getModuleCachePath(),
708 Complain ? &Reader.Diags : nullptr,
712 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
713 PP.setCounterValue(Value);
716 //===----------------------------------------------------------------------===//
717 // AST reader implementation
718 //===----------------------------------------------------------------------===//
720 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
721 bool TakeOwnership) {
722 DeserializationListener = Listener;
723 OwnsDeserializationListener = TakeOwnership;
726 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
727 return serialization::ComputeHash(Sel);
730 std::pair<unsigned, unsigned>
731 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
732 using namespace llvm::support;
733 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
734 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
735 return std::make_pair(KeyLen, DataLen);
738 ASTSelectorLookupTrait::internal_key_type
739 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
740 using namespace llvm::support;
741 SelectorTable &SelTable = Reader.getContext().Selectors;
742 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
743 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
744 F, endian::readNext<uint32_t, little, unaligned>(d));
746 return SelTable.getNullarySelector(FirstII);
748 return SelTable.getUnarySelector(FirstII);
750 SmallVector<IdentifierInfo *, 16> Args;
751 Args.push_back(FirstII);
752 for (unsigned I = 1; I != N; ++I)
753 Args.push_back(Reader.getLocalIdentifier(
754 F, endian::readNext<uint32_t, little, unaligned>(d)));
756 return SelTable.getSelector(N, Args.data());
759 ASTSelectorLookupTrait::data_type
760 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
762 using namespace llvm::support;
766 Result.ID = Reader.getGlobalSelectorID(
767 F, endian::readNext<uint32_t, little, unaligned>(d));
768 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d);
769 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d);
770 Result.InstanceBits = FullInstanceBits & 0x3;
771 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
772 Result.FactoryBits = FullFactoryBits & 0x3;
773 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
774 unsigned NumInstanceMethods = FullInstanceBits >> 3;
775 unsigned NumFactoryMethods = FullFactoryBits >> 3;
777 // Load instance methods
778 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
779 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
780 F, endian::readNext<uint32_t, little, unaligned>(d)))
781 Result.Instance.push_back(Method);
784 // Load factory methods
785 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
786 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
787 F, endian::readNext<uint32_t, little, unaligned>(d)))
788 Result.Factory.push_back(Method);
794 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
795 return llvm::HashString(a);
798 std::pair<unsigned, unsigned>
799 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
800 using namespace llvm::support;
801 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
802 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
803 return std::make_pair(KeyLen, DataLen);
806 ASTIdentifierLookupTraitBase::internal_key_type
807 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
808 assert(n >= 2 && d[n-1] == '\0');
809 return StringRef((const char*) d, n-1);
812 /// \brief Whether the given identifier is "interesting".
813 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II,
815 return II.hadMacroDefinition() ||
817 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) ||
818 II.hasRevertedTokenIDToIdentifier() ||
819 (!(IsModule && Reader.getContext().getLangOpts().CPlusPlus) &&
820 II.getFETokenInfo<void>());
823 static bool readBit(unsigned &Bits) {
824 bool Value = Bits & 0x1;
829 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) {
830 using namespace llvm::support;
831 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
832 return Reader.getGlobalIdentifierID(F, RawID >> 1);
835 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) {
836 if (!II.isFromAST()) {
838 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr;
839 if (isInterestingIdentifier(Reader, II, IsModule))
840 II.setChangedSinceDeserialization();
844 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
845 const unsigned char* d,
847 using namespace llvm::support;
848 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
849 bool IsInteresting = RawID & 0x01;
851 // Wipe out the "is interesting" bit.
854 // Build the IdentifierInfo and link the identifier ID with it.
855 IdentifierInfo *II = KnownII;
857 II = &Reader.getIdentifierTable().getOwn(k);
860 markIdentifierFromAST(Reader, *II);
861 Reader.markIdentifierUpToDate(II);
863 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
864 if (!IsInteresting) {
865 // For uninteresting identifiers, there's nothing else to do. Just notify
866 // the reader that we've finished loading this identifier.
867 Reader.SetIdentifierInfo(ID, II);
871 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
872 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
873 bool CPlusPlusOperatorKeyword = readBit(Bits);
874 bool HasRevertedTokenIDToIdentifier = readBit(Bits);
875 bool HasRevertedBuiltin = readBit(Bits);
876 bool Poisoned = readBit(Bits);
877 bool ExtensionToken = readBit(Bits);
878 bool HadMacroDefinition = readBit(Bits);
880 assert(Bits == 0 && "Extra bits in the identifier?");
883 // Set or check the various bits in the IdentifierInfo structure.
884 // Token IDs are read-only.
885 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
886 II->revertTokenIDToIdentifier();
888 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
889 else if (HasRevertedBuiltin && II->getBuiltinID()) {
891 assert((II->hasRevertedBuiltin() ||
892 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) &&
893 "Incorrect ObjC keyword or builtin ID");
895 assert(II->isExtensionToken() == ExtensionToken &&
896 "Incorrect extension token flag");
897 (void)ExtensionToken;
899 II->setIsPoisoned(true);
900 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
901 "Incorrect C++ operator keyword flag");
902 (void)CPlusPlusOperatorKeyword;
904 // If this identifier is a macro, deserialize the macro
906 if (HadMacroDefinition) {
907 uint32_t MacroDirectivesOffset =
908 endian::readNext<uint32_t, little, unaligned>(d);
911 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
914 Reader.SetIdentifierInfo(ID, II);
916 // Read all of the declarations visible at global scope with this
919 SmallVector<uint32_t, 4> DeclIDs;
920 for (; DataLen > 0; DataLen -= 4)
921 DeclIDs.push_back(Reader.getGlobalDeclID(
922 F, endian::readNext<uint32_t, little, unaligned>(d)));
923 Reader.SetGloballyVisibleDecls(II, DeclIDs);
929 DeclarationNameKey::DeclarationNameKey(DeclarationName Name)
930 : Kind(Name.getNameKind()) {
932 case DeclarationName::Identifier:
933 Data = (uint64_t)Name.getAsIdentifierInfo();
935 case DeclarationName::ObjCZeroArgSelector:
936 case DeclarationName::ObjCOneArgSelector:
937 case DeclarationName::ObjCMultiArgSelector:
938 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
940 case DeclarationName::CXXOperatorName:
941 Data = Name.getCXXOverloadedOperator();
943 case DeclarationName::CXXLiteralOperatorName:
944 Data = (uint64_t)Name.getCXXLiteralIdentifier();
946 case DeclarationName::CXXConstructorName:
947 case DeclarationName::CXXDestructorName:
948 case DeclarationName::CXXConversionFunctionName:
949 case DeclarationName::CXXUsingDirective:
955 unsigned DeclarationNameKey::getHash() const {
956 llvm::FoldingSetNodeID ID;
960 case DeclarationName::Identifier:
961 case DeclarationName::CXXLiteralOperatorName:
962 ID.AddString(((IdentifierInfo*)Data)->getName());
964 case DeclarationName::ObjCZeroArgSelector:
965 case DeclarationName::ObjCOneArgSelector:
966 case DeclarationName::ObjCMultiArgSelector:
967 ID.AddInteger(serialization::ComputeHash(Selector(Data)));
969 case DeclarationName::CXXOperatorName:
970 ID.AddInteger((OverloadedOperatorKind)Data);
972 case DeclarationName::CXXConstructorName:
973 case DeclarationName::CXXDestructorName:
974 case DeclarationName::CXXConversionFunctionName:
975 case DeclarationName::CXXUsingDirective:
979 return ID.ComputeHash();
983 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) {
984 using namespace llvm::support;
985 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d);
986 return Reader.getLocalModuleFile(F, ModuleFileID);
989 std::pair<unsigned, unsigned>
990 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) {
991 using namespace llvm::support;
992 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
993 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
994 return std::make_pair(KeyLen, DataLen);
997 ASTDeclContextNameLookupTrait::internal_key_type
998 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) {
999 using namespace llvm::support;
1001 auto Kind = (DeclarationName::NameKind)*d++;
1004 case DeclarationName::Identifier:
1005 Data = (uint64_t)Reader.getLocalIdentifier(
1006 F, endian::readNext<uint32_t, little, unaligned>(d));
1008 case DeclarationName::ObjCZeroArgSelector:
1009 case DeclarationName::ObjCOneArgSelector:
1010 case DeclarationName::ObjCMultiArgSelector:
1012 (uint64_t)Reader.getLocalSelector(
1013 F, endian::readNext<uint32_t, little, unaligned>(
1014 d)).getAsOpaquePtr();
1016 case DeclarationName::CXXOperatorName:
1017 Data = *d++; // OverloadedOperatorKind
1019 case DeclarationName::CXXLiteralOperatorName:
1020 Data = (uint64_t)Reader.getLocalIdentifier(
1021 F, endian::readNext<uint32_t, little, unaligned>(d));
1023 case DeclarationName::CXXConstructorName:
1024 case DeclarationName::CXXDestructorName:
1025 case DeclarationName::CXXConversionFunctionName:
1026 case DeclarationName::CXXUsingDirective:
1031 return DeclarationNameKey(Kind, Data);
1034 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type,
1035 const unsigned char *d,
1037 data_type_builder &Val) {
1038 using namespace llvm::support;
1039 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) {
1040 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d);
1041 Val.insert(Reader.getGlobalDeclID(F, LocalID));
1045 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M,
1046 BitstreamCursor &Cursor,
1049 assert(Offset != 0);
1051 SavedStreamPosition SavedPosition(Cursor);
1052 Cursor.JumpToBit(Offset);
1056 unsigned Code = Cursor.ReadCode();
1057 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1058 if (RecCode != DECL_CONTEXT_LEXICAL) {
1059 Error("Expected lexical block");
1063 assert(!isa<TranslationUnitDecl>(DC) &&
1064 "expected a TU_UPDATE_LEXICAL record for TU");
1065 // If we are handling a C++ class template instantiation, we can see multiple
1066 // lexical updates for the same record. It's important that we select only one
1067 // of them, so that field numbering works properly. Just pick the first one we
1069 auto &Lex = LexicalDecls[DC];
1071 Lex = std::make_pair(
1072 &M, llvm::makeArrayRef(
1073 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
1077 DC->setHasExternalLexicalStorage(true);
1081 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M,
1082 BitstreamCursor &Cursor,
1085 assert(Offset != 0);
1087 SavedStreamPosition SavedPosition(Cursor);
1088 Cursor.JumpToBit(Offset);
1092 unsigned Code = Cursor.ReadCode();
1093 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
1094 if (RecCode != DECL_CONTEXT_VISIBLE) {
1095 Error("Expected visible lookup table block");
1099 // We can't safely determine the primary context yet, so delay attaching the
1100 // lookup table until we're done with recursive deserialization.
1101 auto *Data = (const unsigned char*)Blob.data();
1102 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data});
1106 void ASTReader::Error(StringRef Msg) {
1107 Error(diag::err_fe_pch_malformed, Msg);
1108 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight() &&
1109 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1110 Diag(diag::note_module_cache_path)
1111 << PP.getHeaderSearchInfo().getModuleCachePath();
1115 void ASTReader::Error(unsigned DiagID,
1116 StringRef Arg1, StringRef Arg2) {
1117 if (Diags.isDiagnosticInFlight())
1118 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1120 Diag(DiagID) << Arg1 << Arg2;
1123 //===----------------------------------------------------------------------===//
1124 // Source Manager Deserialization
1125 //===----------------------------------------------------------------------===//
1127 /// \brief Read the line table in the source manager block.
1128 /// \returns true if there was an error.
1129 bool ASTReader::ParseLineTable(ModuleFile &F,
1130 const RecordData &Record) {
1132 LineTableInfo &LineTable = SourceMgr.getLineTable();
1134 // Parse the file names
1135 std::map<int, int> FileIDs;
1136 for (unsigned I = 0; Record[Idx]; ++I) {
1137 // Extract the file name
1138 auto Filename = ReadPath(F, Record, Idx);
1139 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1143 // Parse the line entries
1144 std::vector<LineEntry> Entries;
1145 while (Idx < Record.size()) {
1146 int FID = Record[Idx++];
1147 assert(FID >= 0 && "Serialized line entries for non-local file.");
1148 // Remap FileID from 1-based old view.
1149 FID += F.SLocEntryBaseID - 1;
1151 // Extract the line entries
1152 unsigned NumEntries = Record[Idx++];
1153 assert(NumEntries && "no line entries for file ID");
1155 Entries.reserve(NumEntries);
1156 for (unsigned I = 0; I != NumEntries; ++I) {
1157 unsigned FileOffset = Record[Idx++];
1158 unsigned LineNo = Record[Idx++];
1159 int FilenameID = FileIDs[Record[Idx++]];
1160 SrcMgr::CharacteristicKind FileKind
1161 = (SrcMgr::CharacteristicKind)Record[Idx++];
1162 unsigned IncludeOffset = Record[Idx++];
1163 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1164 FileKind, IncludeOffset));
1166 LineTable.AddEntry(FileID::get(FID), Entries);
1172 /// \brief Read a source manager block
1173 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1174 using namespace SrcMgr;
1176 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1178 // Set the source-location entry cursor to the current position in
1179 // the stream. This cursor will be used to read the contents of the
1180 // source manager block initially, and then lazily read
1181 // source-location entries as needed.
1182 SLocEntryCursor = F.Stream;
1184 // The stream itself is going to skip over the source manager block.
1185 if (F.Stream.SkipBlock()) {
1186 Error("malformed block record in AST file");
1190 // Enter the source manager block.
1191 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1192 Error("malformed source manager block record in AST file");
1198 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1201 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1202 case llvm::BitstreamEntry::Error:
1203 Error("malformed block record in AST file");
1205 case llvm::BitstreamEntry::EndBlock:
1207 case llvm::BitstreamEntry::Record:
1208 // The interesting case.
1215 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1216 default: // Default behavior: ignore.
1219 case SM_SLOC_FILE_ENTRY:
1220 case SM_SLOC_BUFFER_ENTRY:
1221 case SM_SLOC_EXPANSION_ENTRY:
1222 // Once we hit one of the source location entries, we're done.
1228 /// \brief If a header file is not found at the path that we expect it to be
1229 /// and the PCH file was moved from its original location, try to resolve the
1230 /// file by assuming that header+PCH were moved together and the header is in
1231 /// the same place relative to the PCH.
1233 resolveFileRelativeToOriginalDir(const std::string &Filename,
1234 const std::string &OriginalDir,
1235 const std::string &CurrDir) {
1236 assert(OriginalDir != CurrDir &&
1237 "No point trying to resolve the file if the PCH dir didn't change");
1238 using namespace llvm::sys;
1239 SmallString<128> filePath(Filename);
1240 fs::make_absolute(filePath);
1241 assert(path::is_absolute(OriginalDir));
1242 SmallString<128> currPCHPath(CurrDir);
1244 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1245 fileDirE = path::end(path::parent_path(filePath));
1246 path::const_iterator origDirI = path::begin(OriginalDir),
1247 origDirE = path::end(OriginalDir);
1248 // Skip the common path components from filePath and OriginalDir.
1249 while (fileDirI != fileDirE && origDirI != origDirE &&
1250 *fileDirI == *origDirI) {
1254 for (; origDirI != origDirE; ++origDirI)
1255 path::append(currPCHPath, "..");
1256 path::append(currPCHPath, fileDirI, fileDirE);
1257 path::append(currPCHPath, path::filename(Filename));
1258 return currPCHPath.str();
1261 bool ASTReader::ReadSLocEntry(int ID) {
1265 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1266 Error("source location entry ID out-of-range for AST file");
1270 // Local helper to read the (possibly-compressed) buffer data following the
1272 auto ReadBuffer = [this](
1273 BitstreamCursor &SLocEntryCursor,
1274 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1277 unsigned Code = SLocEntryCursor.ReadCode();
1278 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1280 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) {
1281 SmallString<0> Uncompressed;
1282 if (llvm::zlib::uncompress(Blob, Uncompressed, Record[0]) !=
1283 llvm::zlib::StatusOK) {
1284 Error("could not decompress embedded file contents");
1287 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name);
1288 } else if (RecCode == SM_SLOC_BUFFER_BLOB) {
1289 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true);
1291 Error("AST record has invalid code");
1296 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1297 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1298 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1299 unsigned BaseOffset = F->SLocEntryBaseOffset;
1301 ++NumSLocEntriesRead;
1302 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1303 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1304 Error("incorrectly-formatted source location entry in AST file");
1310 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1312 Error("incorrectly-formatted source location entry in AST file");
1315 case SM_SLOC_FILE_ENTRY: {
1316 // We will detect whether a file changed and return 'Failure' for it, but
1317 // we will also try to fail gracefully by setting up the SLocEntry.
1318 unsigned InputID = Record[4];
1319 InputFile IF = getInputFile(*F, InputID);
1320 const FileEntry *File = IF.getFile();
1321 bool OverriddenBuffer = IF.isOverridden();
1323 // Note that we only check if a File was returned. If it was out-of-date
1324 // we have complained but we will continue creating a FileID to recover
1329 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1330 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1331 // This is the module's main file.
1332 IncludeLoc = getImportLocation(F);
1334 SrcMgr::CharacteristicKind
1335 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1336 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1337 ID, BaseOffset + Record[0]);
1338 SrcMgr::FileInfo &FileInfo =
1339 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1340 FileInfo.NumCreatedFIDs = Record[5];
1342 FileInfo.setHasLineDirectives();
1344 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1345 unsigned NumFileDecls = Record[7];
1347 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1348 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1352 const SrcMgr::ContentCache *ContentCache
1353 = SourceMgr.getOrCreateContentCache(File,
1354 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1355 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1356 ContentCache->ContentsEntry == ContentCache->OrigEntry &&
1357 !ContentCache->getRawBuffer()) {
1358 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName());
1361 SourceMgr.overrideFileContents(File, std::move(Buffer));
1367 case SM_SLOC_BUFFER_ENTRY: {
1368 const char *Name = Blob.data();
1369 unsigned Offset = Record[0];
1370 SrcMgr::CharacteristicKind
1371 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1372 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1373 if (IncludeLoc.isInvalid() && F->isModule()) {
1374 IncludeLoc = getImportLocation(F);
1377 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1380 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1381 BaseOffset + Offset, IncludeLoc);
1385 case SM_SLOC_EXPANSION_ENTRY: {
1386 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1387 SourceMgr.createExpansionLoc(SpellingLoc,
1388 ReadSourceLocation(*F, Record[2]),
1389 ReadSourceLocation(*F, Record[3]),
1392 BaseOffset + Record[0]);
1400 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1402 return std::make_pair(SourceLocation(), "");
1404 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1405 Error("source location entry ID out-of-range for AST file");
1406 return std::make_pair(SourceLocation(), "");
1409 // Find which module file this entry lands in.
1410 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1412 return std::make_pair(SourceLocation(), "");
1414 // FIXME: Can we map this down to a particular submodule? That would be
1416 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1419 /// \brief Find the location where the module F is imported.
1420 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1421 if (F->ImportLoc.isValid())
1422 return F->ImportLoc;
1424 // Otherwise we have a PCH. It's considered to be "imported" at the first
1425 // location of its includer.
1426 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1427 // Main file is the importer.
1428 assert(SourceMgr.getMainFileID().isValid() && "missing main file");
1429 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1431 return F->ImportedBy[0]->FirstLoc;
1434 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1435 /// specified cursor. Read the abbreviations that are at the top of the block
1436 /// and then leave the cursor pointing into the block.
1437 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1438 if (Cursor.EnterSubBlock(BlockID))
1442 uint64_t Offset = Cursor.GetCurrentBitNo();
1443 unsigned Code = Cursor.ReadCode();
1445 // We expect all abbrevs to be at the start of the block.
1446 if (Code != llvm::bitc::DEFINE_ABBREV) {
1447 Cursor.JumpToBit(Offset);
1450 Cursor.ReadAbbrevRecord();
1454 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1458 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1459 Tok.setLength(Record[Idx++]);
1460 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1461 Tok.setIdentifierInfo(II);
1462 Tok.setKind((tok::TokenKind)Record[Idx++]);
1463 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1467 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1468 BitstreamCursor &Stream = F.MacroCursor;
1470 // Keep track of where we are in the stream, then jump back there
1471 // after reading this macro.
1472 SavedStreamPosition SavedPosition(Stream);
1474 Stream.JumpToBit(Offset);
1476 SmallVector<IdentifierInfo*, 16> MacroArgs;
1477 MacroInfo *Macro = nullptr;
1480 // Advance to the next record, but if we get to the end of the block, don't
1481 // pop it (removing all the abbreviations from the cursor) since we want to
1482 // be able to reseek within the block and read entries.
1483 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1484 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1486 switch (Entry.Kind) {
1487 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1488 case llvm::BitstreamEntry::Error:
1489 Error("malformed block record in AST file");
1491 case llvm::BitstreamEntry::EndBlock:
1493 case llvm::BitstreamEntry::Record:
1494 // The interesting case.
1500 PreprocessorRecordTypes RecType =
1501 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1503 case PP_MODULE_MACRO:
1504 case PP_MACRO_DIRECTIVE_HISTORY:
1507 case PP_MACRO_OBJECT_LIKE:
1508 case PP_MACRO_FUNCTION_LIKE: {
1509 // If we already have a macro, that means that we've hit the end
1510 // of the definition of the macro we were looking for. We're
1515 unsigned NextIndex = 1; // Skip identifier ID.
1516 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
1517 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1518 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
1519 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1520 MI->setIsUsed(Record[NextIndex++]);
1521 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1523 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1524 // Decode function-like macro info.
1525 bool isC99VarArgs = Record[NextIndex++];
1526 bool isGNUVarArgs = Record[NextIndex++];
1527 bool hasCommaPasting = Record[NextIndex++];
1529 unsigned NumArgs = Record[NextIndex++];
1530 for (unsigned i = 0; i != NumArgs; ++i)
1531 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1533 // Install function-like macro info.
1534 MI->setIsFunctionLike();
1535 if (isC99VarArgs) MI->setIsC99Varargs();
1536 if (isGNUVarArgs) MI->setIsGNUVarargs();
1537 if (hasCommaPasting) MI->setHasCommaPasting();
1538 MI->setArgumentList(MacroArgs, PP.getPreprocessorAllocator());
1541 // Remember that we saw this macro last so that we add the tokens that
1542 // form its body to it.
1545 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1546 Record[NextIndex]) {
1547 // We have a macro definition. Register the association
1548 PreprocessedEntityID
1549 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1550 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1551 PreprocessingRecord::PPEntityID PPID =
1552 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true);
1553 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>(
1554 PPRec.getPreprocessedEntity(PPID));
1556 PPRec.RegisterMacroDefinition(Macro, PPDef);
1564 // If we see a TOKEN before a PP_MACRO_*, then the file is
1565 // erroneous, just pretend we didn't see this.
1569 Token Tok = ReadToken(F, Record, Idx);
1570 Macro->AddTokenToBody(Tok);
1577 PreprocessedEntityID
1578 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1579 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1580 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1581 assert(I != M.PreprocessedEntityRemap.end()
1582 && "Invalid index into preprocessed entity index remap");
1584 return LocalID + I->second;
1587 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1588 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1591 HeaderFileInfoTrait::internal_key_type
1592 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1593 internal_key_type ikey = {FE->getSize(),
1594 M.HasTimestamps ? FE->getModificationTime() : 0,
1595 FE->getName(), /*Imported*/ false};
1599 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1600 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime))
1603 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename)
1606 // Determine whether the actual files are equivalent.
1607 FileManager &FileMgr = Reader.getFileManager();
1608 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* {
1610 return FileMgr.getFile(Key.Filename);
1612 std::string Resolved = Key.Filename;
1613 Reader.ResolveImportedPath(M, Resolved);
1614 return FileMgr.getFile(Resolved);
1617 const FileEntry *FEA = GetFile(a);
1618 const FileEntry *FEB = GetFile(b);
1619 return FEA && FEA == FEB;
1622 std::pair<unsigned, unsigned>
1623 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1624 using namespace llvm::support;
1625 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1626 unsigned DataLen = (unsigned) *d++;
1627 return std::make_pair(KeyLen, DataLen);
1630 HeaderFileInfoTrait::internal_key_type
1631 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1632 using namespace llvm::support;
1633 internal_key_type ikey;
1634 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1635 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1636 ikey.Filename = (const char *)d;
1637 ikey.Imported = true;
1641 HeaderFileInfoTrait::data_type
1642 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1644 const unsigned char *End = d + DataLen;
1645 using namespace llvm::support;
1647 unsigned Flags = *d++;
1648 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp.
1649 HFI.isImport |= (Flags >> 4) & 0x01;
1650 HFI.isPragmaOnce |= (Flags >> 3) & 0x01;
1651 HFI.DirInfo = (Flags >> 1) & 0x03;
1652 HFI.IndexHeaderMapHeader = Flags & 0x01;
1653 // FIXME: Find a better way to handle this. Maybe just store a
1654 // "has been included" flag?
1655 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d),
1657 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1658 M, endian::readNext<uint32_t, little, unaligned>(d));
1659 if (unsigned FrameworkOffset =
1660 endian::readNext<uint32_t, little, unaligned>(d)) {
1661 // The framework offset is 1 greater than the actual offset,
1662 // since 0 is used as an indicator for "no framework name".
1663 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1664 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1667 assert((End - d) % 4 == 0 &&
1668 "Wrong data length in HeaderFileInfo deserialization");
1670 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1671 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3);
1674 // This header is part of a module. Associate it with the module to enable
1675 // implicit module import.
1676 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1677 Module *Mod = Reader.getSubmodule(GlobalSMID);
1678 FileManager &FileMgr = Reader.getFileManager();
1680 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1682 std::string Filename = key.Filename;
1684 Reader.ResolveImportedPath(M, Filename);
1685 // FIXME: This is not always the right filename-as-written, but we're not
1686 // going to use this information to rebuild the module, so it doesn't make
1687 // a lot of difference.
1688 Module::Header H = { key.Filename, FileMgr.getFile(Filename) };
1689 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true);
1690 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader);
1693 // This HeaderFileInfo was externally loaded.
1694 HFI.External = true;
1699 void ASTReader::addPendingMacro(IdentifierInfo *II,
1701 uint64_t MacroDirectivesOffset) {
1702 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1703 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1706 void ASTReader::ReadDefinedMacros() {
1707 // Note that we are loading defined macros.
1708 Deserializing Macros(this);
1710 for (auto &I : llvm::reverse(ModuleMgr)) {
1711 BitstreamCursor &MacroCursor = I->MacroCursor;
1713 // If there was no preprocessor block, skip this file.
1714 if (MacroCursor.getBitcodeBytes().empty())
1717 BitstreamCursor Cursor = MacroCursor;
1718 Cursor.JumpToBit(I->MacroStartOffset);
1722 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1725 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1726 case llvm::BitstreamEntry::Error:
1727 Error("malformed block record in AST file");
1729 case llvm::BitstreamEntry::EndBlock:
1732 case llvm::BitstreamEntry::Record:
1734 switch (Cursor.readRecord(E.ID, Record)) {
1735 default: // Default behavior: ignore.
1738 case PP_MACRO_OBJECT_LIKE:
1739 case PP_MACRO_FUNCTION_LIKE: {
1740 IdentifierInfo *II = getLocalIdentifier(*I, Record[0]);
1741 if (II->isOutOfDate())
1742 updateOutOfDateIdentifier(*II);
1759 /// \brief Visitor class used to look up identifirs in an AST file.
1760 class IdentifierLookupVisitor {
1763 unsigned PriorGeneration;
1764 unsigned &NumIdentifierLookups;
1765 unsigned &NumIdentifierLookupHits;
1766 IdentifierInfo *Found;
1769 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1770 unsigned &NumIdentifierLookups,
1771 unsigned &NumIdentifierLookupHits)
1772 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)),
1773 PriorGeneration(PriorGeneration),
1774 NumIdentifierLookups(NumIdentifierLookups),
1775 NumIdentifierLookupHits(NumIdentifierLookupHits),
1780 bool operator()(ModuleFile &M) {
1781 // If we've already searched this module file, skip it now.
1782 if (M.Generation <= PriorGeneration)
1785 ASTIdentifierLookupTable *IdTable
1786 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1790 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M,
1792 ++NumIdentifierLookups;
1793 ASTIdentifierLookupTable::iterator Pos =
1794 IdTable->find_hashed(Name, NameHash, &Trait);
1795 if (Pos == IdTable->end())
1798 // Dereferencing the iterator has the effect of building the
1799 // IdentifierInfo node and populating it with the various
1800 // declarations it needs.
1801 ++NumIdentifierLookupHits;
1806 // \brief Retrieve the identifier info found within the module
1808 IdentifierInfo *getIdentifierInfo() const { return Found; }
1811 } // end anonymous namespace
1813 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1814 // Note that we are loading an identifier.
1815 Deserializing AnIdentifier(this);
1817 unsigned PriorGeneration = 0;
1818 if (getContext().getLangOpts().Modules)
1819 PriorGeneration = IdentifierGeneration[&II];
1821 // If there is a global index, look there first to determine which modules
1822 // provably do not have any results for this identifier.
1823 GlobalModuleIndex::HitSet Hits;
1824 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1825 if (!loadGlobalIndex()) {
1826 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1831 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1832 NumIdentifierLookups,
1833 NumIdentifierLookupHits);
1834 ModuleMgr.visit(Visitor, HitsPtr);
1835 markIdentifierUpToDate(&II);
1838 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1842 II->setOutOfDate(false);
1844 // Update the generation for this identifier.
1845 if (getContext().getLangOpts().Modules)
1846 IdentifierGeneration[II] = getGeneration();
1849 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1850 const PendingMacroInfo &PMInfo) {
1851 ModuleFile &M = *PMInfo.M;
1853 BitstreamCursor &Cursor = M.MacroCursor;
1854 SavedStreamPosition SavedPosition(Cursor);
1855 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset);
1857 struct ModuleMacroRecord {
1858 SubmoduleID SubModID;
1860 SmallVector<SubmoduleID, 8> Overrides;
1862 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros;
1864 // We expect to see a sequence of PP_MODULE_MACRO records listing exported
1865 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete
1869 llvm::BitstreamEntry Entry =
1870 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1871 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1872 Error("malformed block record in AST file");
1877 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
1878 case PP_MACRO_DIRECTIVE_HISTORY:
1881 case PP_MODULE_MACRO: {
1882 ModuleMacros.push_back(ModuleMacroRecord());
1883 auto &Info = ModuleMacros.back();
1884 Info.SubModID = getGlobalSubmoduleID(M, Record[0]);
1885 Info.MI = getMacro(getGlobalMacroID(M, Record[1]));
1886 for (int I = 2, N = Record.size(); I != N; ++I)
1887 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I]));
1892 Error("malformed block record in AST file");
1896 // We found the macro directive history; that's the last record
1901 // Module macros are listed in reverse dependency order.
1903 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
1904 llvm::SmallVector<ModuleMacro*, 8> Overrides;
1905 for (auto &MMR : ModuleMacros) {
1907 for (unsigned ModID : MMR.Overrides) {
1908 Module *Mod = getSubmodule(ModID);
1909 auto *Macro = PP.getModuleMacro(Mod, II);
1910 assert(Macro && "missing definition for overridden macro");
1911 Overrides.push_back(Macro);
1914 bool Inserted = false;
1915 Module *Owner = getSubmodule(MMR.SubModID);
1916 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
1920 // Don't read the directive history for a module; we don't have anywhere
1925 // Deserialize the macro directives history in reverse source-order.
1926 MacroDirective *Latest = nullptr, *Earliest = nullptr;
1927 unsigned Idx = 0, N = Record.size();
1929 MacroDirective *MD = nullptr;
1930 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
1931 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1933 case MacroDirective::MD_Define: {
1934 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++]));
1935 MD = PP.AllocateDefMacroDirective(MI, Loc);
1938 case MacroDirective::MD_Undefine: {
1939 MD = PP.AllocateUndefMacroDirective(Loc);
1942 case MacroDirective::MD_Visibility:
1943 bool isPublic = Record[Idx++];
1944 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1951 Earliest->setPrevious(MD);
1956 PP.setLoadedMacroDirective(II, Earliest, Latest);
1959 ASTReader::InputFileInfo
1960 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
1961 // Go find this input file.
1962 BitstreamCursor &Cursor = F.InputFilesCursor;
1963 SavedStreamPosition SavedPosition(Cursor);
1964 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
1966 unsigned Code = Cursor.ReadCode();
1970 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
1971 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
1972 "invalid record type for input file");
1975 assert(Record[0] == ID && "Bogus stored ID or offset");
1977 R.StoredSize = static_cast<off_t>(Record[1]);
1978 R.StoredTime = static_cast<time_t>(Record[2]);
1979 R.Overridden = static_cast<bool>(Record[3]);
1980 R.Transient = static_cast<bool>(Record[4]);
1982 ResolveImportedPath(F, R.Filename);
1986 static unsigned moduleKindForDiagnostic(ModuleKind Kind);
1987 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
1988 // If this ID is bogus, just return an empty input file.
1989 if (ID == 0 || ID > F.InputFilesLoaded.size())
1992 // If we've already loaded this input file, return it.
1993 if (F.InputFilesLoaded[ID-1].getFile())
1994 return F.InputFilesLoaded[ID-1];
1996 if (F.InputFilesLoaded[ID-1].isNotFound())
1999 // Go find this input file.
2000 BitstreamCursor &Cursor = F.InputFilesCursor;
2001 SavedStreamPosition SavedPosition(Cursor);
2002 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2004 InputFileInfo FI = readInputFileInfo(F, ID);
2005 off_t StoredSize = FI.StoredSize;
2006 time_t StoredTime = FI.StoredTime;
2007 bool Overridden = FI.Overridden;
2008 bool Transient = FI.Transient;
2009 StringRef Filename = FI.Filename;
2011 const FileEntry *File = FileMgr.getFile(Filename, /*OpenFile=*/false);
2013 // If we didn't find the file, resolve it relative to the
2014 // original directory from which this AST file was created.
2015 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
2016 F.OriginalDir != CurrentDir) {
2017 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2020 if (!Resolved.empty())
2021 File = FileMgr.getFile(Resolved);
2024 // For an overridden file, create a virtual file with the stored
2026 if ((Overridden || Transient) && File == nullptr)
2027 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2029 if (File == nullptr) {
2031 std::string ErrorStr = "could not find file '";
2032 ErrorStr += Filename;
2033 ErrorStr += "' referenced by AST file '";
2034 ErrorStr += F.FileName;
2038 // Record that we didn't find the file.
2039 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2043 // Check if there was a request to override the contents of the file
2044 // that was part of the precompiled header. Overridding such a file
2045 // can lead to problems when lexing using the source locations from the
2047 SourceManager &SM = getSourceManager();
2048 // FIXME: Reject if the overrides are different.
2049 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) {
2051 Error(diag::err_fe_pch_file_overridden, Filename);
2052 // After emitting the diagnostic, recover by disabling the override so
2053 // that the original file will be used.
2055 // FIXME: This recovery is just as broken as the original state; there may
2056 // be another precompiled module that's using the overridden contents, or
2057 // we might be half way through parsing it. Instead, we should treat the
2058 // overridden contents as belonging to a separate FileEntry.
2059 SM.disableFileContentsOverride(File);
2060 // The FileEntry is a virtual file entry with the size of the contents
2061 // that would override the original contents. Set it to the original's
2063 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2064 StoredSize, StoredTime);
2067 bool IsOutOfDate = false;
2069 // For an overridden file, there is nothing to validate.
2070 if (!Overridden && //
2071 (StoredSize != File->getSize() ||
2072 (StoredTime && StoredTime != File->getModificationTime() &&
2076 // Build a list of the PCH imports that got us here (in reverse).
2077 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2078 while (ImportStack.back()->ImportedBy.size() > 0)
2079 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2081 // The top-level PCH is stale.
2082 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2083 unsigned DiagnosticKind = moduleKindForDiagnostic(ImportStack.back()->Kind);
2084 if (DiagnosticKind == 0)
2085 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2086 else if (DiagnosticKind == 1)
2087 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName);
2089 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName);
2091 // Print the import stack.
2092 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2093 Diag(diag::note_pch_required_by)
2094 << Filename << ImportStack[0]->FileName;
2095 for (unsigned I = 1; I < ImportStack.size(); ++I)
2096 Diag(diag::note_pch_required_by)
2097 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2100 if (!Diags.isDiagnosticInFlight())
2101 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2106 // FIXME: If the file is overridden and we've already opened it,
2107 // issue an error (or split it into a separate FileEntry).
2109 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate);
2111 // Note that we've loaded this input file.
2112 F.InputFilesLoaded[ID-1] = IF;
2116 /// \brief If we are loading a relocatable PCH or module file, and the filename
2117 /// is not an absolute path, add the system or module root to the beginning of
2119 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) {
2120 // Resolve relative to the base directory, if we have one.
2121 if (!M.BaseDirectory.empty())
2122 return ResolveImportedPath(Filename, M.BaseDirectory);
2125 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) {
2126 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2129 SmallString<128> Buffer;
2130 llvm::sys::path::append(Buffer, Prefix, Filename);
2131 Filename.assign(Buffer.begin(), Buffer.end());
2134 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) {
2136 case ASTReader::Failure: return true;
2137 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing);
2138 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate);
2139 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch);
2140 case ASTReader::ConfigurationMismatch:
2141 return !(Caps & ASTReader::ARR_ConfigurationMismatch);
2142 case ASTReader::HadErrors: return true;
2143 case ASTReader::Success: return false;
2146 llvm_unreachable("unknown ASTReadResult");
2149 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock(
2150 BitstreamCursor &Stream, unsigned ClientLoadCapabilities,
2151 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener,
2152 std::string &SuggestedPredefines, bool ValidateDiagnosticOptions) {
2153 if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID))
2156 // Read all of the records in the options block.
2158 ASTReadResult Result = Success;
2160 llvm::BitstreamEntry Entry = Stream.advance();
2162 switch (Entry.Kind) {
2163 case llvm::BitstreamEntry::Error:
2164 case llvm::BitstreamEntry::SubBlock:
2167 case llvm::BitstreamEntry::EndBlock:
2170 case llvm::BitstreamEntry::Record:
2171 // The interesting case.
2175 // Read and process a record.
2177 switch ((OptionsRecordTypes)Stream.readRecord(Entry.ID, Record)) {
2178 case LANGUAGE_OPTIONS: {
2179 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2180 if (ParseLanguageOptions(Record, Complain, Listener,
2181 AllowCompatibleConfigurationMismatch))
2182 Result = ConfigurationMismatch;
2186 case TARGET_OPTIONS: {
2187 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2188 if (ParseTargetOptions(Record, Complain, Listener,
2189 AllowCompatibleConfigurationMismatch))
2190 Result = ConfigurationMismatch;
2194 case DIAGNOSTIC_OPTIONS: {
2195 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2196 if (ValidateDiagnosticOptions &&
2197 !AllowCompatibleConfigurationMismatch &&
2198 ParseDiagnosticOptions(Record, Complain, Listener))
2203 case FILE_SYSTEM_OPTIONS: {
2204 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2205 if (!AllowCompatibleConfigurationMismatch &&
2206 ParseFileSystemOptions(Record, Complain, Listener))
2207 Result = ConfigurationMismatch;
2211 case HEADER_SEARCH_OPTIONS: {
2212 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2213 if (!AllowCompatibleConfigurationMismatch &&
2214 ParseHeaderSearchOptions(Record, Complain, Listener))
2215 Result = ConfigurationMismatch;
2219 case PREPROCESSOR_OPTIONS:
2220 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2221 if (!AllowCompatibleConfigurationMismatch &&
2222 ParsePreprocessorOptions(Record, Complain, Listener,
2223 SuggestedPredefines))
2224 Result = ConfigurationMismatch;
2230 ASTReader::ASTReadResult
2231 ASTReader::ReadControlBlock(ModuleFile &F,
2232 SmallVectorImpl<ImportedModule> &Loaded,
2233 const ModuleFile *ImportedBy,
2234 unsigned ClientLoadCapabilities) {
2235 BitstreamCursor &Stream = F.Stream;
2236 ASTReadResult Result = Success;
2238 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2239 Error("malformed block record in AST file");
2243 // Read all of the records and blocks in the control block.
2245 unsigned NumInputs = 0;
2246 unsigned NumUserInputs = 0;
2248 llvm::BitstreamEntry Entry = Stream.advance();
2250 switch (Entry.Kind) {
2251 case llvm::BitstreamEntry::Error:
2252 Error("malformed block record in AST file");
2254 case llvm::BitstreamEntry::EndBlock: {
2255 // Validate input files.
2256 const HeaderSearchOptions &HSOpts =
2257 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2259 // All user input files reside at the index range [0, NumUserInputs), and
2260 // system input files reside at [NumUserInputs, NumInputs). For explicitly
2261 // loaded module files, ignore missing inputs.
2262 if (!DisableValidation && F.Kind != MK_ExplicitModule &&
2263 F.Kind != MK_PrebuiltModule) {
2264 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2266 // If we are reading a module, we will create a verification timestamp,
2267 // so we verify all input files. Otherwise, verify only user input
2270 unsigned N = NumUserInputs;
2271 if (ValidateSystemInputs ||
2272 (HSOpts.ModulesValidateOncePerBuildSession &&
2273 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp &&
2274 F.Kind == MK_ImplicitModule))
2277 for (unsigned I = 0; I < N; ++I) {
2278 InputFile IF = getInputFile(F, I+1, Complain);
2279 if (!IF.getFile() || IF.isOutOfDate())
2285 Listener->visitModuleFile(F.FileName, F.Kind);
2287 if (Listener && Listener->needsInputFileVisitation()) {
2288 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2290 for (unsigned I = 0; I < N; ++I) {
2291 bool IsSystem = I >= NumUserInputs;
2292 InputFileInfo FI = readInputFileInfo(F, I+1);
2293 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,
2294 F.Kind == MK_ExplicitModule ||
2295 F.Kind == MK_PrebuiltModule);
2302 case llvm::BitstreamEntry::SubBlock:
2304 case INPUT_FILES_BLOCK_ID:
2305 F.InputFilesCursor = Stream;
2306 if (Stream.SkipBlock() || // Skip with the main cursor
2307 // Read the abbreviations
2308 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2309 Error("malformed block record in AST file");
2314 case OPTIONS_BLOCK_ID:
2315 // If we're reading the first module for this group, check its options
2316 // are compatible with ours. For modules it imports, no further checking
2317 // is required, because we checked them when we built it.
2318 if (Listener && !ImportedBy) {
2319 // Should we allow the configuration of the module file to differ from
2320 // the configuration of the current translation unit in a compatible
2323 // FIXME: Allow this for files explicitly specified with -include-pch.
2324 bool AllowCompatibleConfigurationMismatch =
2325 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
2326 const HeaderSearchOptions &HSOpts =
2327 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2329 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities,
2330 AllowCompatibleConfigurationMismatch,
2331 *Listener, SuggestedPredefines,
2332 HSOpts.ModulesValidateDiagnosticOptions);
2333 if (Result == Failure) {
2334 Error("malformed block record in AST file");
2338 if (DisableValidation ||
2339 (AllowConfigurationMismatch && Result == ConfigurationMismatch))
2342 // If we can't load the module, exit early since we likely
2343 // will rebuild the module anyway. The stream may be in the
2344 // middle of a block.
2345 if (Result != Success)
2347 } else if (Stream.SkipBlock()) {
2348 Error("malformed block record in AST file");
2354 if (Stream.SkipBlock()) {
2355 Error("malformed block record in AST file");
2361 case llvm::BitstreamEntry::Record:
2362 // The interesting case.
2366 // Read and process a record.
2369 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2371 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2372 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2373 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2374 : diag::err_pch_version_too_new);
2375 return VersionMismatch;
2378 bool hasErrors = Record[6];
2379 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2380 Diag(diag::err_pch_with_compiler_errors);
2384 Diags.ErrorOccurred = true;
2385 Diags.UncompilableErrorOccurred = true;
2386 Diags.UnrecoverableErrorOccurred = true;
2389 F.RelocatablePCH = Record[4];
2390 // Relative paths in a relocatable PCH are relative to our sysroot.
2391 if (F.RelocatablePCH)
2392 F.BaseDirectory = isysroot.empty() ? "/" : isysroot;
2394 F.HasTimestamps = Record[5];
2396 const std::string &CurBranch = getClangFullRepositoryVersion();
2397 StringRef ASTBranch = Blob;
2398 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2399 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2400 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2401 return VersionMismatch;
2407 assert((!F.Signature || F.Signature == Record[0]) && "signature changed");
2408 F.Signature = Record[0];
2412 // Load each of the imported PCH files.
2413 unsigned Idx = 0, N = Record.size();
2415 // Read information about the AST file.
2416 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2417 // The import location will be the local one for now; we will adjust
2418 // all import locations of module imports after the global source
2419 // location info are setup, in ReadAST.
2420 SourceLocation ImportLoc =
2421 ReadUntranslatedSourceLocation(Record[Idx++]);
2422 off_t StoredSize = (off_t)Record[Idx++];
2423 time_t StoredModTime = (time_t)Record[Idx++];
2424 ASTFileSignature StoredSignature = Record[Idx++];
2425 auto ImportedFile = ReadPath(F, Record, Idx);
2427 // If our client can't cope with us being out of date, we can't cope with
2428 // our dependency being missing.
2429 unsigned Capabilities = ClientLoadCapabilities;
2430 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2431 Capabilities &= ~ARR_Missing;
2433 // Load the AST file.
2434 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
2435 Loaded, StoredSize, StoredModTime,
2436 StoredSignature, Capabilities);
2438 // If we diagnosed a problem, produce a backtrace.
2439 if (isDiagnosedResult(Result, Capabilities))
2440 Diag(diag::note_module_file_imported_by)
2441 << F.FileName << !F.ModuleName.empty() << F.ModuleName;
2444 case Failure: return Failure;
2445 // If we have to ignore the dependency, we'll have to ignore this too.
2447 case OutOfDate: return OutOfDate;
2448 case VersionMismatch: return VersionMismatch;
2449 case ConfigurationMismatch: return ConfigurationMismatch;
2450 case HadErrors: return HadErrors;
2451 case Success: break;
2458 F.OriginalSourceFileID = FileID::get(Record[0]);
2459 F.ActualOriginalSourceFileName = Blob;
2460 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2461 ResolveImportedPath(F, F.OriginalSourceFileName);
2464 case ORIGINAL_FILE_ID:
2465 F.OriginalSourceFileID = FileID::get(Record[0]);
2468 case ORIGINAL_PCH_DIR:
2469 F.OriginalDir = Blob;
2473 F.ModuleName = Blob;
2475 Listener->ReadModuleName(F.ModuleName);
2478 case MODULE_DIRECTORY: {
2479 assert(!F.ModuleName.empty() &&
2480 "MODULE_DIRECTORY found before MODULE_NAME");
2481 // If we've already loaded a module map file covering this module, we may
2482 // have a better path for it (relative to the current build).
2483 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2484 if (M && M->Directory) {
2485 // If we're implicitly loading a module, the base directory can't
2486 // change between the build and use.
2487 if (F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
2488 const DirectoryEntry *BuildDir =
2489 PP.getFileManager().getDirectory(Blob);
2490 if (!BuildDir || BuildDir != M->Directory) {
2491 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2492 Diag(diag::err_imported_module_relocated)
2493 << F.ModuleName << Blob << M->Directory->getName();
2497 F.BaseDirectory = M->Directory->getName();
2499 F.BaseDirectory = Blob;
2504 case MODULE_MAP_FILE:
2505 if (ASTReadResult Result =
2506 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities))
2510 case INPUT_FILE_OFFSETS:
2511 NumInputs = Record[0];
2512 NumUserInputs = Record[1];
2513 F.InputFileOffsets =
2514 (const llvm::support::unaligned_uint64_t *)Blob.data();
2515 F.InputFilesLoaded.resize(NumInputs);
2521 ASTReader::ASTReadResult
2522 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2523 BitstreamCursor &Stream = F.Stream;
2525 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2526 Error("malformed block record in AST file");
2530 // Read all of the records and blocks for the AST file.
2533 llvm::BitstreamEntry Entry = Stream.advance();
2535 switch (Entry.Kind) {
2536 case llvm::BitstreamEntry::Error:
2537 Error("error at end of module block in AST file");
2539 case llvm::BitstreamEntry::EndBlock: {
2540 // Outside of C++, we do not store a lookup map for the translation unit.
2541 // Instead, mark it as needing a lookup map to be built if this module
2542 // contains any declarations lexically within it (which it always does!).
2543 // This usually has no cost, since we very rarely need the lookup map for
2544 // the translation unit outside C++.
2545 DeclContext *DC = Context.getTranslationUnitDecl();
2546 if (DC->hasExternalLexicalStorage() &&
2547 !getContext().getLangOpts().CPlusPlus)
2548 DC->setMustBuildLookupTable();
2552 case llvm::BitstreamEntry::SubBlock:
2554 case DECLTYPES_BLOCK_ID:
2555 // We lazily load the decls block, but we want to set up the
2556 // DeclsCursor cursor to point into it. Clone our current bitcode
2557 // cursor to it, enter the block and read the abbrevs in that block.
2558 // With the main cursor, we just skip over it.
2559 F.DeclsCursor = Stream;
2560 if (Stream.SkipBlock() || // Skip with the main cursor.
2561 // Read the abbrevs.
2562 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2563 Error("malformed block record in AST file");
2568 case PREPROCESSOR_BLOCK_ID:
2569 F.MacroCursor = Stream;
2570 if (!PP.getExternalSource())
2571 PP.setExternalSource(this);
2573 if (Stream.SkipBlock() ||
2574 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2575 Error("malformed block record in AST file");
2578 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2581 case PREPROCESSOR_DETAIL_BLOCK_ID:
2582 F.PreprocessorDetailCursor = Stream;
2583 if (Stream.SkipBlock() ||
2584 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2585 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2586 Error("malformed preprocessor detail record in AST file");
2589 F.PreprocessorDetailStartOffset
2590 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2592 if (!PP.getPreprocessingRecord())
2593 PP.createPreprocessingRecord();
2594 if (!PP.getPreprocessingRecord()->getExternalSource())
2595 PP.getPreprocessingRecord()->SetExternalSource(*this);
2598 case SOURCE_MANAGER_BLOCK_ID:
2599 if (ReadSourceManagerBlock(F))
2603 case SUBMODULE_BLOCK_ID:
2604 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2608 case COMMENTS_BLOCK_ID: {
2609 BitstreamCursor C = Stream;
2610 if (Stream.SkipBlock() ||
2611 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2612 Error("malformed comments block in AST file");
2615 CommentsCursors.push_back(std::make_pair(C, &F));
2620 if (Stream.SkipBlock()) {
2621 Error("malformed block record in AST file");
2628 case llvm::BitstreamEntry::Record:
2629 // The interesting case.
2633 // Read and process a record.
2636 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2637 default: // Default behavior: ignore.
2641 if (F.LocalNumTypes != 0) {
2642 Error("duplicate TYPE_OFFSET record in AST file");
2645 F.TypeOffsets = (const uint32_t *)Blob.data();
2646 F.LocalNumTypes = Record[0];
2647 unsigned LocalBaseTypeIndex = Record[1];
2648 F.BaseTypeIndex = getTotalNumTypes();
2650 if (F.LocalNumTypes > 0) {
2651 // Introduce the global -> local mapping for types within this module.
2652 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2654 // Introduce the local -> global mapping for types within this module.
2655 F.TypeRemap.insertOrReplace(
2656 std::make_pair(LocalBaseTypeIndex,
2657 F.BaseTypeIndex - LocalBaseTypeIndex));
2659 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2665 if (F.LocalNumDecls != 0) {
2666 Error("duplicate DECL_OFFSET record in AST file");
2669 F.DeclOffsets = (const DeclOffset *)Blob.data();
2670 F.LocalNumDecls = Record[0];
2671 unsigned LocalBaseDeclID = Record[1];
2672 F.BaseDeclID = getTotalNumDecls();
2674 if (F.LocalNumDecls > 0) {
2675 // Introduce the global -> local mapping for declarations within this
2677 GlobalDeclMap.insert(
2678 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2680 // Introduce the local -> global mapping for declarations within this
2682 F.DeclRemap.insertOrReplace(
2683 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2685 // Introduce the global -> local mapping for declarations within this
2687 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2689 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2694 case TU_UPDATE_LEXICAL: {
2695 DeclContext *TU = Context.getTranslationUnitDecl();
2696 LexicalContents Contents(
2697 reinterpret_cast<const llvm::support::unaligned_uint32_t *>(
2699 static_cast<unsigned int>(Blob.size() / 4));
2700 TULexicalDecls.push_back(std::make_pair(&F, Contents));
2701 TU->setHasExternalLexicalStorage(true);
2705 case UPDATE_VISIBLE: {
2707 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2708 auto *Data = (const unsigned char*)Blob.data();
2709 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data});
2710 // If we've already loaded the decl, perform the updates when we finish
2711 // loading this block.
2712 if (Decl *D = GetExistingDecl(ID))
2713 PendingUpdateRecords.push_back(std::make_pair(ID, D));
2717 case IDENTIFIER_TABLE:
2718 F.IdentifierTableData = Blob.data();
2720 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2721 (const unsigned char *)F.IdentifierTableData + Record[0],
2722 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2723 (const unsigned char *)F.IdentifierTableData,
2724 ASTIdentifierLookupTrait(*this, F));
2726 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2730 case IDENTIFIER_OFFSET: {
2731 if (F.LocalNumIdentifiers != 0) {
2732 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2735 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2736 F.LocalNumIdentifiers = Record[0];
2737 unsigned LocalBaseIdentifierID = Record[1];
2738 F.BaseIdentifierID = getTotalNumIdentifiers();
2740 if (F.LocalNumIdentifiers > 0) {
2741 // Introduce the global -> local mapping for identifiers within this
2743 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2746 // Introduce the local -> global mapping for identifiers within this
2748 F.IdentifierRemap.insertOrReplace(
2749 std::make_pair(LocalBaseIdentifierID,
2750 F.BaseIdentifierID - LocalBaseIdentifierID));
2752 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2753 + F.LocalNumIdentifiers);
2758 case INTERESTING_IDENTIFIERS:
2759 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end());
2762 case EAGERLY_DESERIALIZED_DECLS:
2763 // FIXME: Skip reading this record if our ASTConsumer doesn't care
2764 // about "interesting" decls (for instance, if we're building a module).
2765 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2766 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2770 if (SpecialTypes.empty()) {
2771 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2772 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2776 if (SpecialTypes.size() != Record.size()) {
2777 Error("invalid special-types record");
2781 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2782 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2783 if (!SpecialTypes[I])
2784 SpecialTypes[I] = ID;
2785 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2791 TotalNumStatements += Record[0];
2792 TotalNumMacros += Record[1];
2793 TotalLexicalDeclContexts += Record[2];
2794 TotalVisibleDeclContexts += Record[3];
2797 case UNUSED_FILESCOPED_DECLS:
2798 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2799 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2802 case DELEGATING_CTORS:
2803 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2804 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2807 case WEAK_UNDECLARED_IDENTIFIERS:
2808 if (Record.size() % 4 != 0) {
2809 Error("invalid weak identifiers record");
2813 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2814 // files. This isn't the way to do it :)
2815 WeakUndeclaredIdentifiers.clear();
2817 // Translate the weak, undeclared identifiers into global IDs.
2818 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2819 WeakUndeclaredIdentifiers.push_back(
2820 getGlobalIdentifierID(F, Record[I++]));
2821 WeakUndeclaredIdentifiers.push_back(
2822 getGlobalIdentifierID(F, Record[I++]));
2823 WeakUndeclaredIdentifiers.push_back(
2824 ReadSourceLocation(F, Record, I).getRawEncoding());
2825 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2829 case SELECTOR_OFFSETS: {
2830 F.SelectorOffsets = (const uint32_t *)Blob.data();
2831 F.LocalNumSelectors = Record[0];
2832 unsigned LocalBaseSelectorID = Record[1];
2833 F.BaseSelectorID = getTotalNumSelectors();
2835 if (F.LocalNumSelectors > 0) {
2836 // Introduce the global -> local mapping for selectors within this
2838 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2840 // Introduce the local -> global mapping for selectors within this
2842 F.SelectorRemap.insertOrReplace(
2843 std::make_pair(LocalBaseSelectorID,
2844 F.BaseSelectorID - LocalBaseSelectorID));
2846 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2852 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
2854 F.SelectorLookupTable
2855 = ASTSelectorLookupTable::Create(
2856 F.SelectorLookupTableData + Record[0],
2857 F.SelectorLookupTableData,
2858 ASTSelectorLookupTrait(*this, F));
2859 TotalNumMethodPoolEntries += Record[1];
2862 case REFERENCED_SELECTOR_POOL:
2863 if (!Record.empty()) {
2864 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2865 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2867 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2873 case PP_COUNTER_VALUE:
2874 if (!Record.empty() && Listener)
2875 Listener->ReadCounter(F, Record[0]);
2878 case FILE_SORTED_DECLS:
2879 F.FileSortedDecls = (const DeclID *)Blob.data();
2880 F.NumFileSortedDecls = Record[0];
2883 case SOURCE_LOCATION_OFFSETS: {
2884 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
2885 F.LocalNumSLocEntries = Record[0];
2886 unsigned SLocSpaceSize = Record[1];
2887 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2888 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2890 if (!F.SLocEntryBaseID) {
2891 Error("ran out of source locations");
2894 // Make our entry in the range map. BaseID is negative and growing, so
2895 // we invert it. Because we invert it, though, we need the other end of
2897 unsigned RangeStart =
2898 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2899 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2900 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2902 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2903 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2904 GlobalSLocOffsetMap.insert(
2905 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2906 - SLocSpaceSize,&F));
2908 // Initialize the remapping table.
2909 // Invalid stays invalid.
2910 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
2911 // This module. Base was 2 when being compiled.
2912 F.SLocRemap.insertOrReplace(std::make_pair(2U,
2913 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2915 TotalNumSLocEntries += F.LocalNumSLocEntries;
2919 case MODULE_OFFSET_MAP: {
2920 // Additional remapping information.
2921 const unsigned char *Data = (const unsigned char*)Blob.data();
2922 const unsigned char *DataEnd = Data + Blob.size();
2924 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2925 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2926 F.SLocRemap.insert(std::make_pair(0U, 0));
2927 F.SLocRemap.insert(std::make_pair(2U, 1));
2930 // Continuous range maps we may be updating in our module.
2931 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder
2933 RemapBuilder SLocRemap(F.SLocRemap);
2934 RemapBuilder IdentifierRemap(F.IdentifierRemap);
2935 RemapBuilder MacroRemap(F.MacroRemap);
2936 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2937 RemapBuilder SubmoduleRemap(F.SubmoduleRemap);
2938 RemapBuilder SelectorRemap(F.SelectorRemap);
2939 RemapBuilder DeclRemap(F.DeclRemap);
2940 RemapBuilder TypeRemap(F.TypeRemap);
2942 while (Data < DataEnd) {
2943 using namespace llvm::support;
2944 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
2945 StringRef Name = StringRef((const char*)Data, Len);
2947 ModuleFile *OM = ModuleMgr.lookup(Name);
2949 Error("SourceLocation remap refers to unknown module");
2953 uint32_t SLocOffset =
2954 endian::readNext<uint32_t, little, unaligned>(Data);
2955 uint32_t IdentifierIDOffset =
2956 endian::readNext<uint32_t, little, unaligned>(Data);
2957 uint32_t MacroIDOffset =
2958 endian::readNext<uint32_t, little, unaligned>(Data);
2959 uint32_t PreprocessedEntityIDOffset =
2960 endian::readNext<uint32_t, little, unaligned>(Data);
2961 uint32_t SubmoduleIDOffset =
2962 endian::readNext<uint32_t, little, unaligned>(Data);
2963 uint32_t SelectorIDOffset =
2964 endian::readNext<uint32_t, little, unaligned>(Data);
2965 uint32_t DeclIDOffset =
2966 endian::readNext<uint32_t, little, unaligned>(Data);
2967 uint32_t TypeIndexOffset =
2968 endian::readNext<uint32_t, little, unaligned>(Data);
2970 uint32_t None = std::numeric_limits<uint32_t>::max();
2972 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset,
2973 RemapBuilder &Remap) {
2975 Remap.insert(std::make_pair(Offset,
2976 static_cast<int>(BaseOffset - Offset)));
2978 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap);
2979 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap);
2980 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap);
2981 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID,
2982 PreprocessedEntityRemap);
2983 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap);
2984 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap);
2985 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap);
2986 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap);
2988 // Global -> local mappings.
2989 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2994 case SOURCE_MANAGER_LINE_TABLE:
2995 if (ParseLineTable(F, Record))
2999 case SOURCE_LOCATION_PRELOADS: {
3000 // Need to transform from the local view (1-based IDs) to the global view,
3001 // which is based off F.SLocEntryBaseID.
3002 if (!F.PreloadSLocEntries.empty()) {
3003 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
3007 F.PreloadSLocEntries.swap(Record);
3011 case EXT_VECTOR_DECLS:
3012 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3013 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
3017 if (Record.size() % 3 != 0) {
3018 Error("Invalid VTABLE_USES record");
3022 // Later tables overwrite earlier ones.
3023 // FIXME: Modules will have some trouble with this. This is clearly not
3024 // the right way to do this.
3027 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3028 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3029 VTableUses.push_back(
3030 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3031 VTableUses.push_back(Record[Idx++]);
3035 case PENDING_IMPLICIT_INSTANTIATIONS:
3036 if (PendingInstantiations.size() % 2 != 0) {
3037 Error("Invalid existing PendingInstantiations");
3041 if (Record.size() % 2 != 0) {
3042 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3046 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3047 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3048 PendingInstantiations.push_back(
3049 ReadSourceLocation(F, Record, I).getRawEncoding());
3053 case SEMA_DECL_REFS:
3054 if (Record.size() != 3) {
3055 Error("Invalid SEMA_DECL_REFS block");
3058 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3059 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3062 case PPD_ENTITIES_OFFSETS: {
3063 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3064 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3065 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3067 unsigned LocalBasePreprocessedEntityID = Record[0];
3069 unsigned StartingID;
3070 if (!PP.getPreprocessingRecord())
3071 PP.createPreprocessingRecord();
3072 if (!PP.getPreprocessingRecord()->getExternalSource())
3073 PP.getPreprocessingRecord()->SetExternalSource(*this);
3075 = PP.getPreprocessingRecord()
3076 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3077 F.BasePreprocessedEntityID = StartingID;
3079 if (F.NumPreprocessedEntities > 0) {
3080 // Introduce the global -> local mapping for preprocessed entities in
3082 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3084 // Introduce the local -> global mapping for preprocessed entities in
3086 F.PreprocessedEntityRemap.insertOrReplace(
3087 std::make_pair(LocalBasePreprocessedEntityID,
3088 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3094 case DECL_UPDATE_OFFSETS: {
3095 if (Record.size() % 2 != 0) {
3096 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3099 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3100 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3101 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3103 // If we've already loaded the decl, perform the updates when we finish
3104 // loading this block.
3105 if (Decl *D = GetExistingDecl(ID))
3106 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3111 case OBJC_CATEGORIES_MAP: {
3112 if (F.LocalNumObjCCategoriesInMap != 0) {
3113 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3117 F.LocalNumObjCCategoriesInMap = Record[0];
3118 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3122 case OBJC_CATEGORIES:
3123 F.ObjCCategories.swap(Record);
3126 case DIAG_PRAGMA_MAPPINGS:
3127 if (F.PragmaDiagMappings.empty())
3128 F.PragmaDiagMappings.swap(Record);
3130 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3131 Record.begin(), Record.end());
3134 case CUDA_SPECIAL_DECL_REFS:
3135 // Later tables overwrite earlier ones.
3136 // FIXME: Modules will have trouble with this.
3137 CUDASpecialDeclRefs.clear();
3138 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3139 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3142 case HEADER_SEARCH_TABLE: {
3143 F.HeaderFileInfoTableData = Blob.data();
3144 F.LocalNumHeaderFileInfos = Record[1];
3146 F.HeaderFileInfoTable
3147 = HeaderFileInfoLookupTable::Create(
3148 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3149 (const unsigned char *)F.HeaderFileInfoTableData,
3150 HeaderFileInfoTrait(*this, F,
3151 &PP.getHeaderSearchInfo(),
3152 Blob.data() + Record[2]));
3154 PP.getHeaderSearchInfo().SetExternalSource(this);
3155 if (!PP.getHeaderSearchInfo().getExternalLookup())
3156 PP.getHeaderSearchInfo().SetExternalLookup(this);
3161 case FP_PRAGMA_OPTIONS:
3162 // Later tables overwrite earlier ones.
3163 FPPragmaOptions.swap(Record);
3166 case OPENCL_EXTENSIONS:
3167 // Later tables overwrite earlier ones.
3168 OpenCLExtensions.swap(Record);
3171 case TENTATIVE_DEFINITIONS:
3172 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3173 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3176 case KNOWN_NAMESPACES:
3177 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3178 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3181 case UNDEFINED_BUT_USED:
3182 if (UndefinedButUsed.size() % 2 != 0) {
3183 Error("Invalid existing UndefinedButUsed");
3187 if (Record.size() % 2 != 0) {
3188 Error("invalid undefined-but-used record");
3191 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3192 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3193 UndefinedButUsed.push_back(
3194 ReadSourceLocation(F, Record, I).getRawEncoding());
3197 case DELETE_EXPRS_TO_ANALYZE:
3198 for (unsigned I = 0, N = Record.size(); I != N;) {
3199 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++]));
3200 const uint64_t Count = Record[I++];
3201 DelayedDeleteExprs.push_back(Count);
3202 for (uint64_t C = 0; C < Count; ++C) {
3203 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding());
3204 bool IsArrayForm = Record[I++] == 1;
3205 DelayedDeleteExprs.push_back(IsArrayForm);
3210 case IMPORTED_MODULES: {
3211 if (!F.isModule()) {
3212 // If we aren't loading a module (which has its own exports), make
3213 // all of the imported modules visible.
3214 // FIXME: Deal with macros-only imports.
3215 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3216 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3217 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3219 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3225 case MACRO_OFFSET: {
3226 if (F.LocalNumMacros != 0) {
3227 Error("duplicate MACRO_OFFSET record in AST file");
3230 F.MacroOffsets = (const uint32_t *)Blob.data();
3231 F.LocalNumMacros = Record[0];
3232 unsigned LocalBaseMacroID = Record[1];
3233 F.BaseMacroID = getTotalNumMacros();
3235 if (F.LocalNumMacros > 0) {
3236 // Introduce the global -> local mapping for macros within this module.
3237 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3239 // Introduce the local -> global mapping for macros within this module.
3240 F.MacroRemap.insertOrReplace(
3241 std::make_pair(LocalBaseMacroID,
3242 F.BaseMacroID - LocalBaseMacroID));
3244 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3249 case LATE_PARSED_TEMPLATE: {
3250 LateParsedTemplates.append(Record.begin(), Record.end());
3254 case OPTIMIZE_PRAGMA_OPTIONS:
3255 if (Record.size() != 1) {
3256 Error("invalid pragma optimize record");
3259 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3262 case MSSTRUCT_PRAGMA_OPTIONS:
3263 if (Record.size() != 1) {
3264 Error("invalid pragma ms_struct record");
3267 PragmaMSStructState = Record[0];
3270 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS:
3271 if (Record.size() != 2) {
3272 Error("invalid pragma ms_struct record");
3275 PragmaMSPointersToMembersState = Record[0];
3276 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]);
3279 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES:
3280 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3281 UnusedLocalTypedefNameCandidates.push_back(
3282 getGlobalDeclID(F, Record[I]));
3285 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH:
3286 if (Record.size() != 1) {
3287 Error("invalid cuda pragma options record");
3290 ForceCUDAHostDeviceDepth = Record[0];
3296 ASTReader::ASTReadResult
3297 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
3298 const ModuleFile *ImportedBy,
3299 unsigned ClientLoadCapabilities) {
3301 F.ModuleMapPath = ReadPath(F, Record, Idx);
3303 if (F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule) {
3304 // For an explicitly-loaded module, we don't care whether the original
3305 // module map file exists or matches.
3309 // Try to resolve ModuleName in the current header search context and
3310 // verify that it is found in the same module map file as we saved. If the
3311 // top-level AST file is a main file, skip this check because there is no
3312 // usable header search context.
3313 assert(!F.ModuleName.empty() &&
3314 "MODULE_NAME should come before MODULE_MAP_FILE");
3315 if (F.Kind == MK_ImplicitModule &&
3316 (*ModuleMgr.begin())->Kind != MK_MainFile) {
3317 // An implicitly-loaded module file should have its module listed in some
3318 // module map file that we've already loaded.
3319 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
3320 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
3321 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
3323 assert(ImportedBy && "top-level import should be verified");
3324 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
3325 if (auto *ASTFE = M ? M->getASTFile() : nullptr)
3326 // This module was defined by an imported (explicit) module.
3327 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName
3328 << ASTFE->getName();
3330 // This module was built with a different module map.
3331 Diag(diag::err_imported_module_not_found)
3332 << F.ModuleName << F.FileName << ImportedBy->FileName
3338 assert(M->Name == F.ModuleName && "found module with different name");
3340 // Check the primary module map file.
3341 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
3342 if (StoredModMap == nullptr || StoredModMap != ModMap) {
3343 assert(ModMap && "found module is missing module map file");
3344 assert(ImportedBy && "top-level import should be verified");
3345 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3346 Diag(diag::err_imported_module_modmap_changed)
3347 << F.ModuleName << ImportedBy->FileName
3348 << ModMap->getName() << F.ModuleMapPath;
3352 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps;
3353 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) {
3354 // FIXME: we should use input files rather than storing names.
3355 std::string Filename = ReadPath(F, Record, Idx);
3356 const FileEntry *F =
3357 FileMgr.getFile(Filename, false, false);
3359 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3360 Error("could not find file '" + Filename +"' referenced by AST file");
3363 AdditionalStoredMaps.insert(F);
3366 // Check any additional module map files (e.g. module.private.modulemap)
3367 // that are not in the pcm.
3368 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
3369 for (const FileEntry *ModMap : *AdditionalModuleMaps) {
3370 // Remove files that match
3371 // Note: SmallPtrSet::erase is really remove
3372 if (!AdditionalStoredMaps.erase(ModMap)) {
3373 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3374 Diag(diag::err_module_different_modmap)
3375 << F.ModuleName << /*new*/0 << ModMap->getName();
3381 // Check any additional module map files that are in the pcm, but not
3382 // found in header search. Cases that match are already removed.
3383 for (const FileEntry *ModMap : AdditionalStoredMaps) {
3384 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3385 Diag(diag::err_module_different_modmap)
3386 << F.ModuleName << /*not new*/1 << ModMap->getName();
3392 Listener->ReadModuleMapFile(F.ModuleMapPath);
3397 /// \brief Move the given method to the back of the global list of methods.
3398 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3399 // Find the entry for this selector in the method pool.
3400 Sema::GlobalMethodPool::iterator Known
3401 = S.MethodPool.find(Method->getSelector());
3402 if (Known == S.MethodPool.end())
3405 // Retrieve the appropriate method list.
3406 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3407 : Known->second.second;
3409 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3411 if (List->getMethod() == Method) {
3419 if (List->getNext())
3420 List->setMethod(List->getNext()->getMethod());
3422 List->setMethod(Method);
3426 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3427 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?");
3428 for (Decl *D : Names) {
3429 bool wasHidden = D->Hidden;
3432 if (wasHidden && SemaObj) {
3433 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3434 moveMethodToBackOfGlobalList(*SemaObj, Method);
3440 void ASTReader::makeModuleVisible(Module *Mod,
3441 Module::NameVisibilityKind NameVisibility,
3442 SourceLocation ImportLoc) {
3443 llvm::SmallPtrSet<Module *, 4> Visited;
3444 SmallVector<Module *, 4> Stack;
3445 Stack.push_back(Mod);
3446 while (!Stack.empty()) {
3447 Mod = Stack.pop_back_val();
3449 if (NameVisibility <= Mod->NameVisibility) {
3450 // This module already has this level of visibility (or greater), so
3451 // there is nothing more to do.
3455 if (!Mod->isAvailable()) {
3456 // Modules that aren't available cannot be made visible.
3460 // Update the module's name visibility.
3461 Mod->NameVisibility = NameVisibility;
3463 // If we've already deserialized any names from this module,
3464 // mark them as visible.
3465 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3466 if (Hidden != HiddenNamesMap.end()) {
3467 auto HiddenNames = std::move(*Hidden);
3468 HiddenNamesMap.erase(Hidden);
3469 makeNamesVisible(HiddenNames.second, HiddenNames.first);
3470 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() &&
3471 "making names visible added hidden names");
3474 // Push any exported modules onto the stack to be marked as visible.
3475 SmallVector<Module *, 16> Exports;
3476 Mod->getExportedModules(Exports);
3477 for (SmallVectorImpl<Module *>::iterator
3478 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3479 Module *Exported = *I;
3480 if (Visited.insert(Exported).second)
3481 Stack.push_back(Exported);
3486 /// We've merged the definition \p MergedDef into the existing definition
3487 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made
3489 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def,
3490 NamedDecl *MergedDef) {
3491 // FIXME: This doesn't correctly handle the case where MergedDef is visible
3492 // in modules other than its owning module. We should instead give the
3493 // ASTContext a list of merged definitions for Def.
3494 if (Def->isHidden()) {
3495 // If MergedDef is visible or becomes visible, make the definition visible.
3496 if (!MergedDef->isHidden())
3497 Def->Hidden = false;
3498 else if (getContext().getLangOpts().ModulesLocalVisibility) {
3499 getContext().mergeDefinitionIntoModule(
3500 Def, MergedDef->getImportedOwningModule(),
3501 /*NotifyListeners*/ false);
3502 PendingMergedDefinitionsToDeduplicate.insert(Def);
3504 auto SubmoduleID = MergedDef->getOwningModuleID();
3505 assert(SubmoduleID && "hidden definition in no module");
3506 HiddenNamesMap[getSubmodule(SubmoduleID)].push_back(Def);
3511 bool ASTReader::loadGlobalIndex() {
3515 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3516 !Context.getLangOpts().Modules)
3519 // Try to load the global index.
3520 TriedLoadingGlobalIndex = true;
3521 StringRef ModuleCachePath
3522 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3523 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3524 = GlobalModuleIndex::readIndex(ModuleCachePath);
3528 GlobalIndex.reset(Result.first);
3529 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3533 bool ASTReader::isGlobalIndexUnavailable() const {
3534 return Context.getLangOpts().Modules && UseGlobalIndex &&
3535 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3538 static void updateModuleTimestamp(ModuleFile &MF) {
3539 // Overwrite the timestamp file contents so that file's mtime changes.
3540 std::string TimestampFilename = MF.getTimestampFilename();
3542 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text);
3545 OS << "Timestamp file\n";
3548 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3549 /// cursor into the start of the given block ID, returning false on success and
3550 /// true on failure.
3551 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3553 llvm::BitstreamEntry Entry = Cursor.advance();
3554 switch (Entry.Kind) {
3555 case llvm::BitstreamEntry::Error:
3556 case llvm::BitstreamEntry::EndBlock:
3559 case llvm::BitstreamEntry::Record:
3560 // Ignore top-level records.
3561 Cursor.skipRecord(Entry.ID);
3564 case llvm::BitstreamEntry::SubBlock:
3565 if (Entry.ID == BlockID) {
3566 if (Cursor.EnterSubBlock(BlockID))
3572 if (Cursor.SkipBlock())
3578 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
3580 SourceLocation ImportLoc,
3581 unsigned ClientLoadCapabilities) {
3582 llvm::SaveAndRestore<SourceLocation>
3583 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3585 // Defer any pending actions until we get to the end of reading the AST file.
3586 Deserializing AnASTFile(this);
3588 // Bump the generation number.
3589 unsigned PreviousGeneration = incrementGeneration(Context);
3591 unsigned NumModules = ModuleMgr.size();
3592 SmallVector<ImportedModule, 4> Loaded;
3593 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
3594 /*ImportedBy=*/nullptr, Loaded,
3596 ClientLoadCapabilities)) {
3600 case VersionMismatch:
3601 case ConfigurationMismatch:
3603 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3604 for (const ImportedModule &IM : Loaded)
3605 LoadedSet.insert(IM.Mod);
3607 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
3609 Context.getLangOpts().Modules
3610 ? &PP.getHeaderSearchInfo().getModuleMap()
3613 // If we find that any modules are unusable, the global index is going
3614 // to be out-of-date. Just remove it.
3615 GlobalIndex.reset();
3616 ModuleMgr.setGlobalIndex(nullptr);
3623 // Here comes stuff that we only do once the entire chain is loaded.
3625 // Load the AST blocks of all of the modules that we loaded.
3626 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3627 MEnd = Loaded.end();
3629 ModuleFile &F = *M->Mod;
3631 // Read the AST block.
3632 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3635 // Read the extension blocks.
3636 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) {
3637 if (ASTReadResult Result = ReadExtensionBlock(F))
3641 // Once read, set the ModuleFile bit base offset and update the size in
3642 // bits of all files we've seen.
3643 F.GlobalBitOffset = TotalModulesSizeInBits;
3644 TotalModulesSizeInBits += F.SizeInBits;
3645 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3647 // Preload SLocEntries.
3648 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3649 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3650 // Load it through the SourceManager and don't call ReadSLocEntry()
3651 // directly because the entry may have already been loaded in which case
3652 // calling ReadSLocEntry() directly would trigger an assertion in
3654 SourceMgr.getLoadedSLocEntryByID(Index);
3657 // Preload all the pending interesting identifiers by marking them out of
3659 for (auto Offset : F.PreloadIdentifierOffsets) {
3660 const unsigned char *Data = reinterpret_cast<const unsigned char *>(
3661 F.IdentifierTableData + Offset);
3663 ASTIdentifierLookupTrait Trait(*this, F);
3664 auto KeyDataLen = Trait.ReadKeyDataLength(Data);
3665 auto Key = Trait.ReadKey(Data, KeyDataLen.first);
3666 auto &II = PP.getIdentifierTable().getOwn(Key);
3667 II.setOutOfDate(true);
3669 // Mark this identifier as being from an AST file so that we can track
3670 // whether we need to serialize it.
3671 markIdentifierFromAST(*this, II);
3673 // Associate the ID with the identifier so that the writer can reuse it.
3674 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first);
3675 SetIdentifierInfo(ID, &II);
3679 // Setup the import locations and notify the module manager that we've
3680 // committed to these module files.
3681 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3682 MEnd = Loaded.end();
3684 ModuleFile &F = *M->Mod;
3686 ModuleMgr.moduleFileAccepted(&F);
3688 // Set the import location.
3689 F.DirectImportLoc = ImportLoc;
3690 // FIXME: We assume that locations from PCH / preamble do not need
3693 F.ImportLoc = M->ImportLoc;
3695 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc);
3698 if (!Context.getLangOpts().CPlusPlus ||
3699 (Type != MK_ImplicitModule && Type != MK_ExplicitModule &&
3700 Type != MK_PrebuiltModule)) {
3701 // Mark all of the identifiers in the identifier table as being out of date,
3702 // so that various accessors know to check the loaded modules when the
3703 // identifier is used.
3705 // For C++ modules, we don't need information on many identifiers (just
3706 // those that provide macros or are poisoned), so we mark all of
3707 // the interesting ones via PreloadIdentifierOffsets.
3708 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3709 IdEnd = PP.getIdentifierTable().end();
3711 Id->second->setOutOfDate(true);
3713 // Mark selectors as out of date.
3714 for (auto Sel : SelectorGeneration)
3715 SelectorOutOfDate[Sel.first] = true;
3717 // Resolve any unresolved module exports.
3718 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3719 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
3720 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3721 Module *ResolvedMod = getSubmodule(GlobalID);
3723 switch (Unresolved.Kind) {
3724 case UnresolvedModuleRef::Conflict:
3726 Module::Conflict Conflict;
3727 Conflict.Other = ResolvedMod;
3728 Conflict.Message = Unresolved.String.str();
3729 Unresolved.Mod->Conflicts.push_back(Conflict);
3733 case UnresolvedModuleRef::Import:
3735 Unresolved.Mod->Imports.insert(ResolvedMod);
3738 case UnresolvedModuleRef::Export:
3739 if (ResolvedMod || Unresolved.IsWildcard)
3740 Unresolved.Mod->Exports.push_back(
3741 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3745 UnresolvedModuleRefs.clear();
3747 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3748 // Might be unnecessary as use declarations are only used to build the
3751 InitializeContext();
3756 if (DeserializationListener)
3757 DeserializationListener->ReaderInitialized(this);
3759 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3760 if (PrimaryModule.OriginalSourceFileID.isValid()) {
3761 PrimaryModule.OriginalSourceFileID
3762 = FileID::get(PrimaryModule.SLocEntryBaseID
3763 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3765 // If this AST file is a precompiled preamble, then set the
3766 // preamble file ID of the source manager to the file source file
3767 // from which the preamble was built.
3768 if (Type == MK_Preamble) {
3769 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3770 } else if (Type == MK_MainFile) {
3771 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3775 // For any Objective-C class definitions we have already loaded, make sure
3776 // that we load any additional categories.
3777 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3778 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3779 ObjCClassesLoaded[I],
3780 PreviousGeneration);
3783 if (PP.getHeaderSearchInfo()
3784 .getHeaderSearchOpts()
3785 .ModulesValidateOncePerBuildSession) {
3786 // Now we are certain that the module and all modules it depends on are
3787 // up to date. Create or update timestamp files for modules that are
3788 // located in the module cache (not for PCH files that could be anywhere
3789 // in the filesystem).
3790 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3791 ImportedModule &M = Loaded[I];
3792 if (M.Mod->Kind == MK_ImplicitModule) {
3793 updateModuleTimestamp(*M.Mod);
3801 static ASTFileSignature readASTFileSignature(StringRef PCH);
3803 /// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
3804 static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
3805 return Stream.canSkipToPos(4) &&
3806 Stream.Read(8) == 'C' &&
3807 Stream.Read(8) == 'P' &&
3808 Stream.Read(8) == 'C' &&
3809 Stream.Read(8) == 'H';
3812 static unsigned moduleKindForDiagnostic(ModuleKind Kind) {
3816 case MK_ImplicitModule:
3817 case MK_ExplicitModule:
3818 case MK_PrebuiltModule:
3822 return 2; // main source file
3824 llvm_unreachable("unknown module kind");
3827 ASTReader::ASTReadResult
3828 ASTReader::ReadASTCore(StringRef FileName,
3830 SourceLocation ImportLoc,
3831 ModuleFile *ImportedBy,
3832 SmallVectorImpl<ImportedModule> &Loaded,
3833 off_t ExpectedSize, time_t ExpectedModTime,
3834 ASTFileSignature ExpectedSignature,
3835 unsigned ClientLoadCapabilities) {
3837 std::string ErrorStr;
3838 ModuleManager::AddModuleResult AddResult
3839 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
3840 getGeneration(), ExpectedSize, ExpectedModTime,
3841 ExpectedSignature, readASTFileSignature,
3844 switch (AddResult) {
3845 case ModuleManager::AlreadyLoaded:
3848 case ModuleManager::NewlyLoaded:
3849 // Load module file below.
3852 case ModuleManager::Missing:
3853 // The module file was missing; if the client can handle that, return
3855 if (ClientLoadCapabilities & ARR_Missing)
3858 // Otherwise, return an error.
3859 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type)
3860 << FileName << !ErrorStr.empty()
3864 case ModuleManager::OutOfDate:
3865 // We couldn't load the module file because it is out-of-date. If the
3866 // client can handle out-of-date, return it.
3867 if (ClientLoadCapabilities & ARR_OutOfDate)
3870 // Otherwise, return an error.
3871 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type)
3872 << FileName << !ErrorStr.empty()
3877 assert(M && "Missing module file");
3879 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3881 if (FileName != "-") {
3882 CurrentDir = llvm::sys::path::parent_path(FileName);
3883 if (CurrentDir.empty()) CurrentDir = ".";
3887 BitstreamCursor &Stream = F.Stream;
3888 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
3889 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3891 // Sniff for the signature.
3892 if (!startsWithASTFileMagic(Stream)) {
3893 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type)
3898 // This is used for compatibility with older PCH formats.
3899 bool HaveReadControlBlock = false;
3901 llvm::BitstreamEntry Entry = Stream.advance();
3903 switch (Entry.Kind) {
3904 case llvm::BitstreamEntry::Error:
3905 case llvm::BitstreamEntry::Record:
3906 case llvm::BitstreamEntry::EndBlock:
3907 Error("invalid record at top-level of AST file");
3910 case llvm::BitstreamEntry::SubBlock:
3915 case CONTROL_BLOCK_ID:
3916 HaveReadControlBlock = true;
3917 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
3919 // Check that we didn't try to load a non-module AST file as a module.
3921 // FIXME: Should we also perform the converse check? Loading a module as
3922 // a PCH file sort of works, but it's a bit wonky.
3923 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule ||
3924 Type == MK_PrebuiltModule) &&
3925 F.ModuleName.empty()) {
3926 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure;
3927 if (Result != OutOfDate ||
3928 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
3929 Diag(diag::err_module_file_not_module) << FileName;
3934 case Failure: return Failure;
3935 case Missing: return Missing;
3936 case OutOfDate: return OutOfDate;
3937 case VersionMismatch: return VersionMismatch;
3938 case ConfigurationMismatch: return ConfigurationMismatch;
3939 case HadErrors: return HadErrors;
3944 if (!HaveReadControlBlock) {
3945 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3946 Diag(diag::err_pch_version_too_old);
3947 return VersionMismatch;
3950 // Record that we've loaded this module.
3951 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3955 if (Stream.SkipBlock()) {
3956 Error("malformed block record in AST file");
3966 /// Parse a record and blob containing module file extension metadata.
3967 static bool parseModuleFileExtensionMetadata(
3968 const SmallVectorImpl<uint64_t> &Record,
3970 ModuleFileExtensionMetadata &Metadata) {
3971 if (Record.size() < 4) return true;
3973 Metadata.MajorVersion = Record[0];
3974 Metadata.MinorVersion = Record[1];
3976 unsigned BlockNameLen = Record[2];
3977 unsigned UserInfoLen = Record[3];
3979 if (BlockNameLen + UserInfoLen > Blob.size()) return true;
3981 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
3982 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen,
3983 Blob.data() + BlockNameLen + UserInfoLen);
3987 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) {
3988 BitstreamCursor &Stream = F.Stream;
3992 llvm::BitstreamEntry Entry = Stream.advance();
3993 switch (Entry.Kind) {
3994 case llvm::BitstreamEntry::SubBlock:
3995 if (Stream.SkipBlock())
4000 case llvm::BitstreamEntry::EndBlock:
4003 case llvm::BitstreamEntry::Error:
4006 case llvm::BitstreamEntry::Record:
4012 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4014 case EXTENSION_METADATA: {
4015 ModuleFileExtensionMetadata Metadata;
4016 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4019 // Find a module file extension with this block name.
4020 auto Known = ModuleFileExtensions.find(Metadata.BlockName);
4021 if (Known == ModuleFileExtensions.end()) break;
4024 if (auto Reader = Known->second->createExtensionReader(Metadata, *this,
4026 F.ExtensionReaders.push_back(std::move(Reader));
4037 void ASTReader::InitializeContext() {
4038 // If there's a listener, notify them that we "read" the translation unit.
4039 if (DeserializationListener)
4040 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
4041 Context.getTranslationUnitDecl());
4043 // FIXME: Find a better way to deal with collisions between these
4044 // built-in types. Right now, we just ignore the problem.
4046 // Load the special types.
4047 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
4048 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
4049 if (!Context.CFConstantStringTypeDecl)
4050 Context.setCFConstantStringType(GetType(String));
4053 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
4054 QualType FileType = GetType(File);
4055 if (FileType.isNull()) {
4056 Error("FILE type is NULL");
4060 if (!Context.FILEDecl) {
4061 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
4062 Context.setFILEDecl(Typedef->getDecl());
4064 const TagType *Tag = FileType->getAs<TagType>();
4066 Error("Invalid FILE type in AST file");
4069 Context.setFILEDecl(Tag->getDecl());
4074 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
4075 QualType Jmp_bufType = GetType(Jmp_buf);
4076 if (Jmp_bufType.isNull()) {
4077 Error("jmp_buf type is NULL");
4081 if (!Context.jmp_bufDecl) {
4082 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
4083 Context.setjmp_bufDecl(Typedef->getDecl());
4085 const TagType *Tag = Jmp_bufType->getAs<TagType>();
4087 Error("Invalid jmp_buf type in AST file");
4090 Context.setjmp_bufDecl(Tag->getDecl());
4095 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
4096 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
4097 if (Sigjmp_bufType.isNull()) {
4098 Error("sigjmp_buf type is NULL");
4102 if (!Context.sigjmp_bufDecl) {
4103 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
4104 Context.setsigjmp_bufDecl(Typedef->getDecl());
4106 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
4107 assert(Tag && "Invalid sigjmp_buf type in AST file");
4108 Context.setsigjmp_bufDecl(Tag->getDecl());
4113 if (unsigned ObjCIdRedef
4114 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
4115 if (Context.ObjCIdRedefinitionType.isNull())
4116 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
4119 if (unsigned ObjCClassRedef
4120 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
4121 if (Context.ObjCClassRedefinitionType.isNull())
4122 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
4125 if (unsigned ObjCSelRedef
4126 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
4127 if (Context.ObjCSelRedefinitionType.isNull())
4128 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
4131 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
4132 QualType Ucontext_tType = GetType(Ucontext_t);
4133 if (Ucontext_tType.isNull()) {
4134 Error("ucontext_t type is NULL");
4138 if (!Context.ucontext_tDecl) {
4139 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
4140 Context.setucontext_tDecl(Typedef->getDecl());
4142 const TagType *Tag = Ucontext_tType->getAs<TagType>();
4143 assert(Tag && "Invalid ucontext_t type in AST file");
4144 Context.setucontext_tDecl(Tag->getDecl());
4150 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
4152 // If there were any CUDA special declarations, deserialize them.
4153 if (!CUDASpecialDeclRefs.empty()) {
4154 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
4155 Context.setcudaConfigureCallDecl(
4156 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
4159 // Re-export any modules that were imported by a non-module AST file.
4160 // FIXME: This does not make macro-only imports visible again.
4161 for (auto &Import : ImportedModules) {
4162 if (Module *Imported = getSubmodule(Import.ID)) {
4163 makeModuleVisible(Imported, Module::AllVisible,
4164 /*ImportLoc=*/Import.ImportLoc);
4165 if (Import.ImportLoc.isValid())
4166 PP.makeModuleVisible(Imported, Import.ImportLoc);
4167 // FIXME: should we tell Sema to make the module visible too?
4170 ImportedModules.clear();
4173 void ASTReader::finalizeForWriting() {
4174 // Nothing to do for now.
4177 /// \brief Reads and return the signature record from \p PCH's control block, or
4179 static ASTFileSignature readASTFileSignature(StringRef PCH) {
4180 BitstreamCursor Stream(PCH);
4181 if (!startsWithASTFileMagic(Stream))
4184 // Scan for the CONTROL_BLOCK_ID block.
4185 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4188 // Scan for SIGNATURE inside the control block.
4189 ASTReader::RecordData Record;
4191 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4192 if (Entry.Kind != llvm::BitstreamEntry::Record)
4197 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob))
4202 /// \brief Retrieve the name of the original source file name
4203 /// directly from the AST file, without actually loading the AST
4205 std::string ASTReader::getOriginalSourceFile(
4206 const std::string &ASTFileName, FileManager &FileMgr,
4207 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {
4208 // Open the AST file.
4209 auto Buffer = FileMgr.getBufferForFile(ASTFileName);
4211 Diags.Report(diag::err_fe_unable_to_read_pch_file)
4212 << ASTFileName << Buffer.getError().message();
4213 return std::string();
4216 // Initialize the stream
4217 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
4219 // Sniff for the signature.
4220 if (!startsWithASTFileMagic(Stream)) {
4221 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
4222 return std::string();
4225 // Scan for the CONTROL_BLOCK_ID block.
4226 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
4227 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4228 return std::string();
4231 // Scan for ORIGINAL_FILE inside the control block.
4234 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4235 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4236 return std::string();
4238 if (Entry.Kind != llvm::BitstreamEntry::Record) {
4239 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
4240 return std::string();
4245 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
4252 class SimplePCHValidator : public ASTReaderListener {
4253 const LangOptions &ExistingLangOpts;
4254 const TargetOptions &ExistingTargetOpts;
4255 const PreprocessorOptions &ExistingPPOpts;
4256 std::string ExistingModuleCachePath;
4257 FileManager &FileMgr;
4260 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4261 const TargetOptions &ExistingTargetOpts,
4262 const PreprocessorOptions &ExistingPPOpts,
4263 StringRef ExistingModuleCachePath,
4264 FileManager &FileMgr)
4265 : ExistingLangOpts(ExistingLangOpts),
4266 ExistingTargetOpts(ExistingTargetOpts),
4267 ExistingPPOpts(ExistingPPOpts),
4268 ExistingModuleCachePath(ExistingModuleCachePath),
4273 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain,
4274 bool AllowCompatibleDifferences) override {
4275 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr,
4276 AllowCompatibleDifferences);
4279 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain,
4280 bool AllowCompatibleDifferences) override {
4281 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr,
4282 AllowCompatibleDifferences);
4285 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
4286 StringRef SpecificModuleCachePath,
4287 bool Complain) override {
4288 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4289 ExistingModuleCachePath,
4290 nullptr, ExistingLangOpts);
4293 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4295 std::string &SuggestedPredefines) override {
4296 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4297 SuggestedPredefines, ExistingLangOpts);
4301 } // end anonymous namespace
4303 bool ASTReader::readASTFileControlBlock(
4304 StringRef Filename, FileManager &FileMgr,
4305 const PCHContainerReader &PCHContainerRdr,
4306 bool FindModuleFileExtensions,
4307 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) {
4308 // Open the AST file.
4309 // FIXME: This allows use of the VFS; we do not allow use of the
4310 // VFS when actually loading a module.
4311 auto Buffer = FileMgr.getBufferForFile(Filename);
4316 // Initialize the stream
4317 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
4319 // Sniff for the signature.
4320 if (!startsWithASTFileMagic(Stream))
4323 // Scan for the CONTROL_BLOCK_ID block.
4324 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4327 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4328 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4329 bool NeedsImports = Listener.needsImportVisitation();
4330 BitstreamCursor InputFilesCursor;
4333 std::string ModuleDir;
4334 bool DoneWithControlBlock = false;
4335 while (!DoneWithControlBlock) {
4336 llvm::BitstreamEntry Entry = Stream.advance();
4338 switch (Entry.Kind) {
4339 case llvm::BitstreamEntry::SubBlock: {
4341 case OPTIONS_BLOCK_ID: {
4342 std::string IgnoredSuggestedPredefines;
4343 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate,
4344 /*AllowCompatibleConfigurationMismatch*/ false,
4345 Listener, IgnoredSuggestedPredefines,
4346 ValidateDiagnosticOptions) != Success)
4351 case INPUT_FILES_BLOCK_ID:
4352 InputFilesCursor = Stream;
4353 if (Stream.SkipBlock() ||
4355 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)))
4360 if (Stream.SkipBlock())
4368 case llvm::BitstreamEntry::EndBlock:
4369 DoneWithControlBlock = true;
4372 case llvm::BitstreamEntry::Error:
4375 case llvm::BitstreamEntry::Record:
4379 if (DoneWithControlBlock) break;
4383 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4384 switch ((ControlRecordTypes)RecCode) {
4386 if (Record[0] != VERSION_MAJOR)
4389 if (Listener.ReadFullVersionInformation(Blob))
4395 Listener.ReadModuleName(Blob);
4397 case MODULE_DIRECTORY:
4400 case MODULE_MAP_FILE: {
4402 auto Path = ReadString(Record, Idx);
4403 ResolveImportedPath(Path, ModuleDir);
4404 Listener.ReadModuleMapFile(Path);
4407 case INPUT_FILE_OFFSETS: {
4408 if (!NeedsInputFiles)
4411 unsigned NumInputFiles = Record[0];
4412 unsigned NumUserFiles = Record[1];
4413 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data();
4414 for (unsigned I = 0; I != NumInputFiles; ++I) {
4415 // Go find this input file.
4416 bool isSystemFile = I >= NumUserFiles;
4418 if (isSystemFile && !NeedsSystemInputFiles)
4419 break; // the rest are system input files
4421 BitstreamCursor &Cursor = InputFilesCursor;
4422 SavedStreamPosition SavedPosition(Cursor);
4423 Cursor.JumpToBit(InputFileOffs[I]);
4425 unsigned Code = Cursor.ReadCode();
4428 bool shouldContinue = false;
4429 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4431 bool Overridden = static_cast<bool>(Record[3]);
4432 std::string Filename = Blob;
4433 ResolveImportedPath(Filename, ModuleDir);
4434 shouldContinue = Listener.visitInputFile(
4435 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);
4438 if (!shouldContinue)
4448 unsigned Idx = 0, N = Record.size();
4450 // Read information about the AST file.
4451 Idx += 5; // ImportLoc, Size, ModTime, Signature
4452 std::string Filename = ReadString(Record, Idx);
4453 ResolveImportedPath(Filename, ModuleDir);
4454 Listener.visitImport(Filename);
4460 // No other validation to perform.
4465 // Look for module file extension blocks, if requested.
4466 if (FindModuleFileExtensions) {
4467 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) {
4468 bool DoneWithExtensionBlock = false;
4469 while (!DoneWithExtensionBlock) {
4470 llvm::BitstreamEntry Entry = Stream.advance();
4472 switch (Entry.Kind) {
4473 case llvm::BitstreamEntry::SubBlock:
4474 if (Stream.SkipBlock())
4479 case llvm::BitstreamEntry::EndBlock:
4480 DoneWithExtensionBlock = true;
4483 case llvm::BitstreamEntry::Error:
4486 case llvm::BitstreamEntry::Record:
4492 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4494 case EXTENSION_METADATA: {
4495 ModuleFileExtensionMetadata Metadata;
4496 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata))
4499 Listener.readModuleFileExtension(Metadata);
4510 bool ASTReader::isAcceptableASTFile(
4511 StringRef Filename, FileManager &FileMgr,
4512 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts,
4513 const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts,
4514 std::string ExistingModuleCachePath) {
4515 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts,
4516 ExistingModuleCachePath, FileMgr);
4517 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr,
4518 /*FindModuleFileExtensions=*/false,
4520 /*ValidateDiagnosticOptions=*/true);
4523 ASTReader::ASTReadResult
4524 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4525 // Enter the submodule block.
4526 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4527 Error("malformed submodule block record in AST file");
4531 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4533 Module *CurrentModule = nullptr;
4536 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4538 switch (Entry.Kind) {
4539 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4540 case llvm::BitstreamEntry::Error:
4541 Error("malformed block record in AST file");
4543 case llvm::BitstreamEntry::EndBlock:
4545 case llvm::BitstreamEntry::Record:
4546 // The interesting case.
4553 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob);
4555 if ((Kind == SUBMODULE_METADATA) != First) {
4556 Error("submodule metadata record should be at beginning of block");
4561 // Submodule information is only valid if we have a current module.
4562 // FIXME: Should we error on these cases?
4563 if (!CurrentModule && Kind != SUBMODULE_METADATA &&
4564 Kind != SUBMODULE_DEFINITION)
4568 default: // Default behavior: ignore.
4571 case SUBMODULE_DEFINITION: {
4572 if (Record.size() < 8) {
4573 Error("malformed module definition");
4577 StringRef Name = Blob;
4579 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4580 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4581 bool IsFramework = Record[Idx++];
4582 bool IsExplicit = Record[Idx++];
4583 bool IsSystem = Record[Idx++];
4584 bool IsExternC = Record[Idx++];
4585 bool InferSubmodules = Record[Idx++];
4586 bool InferExplicitSubmodules = Record[Idx++];
4587 bool InferExportWildcard = Record[Idx++];
4588 bool ConfigMacrosExhaustive = Record[Idx++];
4590 Module *ParentModule = nullptr;
4592 ParentModule = getSubmodule(Parent);
4594 // Retrieve this (sub)module from the module map, creating it if
4596 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework,
4599 // FIXME: set the definition loc for CurrentModule, or call
4600 // ModMap.setInferredModuleAllowedBy()
4602 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4603 if (GlobalIndex >= SubmodulesLoaded.size() ||
4604 SubmodulesLoaded[GlobalIndex]) {
4605 Error("too many submodules");
4609 if (!ParentModule) {
4610 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4611 if (CurFile != F.File) {
4612 if (!Diags.isDiagnosticInFlight()) {
4613 Diag(diag::err_module_file_conflict)
4614 << CurrentModule->getTopLevelModuleName()
4615 << CurFile->getName()
4616 << F.File->getName();
4622 CurrentModule->setASTFile(F.File);
4625 CurrentModule->Signature = F.Signature;
4626 CurrentModule->IsFromModuleFile = true;
4627 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
4628 CurrentModule->IsExternC = IsExternC;
4629 CurrentModule->InferSubmodules = InferSubmodules;
4630 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4631 CurrentModule->InferExportWildcard = InferExportWildcard;
4632 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
4633 if (DeserializationListener)
4634 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4636 SubmodulesLoaded[GlobalIndex] = CurrentModule;
4638 // Clear out data that will be replaced by what is in the module file.
4639 CurrentModule->LinkLibraries.clear();
4640 CurrentModule->ConfigMacros.clear();
4641 CurrentModule->UnresolvedConflicts.clear();
4642 CurrentModule->Conflicts.clear();
4644 // The module is available unless it's missing a requirement; relevant
4645 // requirements will be (re-)added by SUBMODULE_REQUIRES records.
4646 // Missing headers that were present when the module was built do not
4647 // make it unavailable -- if we got this far, this must be an explicitly
4648 // imported module file.
4649 CurrentModule->Requirements.clear();
4650 CurrentModule->MissingHeaders.clear();
4651 CurrentModule->IsMissingRequirement =
4652 ParentModule && ParentModule->IsMissingRequirement;
4653 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement;
4657 case SUBMODULE_UMBRELLA_HEADER: {
4658 std::string Filename = Blob;
4659 ResolveImportedPath(F, Filename);
4660 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) {
4661 if (!CurrentModule->getUmbrellaHeader())
4662 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob);
4663 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) {
4664 // This can be a spurious difference caused by changing the VFS to
4665 // point to a different copy of the file, and it is too late to
4666 // to rebuild safely.
4667 // FIXME: If we wrote the virtual paths instead of the 'real' paths,
4668 // after input file validation only real problems would remain and we
4669 // could just error. For now, assume it's okay.
4676 case SUBMODULE_HEADER:
4677 case SUBMODULE_EXCLUDED_HEADER:
4678 case SUBMODULE_PRIVATE_HEADER:
4679 // We lazily associate headers with their modules via the HeaderInfo table.
4680 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4681 // of complete filenames or remove it entirely.
4684 case SUBMODULE_TEXTUAL_HEADER:
4685 case SUBMODULE_PRIVATE_TEXTUAL_HEADER:
4686 // FIXME: Textual headers are not marked in the HeaderInfo table. Load
4690 case SUBMODULE_TOPHEADER: {
4691 CurrentModule->addTopHeaderFilename(Blob);
4695 case SUBMODULE_UMBRELLA_DIR: {
4696 std::string Dirname = Blob;
4697 ResolveImportedPath(F, Dirname);
4698 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) {
4699 if (!CurrentModule->getUmbrellaDir())
4700 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob);
4701 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) {
4702 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4703 Error("mismatched umbrella directories in submodule");
4710 case SUBMODULE_METADATA: {
4711 F.BaseSubmoduleID = getTotalNumSubmodules();
4712 F.LocalNumSubmodules = Record[0];
4713 unsigned LocalBaseSubmoduleID = Record[1];
4714 if (F.LocalNumSubmodules > 0) {
4715 // Introduce the global -> local mapping for submodules within this
4717 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4719 // Introduce the local -> global mapping for submodules within this
4721 F.SubmoduleRemap.insertOrReplace(
4722 std::make_pair(LocalBaseSubmoduleID,
4723 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4725 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4730 case SUBMODULE_IMPORTS: {
4731 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
4732 UnresolvedModuleRef Unresolved;
4733 Unresolved.File = &F;
4734 Unresolved.Mod = CurrentModule;
4735 Unresolved.ID = Record[Idx];
4736 Unresolved.Kind = UnresolvedModuleRef::Import;
4737 Unresolved.IsWildcard = false;
4738 UnresolvedModuleRefs.push_back(Unresolved);
4743 case SUBMODULE_EXPORTS: {
4744 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
4745 UnresolvedModuleRef Unresolved;
4746 Unresolved.File = &F;
4747 Unresolved.Mod = CurrentModule;
4748 Unresolved.ID = Record[Idx];
4749 Unresolved.Kind = UnresolvedModuleRef::Export;
4750 Unresolved.IsWildcard = Record[Idx + 1];
4751 UnresolvedModuleRefs.push_back(Unresolved);
4754 // Once we've loaded the set of exports, there's no reason to keep
4755 // the parsed, unresolved exports around.
4756 CurrentModule->UnresolvedExports.clear();
4759 case SUBMODULE_REQUIRES: {
4760 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
4761 Context.getTargetInfo());
4765 case SUBMODULE_LINK_LIBRARY:
4766 CurrentModule->LinkLibraries.push_back(
4767 Module::LinkLibrary(Blob, Record[0]));
4770 case SUBMODULE_CONFIG_MACRO:
4771 CurrentModule->ConfigMacros.push_back(Blob.str());
4774 case SUBMODULE_CONFLICT: {
4775 UnresolvedModuleRef Unresolved;
4776 Unresolved.File = &F;
4777 Unresolved.Mod = CurrentModule;
4778 Unresolved.ID = Record[0];
4779 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4780 Unresolved.IsWildcard = false;
4781 Unresolved.String = Blob;
4782 UnresolvedModuleRefs.push_back(Unresolved);
4786 case SUBMODULE_INITIALIZERS:
4787 SmallVector<uint32_t, 16> Inits;
4788 for (auto &ID : Record)
4789 Inits.push_back(getGlobalDeclID(F, ID));
4790 Context.addLazyModuleInitializers(CurrentModule, Inits);
4796 /// \brief Parse the record that corresponds to a LangOptions data
4799 /// This routine parses the language options from the AST file and then gives
4800 /// them to the AST listener if one is set.
4802 /// \returns true if the listener deems the file unacceptable, false otherwise.
4803 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4805 ASTReaderListener &Listener,
4806 bool AllowCompatibleDifferences) {
4807 LangOptions LangOpts;
4809 #define LANGOPT(Name, Bits, Default, Description) \
4810 LangOpts.Name = Record[Idx++];
4811 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4812 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4813 #include "clang/Basic/LangOptions.def"
4814 #define SANITIZER(NAME, ID) \
4815 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
4816 #include "clang/Basic/Sanitizers.def"
4818 for (unsigned N = Record[Idx++]; N; --N)
4819 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx));
4821 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4822 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4823 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4825 LangOpts.CurrentModule = ReadString(Record, Idx);
4828 for (unsigned N = Record[Idx++]; N; --N) {
4829 LangOpts.CommentOpts.BlockCommandNames.push_back(
4830 ReadString(Record, Idx));
4832 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
4834 // OpenMP offloading options.
4835 for (unsigned N = Record[Idx++]; N; --N) {
4836 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx)));
4839 LangOpts.OMPHostIRFile = ReadString(Record, Idx);
4841 return Listener.ReadLanguageOptions(LangOpts, Complain,
4842 AllowCompatibleDifferences);
4845 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain,
4846 ASTReaderListener &Listener,
4847 bool AllowCompatibleDifferences) {
4849 TargetOptions TargetOpts;
4850 TargetOpts.Triple = ReadString(Record, Idx);
4851 TargetOpts.CPU = ReadString(Record, Idx);
4852 TargetOpts.ABI = ReadString(Record, Idx);
4853 for (unsigned N = Record[Idx++]; N; --N) {
4854 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4856 for (unsigned N = Record[Idx++]; N; --N) {
4857 TargetOpts.Features.push_back(ReadString(Record, Idx));
4860 return Listener.ReadTargetOptions(TargetOpts, Complain,
4861 AllowCompatibleDifferences);
4864 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4865 ASTReaderListener &Listener) {
4866 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
4868 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
4869 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
4870 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
4871 #include "clang/Basic/DiagnosticOptions.def"
4873 for (unsigned N = Record[Idx++]; N; --N)
4874 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
4875 for (unsigned N = Record[Idx++]; N; --N)
4876 DiagOpts->Remarks.push_back(ReadString(Record, Idx));
4878 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4881 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4882 ASTReaderListener &Listener) {
4883 FileSystemOptions FSOpts;
4885 FSOpts.WorkingDir = ReadString(Record, Idx);
4886 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4889 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4891 ASTReaderListener &Listener) {
4892 HeaderSearchOptions HSOpts;
4894 HSOpts.Sysroot = ReadString(Record, Idx);
4897 for (unsigned N = Record[Idx++]; N; --N) {
4898 std::string Path = ReadString(Record, Idx);
4899 frontend::IncludeDirGroup Group
4900 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
4901 bool IsFramework = Record[Idx++];
4902 bool IgnoreSysRoot = Record[Idx++];
4903 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework,
4907 // System header prefixes.
4908 for (unsigned N = Record[Idx++]; N; --N) {
4909 std::string Prefix = ReadString(Record, Idx);
4910 bool IsSystemHeader = Record[Idx++];
4911 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader);
4914 HSOpts.ResourceDir = ReadString(Record, Idx);
4915 HSOpts.ModuleCachePath = ReadString(Record, Idx);
4916 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
4917 HSOpts.DisableModuleHash = Record[Idx++];
4918 HSOpts.UseBuiltinIncludes = Record[Idx++];
4919 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4920 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4921 HSOpts.UseLibcxx = Record[Idx++];
4922 std::string SpecificModuleCachePath = ReadString(Record, Idx);
4924 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath,
4928 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4930 ASTReaderListener &Listener,
4931 std::string &SuggestedPredefines) {
4932 PreprocessorOptions PPOpts;
4935 // Macro definitions/undefs
4936 for (unsigned N = Record[Idx++]; N; --N) {
4937 std::string Macro = ReadString(Record, Idx);
4938 bool IsUndef = Record[Idx++];
4939 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4943 for (unsigned N = Record[Idx++]; N; --N) {
4944 PPOpts.Includes.push_back(ReadString(Record, Idx));
4948 for (unsigned N = Record[Idx++]; N; --N) {
4949 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4952 PPOpts.UsePredefines = Record[Idx++];
4953 PPOpts.DetailedRecord = Record[Idx++];
4954 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4955 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4956 PPOpts.ObjCXXARCStandardLibrary =
4957 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4958 SuggestedPredefines.clear();
4959 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4960 SuggestedPredefines);
4963 std::pair<ModuleFile *, unsigned>
4964 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4965 GlobalPreprocessedEntityMapType::iterator
4966 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4967 assert(I != GlobalPreprocessedEntityMap.end() &&
4968 "Corrupted global preprocessed entity map");
4969 ModuleFile *M = I->second;
4970 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4971 return std::make_pair(M, LocalIndex);
4974 llvm::iterator_range<PreprocessingRecord::iterator>
4975 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4976 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4977 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4978 Mod.NumPreprocessedEntities);
4980 return llvm::make_range(PreprocessingRecord::iterator(),
4981 PreprocessingRecord::iterator());
4984 llvm::iterator_range<ASTReader::ModuleDeclIterator>
4985 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4986 return llvm::make_range(
4987 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4988 ModuleDeclIterator(this, &Mod,
4989 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4992 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4993 PreprocessedEntityID PPID = Index+1;
4994 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4995 ModuleFile &M = *PPInfo.first;
4996 unsigned LocalIndex = PPInfo.second;
4997 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4999 if (!PP.getPreprocessingRecord()) {
5000 Error("no preprocessing record");
5004 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
5005 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
5007 llvm::BitstreamEntry Entry =
5008 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
5009 if (Entry.Kind != llvm::BitstreamEntry::Record)
5013 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()),
5014 TranslateSourceLocation(M, PPOffs.getEnd()));
5015 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
5018 PreprocessorDetailRecordTypes RecType =
5019 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
5020 Entry.ID, Record, &Blob);
5022 case PPD_MACRO_EXPANSION: {
5023 bool isBuiltin = Record[0];
5024 IdentifierInfo *Name = nullptr;
5025 MacroDefinitionRecord *Def = nullptr;
5027 Name = getLocalIdentifier(M, Record[1]);
5029 PreprocessedEntityID GlobalID =
5030 getGlobalPreprocessedEntityID(M, Record[1]);
5031 Def = cast<MacroDefinitionRecord>(
5032 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
5037 ME = new (PPRec) MacroExpansion(Name, Range);
5039 ME = new (PPRec) MacroExpansion(Def, Range);
5044 case PPD_MACRO_DEFINITION: {
5045 // Decode the identifier info and then check again; if the macro is
5046 // still defined and associated with the identifier,
5047 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
5048 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range);
5050 if (DeserializationListener)
5051 DeserializationListener->MacroDefinitionRead(PPID, MD);
5056 case PPD_INCLUSION_DIRECTIVE: {
5057 const char *FullFileNameStart = Blob.data() + Record[0];
5058 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
5059 const FileEntry *File = nullptr;
5060 if (!FullFileName.empty())
5061 File = PP.getFileManager().getFile(FullFileName);
5063 // FIXME: Stable encoding
5064 InclusionDirective::InclusionKind Kind
5065 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
5066 InclusionDirective *ID
5067 = new (PPRec) InclusionDirective(PPRec, Kind,
5068 StringRef(Blob.data(), Record[0]),
5069 Record[1], Record[3],
5076 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
5079 /// \brief \arg SLocMapI points at a chunk of a module that contains no
5080 /// preprocessed entities or the entities it contains are not the ones we are
5081 /// looking for. Find the next module that contains entities and return the ID
5082 /// of the first entry.
5083 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
5084 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
5086 for (GlobalSLocOffsetMapType::const_iterator
5087 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
5088 ModuleFile &M = *SLocMapI->second;
5089 if (M.NumPreprocessedEntities)
5090 return M.BasePreprocessedEntityID;
5093 return getTotalNumPreprocessedEntities();
5098 struct PPEntityComp {
5099 const ASTReader &Reader;
5102 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
5104 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
5105 SourceLocation LHS = getLoc(L);
5106 SourceLocation RHS = getLoc(R);
5107 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5110 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
5111 SourceLocation LHS = getLoc(L);
5112 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5115 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
5116 SourceLocation RHS = getLoc(R);
5117 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
5120 SourceLocation getLoc(const PPEntityOffset &PPE) const {
5121 return Reader.TranslateSourceLocation(M, PPE.getBegin());
5125 } // end anonymous namespace
5127 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
5128 bool EndsAfter) const {
5129 if (SourceMgr.isLocalSourceLocation(Loc))
5130 return getTotalNumPreprocessedEntities();
5132 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
5133 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
5134 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
5135 "Corrupted global sloc offset map");
5137 if (SLocMapI->second->NumPreprocessedEntities == 0)
5138 return findNextPreprocessedEntity(SLocMapI);
5140 ModuleFile &M = *SLocMapI->second;
5141 typedef const PPEntityOffset *pp_iterator;
5142 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
5143 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
5145 size_t Count = M.NumPreprocessedEntities;
5147 pp_iterator First = pp_begin;
5151 PPI = std::upper_bound(pp_begin, pp_end, Loc,
5152 PPEntityComp(*this, M));
5154 // Do a binary search manually instead of using std::lower_bound because
5155 // The end locations of entities may be unordered (when a macro expansion
5156 // is inside another macro argument), but for this case it is not important
5157 // whether we get the first macro expansion or its containing macro.
5161 std::advance(PPI, Half);
5162 if (SourceMgr.isBeforeInTranslationUnit(
5163 TranslateSourceLocation(M, PPI->getEnd()), Loc)) {
5166 Count = Count - Half - 1;
5173 return findNextPreprocessedEntity(SLocMapI);
5175 return M.BasePreprocessedEntityID + (PPI - pp_begin);
5178 /// \brief Returns a pair of [Begin, End) indices of preallocated
5179 /// preprocessed entities that \arg Range encompasses.
5180 std::pair<unsigned, unsigned>
5181 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
5182 if (Range.isInvalid())
5183 return std::make_pair(0,0);
5184 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
5186 PreprocessedEntityID BeginID =
5187 findPreprocessedEntity(Range.getBegin(), false);
5188 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
5189 return std::make_pair(BeginID, EndID);
5192 /// \brief Optionally returns true or false if the preallocated preprocessed
5193 /// entity with index \arg Index came from file \arg FID.
5194 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
5196 if (FID.isInvalid())
5199 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
5200 ModuleFile &M = *PPInfo.first;
5201 unsigned LocalIndex = PPInfo.second;
5202 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
5204 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin());
5205 if (Loc.isInvalid())
5208 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
5216 /// \brief Visitor used to search for information about a header file.
5217 class HeaderFileInfoVisitor {
5218 const FileEntry *FE;
5220 Optional<HeaderFileInfo> HFI;
5223 explicit HeaderFileInfoVisitor(const FileEntry *FE)
5226 bool operator()(ModuleFile &M) {
5227 HeaderFileInfoLookupTable *Table
5228 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
5232 // Look in the on-disk hash table for an entry for this file name.
5233 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
5234 if (Pos == Table->end())
5241 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
5244 } // end anonymous namespace
5246 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
5247 HeaderFileInfoVisitor Visitor(FE);
5248 ModuleMgr.visit(Visitor);
5249 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
5252 return HeaderFileInfo();
5255 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
5256 // FIXME: Make it work properly with modules.
5257 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
5258 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
5259 ModuleFile &F = *(*I);
5262 assert(!Diag.DiagStates.empty());
5263 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
5264 while (Idx < F.PragmaDiagMappings.size()) {
5265 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5266 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5267 if (DiagStateID != 0) {
5268 Diag.DiagStatePoints.push_back(
5269 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5270 FullSourceLoc(Loc, SourceMgr)));
5274 assert(DiagStateID == 0);
5275 // A new DiagState was created here.
5276 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5277 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5278 DiagStates.push_back(NewState);
5279 Diag.DiagStatePoints.push_back(
5280 DiagnosticsEngine::DiagStatePoint(NewState,
5281 FullSourceLoc(Loc, SourceMgr)));
5283 assert(Idx < F.PragmaDiagMappings.size() &&
5284 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5285 if (Idx >= F.PragmaDiagMappings.size()) {
5286 break; // Something is messed up but at least avoid infinite loop in
5289 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5290 if (DiagID == (unsigned)-1) {
5291 break; // no more diag/map pairs for this location.
5293 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5294 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5295 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
5301 /// \brief Get the correct cursor and offset for loading a type.
5302 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5303 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5304 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5305 ModuleFile *M = I->second;
5306 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5309 /// \brief Read and return the type with the given index..
5311 /// The index is the type ID, shifted and minus the number of predefs. This
5312 /// routine actually reads the record corresponding to the type at the given
5313 /// location. It is a helper routine for GetType, which deals with reading type
5315 QualType ASTReader::readTypeRecord(unsigned Index) {
5316 RecordLocation Loc = TypeCursorForIndex(Index);
5317 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5319 // Keep track of where we are in the stream, then jump back there
5320 // after reading this type.
5321 SavedStreamPosition SavedPosition(DeclsCursor);
5323 ReadingKindTracker ReadingKind(Read_Type, *this);
5325 // Note that we are loading a type record.
5326 Deserializing AType(this);
5329 DeclsCursor.JumpToBit(Loc.Offset);
5331 unsigned Code = DeclsCursor.ReadCode();
5332 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5333 case TYPE_EXT_QUAL: {
5334 if (Record.size() != 2) {
5335 Error("Incorrect encoding of extended qualifier type");
5338 QualType Base = readType(*Loc.F, Record, Idx);
5339 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5340 return Context.getQualifiedType(Base, Quals);
5343 case TYPE_COMPLEX: {
5344 if (Record.size() != 1) {
5345 Error("Incorrect encoding of complex type");
5348 QualType ElemType = readType(*Loc.F, Record, Idx);
5349 return Context.getComplexType(ElemType);
5352 case TYPE_POINTER: {
5353 if (Record.size() != 1) {
5354 Error("Incorrect encoding of pointer type");
5357 QualType PointeeType = readType(*Loc.F, Record, Idx);
5358 return Context.getPointerType(PointeeType);
5361 case TYPE_DECAYED: {
5362 if (Record.size() != 1) {
5363 Error("Incorrect encoding of decayed type");
5366 QualType OriginalType = readType(*Loc.F, Record, Idx);
5367 QualType DT = Context.getAdjustedParameterType(OriginalType);
5368 if (!isa<DecayedType>(DT))
5369 Error("Decayed type does not decay");
5373 case TYPE_ADJUSTED: {
5374 if (Record.size() != 2) {
5375 Error("Incorrect encoding of adjusted type");
5378 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5379 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5380 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5383 case TYPE_BLOCK_POINTER: {
5384 if (Record.size() != 1) {
5385 Error("Incorrect encoding of block pointer type");
5388 QualType PointeeType = readType(*Loc.F, Record, Idx);
5389 return Context.getBlockPointerType(PointeeType);
5392 case TYPE_LVALUE_REFERENCE: {
5393 if (Record.size() != 2) {
5394 Error("Incorrect encoding of lvalue reference type");
5397 QualType PointeeType = readType(*Loc.F, Record, Idx);
5398 return Context.getLValueReferenceType(PointeeType, Record[1]);
5401 case TYPE_RVALUE_REFERENCE: {
5402 if (Record.size() != 1) {
5403 Error("Incorrect encoding of rvalue reference type");
5406 QualType PointeeType = readType(*Loc.F, Record, Idx);
5407 return Context.getRValueReferenceType(PointeeType);
5410 case TYPE_MEMBER_POINTER: {
5411 if (Record.size() != 2) {
5412 Error("Incorrect encoding of member pointer type");
5415 QualType PointeeType = readType(*Loc.F, Record, Idx);
5416 QualType ClassType = readType(*Loc.F, Record, Idx);
5417 if (PointeeType.isNull() || ClassType.isNull())
5420 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5423 case TYPE_CONSTANT_ARRAY: {
5424 QualType ElementType = readType(*Loc.F, Record, Idx);
5425 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5426 unsigned IndexTypeQuals = Record[2];
5428 llvm::APInt Size = ReadAPInt(Record, Idx);
5429 return Context.getConstantArrayType(ElementType, Size,
5430 ASM, IndexTypeQuals);
5433 case TYPE_INCOMPLETE_ARRAY: {
5434 QualType ElementType = readType(*Loc.F, Record, Idx);
5435 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5436 unsigned IndexTypeQuals = Record[2];
5437 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5440 case TYPE_VARIABLE_ARRAY: {
5441 QualType ElementType = readType(*Loc.F, Record, Idx);
5442 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5443 unsigned IndexTypeQuals = Record[2];
5444 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5445 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5446 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5447 ASM, IndexTypeQuals,
5448 SourceRange(LBLoc, RBLoc));
5452 if (Record.size() != 3) {
5453 Error("incorrect encoding of vector type in AST file");
5457 QualType ElementType = readType(*Loc.F, Record, Idx);
5458 unsigned NumElements = Record[1];
5459 unsigned VecKind = Record[2];
5460 return Context.getVectorType(ElementType, NumElements,
5461 (VectorType::VectorKind)VecKind);
5464 case TYPE_EXT_VECTOR: {
5465 if (Record.size() != 3) {
5466 Error("incorrect encoding of extended vector type in AST file");
5470 QualType ElementType = readType(*Loc.F, Record, Idx);
5471 unsigned NumElements = Record[1];
5472 return Context.getExtVectorType(ElementType, NumElements);
5475 case TYPE_FUNCTION_NO_PROTO: {
5476 if (Record.size() != 6) {
5477 Error("incorrect encoding of no-proto function type");
5480 QualType ResultType = readType(*Loc.F, Record, Idx);
5481 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5482 (CallingConv)Record[4], Record[5]);
5483 return Context.getFunctionNoProtoType(ResultType, Info);
5486 case TYPE_FUNCTION_PROTO: {
5487 QualType ResultType = readType(*Loc.F, Record, Idx);
5489 FunctionProtoType::ExtProtoInfo EPI;
5490 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5491 /*hasregparm*/ Record[2],
5492 /*regparm*/ Record[3],
5493 static_cast<CallingConv>(Record[4]),
5494 /*produces*/ Record[5]);
5498 EPI.Variadic = Record[Idx++];
5499 EPI.HasTrailingReturn = Record[Idx++];
5500 EPI.TypeQuals = Record[Idx++];
5501 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
5502 SmallVector<QualType, 8> ExceptionStorage;
5503 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx);
5505 unsigned NumParams = Record[Idx++];
5506 SmallVector<QualType, 16> ParamTypes;
5507 for (unsigned I = 0; I != NumParams; ++I)
5508 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5510 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos;
5511 if (Idx != Record.size()) {
5512 for (unsigned I = 0; I != NumParams; ++I)
5513 ExtParameterInfos.push_back(
5514 FunctionProtoType::ExtParameterInfo
5515 ::getFromOpaqueValue(Record[Idx++]));
5516 EPI.ExtParameterInfos = ExtParameterInfos.data();
5519 assert(Idx == Record.size());
5521 return Context.getFunctionType(ResultType, ParamTypes, EPI);
5524 case TYPE_UNRESOLVED_USING: {
5526 return Context.getTypeDeclType(
5527 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5530 case TYPE_TYPEDEF: {
5531 if (Record.size() != 2) {
5532 Error("incorrect encoding of typedef type");
5536 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5537 QualType Canonical = readType(*Loc.F, Record, Idx);
5538 if (!Canonical.isNull())
5539 Canonical = Context.getCanonicalType(Canonical);
5540 return Context.getTypedefType(Decl, Canonical);
5543 case TYPE_TYPEOF_EXPR:
5544 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5547 if (Record.size() != 1) {
5548 Error("incorrect encoding of typeof(type) in AST file");
5551 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5552 return Context.getTypeOfType(UnderlyingType);
5555 case TYPE_DECLTYPE: {
5556 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5557 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5560 case TYPE_UNARY_TRANSFORM: {
5561 QualType BaseType = readType(*Loc.F, Record, Idx);
5562 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5563 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5564 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5568 QualType Deduced = readType(*Loc.F, Record, Idx);
5569 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++];
5570 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
5571 return Context.getAutoType(Deduced, Keyword, IsDependent);
5575 if (Record.size() != 2) {
5576 Error("incorrect encoding of record type");
5580 bool IsDependent = Record[Idx++];
5581 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5582 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5583 QualType T = Context.getRecordType(RD);
5584 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5589 if (Record.size() != 2) {
5590 Error("incorrect encoding of enum type");
5594 bool IsDependent = Record[Idx++];
5596 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5597 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5601 case TYPE_ATTRIBUTED: {
5602 if (Record.size() != 3) {
5603 Error("incorrect encoding of attributed type");
5606 QualType modifiedType = readType(*Loc.F, Record, Idx);
5607 QualType equivalentType = readType(*Loc.F, Record, Idx);
5608 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5609 return Context.getAttributedType(kind, modifiedType, equivalentType);
5613 if (Record.size() != 1) {
5614 Error("incorrect encoding of paren type");
5617 QualType InnerType = readType(*Loc.F, Record, Idx);
5618 return Context.getParenType(InnerType);
5621 case TYPE_PACK_EXPANSION: {
5622 if (Record.size() != 2) {
5623 Error("incorrect encoding of pack expansion type");
5626 QualType Pattern = readType(*Loc.F, Record, Idx);
5627 if (Pattern.isNull())
5629 Optional<unsigned> NumExpansions;
5631 NumExpansions = Record[1] - 1;
5632 return Context.getPackExpansionType(Pattern, NumExpansions);
5635 case TYPE_ELABORATED: {
5637 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5638 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5639 QualType NamedType = readType(*Loc.F, Record, Idx);
5640 return Context.getElaboratedType(Keyword, NNS, NamedType);
5643 case TYPE_OBJC_INTERFACE: {
5645 ObjCInterfaceDecl *ItfD
5646 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5647 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5650 case TYPE_OBJC_TYPE_PARAM: {
5652 ObjCTypeParamDecl *Decl
5653 = ReadDeclAs<ObjCTypeParamDecl>(*Loc.F, Record, Idx);
5654 unsigned NumProtos = Record[Idx++];
5655 SmallVector<ObjCProtocolDecl*, 4> Protos;
5656 for (unsigned I = 0; I != NumProtos; ++I)
5657 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5658 return Context.getObjCTypeParamType(Decl, Protos);
5660 case TYPE_OBJC_OBJECT: {
5662 QualType Base = readType(*Loc.F, Record, Idx);
5663 unsigned NumTypeArgs = Record[Idx++];
5664 SmallVector<QualType, 4> TypeArgs;
5665 for (unsigned I = 0; I != NumTypeArgs; ++I)
5666 TypeArgs.push_back(readType(*Loc.F, Record, Idx));
5667 unsigned NumProtos = Record[Idx++];
5668 SmallVector<ObjCProtocolDecl*, 4> Protos;
5669 for (unsigned I = 0; I != NumProtos; ++I)
5670 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5671 bool IsKindOf = Record[Idx++];
5672 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf);
5675 case TYPE_OBJC_OBJECT_POINTER: {
5677 QualType Pointee = readType(*Loc.F, Record, Idx);
5678 return Context.getObjCObjectPointerType(Pointee);
5681 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5683 QualType Parm = readType(*Loc.F, Record, Idx);
5684 QualType Replacement = readType(*Loc.F, Record, Idx);
5685 return Context.getSubstTemplateTypeParmType(
5686 cast<TemplateTypeParmType>(Parm),
5687 Context.getCanonicalType(Replacement));
5690 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5692 QualType Parm = readType(*Loc.F, Record, Idx);
5693 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5694 return Context.getSubstTemplateTypeParmPackType(
5695 cast<TemplateTypeParmType>(Parm),
5699 case TYPE_INJECTED_CLASS_NAME: {
5700 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5701 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5702 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5703 // for AST reading, too much interdependencies.
5704 const Type *T = nullptr;
5705 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) {
5706 if (const Type *Existing = DI->getTypeForDecl()) {
5712 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5713 for (auto *DI = D; DI; DI = DI->getPreviousDecl())
5714 DI->setTypeForDecl(T);
5716 return QualType(T, 0);
5719 case TYPE_TEMPLATE_TYPE_PARM: {
5721 unsigned Depth = Record[Idx++];
5722 unsigned Index = Record[Idx++];
5723 bool Pack = Record[Idx++];
5724 TemplateTypeParmDecl *D
5725 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5726 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5729 case TYPE_DEPENDENT_NAME: {
5731 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5732 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5733 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
5734 QualType Canon = readType(*Loc.F, Record, Idx);
5735 if (!Canon.isNull())
5736 Canon = Context.getCanonicalType(Canon);
5737 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5740 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5742 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5743 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5744 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx);
5745 unsigned NumArgs = Record[Idx++];
5746 SmallVector<TemplateArgument, 8> Args;
5747 Args.reserve(NumArgs);
5749 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5750 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5754 case TYPE_DEPENDENT_SIZED_ARRAY: {
5758 QualType ElementType = readType(*Loc.F, Record, Idx);
5759 ArrayType::ArraySizeModifier ASM
5760 = (ArrayType::ArraySizeModifier)Record[Idx++];
5761 unsigned IndexTypeQuals = Record[Idx++];
5763 // DependentSizedArrayType
5764 Expr *NumElts = ReadExpr(*Loc.F);
5765 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5767 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5768 IndexTypeQuals, Brackets);
5771 case TYPE_TEMPLATE_SPECIALIZATION: {
5773 bool IsDependent = Record[Idx++];
5774 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5775 SmallVector<TemplateArgument, 8> Args;
5776 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5777 QualType Underlying = readType(*Loc.F, Record, Idx);
5779 if (Underlying.isNull())
5780 T = Context.getCanonicalTemplateSpecializationType(Name, Args);
5782 T = Context.getTemplateSpecializationType(Name, Args, Underlying);
5783 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5788 if (Record.size() != 1) {
5789 Error("Incorrect encoding of atomic type");
5792 QualType ValueType = readType(*Loc.F, Record, Idx);
5793 return Context.getAtomicType(ValueType);
5797 if (Record.size() != 2) {
5798 Error("Incorrect encoding of pipe type");
5802 // Reading the pipe element type.
5803 QualType ElementType = readType(*Loc.F, Record, Idx);
5804 unsigned ReadOnly = Record[1];
5805 return Context.getPipeType(ElementType, ReadOnly);
5809 llvm_unreachable("Invalid TypeCode!");
5812 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5813 SmallVectorImpl<QualType> &Exceptions,
5814 FunctionProtoType::ExceptionSpecInfo &ESI,
5815 const RecordData &Record, unsigned &Idx) {
5816 ExceptionSpecificationType EST =
5817 static_cast<ExceptionSpecificationType>(Record[Idx++]);
5819 if (EST == EST_Dynamic) {
5820 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I)
5821 Exceptions.push_back(readType(ModuleFile, Record, Idx));
5822 ESI.Exceptions = Exceptions;
5823 } else if (EST == EST_ComputedNoexcept) {
5824 ESI.NoexceptExpr = ReadExpr(ModuleFile);
5825 } else if (EST == EST_Uninstantiated) {
5826 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5827 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5828 } else if (EST == EST_Unevaluated) {
5829 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5833 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5836 const ASTReader::RecordData &Record;
5839 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5841 return Reader.ReadSourceLocation(F, R, I);
5844 template<typename T>
5845 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5846 return Reader.ReadDeclAs<T>(F, Record, Idx);
5850 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5851 const ASTReader::RecordData &Record, unsigned &Idx)
5852 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5855 // We want compile-time assurance that we've enumerated all of
5856 // these, so unfortunately we have to declare them first, then
5857 // define them out-of-line.
5858 #define ABSTRACT_TYPELOC(CLASS, PARENT)
5859 #define TYPELOC(CLASS, PARENT) \
5860 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5861 #include "clang/AST/TypeLocNodes.def"
5863 void VisitFunctionTypeLoc(FunctionTypeLoc);
5864 void VisitArrayTypeLoc(ArrayTypeLoc);
5867 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5871 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5872 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5873 if (TL.needsExtraLocalData()) {
5874 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5875 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5876 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5877 TL.setModeAttr(Record[Idx++]);
5881 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5882 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5885 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5886 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5889 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5893 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5897 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5898 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5901 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5902 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5905 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5906 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5909 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5910 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5911 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5914 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5915 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5916 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5918 TL.setSizeExpr(Reader.ReadExpr(F));
5920 TL.setSizeExpr(nullptr);
5923 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5924 VisitArrayTypeLoc(TL);
5927 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5928 VisitArrayTypeLoc(TL);
5931 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5932 VisitArrayTypeLoc(TL);
5935 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5936 DependentSizedArrayTypeLoc TL) {
5937 VisitArrayTypeLoc(TL);
5940 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5941 DependentSizedExtVectorTypeLoc TL) {
5942 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5945 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5946 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5949 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5950 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5953 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5954 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5955 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5956 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5957 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
5958 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5959 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
5963 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5964 VisitFunctionTypeLoc(TL);
5967 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5968 VisitFunctionTypeLoc(TL);
5970 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5971 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5973 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5974 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5976 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5977 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5978 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5979 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5981 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5982 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5983 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5984 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5985 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5987 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5988 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5991 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5992 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5993 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5994 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5995 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5998 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5999 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6002 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
6003 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6006 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
6007 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6010 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
6011 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
6012 if (TL.hasAttrOperand()) {
6014 range.setBegin(ReadSourceLocation(Record, Idx));
6015 range.setEnd(ReadSourceLocation(Record, Idx));
6016 TL.setAttrOperandParensRange(range);
6018 if (TL.hasAttrExprOperand()) {
6020 TL.setAttrExprOperand(Reader.ReadExpr(F));
6022 TL.setAttrExprOperand(nullptr);
6023 } else if (TL.hasAttrEnumOperand())
6024 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
6027 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
6028 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6031 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
6032 SubstTemplateTypeParmTypeLoc TL) {
6033 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6035 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
6036 SubstTemplateTypeParmPackTypeLoc TL) {
6037 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6039 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
6040 TemplateSpecializationTypeLoc TL) {
6041 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
6042 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
6043 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
6044 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
6045 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
6047 Reader.GetTemplateArgumentLocInfo(F,
6048 TL.getTypePtr()->getArg(i).getKind(),
6051 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
6052 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
6053 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
6056 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
6057 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
6058 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
6061 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
6062 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6065 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
6066 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
6067 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
6068 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6071 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
6072 DependentTemplateSpecializationTypeLoc TL) {
6073 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
6074 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
6075 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
6076 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
6077 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
6078 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
6079 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
6081 Reader.GetTemplateArgumentLocInfo(F,
6082 TL.getTypePtr()->getArg(I).getKind(),
6086 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
6087 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
6090 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
6091 TL.setNameLoc(ReadSourceLocation(Record, Idx));
6094 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
6095 if (TL.getNumProtocols()) {
6096 TL.setProtocolLAngleLoc(ReadSourceLocation(Record, Idx));
6097 TL.setProtocolRAngleLoc(ReadSourceLocation(Record, Idx));
6099 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6100 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
6103 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
6104 TL.setHasBaseTypeAsWritten(Record[Idx++]);
6105 TL.setTypeArgsLAngleLoc(ReadSourceLocation(Record, Idx));
6106 TL.setTypeArgsRAngleLoc(ReadSourceLocation(Record, Idx));
6107 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i)
6108 TL.setTypeArgTInfo(i, Reader.GetTypeSourceInfo(F, Record, Idx));
6109 TL.setProtocolLAngleLoc(ReadSourceLocation(Record, Idx));
6110 TL.setProtocolRAngleLoc(ReadSourceLocation(Record, Idx));
6111 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
6112 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
6115 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
6116 TL.setStarLoc(ReadSourceLocation(Record, Idx));
6119 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
6120 TL.setKWLoc(ReadSourceLocation(Record, Idx));
6121 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
6122 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
6125 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
6126 TL.setKWLoc(ReadSourceLocation(Record, Idx));
6129 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
6130 const RecordData &Record,
6132 QualType InfoTy = readType(F, Record, Idx);
6133 if (InfoTy.isNull())
6136 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
6137 TypeLocReader TLR(*this, F, Record, Idx);
6138 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
6143 QualType ASTReader::GetType(TypeID ID) {
6144 unsigned FastQuals = ID & Qualifiers::FastMask;
6145 unsigned Index = ID >> Qualifiers::FastWidth;
6147 if (Index < NUM_PREDEF_TYPE_IDS) {
6149 switch ((PredefinedTypeIDs)Index) {
6150 case PREDEF_TYPE_NULL_ID:
6152 case PREDEF_TYPE_VOID_ID:
6155 case PREDEF_TYPE_BOOL_ID:
6159 case PREDEF_TYPE_CHAR_U_ID:
6160 case PREDEF_TYPE_CHAR_S_ID:
6161 // FIXME: Check that the signedness of CharTy is correct!
6165 case PREDEF_TYPE_UCHAR_ID:
6166 T = Context.UnsignedCharTy;
6168 case PREDEF_TYPE_USHORT_ID:
6169 T = Context.UnsignedShortTy;
6171 case PREDEF_TYPE_UINT_ID:
6172 T = Context.UnsignedIntTy;
6174 case PREDEF_TYPE_ULONG_ID:
6175 T = Context.UnsignedLongTy;
6177 case PREDEF_TYPE_ULONGLONG_ID:
6178 T = Context.UnsignedLongLongTy;
6180 case PREDEF_TYPE_UINT128_ID:
6181 T = Context.UnsignedInt128Ty;
6183 case PREDEF_TYPE_SCHAR_ID:
6184 T = Context.SignedCharTy;
6186 case PREDEF_TYPE_WCHAR_ID:
6187 T = Context.WCharTy;
6189 case PREDEF_TYPE_SHORT_ID:
6190 T = Context.ShortTy;
6192 case PREDEF_TYPE_INT_ID:
6195 case PREDEF_TYPE_LONG_ID:
6198 case PREDEF_TYPE_LONGLONG_ID:
6199 T = Context.LongLongTy;
6201 case PREDEF_TYPE_INT128_ID:
6202 T = Context.Int128Ty;
6204 case PREDEF_TYPE_HALF_ID:
6207 case PREDEF_TYPE_FLOAT_ID:
6208 T = Context.FloatTy;
6210 case PREDEF_TYPE_DOUBLE_ID:
6211 T = Context.DoubleTy;
6213 case PREDEF_TYPE_LONGDOUBLE_ID:
6214 T = Context.LongDoubleTy;
6216 case PREDEF_TYPE_FLOAT128_ID:
6217 T = Context.Float128Ty;
6219 case PREDEF_TYPE_OVERLOAD_ID:
6220 T = Context.OverloadTy;
6222 case PREDEF_TYPE_BOUND_MEMBER:
6223 T = Context.BoundMemberTy;
6225 case PREDEF_TYPE_PSEUDO_OBJECT:
6226 T = Context.PseudoObjectTy;
6228 case PREDEF_TYPE_DEPENDENT_ID:
6229 T = Context.DependentTy;
6231 case PREDEF_TYPE_UNKNOWN_ANY:
6232 T = Context.UnknownAnyTy;
6234 case PREDEF_TYPE_NULLPTR_ID:
6235 T = Context.NullPtrTy;
6237 case PREDEF_TYPE_CHAR16_ID:
6238 T = Context.Char16Ty;
6240 case PREDEF_TYPE_CHAR32_ID:
6241 T = Context.Char32Ty;
6243 case PREDEF_TYPE_OBJC_ID:
6244 T = Context.ObjCBuiltinIdTy;
6246 case PREDEF_TYPE_OBJC_CLASS:
6247 T = Context.ObjCBuiltinClassTy;
6249 case PREDEF_TYPE_OBJC_SEL:
6250 T = Context.ObjCBuiltinSelTy;
6252 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6253 case PREDEF_TYPE_##Id##_ID: \
6254 T = Context.SingletonId; \
6256 #include "clang/Basic/OpenCLImageTypes.def"
6257 case PREDEF_TYPE_SAMPLER_ID:
6258 T = Context.OCLSamplerTy;
6260 case PREDEF_TYPE_EVENT_ID:
6261 T = Context.OCLEventTy;
6263 case PREDEF_TYPE_CLK_EVENT_ID:
6264 T = Context.OCLClkEventTy;
6266 case PREDEF_TYPE_QUEUE_ID:
6267 T = Context.OCLQueueTy;
6269 case PREDEF_TYPE_NDRANGE_ID:
6270 T = Context.OCLNDRangeTy;
6272 case PREDEF_TYPE_RESERVE_ID_ID:
6273 T = Context.OCLReserveIDTy;
6275 case PREDEF_TYPE_AUTO_DEDUCT:
6276 T = Context.getAutoDeductType();
6279 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
6280 T = Context.getAutoRRefDeductType();
6283 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
6284 T = Context.ARCUnbridgedCastTy;
6287 case PREDEF_TYPE_BUILTIN_FN:
6288 T = Context.BuiltinFnTy;
6291 case PREDEF_TYPE_OMP_ARRAY_SECTION:
6292 T = Context.OMPArraySectionTy;
6296 assert(!T.isNull() && "Unknown predefined type");
6297 return T.withFastQualifiers(FastQuals);
6300 Index -= NUM_PREDEF_TYPE_IDS;
6301 assert(Index < TypesLoaded.size() && "Type index out-of-range");
6302 if (TypesLoaded[Index].isNull()) {
6303 TypesLoaded[Index] = readTypeRecord(Index);
6304 if (TypesLoaded[Index].isNull())
6307 TypesLoaded[Index]->setFromAST();
6308 if (DeserializationListener)
6309 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
6310 TypesLoaded[Index]);
6313 return TypesLoaded[Index].withFastQualifiers(FastQuals);
6316 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
6317 return GetType(getGlobalTypeID(F, LocalID));
6320 serialization::TypeID
6321 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
6322 unsigned FastQuals = LocalID & Qualifiers::FastMask;
6323 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
6325 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
6328 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6329 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
6330 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
6332 unsigned GlobalIndex = LocalIndex + I->second;
6333 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
6336 TemplateArgumentLocInfo
6337 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
6338 TemplateArgument::ArgKind Kind,
6339 const RecordData &Record,
6342 case TemplateArgument::Expression:
6344 case TemplateArgument::Type:
6345 return GetTypeSourceInfo(F, Record, Index);
6346 case TemplateArgument::Template: {
6347 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6349 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6350 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6353 case TemplateArgument::TemplateExpansion: {
6354 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
6356 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
6357 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
6358 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
6361 case TemplateArgument::Null:
6362 case TemplateArgument::Integral:
6363 case TemplateArgument::Declaration:
6364 case TemplateArgument::NullPtr:
6365 case TemplateArgument::Pack:
6366 // FIXME: Is this right?
6367 return TemplateArgumentLocInfo();
6369 llvm_unreachable("unexpected template argument loc");
6373 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
6374 const RecordData &Record, unsigned &Index) {
6375 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
6377 if (Arg.getKind() == TemplateArgument::Expression) {
6378 if (Record[Index++]) // bool InfoHasSameExpr.
6379 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
6381 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
6385 const ASTTemplateArgumentListInfo*
6386 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
6387 const RecordData &Record,
6389 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
6390 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
6391 unsigned NumArgsAsWritten = Record[Index++];
6392 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
6393 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
6394 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
6395 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
6398 Decl *ASTReader::GetExternalDecl(uint32_t ID) {
6402 template<typename TemplateSpecializationDecl>
6403 static void completeRedeclChainForTemplateSpecialization(Decl *D) {
6404 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D))
6405 TSD->getSpecializedTemplate()->LoadLazySpecializations();
6408 void ASTReader::CompleteRedeclChain(const Decl *D) {
6409 if (NumCurrentElementsDeserializing) {
6410 // We arrange to not care about the complete redeclaration chain while we're
6411 // deserializing. Just remember that the AST has marked this one as complete
6412 // but that it's not actually complete yet, so we know we still need to
6413 // complete it later.
6414 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
6418 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
6420 // If this is a named declaration, complete it by looking it up
6421 // within its context.
6423 // FIXME: Merging a function definition should merge
6424 // all mergeable entities within it.
6425 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
6426 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
6427 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
6428 if (!getContext().getLangOpts().CPlusPlus &&
6429 isa<TranslationUnitDecl>(DC)) {
6430 // Outside of C++, we don't have a lookup table for the TU, so update
6431 // the identifier instead. (For C++ modules, we don't store decls
6432 // in the serialized identifier table, so we do the lookup in the TU.)
6433 auto *II = Name.getAsIdentifierInfo();
6434 assert(II && "non-identifier name in C?");
6435 if (II->isOutOfDate())
6436 updateOutOfDateIdentifier(*II);
6439 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) {
6440 // Find all declarations of this kind from the relevant context.
6441 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) {
6442 auto *DC = cast<DeclContext>(DCDecl);
6443 SmallVector<Decl*, 8> Decls;
6444 FindExternalLexicalDecls(
6445 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls);
6450 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
6451 CTSD->getSpecializedTemplate()->LoadLazySpecializations();
6452 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
6453 VTSD->getSpecializedTemplate()->LoadLazySpecializations();
6454 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6455 if (auto *Template = FD->getPrimaryTemplate())
6456 Template->LoadLazySpecializations();
6460 CXXCtorInitializer **
6461 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) {
6462 RecordLocation Loc = getLocalBitOffset(Offset);
6463 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6464 SavedStreamPosition SavedPosition(Cursor);
6465 Cursor.JumpToBit(Loc.Offset);
6466 ReadingKindTracker ReadingKind(Read_Decl, *this);
6469 unsigned Code = Cursor.ReadCode();
6470 unsigned RecCode = Cursor.readRecord(Code, Record);
6471 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) {
6472 Error("malformed AST file: missing C++ ctor initializers");
6477 return ReadCXXCtorInitializers(*Loc.F, Record, Idx);
6480 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6481 RecordLocation Loc = getLocalBitOffset(Offset);
6482 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6483 SavedStreamPosition SavedPosition(Cursor);
6484 Cursor.JumpToBit(Loc.Offset);
6485 ReadingKindTracker ReadingKind(Read_Decl, *this);
6487 unsigned Code = Cursor.ReadCode();
6488 unsigned RecCode = Cursor.readRecord(Code, Record);
6489 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
6490 Error("malformed AST file: missing C++ base specifiers");
6495 unsigned NumBases = Record[Idx++];
6496 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6497 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6498 for (unsigned I = 0; I != NumBases; ++I)
6499 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6503 serialization::DeclID
6504 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6505 if (LocalID < NUM_PREDEF_DECL_IDS)
6508 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6509 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6510 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6512 return LocalID + I->second;
6515 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6516 ModuleFile &M) const {
6517 // Predefined decls aren't from any module.
6518 if (ID < NUM_PREDEF_DECL_IDS)
6521 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID &&
6522 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls;
6525 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
6526 if (!D->isFromASTFile())
6528 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6529 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6533 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6534 if (ID < NUM_PREDEF_DECL_IDS)
6535 return SourceLocation();
6537 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6539 if (Index > DeclsLoaded.size()) {
6540 Error("declaration ID out-of-range for AST file");
6541 return SourceLocation();
6544 if (Decl *D = DeclsLoaded[Index])
6545 return D->getLocation();
6548 DeclCursorForID(ID, Loc);
6552 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
6554 case PREDEF_DECL_NULL_ID:
6557 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6558 return Context.getTranslationUnitDecl();
6560 case PREDEF_DECL_OBJC_ID_ID:
6561 return Context.getObjCIdDecl();
6563 case PREDEF_DECL_OBJC_SEL_ID:
6564 return Context.getObjCSelDecl();
6566 case PREDEF_DECL_OBJC_CLASS_ID:
6567 return Context.getObjCClassDecl();
6569 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6570 return Context.getObjCProtocolDecl();
6572 case PREDEF_DECL_INT_128_ID:
6573 return Context.getInt128Decl();
6575 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6576 return Context.getUInt128Decl();
6578 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6579 return Context.getObjCInstanceTypeDecl();
6581 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6582 return Context.getBuiltinVaListDecl();
6584 case PREDEF_DECL_VA_LIST_TAG:
6585 return Context.getVaListTagDecl();
6587 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
6588 return Context.getBuiltinMSVaListDecl();
6590 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
6591 return Context.getExternCContextDecl();
6593 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
6594 return Context.getMakeIntegerSeqDecl();
6596 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
6597 return Context.getCFConstantStringDecl();
6599 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
6600 return Context.getCFConstantStringTagDecl();
6602 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
6603 return Context.getTypePackElementDecl();
6605 llvm_unreachable("PredefinedDeclIDs unknown enum value");
6608 Decl *ASTReader::GetExistingDecl(DeclID ID) {
6609 if (ID < NUM_PREDEF_DECL_IDS) {
6610 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID);
6612 // Track that we have merged the declaration with ID \p ID into the
6613 // pre-existing predefined declaration \p D.
6614 auto &Merged = KeyDecls[D->getCanonicalDecl()];
6616 Merged.push_back(ID);
6621 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6623 if (Index >= DeclsLoaded.size()) {
6624 assert(0 && "declaration ID out-of-range for AST file");
6625 Error("declaration ID out-of-range for AST file");
6629 return DeclsLoaded[Index];
6632 Decl *ASTReader::GetDecl(DeclID ID) {
6633 if (ID < NUM_PREDEF_DECL_IDS)
6634 return GetExistingDecl(ID);
6636 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6638 if (Index >= DeclsLoaded.size()) {
6639 assert(0 && "declaration ID out-of-range for AST file");
6640 Error("declaration ID out-of-range for AST file");
6644 if (!DeclsLoaded[Index]) {
6646 if (DeserializationListener)
6647 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6650 return DeclsLoaded[Index];
6653 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6655 if (GlobalID < NUM_PREDEF_DECL_IDS)
6658 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6659 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6660 ModuleFile *Owner = I->second;
6662 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6663 = M.GlobalToLocalDeclIDs.find(Owner);
6664 if (Pos == M.GlobalToLocalDeclIDs.end())
6667 return GlobalID - Owner->BaseDeclID + Pos->second;
6670 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6671 const RecordData &Record,
6673 if (Idx >= Record.size()) {
6674 Error("Corrupted AST file");
6678 return getGlobalDeclID(F, Record[Idx++]);
6681 /// \brief Resolve the offset of a statement into a statement.
6683 /// This operation will read a new statement from the external
6684 /// source each time it is called, and is meant to be used via a
6685 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6686 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6687 // Switch case IDs are per Decl.
6688 ClearSwitchCaseIDs();
6690 // Offset here is a global offset across the entire chain.
6691 RecordLocation Loc = getLocalBitOffset(Offset);
6692 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6693 return ReadStmtFromStream(*Loc.F);
6696 void ASTReader::FindExternalLexicalDecls(
6697 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
6698 SmallVectorImpl<Decl *> &Decls) {
6699 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {};
6701 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) {
6702 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries");
6703 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
6704 auto K = (Decl::Kind)+LexicalDecls[I];
6705 if (!IsKindWeWant(K))
6708 auto ID = (serialization::DeclID)+LexicalDecls[I + 1];
6710 // Don't add predefined declarations to the lexical context more
6712 if (ID < NUM_PREDEF_DECL_IDS) {
6713 if (PredefsVisited[ID])
6716 PredefsVisited[ID] = true;
6719 if (Decl *D = GetLocalDecl(*M, ID)) {
6720 assert(D->getKind() == K && "wrong kind for lexical decl");
6721 if (!DC->isDeclInLexicalTraversal(D))
6727 if (isa<TranslationUnitDecl>(DC)) {
6728 for (auto Lexical : TULexicalDecls)
6729 Visit(Lexical.first, Lexical.second);
6731 auto I = LexicalDecls.find(DC);
6732 if (I != LexicalDecls.end())
6733 Visit(I->second.first, I->second.second);
6736 ++NumLexicalDeclContextsRead;
6746 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6748 bool operator()(LocalDeclID L, LocalDeclID R) const {
6749 SourceLocation LHS = getLocation(L);
6750 SourceLocation RHS = getLocation(R);
6751 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6754 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6755 SourceLocation RHS = getLocation(R);
6756 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6759 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6760 SourceLocation LHS = getLocation(L);
6761 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6764 SourceLocation getLocation(LocalDeclID ID) const {
6765 return Reader.getSourceManager().getFileLoc(
6766 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6770 } // end anonymous namespace
6772 void ASTReader::FindFileRegionDecls(FileID File,
6773 unsigned Offset, unsigned Length,
6774 SmallVectorImpl<Decl *> &Decls) {
6775 SourceManager &SM = getSourceManager();
6777 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6778 if (I == FileDeclIDs.end())
6781 FileDeclsInfo &DInfo = I->second;
6782 if (DInfo.Decls.empty())
6786 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6787 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6789 DeclIDComp DIDComp(*this, *DInfo.Mod);
6790 ArrayRef<serialization::LocalDeclID>::iterator
6791 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6793 if (BeginIt != DInfo.Decls.begin())
6796 // If we are pointing at a top-level decl inside an objc container, we need
6797 // to backtrack until we find it otherwise we will fail to report that the
6798 // region overlaps with an objc container.
6799 while (BeginIt != DInfo.Decls.begin() &&
6800 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6801 ->isTopLevelDeclInObjCContainer())
6804 ArrayRef<serialization::LocalDeclID>::iterator
6805 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6807 if (EndIt != DInfo.Decls.end())
6810 for (ArrayRef<serialization::LocalDeclID>::iterator
6811 DIt = BeginIt; DIt != EndIt; ++DIt)
6812 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6816 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6817 DeclarationName Name) {
6818 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() &&
6819 "DeclContext has no visible decls in storage");
6823 auto It = Lookups.find(DC);
6824 if (It == Lookups.end())
6827 Deserializing LookupResults(this);
6829 // Load the list of declarations.
6830 SmallVector<NamedDecl *, 64> Decls;
6831 for (DeclID ID : It->second.Table.find(Name)) {
6832 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
6833 if (ND->getDeclName() == Name)
6834 Decls.push_back(ND);
6837 ++NumVisibleDeclContextsRead;
6838 SetExternalVisibleDeclsForName(DC, Name, Decls);
6839 return !Decls.empty();
6842 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6843 if (!DC->hasExternalVisibleStorage())
6846 auto It = Lookups.find(DC);
6847 assert(It != Lookups.end() &&
6848 "have external visible storage but no lookup tables");
6852 for (DeclID ID : It->second.Table.findAll()) {
6853 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID));
6854 Decls[ND->getDeclName()].push_back(ND);
6857 ++NumVisibleDeclContextsRead;
6859 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
6860 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6862 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6865 const serialization::reader::DeclContextLookupTable *
6866 ASTReader::getLoadedLookupTables(DeclContext *Primary) const {
6867 auto I = Lookups.find(Primary);
6868 return I == Lookups.end() ? nullptr : &I->second;
6871 /// \brief Under non-PCH compilation the consumer receives the objc methods
6872 /// before receiving the implementation, and codegen depends on this.
6873 /// We simulate this by deserializing and passing to consumer the methods of the
6874 /// implementation before passing the deserialized implementation decl.
6875 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6876 ASTConsumer *Consumer) {
6877 assert(ImplD && Consumer);
6879 for (auto *I : ImplD->methods())
6880 Consumer->HandleInterestingDecl(DeclGroupRef(I));
6882 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6885 void ASTReader::PassInterestingDeclsToConsumer() {
6888 if (PassingDeclsToConsumer)
6891 // Guard variable to avoid recursively redoing the process of passing
6892 // decls to consumer.
6893 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6896 // Ensure that we've loaded all potentially-interesting declarations
6897 // that need to be eagerly loaded.
6898 for (auto ID : EagerlyDeserializedDecls)
6900 EagerlyDeserializedDecls.clear();
6902 while (!InterestingDecls.empty()) {
6903 Decl *D = InterestingDecls.front();
6904 InterestingDecls.pop_front();
6906 PassInterestingDeclToConsumer(D);
6910 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6911 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6912 PassObjCImplDeclToConsumer(ImplD, Consumer);
6914 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6917 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6918 this->Consumer = Consumer;
6921 PassInterestingDeclsToConsumer();
6923 if (DeserializationListener)
6924 DeserializationListener->ReaderInitialized(this);
6927 void ASTReader::PrintStats() {
6928 std::fprintf(stderr, "*** AST File Statistics:\n");
6930 unsigned NumTypesLoaded
6931 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6933 unsigned NumDeclsLoaded
6934 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
6936 unsigned NumIdentifiersLoaded
6937 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6938 IdentifiersLoaded.end(),
6939 (IdentifierInfo *)nullptr);
6940 unsigned NumMacrosLoaded
6941 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6943 (MacroInfo *)nullptr);
6944 unsigned NumSelectorsLoaded
6945 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6946 SelectorsLoaded.end(),
6949 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6950 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6951 NumSLocEntriesRead, TotalNumSLocEntries,
6952 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6953 if (!TypesLoaded.empty())
6954 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6955 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6956 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6957 if (!DeclsLoaded.empty())
6958 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6959 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6960 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6961 if (!IdentifiersLoaded.empty())
6962 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6963 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6964 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6965 if (!MacrosLoaded.empty())
6966 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6967 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6968 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6969 if (!SelectorsLoaded.empty())
6970 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6971 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6972 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6973 if (TotalNumStatements)
6974 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6975 NumStatementsRead, TotalNumStatements,
6976 ((float)NumStatementsRead/TotalNumStatements * 100));
6978 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6979 NumMacrosRead, TotalNumMacros,
6980 ((float)NumMacrosRead/TotalNumMacros * 100));
6981 if (TotalLexicalDeclContexts)
6982 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6983 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6984 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6986 if (TotalVisibleDeclContexts)
6987 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6988 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6989 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6991 if (TotalNumMethodPoolEntries) {
6992 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6993 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6994 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6997 if (NumMethodPoolLookups) {
6998 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6999 NumMethodPoolHits, NumMethodPoolLookups,
7000 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
7002 if (NumMethodPoolTableLookups) {
7003 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
7004 NumMethodPoolTableHits, NumMethodPoolTableLookups,
7005 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
7009 if (NumIdentifierLookupHits) {
7010 std::fprintf(stderr,
7011 " %u / %u identifier table lookups succeeded (%f%%)\n",
7012 NumIdentifierLookupHits, NumIdentifierLookups,
7013 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
7017 std::fprintf(stderr, "\n");
7018 GlobalIndex->printStats();
7021 std::fprintf(stderr, "\n");
7023 std::fprintf(stderr, "\n");
7026 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
7028 dumpModuleIDMap(StringRef Name,
7029 const ContinuousRangeMap<Key, ModuleFile *,
7030 InitialCapacity> &Map) {
7031 if (Map.begin() == Map.end())
7034 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
7035 llvm::errs() << Name << ":\n";
7036 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
7038 llvm::errs() << " " << I->first << " -> " << I->second->FileName
7043 LLVM_DUMP_METHOD void ASTReader::dump() {
7044 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
7045 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
7046 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
7047 dumpModuleIDMap("Global type map", GlobalTypeMap);
7048 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
7049 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
7050 dumpModuleIDMap("Global macro map", GlobalMacroMap);
7051 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
7052 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
7053 dumpModuleIDMap("Global preprocessed entity map",
7054 GlobalPreprocessedEntityMap);
7056 llvm::errs() << "\n*** PCH/Modules Loaded:";
7057 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
7058 MEnd = ModuleMgr.end();
7063 /// Return the amount of memory used by memory buffers, breaking down
7064 /// by heap-backed versus mmap'ed memory.
7065 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
7066 for (ModuleConstIterator I = ModuleMgr.begin(),
7067 E = ModuleMgr.end(); I != E; ++I) {
7068 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
7069 size_t bytes = buf->getBufferSize();
7070 switch (buf->getBufferKind()) {
7071 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
7072 sizes.malloc_bytes += bytes;
7074 case llvm::MemoryBuffer::MemoryBuffer_MMap:
7075 sizes.mmap_bytes += bytes;
7082 void ASTReader::InitializeSema(Sema &S) {
7084 S.addExternalSource(this);
7086 // Makes sure any declarations that were deserialized "too early"
7087 // still get added to the identifier's declaration chains.
7088 for (uint64_t ID : PreloadedDeclIDs) {
7089 NamedDecl *D = cast<NamedDecl>(GetDecl(ID));
7090 pushExternalDeclIntoScope(D, D->getDeclName());
7092 PreloadedDeclIDs.clear();
7094 // FIXME: What happens if these are changed by a module import?
7095 if (!FPPragmaOptions.empty()) {
7096 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
7097 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
7100 // FIXME: What happens if these are changed by a module import?
7101 if (!OpenCLExtensions.empty()) {
7103 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
7104 #include "clang/Basic/OpenCLExtensions.def"
7106 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
7112 void ASTReader::UpdateSema() {
7113 assert(SemaObj && "no Sema to update");
7115 // Load the offsets of the declarations that Sema references.
7116 // They will be lazily deserialized when needed.
7117 if (!SemaDeclRefs.empty()) {
7118 assert(SemaDeclRefs.size() % 3 == 0);
7119 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
7120 if (!SemaObj->StdNamespace)
7121 SemaObj->StdNamespace = SemaDeclRefs[I];
7122 if (!SemaObj->StdBadAlloc)
7123 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
7124 if (!SemaObj->StdAlignValT)
7125 SemaObj->StdAlignValT = SemaDeclRefs[I+2];
7127 SemaDeclRefs.clear();
7130 // Update the state of pragmas. Use the same API as if we had encountered the
7131 // pragma in the source.
7132 if(OptimizeOffPragmaLocation.isValid())
7133 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
7134 if (PragmaMSStructState != -1)
7135 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState);
7136 if (PointersToMembersPragmaLocation.isValid()) {
7137 SemaObj->ActOnPragmaMSPointersToMembers(
7138 (LangOptions::PragmaMSPointersToMembersKind)
7139 PragmaMSPointersToMembersState,
7140 PointersToMembersPragmaLocation);
7142 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth;
7145 IdentifierInfo *ASTReader::get(StringRef Name) {
7146 // Note that we are loading an identifier.
7147 Deserializing AnIdentifier(this);
7149 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
7150 NumIdentifierLookups,
7151 NumIdentifierLookupHits);
7153 // We don't need to do identifier table lookups in C++ modules (we preload
7154 // all interesting declarations, and don't need to use the scope for name
7155 // lookups). Perform the lookup in PCH files, though, since we don't build
7156 // a complete initial identifier table if we're carrying on from a PCH.
7157 if (Context.getLangOpts().CPlusPlus) {
7158 for (auto F : ModuleMgr.pch_modules())
7162 // If there is a global index, look there first to determine which modules
7163 // provably do not have any results for this identifier.
7164 GlobalModuleIndex::HitSet Hits;
7165 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
7166 if (!loadGlobalIndex()) {
7167 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
7172 ModuleMgr.visit(Visitor, HitsPtr);
7175 IdentifierInfo *II = Visitor.getIdentifierInfo();
7176 markIdentifierUpToDate(II);
7182 /// \brief An identifier-lookup iterator that enumerates all of the
7183 /// identifiers stored within a set of AST files.
7184 class ASTIdentifierIterator : public IdentifierIterator {
7185 /// \brief The AST reader whose identifiers are being enumerated.
7186 const ASTReader &Reader;
7188 /// \brief The current index into the chain of AST files stored in
7192 /// \brief The current position within the identifier lookup table
7193 /// of the current AST file.
7194 ASTIdentifierLookupTable::key_iterator Current;
7196 /// \brief The end position within the identifier lookup table of
7197 /// the current AST file.
7198 ASTIdentifierLookupTable::key_iterator End;
7200 /// \brief Whether to skip any modules in the ASTReader.
7204 explicit ASTIdentifierIterator(const ASTReader &Reader,
7205 bool SkipModules = false);
7207 StringRef Next() override;
7210 } // end namespace clang
7212 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader,
7214 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
7217 StringRef ASTIdentifierIterator::Next() {
7218 while (Current == End) {
7219 // If we have exhausted all of our AST files, we're done.
7224 ModuleFile &F = Reader.ModuleMgr[Index];
7225 if (SkipModules && F.isModule())
7228 ASTIdentifierLookupTable *IdTable =
7229 (ASTIdentifierLookupTable *)F.IdentifierLookupTable;
7230 Current = IdTable->key_begin();
7231 End = IdTable->key_end();
7234 // We have any identifiers remaining in the current AST file; return
7236 StringRef Result = *Current;
7243 /// A utility for appending two IdentifierIterators.
7244 class ChainedIdentifierIterator : public IdentifierIterator {
7245 std::unique_ptr<IdentifierIterator> Current;
7246 std::unique_ptr<IdentifierIterator> Queued;
7249 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First,
7250 std::unique_ptr<IdentifierIterator> Second)
7251 : Current(std::move(First)), Queued(std::move(Second)) {}
7253 StringRef Next() override {
7257 StringRef result = Current->Next();
7258 if (!result.empty())
7261 // Try the queued iterator, which may itself be empty.
7263 std::swap(Current, Queued);
7268 } // end anonymous namespace.
7270 IdentifierIterator *ASTReader::getIdentifiers() {
7271 if (!loadGlobalIndex()) {
7272 std::unique_ptr<IdentifierIterator> ReaderIter(
7273 new ASTIdentifierIterator(*this, /*SkipModules=*/true));
7274 std::unique_ptr<IdentifierIterator> ModulesIter(
7275 GlobalIndex->createIdentifierIterator());
7276 return new ChainedIdentifierIterator(std::move(ReaderIter),
7277 std::move(ModulesIter));
7280 return new ASTIdentifierIterator(*this);
7284 namespace serialization {
7286 class ReadMethodPoolVisitor {
7289 unsigned PriorGeneration;
7290 unsigned InstanceBits;
7291 unsigned FactoryBits;
7292 bool InstanceHasMoreThanOneDecl;
7293 bool FactoryHasMoreThanOneDecl;
7294 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
7295 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
7298 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
7299 unsigned PriorGeneration)
7300 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
7301 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false),
7302 FactoryHasMoreThanOneDecl(false) {}
7304 bool operator()(ModuleFile &M) {
7305 if (!M.SelectorLookupTable)
7308 // If we've already searched this module file, skip it now.
7309 if (M.Generation <= PriorGeneration)
7312 ++Reader.NumMethodPoolTableLookups;
7313 ASTSelectorLookupTable *PoolTable
7314 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
7315 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
7316 if (Pos == PoolTable->end())
7319 ++Reader.NumMethodPoolTableHits;
7320 ++Reader.NumSelectorsRead;
7321 // FIXME: Not quite happy with the statistics here. We probably should
7322 // disable this tracking when called via LoadSelector.
7323 // Also, should entries without methods count as misses?
7324 ++Reader.NumMethodPoolEntriesRead;
7325 ASTSelectorLookupTrait::data_type Data = *Pos;
7326 if (Reader.DeserializationListener)
7327 Reader.DeserializationListener->SelectorRead(Data.ID, Sel);
7329 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
7330 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
7331 InstanceBits = Data.InstanceBits;
7332 FactoryBits = Data.FactoryBits;
7333 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl;
7334 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl;
7338 /// \brief Retrieve the instance methods found by this visitor.
7339 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
7340 return InstanceMethods;
7343 /// \brief Retrieve the instance methods found by this visitor.
7344 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
7345 return FactoryMethods;
7348 unsigned getInstanceBits() const { return InstanceBits; }
7349 unsigned getFactoryBits() const { return FactoryBits; }
7350 bool instanceHasMoreThanOneDecl() const {
7351 return InstanceHasMoreThanOneDecl;
7353 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; }
7356 } // end namespace serialization
7357 } // end namespace clang
7359 /// \brief Add the given set of methods to the method list.
7360 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
7361 ObjCMethodList &List) {
7362 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
7363 S.addMethodToGlobalList(&List, Methods[I]);
7367 void ASTReader::ReadMethodPool(Selector Sel) {
7368 // Get the selector generation and update it to the current generation.
7369 unsigned &Generation = SelectorGeneration[Sel];
7370 unsigned PriorGeneration = Generation;
7371 Generation = getGeneration();
7372 SelectorOutOfDate[Sel] = false;
7374 // Search for methods defined with this selector.
7375 ++NumMethodPoolLookups;
7376 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
7377 ModuleMgr.visit(Visitor);
7379 if (Visitor.getInstanceMethods().empty() &&
7380 Visitor.getFactoryMethods().empty())
7383 ++NumMethodPoolHits;
7388 Sema &S = *getSema();
7389 Sema::GlobalMethodPool::iterator Pos
7390 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7392 Pos->second.first.setBits(Visitor.getInstanceBits());
7393 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl());
7394 Pos->second.second.setBits(Visitor.getFactoryBits());
7395 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl());
7397 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since
7398 // when building a module we keep every method individually and may need to
7399 // update hasMoreThanOneDecl as we add the methods.
7400 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7401 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
7404 void ASTReader::updateOutOfDateSelector(Selector Sel) {
7405 if (SelectorOutOfDate[Sel])
7406 ReadMethodPool(Sel);
7409 void ASTReader::ReadKnownNamespaces(
7410 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7413 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7414 if (NamespaceDecl *Namespace
7415 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7416 Namespaces.push_back(Namespace);
7420 void ASTReader::ReadUndefinedButUsed(
7421 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
7422 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7423 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
7424 SourceLocation Loc =
7425 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
7426 Undefined.insert(std::make_pair(D, Loc));
7430 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector<
7431 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
7433 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
7434 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++]));
7435 uint64_t Count = DelayedDeleteExprs[Idx++];
7436 for (uint64_t C = 0; C < Count; ++C) {
7437 SourceLocation DeleteLoc =
7438 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]);
7439 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
7440 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
7445 void ASTReader::ReadTentativeDefinitions(
7446 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7447 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7448 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7450 TentativeDefs.push_back(Var);
7452 TentativeDefinitions.clear();
7455 void ASTReader::ReadUnusedFileScopedDecls(
7456 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7457 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7459 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7463 UnusedFileScopedDecls.clear();
7466 void ASTReader::ReadDelegatingConstructors(
7467 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7468 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7469 CXXConstructorDecl *D
7470 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7474 DelegatingCtorDecls.clear();
7477 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7478 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7480 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7484 ExtVectorDecls.clear();
7487 void ASTReader::ReadUnusedLocalTypedefNameCandidates(
7488 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
7489 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
7491 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>(
7492 GetDecl(UnusedLocalTypedefNameCandidates[I]));
7496 UnusedLocalTypedefNameCandidates.clear();
7499 void ASTReader::ReadReferencedSelectors(
7500 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7501 if (ReferencedSelectorsData.empty())
7504 // If there are @selector references added them to its pool. This is for
7505 // implementation of -Wselector.
7506 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7508 while (I < DataSize) {
7509 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7510 SourceLocation SelLoc
7511 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7512 Sels.push_back(std::make_pair(Sel, SelLoc));
7514 ReferencedSelectorsData.clear();
7517 void ASTReader::ReadWeakUndeclaredIdentifiers(
7518 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7519 if (WeakUndeclaredIdentifiers.empty())
7522 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7523 IdentifierInfo *WeakId
7524 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7525 IdentifierInfo *AliasId
7526 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7528 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7529 bool Used = WeakUndeclaredIdentifiers[I++];
7530 WeakInfo WI(AliasId, Loc);
7532 WeakIDs.push_back(std::make_pair(WeakId, WI));
7534 WeakUndeclaredIdentifiers.clear();
7537 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7538 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7539 ExternalVTableUse VT;
7540 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7541 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7542 VT.DefinitionRequired = VTableUses[Idx++];
7543 VTables.push_back(VT);
7549 void ASTReader::ReadPendingInstantiations(
7550 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7551 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7552 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7554 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7556 Pending.push_back(std::make_pair(D, Loc));
7558 PendingInstantiations.clear();
7561 void ASTReader::ReadLateParsedTemplates(
7562 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
7564 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7566 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7568 auto LT = llvm::make_unique<LateParsedTemplate>();
7569 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7571 ModuleFile *F = getOwningModuleFile(LT->D);
7572 assert(F && "No module");
7574 unsigned TokN = LateParsedTemplates[Idx++];
7575 LT->Toks.reserve(TokN);
7576 for (unsigned T = 0; T < TokN; ++T)
7577 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7579 LPTMap.insert(std::make_pair(FD, std::move(LT)));
7582 LateParsedTemplates.clear();
7585 void ASTReader::LoadSelector(Selector Sel) {
7586 // It would be complicated to avoid reading the methods anyway. So don't.
7587 ReadMethodPool(Sel);
7590 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7591 assert(ID && "Non-zero identifier ID required");
7592 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7593 IdentifiersLoaded[ID - 1] = II;
7594 if (DeserializationListener)
7595 DeserializationListener->IdentifierRead(ID, II);
7598 /// \brief Set the globally-visible declarations associated with the given
7601 /// If the AST reader is currently in a state where the given declaration IDs
7602 /// cannot safely be resolved, they are queued until it is safe to resolve
7605 /// \param II an IdentifierInfo that refers to one or more globally-visible
7608 /// \param DeclIDs the set of declaration IDs with the name @p II that are
7609 /// visible at global scope.
7611 /// \param Decls if non-null, this vector will be populated with the set of
7612 /// deserialized declarations. These declarations will not be pushed into
7615 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7616 const SmallVectorImpl<uint32_t> &DeclIDs,
7617 SmallVectorImpl<Decl *> *Decls) {
7618 if (NumCurrentElementsDeserializing && !Decls) {
7619 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
7623 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7625 // Queue this declaration so that it will be added to the
7626 // translation unit scope and identifier's declaration chain
7627 // once a Sema object is known.
7628 PreloadedDeclIDs.push_back(DeclIDs[I]);
7632 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7634 // If we're simply supposed to record the declarations, do so now.
7636 Decls->push_back(D);
7640 // Introduce this declaration into the translation-unit scope
7641 // and add it to the declaration chain for this identifier, so
7642 // that (unqualified) name lookup will find it.
7643 pushExternalDeclIntoScope(D, II);
7647 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
7651 if (IdentifiersLoaded.empty()) {
7652 Error("no identifier table in AST file");
7657 if (!IdentifiersLoaded[ID]) {
7658 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7659 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7660 ModuleFile *M = I->second;
7661 unsigned Index = ID - M->BaseIdentifierID;
7662 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7664 // All of the strings in the AST file are preceded by a 16-bit length.
7665 // Extract that 16-bit length to avoid having to execute strlen().
7666 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7667 // unsigned integers. This is important to avoid integer overflow when
7668 // we cast them to 'unsigned'.
7669 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7670 unsigned StrLen = (((unsigned) StrLenPtr[0])
7671 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
7672 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen));
7673 IdentifiersLoaded[ID] = &II;
7674 markIdentifierFromAST(*this, II);
7675 if (DeserializationListener)
7676 DeserializationListener->IdentifierRead(ID + 1, &II);
7679 return IdentifiersLoaded[ID];
7682 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7683 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
7686 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7687 if (LocalID < NUM_PREDEF_IDENT_IDS)
7690 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7691 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7692 assert(I != M.IdentifierRemap.end()
7693 && "Invalid index into identifier index remap");
7695 return LocalID + I->second;
7698 MacroInfo *ASTReader::getMacro(MacroID ID) {
7702 if (MacrosLoaded.empty()) {
7703 Error("no macro table in AST file");
7707 ID -= NUM_PREDEF_MACRO_IDS;
7708 if (!MacrosLoaded[ID]) {
7709 GlobalMacroMapType::iterator I
7710 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7711 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7712 ModuleFile *M = I->second;
7713 unsigned Index = ID - M->BaseMacroID;
7714 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7716 if (DeserializationListener)
7717 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7721 return MacrosLoaded[ID];
7724 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7725 if (LocalID < NUM_PREDEF_MACRO_IDS)
7728 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7729 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7730 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7732 return LocalID + I->second;
7735 serialization::SubmoduleID
7736 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7737 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7740 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7741 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7742 assert(I != M.SubmoduleRemap.end()
7743 && "Invalid index into submodule index remap");
7745 return LocalID + I->second;
7748 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7749 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7750 assert(GlobalID == 0 && "Unhandled global submodule ID");
7754 if (GlobalID > SubmodulesLoaded.size()) {
7755 Error("submodule ID out of range in AST file");
7759 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7762 Module *ASTReader::getModule(unsigned ID) {
7763 return getSubmodule(ID);
7766 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) {
7768 // It's a module, look it up by submodule ID.
7769 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1));
7770 return I == GlobalSubmoduleMap.end() ? nullptr : I->second;
7772 // It's a prefix (preamble, PCH, ...). Look it up by index.
7773 unsigned IndexFromEnd = ID >> 1;
7774 assert(IndexFromEnd && "got reference to unknown module file");
7775 return getModuleManager().pch_modules().end()[-IndexFromEnd];
7779 unsigned ASTReader::getModuleFileID(ModuleFile *F) {
7783 // For a file representing a module, use the submodule ID of the top-level
7784 // module as the file ID. For any other kind of file, the number of such
7785 // files loaded beforehand will be the same on reload.
7786 // FIXME: Is this true even if we have an explicit module file and a PCH?
7788 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1;
7790 auto PCHModules = getModuleManager().pch_modules();
7791 auto I = std::find(PCHModules.begin(), PCHModules.end(), F);
7792 assert(I != PCHModules.end() && "emitting reference to unknown file");
7793 return (I - PCHModules.end()) << 1;
7796 llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
7797 ASTReader::getSourceDescriptor(unsigned ID) {
7798 if (const Module *M = getSubmodule(ID))
7799 return ExternalASTSource::ASTSourceDescriptor(*M);
7801 // If there is only a single PCH, return it instead.
7802 // Chained PCH are not suported.
7803 if (ModuleMgr.size() == 1) {
7804 ModuleFile &MF = ModuleMgr.getPrimaryModule();
7805 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName);
7806 StringRef FileName = llvm::sys::path::filename(MF.FileName);
7807 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName,
7813 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7814 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7817 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7821 if (ID > SelectorsLoaded.size()) {
7822 Error("selector ID out of range in AST file");
7826 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
7827 // Load this selector from the selector table.
7828 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7829 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7830 ModuleFile &M = *I->second;
7831 ASTSelectorLookupTrait Trait(*this, M);
7832 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7833 SelectorsLoaded[ID - 1] =
7834 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7835 if (DeserializationListener)
7836 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7839 return SelectorsLoaded[ID - 1];
7842 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7843 return DecodeSelector(ID);
7846 uint32_t ASTReader::GetNumExternalSelectors() {
7847 // ID 0 (the null selector) is considered an external selector.
7848 return getTotalNumSelectors() + 1;
7851 serialization::SelectorID
7852 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7853 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7856 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7857 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7858 assert(I != M.SelectorRemap.end()
7859 && "Invalid index into selector index remap");
7861 return LocalID + I->second;
7865 ASTReader::ReadDeclarationName(ModuleFile &F,
7866 const RecordData &Record, unsigned &Idx) {
7867 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7869 case DeclarationName::Identifier:
7870 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
7872 case DeclarationName::ObjCZeroArgSelector:
7873 case DeclarationName::ObjCOneArgSelector:
7874 case DeclarationName::ObjCMultiArgSelector:
7875 return DeclarationName(ReadSelector(F, Record, Idx));
7877 case DeclarationName::CXXConstructorName:
7878 return Context.DeclarationNames.getCXXConstructorName(
7879 Context.getCanonicalType(readType(F, Record, Idx)));
7881 case DeclarationName::CXXDestructorName:
7882 return Context.DeclarationNames.getCXXDestructorName(
7883 Context.getCanonicalType(readType(F, Record, Idx)));
7885 case DeclarationName::CXXConversionFunctionName:
7886 return Context.DeclarationNames.getCXXConversionFunctionName(
7887 Context.getCanonicalType(readType(F, Record, Idx)));
7889 case DeclarationName::CXXOperatorName:
7890 return Context.DeclarationNames.getCXXOperatorName(
7891 (OverloadedOperatorKind)Record[Idx++]);
7893 case DeclarationName::CXXLiteralOperatorName:
7894 return Context.DeclarationNames.getCXXLiteralOperatorName(
7895 GetIdentifierInfo(F, Record, Idx));
7897 case DeclarationName::CXXUsingDirective:
7898 return DeclarationName::getUsingDirectiveName();
7901 llvm_unreachable("Invalid NameKind!");
7904 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7905 DeclarationNameLoc &DNLoc,
7906 DeclarationName Name,
7907 const RecordData &Record, unsigned &Idx) {
7908 switch (Name.getNameKind()) {
7909 case DeclarationName::CXXConstructorName:
7910 case DeclarationName::CXXDestructorName:
7911 case DeclarationName::CXXConversionFunctionName:
7912 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7915 case DeclarationName::CXXOperatorName:
7916 DNLoc.CXXOperatorName.BeginOpNameLoc
7917 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7918 DNLoc.CXXOperatorName.EndOpNameLoc
7919 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7922 case DeclarationName::CXXLiteralOperatorName:
7923 DNLoc.CXXLiteralOperatorName.OpNameLoc
7924 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7927 case DeclarationName::Identifier:
7928 case DeclarationName::ObjCZeroArgSelector:
7929 case DeclarationName::ObjCOneArgSelector:
7930 case DeclarationName::ObjCMultiArgSelector:
7931 case DeclarationName::CXXUsingDirective:
7936 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7937 DeclarationNameInfo &NameInfo,
7938 const RecordData &Record, unsigned &Idx) {
7939 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7940 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7941 DeclarationNameLoc DNLoc;
7942 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7943 NameInfo.setInfo(DNLoc);
7946 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7947 const RecordData &Record, unsigned &Idx) {
7948 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7949 unsigned NumTPLists = Record[Idx++];
7950 Info.NumTemplParamLists = NumTPLists;
7952 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7953 for (unsigned i = 0; i != NumTPLists; ++i)
7954 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7959 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7961 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7963 case TemplateName::Template:
7964 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7966 case TemplateName::OverloadedTemplate: {
7967 unsigned size = Record[Idx++];
7968 UnresolvedSet<8> Decls;
7970 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7972 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7975 case TemplateName::QualifiedTemplate: {
7976 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7977 bool hasTemplKeyword = Record[Idx++];
7978 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7979 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7982 case TemplateName::DependentTemplate: {
7983 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7984 if (Record[Idx++]) // isIdentifier
7985 return Context.getDependentTemplateName(NNS,
7986 GetIdentifierInfo(F, Record,
7988 return Context.getDependentTemplateName(NNS,
7989 (OverloadedOperatorKind)Record[Idx++]);
7992 case TemplateName::SubstTemplateTemplateParm: {
7993 TemplateTemplateParmDecl *param
7994 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7995 if (!param) return TemplateName();
7996 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7997 return Context.getSubstTemplateTemplateParm(param, replacement);
8000 case TemplateName::SubstTemplateTemplateParmPack: {
8001 TemplateTemplateParmDecl *Param
8002 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
8004 return TemplateName();
8006 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
8007 if (ArgPack.getKind() != TemplateArgument::Pack)
8008 return TemplateName();
8010 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
8014 llvm_unreachable("Unhandled template name kind!");
8017 TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F,
8018 const RecordData &Record,
8020 bool Canonicalize) {
8022 // The caller wants a canonical template argument. Sometimes the AST only
8023 // wants template arguments in canonical form (particularly as the template
8024 // argument lists of template specializations) so ensure we preserve that
8025 // canonical form across serialization.
8026 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false);
8027 return Context.getCanonicalTemplateArgument(Arg);
8030 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
8032 case TemplateArgument::Null:
8033 return TemplateArgument();
8034 case TemplateArgument::Type:
8035 return TemplateArgument(readType(F, Record, Idx));
8036 case TemplateArgument::Declaration: {
8037 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
8038 return TemplateArgument(D, readType(F, Record, Idx));
8040 case TemplateArgument::NullPtr:
8041 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
8042 case TemplateArgument::Integral: {
8043 llvm::APSInt Value = ReadAPSInt(Record, Idx);
8044 QualType T = readType(F, Record, Idx);
8045 return TemplateArgument(Context, Value, T);
8047 case TemplateArgument::Template:
8048 return TemplateArgument(ReadTemplateName(F, Record, Idx));
8049 case TemplateArgument::TemplateExpansion: {
8050 TemplateName Name = ReadTemplateName(F, Record, Idx);
8051 Optional<unsigned> NumTemplateExpansions;
8052 if (unsigned NumExpansions = Record[Idx++])
8053 NumTemplateExpansions = NumExpansions - 1;
8054 return TemplateArgument(Name, NumTemplateExpansions);
8056 case TemplateArgument::Expression:
8057 return TemplateArgument(ReadExpr(F));
8058 case TemplateArgument::Pack: {
8059 unsigned NumArgs = Record[Idx++];
8060 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
8061 for (unsigned I = 0; I != NumArgs; ++I)
8062 Args[I] = ReadTemplateArgument(F, Record, Idx);
8063 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs));
8067 llvm_unreachable("Unhandled template argument kind!");
8070 TemplateParameterList *
8071 ASTReader::ReadTemplateParameterList(ModuleFile &F,
8072 const RecordData &Record, unsigned &Idx) {
8073 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
8074 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
8075 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
8077 unsigned NumParams = Record[Idx++];
8078 SmallVector<NamedDecl *, 16> Params;
8079 Params.reserve(NumParams);
8081 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
8084 TemplateParameterList* TemplateParams =
8085 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
8086 Params, RAngleLoc, nullptr);
8087 return TemplateParams;
8092 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
8093 ModuleFile &F, const RecordData &Record,
8094 unsigned &Idx, bool Canonicalize) {
8095 unsigned NumTemplateArgs = Record[Idx++];
8096 TemplArgs.reserve(NumTemplateArgs);
8097 while (NumTemplateArgs--)
8098 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize));
8101 /// \brief Read a UnresolvedSet structure.
8102 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
8103 const RecordData &Record, unsigned &Idx) {
8104 unsigned NumDecls = Record[Idx++];
8105 Set.reserve(Context, NumDecls);
8106 while (NumDecls--) {
8107 DeclID ID = ReadDeclID(F, Record, Idx);
8108 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
8109 Set.addLazyDecl(Context, ID, AS);
8114 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
8115 const RecordData &Record, unsigned &Idx) {
8116 bool isVirtual = static_cast<bool>(Record[Idx++]);
8117 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
8118 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
8119 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
8120 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
8121 SourceRange Range = ReadSourceRange(F, Record, Idx);
8122 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
8123 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
8125 Result.setInheritConstructors(inheritConstructors);
8129 CXXCtorInitializer **
8130 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
8132 unsigned NumInitializers = Record[Idx++];
8133 assert(NumInitializers && "wrote ctor initializers but have no inits");
8134 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers];
8135 for (unsigned i = 0; i != NumInitializers; ++i) {
8136 TypeSourceInfo *TInfo = nullptr;
8137 bool IsBaseVirtual = false;
8138 FieldDecl *Member = nullptr;
8139 IndirectFieldDecl *IndirectMember = nullptr;
8141 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
8143 case CTOR_INITIALIZER_BASE:
8144 TInfo = GetTypeSourceInfo(F, Record, Idx);
8145 IsBaseVirtual = Record[Idx++];
8148 case CTOR_INITIALIZER_DELEGATING:
8149 TInfo = GetTypeSourceInfo(F, Record, Idx);
8152 case CTOR_INITIALIZER_MEMBER:
8153 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
8156 case CTOR_INITIALIZER_INDIRECT_MEMBER:
8157 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
8161 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
8162 Expr *Init = ReadExpr(F);
8163 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
8164 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
8165 bool IsWritten = Record[Idx++];
8166 unsigned SourceOrderOrNumArrayIndices;
8167 SmallVector<VarDecl *, 8> Indices;
8169 SourceOrderOrNumArrayIndices = Record[Idx++];
8171 SourceOrderOrNumArrayIndices = Record[Idx++];
8172 Indices.reserve(SourceOrderOrNumArrayIndices);
8173 for (unsigned i = 0; i != SourceOrderOrNumArrayIndices; ++i)
8174 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
8177 CXXCtorInitializer *BOMInit;
8178 if (Type == CTOR_INITIALIZER_BASE) {
8179 BOMInit = new (Context)
8180 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init,
8181 RParenLoc, MemberOrEllipsisLoc);
8182 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
8183 BOMInit = new (Context)
8184 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc);
8185 } else if (IsWritten) {
8187 BOMInit = new (Context) CXXCtorInitializer(
8188 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc);
8190 BOMInit = new (Context)
8191 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8192 LParenLoc, Init, RParenLoc);
8194 if (IndirectMember) {
8195 assert(Indices.empty() && "Indirect field improperly initialized");
8196 BOMInit = new (Context)
8197 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc,
8198 LParenLoc, Init, RParenLoc);
8200 BOMInit = CXXCtorInitializer::Create(
8201 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc,
8202 Indices.data(), Indices.size());
8207 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
8208 CtorInitializers[i] = BOMInit;
8211 return CtorInitializers;
8214 NestedNameSpecifier *
8215 ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
8216 const RecordData &Record, unsigned &Idx) {
8217 unsigned N = Record[Idx++];
8218 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
8219 for (unsigned I = 0; I != N; ++I) {
8220 NestedNameSpecifier::SpecifierKind Kind
8221 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8223 case NestedNameSpecifier::Identifier: {
8224 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8225 NNS = NestedNameSpecifier::Create(Context, Prev, II);
8229 case NestedNameSpecifier::Namespace: {
8230 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8231 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
8235 case NestedNameSpecifier::NamespaceAlias: {
8236 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8237 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
8241 case NestedNameSpecifier::TypeSpec:
8242 case NestedNameSpecifier::TypeSpecWithTemplate: {
8243 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
8247 bool Template = Record[Idx++];
8248 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
8252 case NestedNameSpecifier::Global: {
8253 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
8254 // No associated value, and there can't be a prefix.
8258 case NestedNameSpecifier::Super: {
8259 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8260 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD);
8269 NestedNameSpecifierLoc
8270 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
8272 unsigned N = Record[Idx++];
8273 NestedNameSpecifierLocBuilder Builder;
8274 for (unsigned I = 0; I != N; ++I) {
8275 NestedNameSpecifier::SpecifierKind Kind
8276 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
8278 case NestedNameSpecifier::Identifier: {
8279 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
8280 SourceRange Range = ReadSourceRange(F, Record, Idx);
8281 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
8285 case NestedNameSpecifier::Namespace: {
8286 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
8287 SourceRange Range = ReadSourceRange(F, Record, Idx);
8288 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
8292 case NestedNameSpecifier::NamespaceAlias: {
8293 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
8294 SourceRange Range = ReadSourceRange(F, Record, Idx);
8295 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
8299 case NestedNameSpecifier::TypeSpec:
8300 case NestedNameSpecifier::TypeSpecWithTemplate: {
8301 bool Template = Record[Idx++];
8302 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
8304 return NestedNameSpecifierLoc();
8305 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8307 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
8308 Builder.Extend(Context,
8309 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
8310 T->getTypeLoc(), ColonColonLoc);
8314 case NestedNameSpecifier::Global: {
8315 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
8316 Builder.MakeGlobal(Context, ColonColonLoc);
8320 case NestedNameSpecifier::Super: {
8321 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx);
8322 SourceRange Range = ReadSourceRange(F, Record, Idx);
8323 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd());
8329 return Builder.getWithLocInContext(Context);
8333 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
8335 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
8336 SourceLocation end = ReadSourceLocation(F, Record, Idx);
8337 return SourceRange(beg, end);
8340 /// \brief Read an integral value
8341 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
8342 unsigned BitWidth = Record[Idx++];
8343 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
8344 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
8349 /// \brief Read a signed integral value
8350 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
8351 bool isUnsigned = Record[Idx++];
8352 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
8355 /// \brief Read a floating-point value
8356 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
8357 const llvm::fltSemantics &Sem,
8359 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
8362 // \brief Read a string
8363 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
8364 unsigned Len = Record[Idx++];
8365 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
8370 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record,
8372 std::string Filename = ReadString(Record, Idx);
8373 ResolveImportedPath(F, Filename);
8377 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
8379 unsigned Major = Record[Idx++];
8380 unsigned Minor = Record[Idx++];
8381 unsigned Subminor = Record[Idx++];
8383 return VersionTuple(Major);
8385 return VersionTuple(Major, Minor - 1);
8386 return VersionTuple(Major, Minor - 1, Subminor - 1);
8389 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
8390 const RecordData &Record,
8392 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
8393 return CXXTemporary::Create(Context, Decl);
8396 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
8397 return Diag(CurrentImportLoc, DiagID);
8400 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
8401 return Diags.Report(Loc, DiagID);
8404 /// \brief Retrieve the identifier table associated with the
8406 IdentifierTable &ASTReader::getIdentifierTable() {
8407 return PP.getIdentifierTable();
8410 /// \brief Record that the given ID maps to the given switch-case
8412 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
8413 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
8414 "Already have a SwitchCase with this ID");
8415 (*CurrSwitchCaseStmts)[ID] = SC;
8418 /// \brief Retrieve the switch-case statement with the given ID.
8419 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
8420 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
8421 return (*CurrSwitchCaseStmts)[ID];
8424 void ASTReader::ClearSwitchCaseIDs() {
8425 CurrSwitchCaseStmts->clear();
8428 void ASTReader::ReadComments() {
8429 std::vector<RawComment *> Comments;
8430 for (SmallVectorImpl<std::pair<BitstreamCursor,
8431 serialization::ModuleFile *> >::iterator
8432 I = CommentsCursors.begin(),
8433 E = CommentsCursors.end();
8436 BitstreamCursor &Cursor = I->first;
8437 serialization::ModuleFile &F = *I->second;
8438 SavedStreamPosition SavedPosition(Cursor);
8442 llvm::BitstreamEntry Entry =
8443 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
8445 switch (Entry.Kind) {
8446 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
8447 case llvm::BitstreamEntry::Error:
8448 Error("malformed block record in AST file");
8450 case llvm::BitstreamEntry::EndBlock:
8452 case llvm::BitstreamEntry::Record:
8453 // The interesting case.
8459 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
8460 case COMMENTS_RAW_COMMENT: {
8462 SourceRange SR = ReadSourceRange(F, Record, Idx);
8463 RawComment::CommentKind Kind =
8464 (RawComment::CommentKind) Record[Idx++];
8465 bool IsTrailingComment = Record[Idx++];
8466 bool IsAlmostTrailingComment = Record[Idx++];
8467 Comments.push_back(new (Context) RawComment(
8468 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
8469 Context.getLangOpts().CommentOpts.ParseAllComments));
8475 Context.Comments.addDeserializedComments(Comments);
8479 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8480 // If we know the owning module, use it.
8481 if (Module *M = D->getImportedOwningModule())
8482 return M->getFullModuleName();
8484 // Otherwise, use the name of the top-level module the decl is within.
8485 if (ModuleFile *M = getOwningModuleFile(D))
8486 return M->ModuleName;
8488 // Not from a module.
8492 void ASTReader::finishPendingActions() {
8493 while (!PendingIdentifierInfos.empty() ||
8494 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
8495 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
8496 !PendingUpdateRecords.empty()) {
8497 // If any identifiers with corresponding top-level declarations have
8498 // been loaded, load those declarations now.
8499 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8501 TopLevelDeclsMap TopLevelDecls;
8503 while (!PendingIdentifierInfos.empty()) {
8504 IdentifierInfo *II = PendingIdentifierInfos.back().first;
8505 SmallVector<uint32_t, 4> DeclIDs =
8506 std::move(PendingIdentifierInfos.back().second);
8507 PendingIdentifierInfos.pop_back();
8509 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
8512 // For each decl chain that we wanted to complete while deserializing, mark
8513 // it as "still needs to be completed".
8514 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8515 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8517 PendingIncompleteDeclChains.clear();
8519 // Load pending declaration chains.
8520 for (unsigned I = 0; I != PendingDeclChains.size(); ++I)
8521 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second);
8522 PendingDeclChains.clear();
8524 // Make the most recent of the top-level declarations visible.
8525 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8526 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
8527 IdentifierInfo *II = TLD->first;
8528 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
8529 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
8533 // Load any pending macro definitions.
8534 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
8535 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8536 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8537 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8538 // Initialize the macro history from chained-PCHs ahead of module imports.
8539 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8541 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8542 if (!Info.M->isModule())
8543 resolvePendingMacro(II, Info);
8545 // Handle module imports.
8546 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8548 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8549 if (Info.M->isModule())
8550 resolvePendingMacro(II, Info);
8553 PendingMacroIDs.clear();
8555 // Wire up the DeclContexts for Decls that we delayed setting until
8556 // recursive loading is completed.
8557 while (!PendingDeclContextInfos.empty()) {
8558 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8559 PendingDeclContextInfos.pop_front();
8560 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8561 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8562 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8565 // Perform any pending declaration updates.
8566 while (!PendingUpdateRecords.empty()) {
8567 auto Update = PendingUpdateRecords.pop_back_val();
8568 ReadingKindTracker ReadingKind(Read_Decl, *this);
8569 loadDeclUpdateRecords(Update.first, Update.second);
8573 // At this point, all update records for loaded decls are in place, so any
8574 // fake class definitions should have become real.
8575 assert(PendingFakeDefinitionData.empty() &&
8576 "faked up a class definition but never saw the real one");
8578 // If we deserialized any C++ or Objective-C class definitions, any
8579 // Objective-C protocol definitions, or any redeclarable templates, make sure
8580 // that all redeclarations point to the definitions. Note that this can only
8581 // happen now, after the redeclaration chains have been fully wired.
8582 for (Decl *D : PendingDefinitions) {
8583 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
8584 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
8585 // Make sure that the TagType points at the definition.
8586 const_cast<TagType*>(TagT)->decl = TD;
8589 if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
8590 for (auto *R = getMostRecentExistingDecl(RD); R;
8591 R = R->getPreviousDecl()) {
8593 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() &&
8594 "declaration thinks it's the definition but it isn't");
8595 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
8602 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
8603 // Make sure that the ObjCInterfaceType points at the definition.
8604 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8607 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
8608 cast<ObjCInterfaceDecl>(R)->Data = ID->Data;
8613 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
8614 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
8615 cast<ObjCProtocolDecl>(R)->Data = PD->Data;
8620 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl();
8621 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
8622 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common;
8624 PendingDefinitions.clear();
8626 // Load the bodies of any functions or methods we've encountered. We do
8627 // this now (delayed) so that we can be sure that the declaration chains
8628 // have been fully wired up (hasBody relies on this).
8629 // FIXME: We shouldn't require complete redeclaration chains here.
8630 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8631 PBEnd = PendingBodies.end();
8632 PB != PBEnd; ++PB) {
8633 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8634 // FIXME: Check for =delete/=default?
8635 // FIXME: Complain about ODR violations here?
8636 const FunctionDecl *Defn = nullptr;
8637 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn))
8638 FD->setLazyBody(PB->second);
8640 mergeDefinitionVisibility(const_cast<FunctionDecl*>(Defn), FD);
8644 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8645 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8646 MD->setLazyBody(PB->second);
8648 PendingBodies.clear();
8651 for (auto *ND : PendingMergedDefinitionsToDeduplicate)
8652 getContext().deduplicateMergedDefinitonsFor(ND);
8653 PendingMergedDefinitionsToDeduplicate.clear();
8656 void ASTReader::diagnoseOdrViolations() {
8657 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty())
8660 // Trigger the import of the full definition of each class that had any
8661 // odr-merging problems, so we can produce better diagnostics for them.
8662 // These updates may in turn find and diagnose some ODR failures, so take
8663 // ownership of the set first.
8664 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
8665 PendingOdrMergeFailures.clear();
8666 for (auto &Merge : OdrMergeFailures) {
8667 Merge.first->buildLookup();
8668 Merge.first->decls_begin();
8669 Merge.first->bases_begin();
8670 Merge.first->vbases_begin();
8671 for (auto *RD : Merge.second) {
8678 // For each declaration from a merged context, check that the canonical
8679 // definition of that context also contains a declaration of the same
8682 // Caution: this loop does things that might invalidate iterators into
8683 // PendingOdrMergeChecks. Don't turn this into a range-based for loop!
8684 while (!PendingOdrMergeChecks.empty()) {
8685 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8687 // FIXME: Skip over implicit declarations for now. This matters for things
8688 // like implicitly-declared special member functions. This isn't entirely
8689 // correct; we can end up with multiple unmerged declarations of the same
8691 if (D->isImplicit())
8694 DeclContext *CanonDef = D->getDeclContext();
8697 const Decl *DCanon = D->getCanonicalDecl();
8699 for (auto RI : D->redecls()) {
8700 if (RI->getLexicalDeclContext() == CanonDef) {
8708 // Quick check failed, time to do the slow thing. Note, we can't just
8709 // look up the name of D in CanonDef here, because the member that is
8710 // in CanonDef might not be found by name lookup (it might have been
8711 // replaced by a more recent declaration in the lookup table), and we
8712 // can't necessarily find it in the redeclaration chain because it might
8713 // be merely mergeable, not redeclarable.
8714 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8715 for (auto *CanonMember : CanonDef->decls()) {
8716 if (CanonMember->getCanonicalDecl() == DCanon) {
8717 // This can happen if the declaration is merely mergeable and not
8718 // actually redeclarable (we looked for redeclarations earlier).
8720 // FIXME: We should be able to detect this more efficiently, without
8721 // pulling in all of the members of CanonDef.
8725 if (auto *ND = dyn_cast<NamedDecl>(CanonMember))
8726 if (ND->getDeclName() == D->getDeclName())
8727 Candidates.push_back(ND);
8731 // The AST doesn't like TagDecls becoming invalid after they've been
8732 // completed. We only really need to mark FieldDecls as invalid here.
8733 if (!isa<TagDecl>(D))
8734 D->setInvalidDecl();
8736 // Ensure we don't accidentally recursively enter deserialization while
8737 // we're producing our diagnostic.
8738 Deserializing RecursionGuard(this);
8740 std::string CanonDefModule =
8741 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8742 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8743 << D << getOwningModuleNameForDiagnostic(D)
8744 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8746 if (Candidates.empty())
8747 Diag(cast<Decl>(CanonDef)->getLocation(),
8748 diag::note_module_odr_violation_no_possible_decls) << D;
8750 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8751 Diag(Candidates[I]->getLocation(),
8752 diag::note_module_odr_violation_possible_decl)
8756 DiagnosedOdrMergeFailures.insert(CanonDef);
8760 if (OdrMergeFailures.empty())
8763 // Ensure we don't accidentally recursively enter deserialization while
8764 // we're producing our diagnostics.
8765 Deserializing RecursionGuard(this);
8767 // Issue any pending ODR-failure diagnostics.
8768 for (auto &Merge : OdrMergeFailures) {
8769 // If we've already pointed out a specific problem with this class, don't
8770 // bother issuing a general "something's different" diagnostic.
8771 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
8774 bool Diagnosed = false;
8775 for (auto *RD : Merge.second) {
8776 // Multiple different declarations got merged together; tell the user
8777 // where they came from.
8778 if (Merge.first != RD) {
8779 // FIXME: Walk the definition, figure out what's different,
8780 // and diagnose that.
8782 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8783 Diag(Merge.first->getLocation(),
8784 diag::err_module_odr_violation_different_definitions)
8785 << Merge.first << Module.empty() << Module;
8789 Diag(RD->getLocation(),
8790 diag::note_module_odr_violation_different_definitions)
8791 << getOwningModuleNameForDiagnostic(RD);
8796 // All definitions are updates to the same declaration. This happens if a
8797 // module instantiates the declaration of a class template specialization
8798 // and two or more other modules instantiate its definition.
8800 // FIXME: Indicate which modules had instantiations of this definition.
8801 // FIXME: How can this even happen?
8802 Diag(Merge.first->getLocation(),
8803 diag::err_module_odr_violation_different_instantiations)
8809 void ASTReader::StartedDeserializing() {
8810 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get())
8811 ReadTimer->startTimer();
8814 void ASTReader::FinishedDeserializing() {
8815 assert(NumCurrentElementsDeserializing &&
8816 "FinishedDeserializing not paired with StartedDeserializing");
8817 if (NumCurrentElementsDeserializing == 1) {
8818 // We decrease NumCurrentElementsDeserializing only after pending actions
8819 // are finished, to avoid recursively re-calling finishPendingActions().
8820 finishPendingActions();
8822 --NumCurrentElementsDeserializing;
8824 if (NumCurrentElementsDeserializing == 0) {
8825 // Propagate exception specification updates along redeclaration chains.
8826 while (!PendingExceptionSpecUpdates.empty()) {
8827 auto Updates = std::move(PendingExceptionSpecUpdates);
8828 PendingExceptionSpecUpdates.clear();
8829 for (auto Update : Updates) {
8830 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
8831 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
8832 auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
8833 if (auto *Listener = Context.getASTMutationListener())
8834 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
8835 for (auto *Redecl : Update.second->redecls())
8836 Context.adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
8841 ReadTimer->stopTimer();
8843 diagnoseOdrViolations();
8845 // We are not in recursive loading, so it's safe to pass the "interesting"
8846 // decls to the consumer.
8848 PassInterestingDeclsToConsumer();
8852 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
8853 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) {
8854 // Remove any fake results before adding any real ones.
8855 auto It = PendingFakeLookupResults.find(II);
8856 if (It != PendingFakeLookupResults.end()) {
8857 for (auto *ND : It->second)
8858 SemaObj->IdResolver.RemoveDecl(ND);
8859 // FIXME: this works around module+PCH performance issue.
8860 // Rather than erase the result from the map, which is O(n), just clear
8861 // the vector of NamedDecls.
8866 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8867 SemaObj->TUScope->AddDecl(D);
8868 } else if (SemaObj->TUScope) {
8869 // Adding the decl to IdResolver may have failed because it was already in
8870 // (even though it was not added in scope). If it is already in, make sure
8871 // it gets in the scope as well.
8872 if (std::find(SemaObj->IdResolver.begin(Name),
8873 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8874 SemaObj->TUScope->AddDecl(D);
8878 ASTReader::ASTReader(
8879 Preprocessor &PP, ASTContext &Context,
8880 const PCHContainerReader &PCHContainerRdr,
8881 ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
8882 StringRef isysroot, bool DisableValidation,
8883 bool AllowASTWithCompilerErrors,
8884 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
8885 bool UseGlobalIndex,
8886 std::unique_ptr<llvm::Timer> ReadTimer)
8887 : Listener(DisableValidation ?
8888 cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) :
8889 cast<ASTReaderListener>(new PCHValidator(PP, *this))),
8890 DeserializationListener(nullptr),
8891 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
8892 FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr),
8893 Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context),
8894 Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr),
8895 DummyIdResolver(PP),
8896 ReadTimer(std::move(ReadTimer)),
8897 PragmaMSStructState(-1),
8898 PragmaMSPointersToMembersState(-1),
8899 isysroot(isysroot), DisableValidation(DisableValidation),
8900 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8901 AllowConfigurationMismatch(AllowConfigurationMismatch),
8902 ValidateSystemInputs(ValidateSystemInputs),
8903 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
8904 ProcessingUpdateRecords(false),
8905 CurrSwitchCaseStmts(&SwitchCaseStmts), NumSLocEntriesRead(0),
8906 TotalNumSLocEntries(0), NumStatementsRead(0), TotalNumStatements(0),
8907 NumMacrosRead(0), TotalNumMacros(0), NumIdentifierLookups(0),
8908 NumIdentifierLookupHits(0), NumSelectorsRead(0),
8909 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8910 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8911 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8912 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8913 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8914 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8915 PassingDeclsToConsumer(false), ReadingKind(Read_None) {
8916 SourceMgr.setExternalSLocEntrySource(this);
8918 for (const auto &Ext : Extensions) {
8919 auto BlockName = Ext->getExtensionMetadata().BlockName;
8920 auto Known = ModuleFileExtensions.find(BlockName);
8921 if (Known != ModuleFileExtensions.end()) {
8922 Diags.Report(diag::warn_duplicate_module_file_extension)
8927 ModuleFileExtensions.insert({BlockName, Ext});
8931 ASTReader::~ASTReader() {
8932 if (OwnsDeserializationListener)
8933 delete DeserializationListener;
8936 IdentifierResolver &ASTReader::getIdResolver() {
8937 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;