1 //===--- ASTReader.cpp - AST File Reader ----------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the ASTReader class, which reads AST files.
12 //===----------------------------------------------------------------------===//
14 #include "clang/Serialization/ASTReader.h"
15 #include "ASTCommon.h"
16 #include "ASTReaderInternals.h"
17 #include "clang/AST/ASTConsumer.h"
18 #include "clang/AST/ASTContext.h"
19 #include "clang/AST/DeclTemplate.h"
20 #include "clang/AST/Expr.h"
21 #include "clang/AST/ExprCXX.h"
22 #include "clang/AST/NestedNameSpecifier.h"
23 #include "clang/AST/Type.h"
24 #include "clang/AST/TypeLocVisitor.h"
25 #include "clang/Basic/DiagnosticOptions.h"
26 #include "clang/Basic/FileManager.h"
27 #include "clang/Basic/SourceManager.h"
28 #include "clang/Basic/SourceManagerInternals.h"
29 #include "clang/Basic/TargetInfo.h"
30 #include "clang/Basic/TargetOptions.h"
31 #include "clang/Basic/Version.h"
32 #include "clang/Basic/VersionTuple.h"
33 #include "clang/Frontend/Utils.h"
34 #include "clang/Lex/HeaderSearch.h"
35 #include "clang/Lex/HeaderSearchOptions.h"
36 #include "clang/Lex/MacroInfo.h"
37 #include "clang/Lex/PreprocessingRecord.h"
38 #include "clang/Lex/Preprocessor.h"
39 #include "clang/Lex/PreprocessorOptions.h"
40 #include "clang/Sema/Scope.h"
41 #include "clang/Sema/Sema.h"
42 #include "clang/Serialization/ASTDeserializationListener.h"
43 #include "clang/Serialization/GlobalModuleIndex.h"
44 #include "clang/Serialization/ModuleManager.h"
45 #include "clang/Serialization/SerializationDiagnostic.h"
46 #include "llvm/ADT/Hashing.h"
47 #include "llvm/ADT/StringExtras.h"
48 #include "llvm/Bitcode/BitstreamReader.h"
49 #include "llvm/Support/ErrorHandling.h"
50 #include "llvm/Support/FileSystem.h"
51 #include "llvm/Support/MemoryBuffer.h"
52 #include "llvm/Support/Path.h"
53 #include "llvm/Support/SaveAndRestore.h"
54 #include "llvm/Support/raw_ostream.h"
58 #include <system_error>
60 using namespace clang;
61 using namespace clang::serialization;
62 using namespace clang::serialization::reader;
63 using llvm::BitstreamCursor;
66 //===----------------------------------------------------------------------===//
67 // ChainedASTReaderListener implementation
68 //===----------------------------------------------------------------------===//
71 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) {
72 return First->ReadFullVersionInformation(FullVersion) ||
73 Second->ReadFullVersionInformation(FullVersion);
75 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) {
76 First->ReadModuleName(ModuleName);
77 Second->ReadModuleName(ModuleName);
79 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) {
80 First->ReadModuleMapFile(ModuleMapPath);
81 Second->ReadModuleMapFile(ModuleMapPath);
83 bool ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts,
85 return First->ReadLanguageOptions(LangOpts, Complain) ||
86 Second->ReadLanguageOptions(LangOpts, Complain);
89 ChainedASTReaderListener::ReadTargetOptions(const TargetOptions &TargetOpts,
91 return First->ReadTargetOptions(TargetOpts, Complain) ||
92 Second->ReadTargetOptions(TargetOpts, Complain);
94 bool ChainedASTReaderListener::ReadDiagnosticOptions(
95 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
96 return First->ReadDiagnosticOptions(DiagOpts, Complain) ||
97 Second->ReadDiagnosticOptions(DiagOpts, Complain);
100 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts,
102 return First->ReadFileSystemOptions(FSOpts, Complain) ||
103 Second->ReadFileSystemOptions(FSOpts, Complain);
106 bool ChainedASTReaderListener::ReadHeaderSearchOptions(
107 const HeaderSearchOptions &HSOpts, bool Complain) {
108 return First->ReadHeaderSearchOptions(HSOpts, Complain) ||
109 Second->ReadHeaderSearchOptions(HSOpts, Complain);
111 bool ChainedASTReaderListener::ReadPreprocessorOptions(
112 const PreprocessorOptions &PPOpts, bool Complain,
113 std::string &SuggestedPredefines) {
114 return First->ReadPreprocessorOptions(PPOpts, Complain,
115 SuggestedPredefines) ||
116 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines);
118 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M,
120 First->ReadCounter(M, Value);
121 Second->ReadCounter(M, Value);
123 bool ChainedASTReaderListener::needsInputFileVisitation() {
124 return First->needsInputFileVisitation() ||
125 Second->needsInputFileVisitation();
127 bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
128 return First->needsSystemInputFileVisitation() ||
129 Second->needsSystemInputFileVisitation();
131 void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
132 First->visitModuleFile(Filename);
133 Second->visitModuleFile(Filename);
135 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
138 bool Continue = false;
139 if (First->needsInputFileVisitation() &&
140 (!isSystem || First->needsSystemInputFileVisitation()))
141 Continue |= First->visitInputFile(Filename, isSystem, isOverridden);
142 if (Second->needsInputFileVisitation() &&
143 (!isSystem || Second->needsSystemInputFileVisitation()))
144 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);
148 //===----------------------------------------------------------------------===//
149 // PCH validator implementation
150 //===----------------------------------------------------------------------===//
152 ASTReaderListener::~ASTReaderListener() {}
154 /// \brief Compare the given set of language options against an existing set of
155 /// language options.
157 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
159 /// \returns true if the languagae options mis-match, false otherwise.
160 static bool checkLanguageOptions(const LangOptions &LangOpts,
161 const LangOptions &ExistingLangOpts,
162 DiagnosticsEngine *Diags) {
163 #define LANGOPT(Name, Bits, Default, Description) \
164 if (ExistingLangOpts.Name != LangOpts.Name) { \
166 Diags->Report(diag::err_pch_langopt_mismatch) \
167 << Description << LangOpts.Name << ExistingLangOpts.Name; \
171 #define VALUE_LANGOPT(Name, Bits, Default, Description) \
172 if (ExistingLangOpts.Name != LangOpts.Name) { \
174 Diags->Report(diag::err_pch_langopt_value_mismatch) \
179 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
180 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
182 Diags->Report(diag::err_pch_langopt_value_mismatch) \
187 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
188 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
189 #include "clang/Basic/LangOptions.def"
191 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) {
193 Diags->Report(diag::err_pch_langopt_value_mismatch)
194 << "target Objective-C runtime";
198 if (ExistingLangOpts.CommentOpts.BlockCommandNames !=
199 LangOpts.CommentOpts.BlockCommandNames) {
201 Diags->Report(diag::err_pch_langopt_value_mismatch)
202 << "block command names";
209 /// \brief Compare the given set of target options against an existing set of
212 /// \param Diags If non-NULL, diagnostics will be emitted via this engine.
214 /// \returns true if the target options mis-match, false otherwise.
215 static bool checkTargetOptions(const TargetOptions &TargetOpts,
216 const TargetOptions &ExistingTargetOpts,
217 DiagnosticsEngine *Diags) {
218 #define CHECK_TARGET_OPT(Field, Name) \
219 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
221 Diags->Report(diag::err_pch_targetopt_mismatch) \
222 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \
226 CHECK_TARGET_OPT(Triple, "target");
227 CHECK_TARGET_OPT(CPU, "target CPU");
228 CHECK_TARGET_OPT(ABI, "target ABI");
229 #undef CHECK_TARGET_OPT
231 // Compare feature sets.
232 SmallVector<StringRef, 4> ExistingFeatures(
233 ExistingTargetOpts.FeaturesAsWritten.begin(),
234 ExistingTargetOpts.FeaturesAsWritten.end());
235 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(),
236 TargetOpts.FeaturesAsWritten.end());
237 std::sort(ExistingFeatures.begin(), ExistingFeatures.end());
238 std::sort(ReadFeatures.begin(), ReadFeatures.end());
240 unsigned ExistingIdx = 0, ExistingN = ExistingFeatures.size();
241 unsigned ReadIdx = 0, ReadN = ReadFeatures.size();
242 while (ExistingIdx < ExistingN && ReadIdx < ReadN) {
243 if (ExistingFeatures[ExistingIdx] == ReadFeatures[ReadIdx]) {
249 if (ReadFeatures[ReadIdx] < ExistingFeatures[ExistingIdx]) {
251 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
252 << false << ReadFeatures[ReadIdx];
257 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
258 << true << ExistingFeatures[ExistingIdx];
262 if (ExistingIdx < ExistingN) {
264 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
265 << true << ExistingFeatures[ExistingIdx];
269 if (ReadIdx < ReadN) {
271 Diags->Report(diag::err_pch_targetopt_feature_mismatch)
272 << false << ReadFeatures[ReadIdx];
280 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
282 const LangOptions &ExistingLangOpts = PP.getLangOpts();
283 return checkLanguageOptions(LangOpts, ExistingLangOpts,
284 Complain? &Reader.Diags : nullptr);
287 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts,
289 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
290 return checkTargetOptions(TargetOpts, ExistingTargetOpts,
291 Complain? &Reader.Diags : nullptr);
295 typedef llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >
297 typedef llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8> >
301 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags,
302 DiagnosticsEngine &Diags,
304 typedef DiagnosticsEngine::Level Level;
306 // Check current mappings for new -Werror mappings, and the stored mappings
307 // for cases that were explicitly mapped to *not* be errors that are now
308 // errors because of options like -Werror.
309 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags };
311 for (DiagnosticsEngine *MappingSource : MappingSources) {
312 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
313 diag::kind DiagID = DiagIDMappingPair.first;
314 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation());
315 if (CurLevel < DiagnosticsEngine::Error)
316 continue; // not significant
318 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation());
319 if (StoredLevel < DiagnosticsEngine::Error) {
321 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" +
322 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str();
331 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) {
332 diag::Severity Ext = Diags.getExtensionHandlingBehavior();
333 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors())
335 return Ext >= diag::Severity::Error;
338 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags,
339 DiagnosticsEngine &Diags,
340 bool IsSystem, bool Complain) {
343 if (Diags.getSuppressSystemWarnings())
345 // If -Wsystem-headers was not enabled before, be conservative
346 if (StoredDiags.getSuppressSystemWarnings()) {
348 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers";
353 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) {
355 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror";
359 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() &&
360 !StoredDiags.getEnableAllWarnings()) {
362 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror";
366 if (isExtHandlingFromDiagsError(Diags) &&
367 !isExtHandlingFromDiagsError(StoredDiags)) {
369 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors";
373 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain);
376 bool PCHValidator::ReadDiagnosticOptions(
377 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) {
378 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics();
379 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs());
380 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
381 new DiagnosticsEngine(DiagIDs, DiagOpts.getPtr()));
382 // This should never fail, because we would have processed these options
383 // before writing them to an ASTFile.
384 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false);
386 ModuleManager &ModuleMgr = Reader.getModuleManager();
387 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then");
389 // If the original import came from a file explicitly generated by the user,
390 // don't check the diagnostic mappings.
391 // FIXME: currently this is approximated by checking whether this is not a
393 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in
394 // the transitive closure of its imports, since unrelated modules cannot be
395 // imported until after this module finishes validation.
396 ModuleFile *TopImport = *ModuleMgr.rbegin();
397 while (!TopImport->ImportedBy.empty())
398 TopImport = TopImport->ImportedBy[0];
399 if (TopImport->Kind != MK_Module)
402 StringRef ModuleName = TopImport->ModuleName;
403 assert(!ModuleName.empty() && "diagnostic options read before module name");
405 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName);
406 assert(M && "missing module");
408 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that
409 // contains the union of their flags.
410 return checkDiagnosticMappings(*Diags, ExistingDiags, M->IsSystem, Complain);
413 /// \brief Collect the macro definitions provided by the given preprocessor
416 collectMacroDefinitions(const PreprocessorOptions &PPOpts,
417 MacroDefinitionsMap &Macros,
418 SmallVectorImpl<StringRef> *MacroNames = nullptr) {
419 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) {
420 StringRef Macro = PPOpts.Macros[I].first;
421 bool IsUndef = PPOpts.Macros[I].second;
423 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
424 StringRef MacroName = MacroPair.first;
425 StringRef MacroBody = MacroPair.second;
427 // For an #undef'd macro, we only care about the name.
429 if (MacroNames && !Macros.count(MacroName))
430 MacroNames->push_back(MacroName);
432 Macros[MacroName] = std::make_pair("", true);
436 // For a #define'd macro, figure out the actual definition.
437 if (MacroName.size() == Macro.size())
440 // Note: GCC drops anything following an end-of-line character.
441 StringRef::size_type End = MacroBody.find_first_of("\n\r");
442 MacroBody = MacroBody.substr(0, End);
445 if (MacroNames && !Macros.count(MacroName))
446 MacroNames->push_back(MacroName);
447 Macros[MacroName] = std::make_pair(MacroBody, false);
451 /// \brief Check the preprocessor options deserialized from the control block
452 /// against the preprocessor options in an existing preprocessor.
454 /// \param Diags If non-null, produce diagnostics for any mismatches incurred.
455 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts,
456 const PreprocessorOptions &ExistingPPOpts,
457 DiagnosticsEngine *Diags,
458 FileManager &FileMgr,
459 std::string &SuggestedPredefines,
460 const LangOptions &LangOpts) {
461 // Check macro definitions.
462 MacroDefinitionsMap ASTFileMacros;
463 collectMacroDefinitions(PPOpts, ASTFileMacros);
464 MacroDefinitionsMap ExistingMacros;
465 SmallVector<StringRef, 4> ExistingMacroNames;
466 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames);
468 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
469 // Dig out the macro definition in the existing preprocessor options.
470 StringRef MacroName = ExistingMacroNames[I];
471 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
473 // Check whether we know anything about this macro name or not.
474 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/> >::iterator Known
475 = ASTFileMacros.find(MacroName);
476 if (Known == ASTFileMacros.end()) {
477 // FIXME: Check whether this identifier was referenced anywhere in the
478 // AST file. If so, we should reject the AST file. Unfortunately, this
479 // information isn't in the control block. What shall we do about it?
481 if (Existing.second) {
482 SuggestedPredefines += "#undef ";
483 SuggestedPredefines += MacroName.str();
484 SuggestedPredefines += '\n';
486 SuggestedPredefines += "#define ";
487 SuggestedPredefines += MacroName.str();
488 SuggestedPredefines += ' ';
489 SuggestedPredefines += Existing.first.str();
490 SuggestedPredefines += '\n';
495 // If the macro was defined in one but undef'd in the other, we have a
497 if (Existing.second != Known->second.second) {
499 Diags->Report(diag::err_pch_macro_def_undef)
500 << MacroName << Known->second.second;
505 // If the macro was #undef'd in both, or if the macro bodies are identical,
507 if (Existing.second || Existing.first == Known->second.first)
510 // The macro bodies differ; complain.
512 Diags->Report(diag::err_pch_macro_def_conflict)
513 << MacroName << Known->second.first << Existing.first;
518 // Check whether we're using predefines.
519 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines) {
521 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines;
526 // Detailed record is important since it is used for the module cache hash.
527 if (LangOpts.Modules &&
528 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord) {
530 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord;
535 // Compute the #include and #include_macros lines we need.
536 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) {
537 StringRef File = ExistingPPOpts.Includes[I];
538 if (File == ExistingPPOpts.ImplicitPCHInclude)
541 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File)
542 != PPOpts.Includes.end())
545 SuggestedPredefines += "#include \"";
546 SuggestedPredefines +=
547 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
548 SuggestedPredefines += "\"\n";
551 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) {
552 StringRef File = ExistingPPOpts.MacroIncludes[I];
553 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(),
555 != PPOpts.MacroIncludes.end())
558 SuggestedPredefines += "#__include_macros \"";
559 SuggestedPredefines +=
560 HeaderSearch::NormalizeDashIncludePath(File, FileMgr);
561 SuggestedPredefines += "\"\n##\n";
567 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
569 std::string &SuggestedPredefines) {
570 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts();
572 return checkPreprocessorOptions(PPOpts, ExistingPPOpts,
573 Complain? &Reader.Diags : nullptr,
579 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) {
580 PP.setCounterValue(Value);
583 //===----------------------------------------------------------------------===//
584 // AST reader implementation
585 //===----------------------------------------------------------------------===//
587 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener,
588 bool TakeOwnership) {
589 DeserializationListener = Listener;
590 OwnsDeserializationListener = TakeOwnership;
595 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) {
596 return serialization::ComputeHash(Sel);
600 std::pair<unsigned, unsigned>
601 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
602 using namespace llvm::support;
603 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
604 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
605 return std::make_pair(KeyLen, DataLen);
608 ASTSelectorLookupTrait::internal_key_type
609 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) {
610 using namespace llvm::support;
611 SelectorTable &SelTable = Reader.getContext().Selectors;
612 unsigned N = endian::readNext<uint16_t, little, unaligned>(d);
613 IdentifierInfo *FirstII = Reader.getLocalIdentifier(
614 F, endian::readNext<uint32_t, little, unaligned>(d));
616 return SelTable.getNullarySelector(FirstII);
618 return SelTable.getUnarySelector(FirstII);
620 SmallVector<IdentifierInfo *, 16> Args;
621 Args.push_back(FirstII);
622 for (unsigned I = 1; I != N; ++I)
623 Args.push_back(Reader.getLocalIdentifier(
624 F, endian::readNext<uint32_t, little, unaligned>(d)));
626 return SelTable.getSelector(N, Args.data());
629 ASTSelectorLookupTrait::data_type
630 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d,
632 using namespace llvm::support;
636 Result.ID = Reader.getGlobalSelectorID(
637 F, endian::readNext<uint32_t, little, unaligned>(d));
638 unsigned NumInstanceMethodsAndBits =
639 endian::readNext<uint16_t, little, unaligned>(d);
640 unsigned NumFactoryMethodsAndBits =
641 endian::readNext<uint16_t, little, unaligned>(d);
642 Result.InstanceBits = NumInstanceMethodsAndBits & 0x3;
643 Result.FactoryBits = NumFactoryMethodsAndBits & 0x3;
644 unsigned NumInstanceMethods = NumInstanceMethodsAndBits >> 2;
645 unsigned NumFactoryMethods = NumFactoryMethodsAndBits >> 2;
647 // Load instance methods
648 for (unsigned I = 0; I != NumInstanceMethods; ++I) {
649 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
650 F, endian::readNext<uint32_t, little, unaligned>(d)))
651 Result.Instance.push_back(Method);
654 // Load factory methods
655 for (unsigned I = 0; I != NumFactoryMethods; ++I) {
656 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>(
657 F, endian::readNext<uint32_t, little, unaligned>(d)))
658 Result.Factory.push_back(Method);
664 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) {
665 return llvm::HashString(a);
668 std::pair<unsigned, unsigned>
669 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) {
670 using namespace llvm::support;
671 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
672 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
673 return std::make_pair(KeyLen, DataLen);
676 ASTIdentifierLookupTraitBase::internal_key_type
677 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) {
678 assert(n >= 2 && d[n-1] == '\0');
679 return StringRef((const char*) d, n-1);
682 /// \brief Whether the given identifier is "interesting".
683 static bool isInterestingIdentifier(IdentifierInfo &II) {
684 return II.isPoisoned() ||
685 II.isExtensionToken() ||
686 II.getObjCOrBuiltinID() ||
687 II.hasRevertedTokenIDToIdentifier() ||
688 II.hadMacroDefinition() ||
689 II.getFETokenInfo<void>();
692 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k,
693 const unsigned char* d,
695 using namespace llvm::support;
696 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d);
697 bool IsInteresting = RawID & 0x01;
699 // Wipe out the "is interesting" bit.
702 IdentID ID = Reader.getGlobalIdentifierID(F, RawID);
703 if (!IsInteresting) {
704 // For uninteresting identifiers, just build the IdentifierInfo
705 // and associate it with the persistent ID.
706 IdentifierInfo *II = KnownII;
708 II = &Reader.getIdentifierTable().getOwn(k);
711 Reader.SetIdentifierInfo(ID, II);
712 if (!II->isFromAST()) {
713 bool WasInteresting = isInterestingIdentifier(*II);
716 II->setChangedSinceDeserialization();
718 Reader.markIdentifierUpToDate(II);
722 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d);
723 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d);
724 bool CPlusPlusOperatorKeyword = Bits & 0x01;
726 bool HasRevertedTokenIDToIdentifier = Bits & 0x01;
728 bool Poisoned = Bits & 0x01;
730 bool ExtensionToken = Bits & 0x01;
732 bool hasSubmoduleMacros = Bits & 0x01;
734 bool hadMacroDefinition = Bits & 0x01;
737 assert(Bits == 0 && "Extra bits in the identifier?");
740 // Build the IdentifierInfo itself and link the identifier ID with
741 // the new IdentifierInfo.
742 IdentifierInfo *II = KnownII;
744 II = &Reader.getIdentifierTable().getOwn(StringRef(k));
747 Reader.markIdentifierUpToDate(II);
748 if (!II->isFromAST()) {
749 bool WasInteresting = isInterestingIdentifier(*II);
752 II->setChangedSinceDeserialization();
755 // Set or check the various bits in the IdentifierInfo structure.
756 // Token IDs are read-only.
757 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier)
758 II->RevertTokenIDToIdentifier();
759 II->setObjCOrBuiltinID(ObjCOrBuiltinID);
760 assert(II->isExtensionToken() == ExtensionToken &&
761 "Incorrect extension token flag");
762 (void)ExtensionToken;
764 II->setIsPoisoned(true);
765 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword &&
766 "Incorrect C++ operator keyword flag");
767 (void)CPlusPlusOperatorKeyword;
769 // If this identifier is a macro, deserialize the macro
771 if (hadMacroDefinition) {
772 uint32_t MacroDirectivesOffset =
773 endian::readNext<uint32_t, little, unaligned>(d);
775 SmallVector<uint32_t, 8> LocalMacroIDs;
776 if (hasSubmoduleMacros) {
777 while (uint32_t LocalMacroID =
778 endian::readNext<uint32_t, little, unaligned>(d)) {
780 LocalMacroIDs.push_back(LocalMacroID);
785 if (F.Kind == MK_Module) {
786 // Macro definitions are stored from newest to oldest, so reverse them
787 // before registering them.
788 llvm::SmallVector<unsigned, 8> MacroSizes;
789 for (SmallVectorImpl<uint32_t>::iterator
790 I = LocalMacroIDs.begin(), E = LocalMacroIDs.end(); I != E; /**/) {
793 static const uint32_t HasOverridesFlag = 0x80000000U;
794 if (I + 1 != E && (I[1] & HasOverridesFlag))
795 Size += 1 + (I[1] & ~HasOverridesFlag);
797 MacroSizes.push_back(Size);
801 SmallVectorImpl<uint32_t>::iterator I = LocalMacroIDs.end();
802 for (SmallVectorImpl<unsigned>::reverse_iterator SI = MacroSizes.rbegin(),
803 SE = MacroSizes.rend();
807 uint32_t LocalMacroID = *I;
808 llvm::ArrayRef<uint32_t> Overrides;
810 Overrides = llvm::makeArrayRef(&I[2], *SI - 2);
811 Reader.addPendingMacroFromModule(II, &F, LocalMacroID, Overrides);
813 assert(I == LocalMacroIDs.begin());
815 Reader.addPendingMacroFromPCH(II, &F, MacroDirectivesOffset);
819 Reader.SetIdentifierInfo(ID, II);
821 // Read all of the declarations visible at global scope with this
824 SmallVector<uint32_t, 4> DeclIDs;
825 for (; DataLen > 0; DataLen -= 4)
826 DeclIDs.push_back(Reader.getGlobalDeclID(
827 F, endian::readNext<uint32_t, little, unaligned>(d)));
828 Reader.SetGloballyVisibleDecls(II, DeclIDs);
835 ASTDeclContextNameLookupTrait::ComputeHash(const DeclNameKey &Key) const {
836 llvm::FoldingSetNodeID ID;
837 ID.AddInteger(Key.Kind);
840 case DeclarationName::Identifier:
841 case DeclarationName::CXXLiteralOperatorName:
842 ID.AddString(((IdentifierInfo*)Key.Data)->getName());
844 case DeclarationName::ObjCZeroArgSelector:
845 case DeclarationName::ObjCOneArgSelector:
846 case DeclarationName::ObjCMultiArgSelector:
847 ID.AddInteger(serialization::ComputeHash(Selector(Key.Data)));
849 case DeclarationName::CXXOperatorName:
850 ID.AddInteger((OverloadedOperatorKind)Key.Data);
852 case DeclarationName::CXXConstructorName:
853 case DeclarationName::CXXDestructorName:
854 case DeclarationName::CXXConversionFunctionName:
855 case DeclarationName::CXXUsingDirective:
859 return ID.ComputeHash();
862 ASTDeclContextNameLookupTrait::internal_key_type
863 ASTDeclContextNameLookupTrait::GetInternalKey(
864 const external_key_type& Name) const {
866 Key.Kind = Name.getNameKind();
867 switch (Name.getNameKind()) {
868 case DeclarationName::Identifier:
869 Key.Data = (uint64_t)Name.getAsIdentifierInfo();
871 case DeclarationName::ObjCZeroArgSelector:
872 case DeclarationName::ObjCOneArgSelector:
873 case DeclarationName::ObjCMultiArgSelector:
874 Key.Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr();
876 case DeclarationName::CXXOperatorName:
877 Key.Data = Name.getCXXOverloadedOperator();
879 case DeclarationName::CXXLiteralOperatorName:
880 Key.Data = (uint64_t)Name.getCXXLiteralIdentifier();
882 case DeclarationName::CXXConstructorName:
883 case DeclarationName::CXXDestructorName:
884 case DeclarationName::CXXConversionFunctionName:
885 case DeclarationName::CXXUsingDirective:
893 std::pair<unsigned, unsigned>
894 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char*& d) {
895 using namespace llvm::support;
896 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d);
897 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d);
898 return std::make_pair(KeyLen, DataLen);
901 ASTDeclContextNameLookupTrait::internal_key_type
902 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char* d, unsigned) {
903 using namespace llvm::support;
906 Key.Kind = (DeclarationName::NameKind)*d++;
908 case DeclarationName::Identifier:
909 Key.Data = (uint64_t)Reader.getLocalIdentifier(
910 F, endian::readNext<uint32_t, little, unaligned>(d));
912 case DeclarationName::ObjCZeroArgSelector:
913 case DeclarationName::ObjCOneArgSelector:
914 case DeclarationName::ObjCMultiArgSelector:
916 (uint64_t)Reader.getLocalSelector(
917 F, endian::readNext<uint32_t, little, unaligned>(
918 d)).getAsOpaquePtr();
920 case DeclarationName::CXXOperatorName:
921 Key.Data = *d++; // OverloadedOperatorKind
923 case DeclarationName::CXXLiteralOperatorName:
924 Key.Data = (uint64_t)Reader.getLocalIdentifier(
925 F, endian::readNext<uint32_t, little, unaligned>(d));
927 case DeclarationName::CXXConstructorName:
928 case DeclarationName::CXXDestructorName:
929 case DeclarationName::CXXConversionFunctionName:
930 case DeclarationName::CXXUsingDirective:
938 ASTDeclContextNameLookupTrait::data_type
939 ASTDeclContextNameLookupTrait::ReadData(internal_key_type,
940 const unsigned char* d,
942 using namespace llvm::support;
943 unsigned NumDecls = endian::readNext<uint16_t, little, unaligned>(d);
944 LE32DeclID *Start = reinterpret_cast<LE32DeclID *>(
945 const_cast<unsigned char *>(d));
946 return std::make_pair(Start, Start + NumDecls);
949 bool ASTReader::ReadDeclContextStorage(ModuleFile &M,
950 BitstreamCursor &Cursor,
951 const std::pair<uint64_t, uint64_t> &Offsets,
952 DeclContextInfo &Info) {
953 SavedStreamPosition SavedPosition(Cursor);
954 // First the lexical decls.
955 if (Offsets.first != 0) {
956 Cursor.JumpToBit(Offsets.first);
960 unsigned Code = Cursor.ReadCode();
961 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
962 if (RecCode != DECL_CONTEXT_LEXICAL) {
963 Error("Expected lexical block");
967 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair*>(Blob.data());
968 Info.NumLexicalDecls = Blob.size() / sizeof(KindDeclIDPair);
971 // Now the lookup table.
972 if (Offsets.second != 0) {
973 Cursor.JumpToBit(Offsets.second);
977 unsigned Code = Cursor.ReadCode();
978 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob);
979 if (RecCode != DECL_CONTEXT_VISIBLE) {
980 Error("Expected visible lookup table block");
983 Info.NameLookupTableData = ASTDeclContextNameLookupTable::Create(
984 (const unsigned char *)Blob.data() + Record[0],
985 (const unsigned char *)Blob.data() + sizeof(uint32_t),
986 (const unsigned char *)Blob.data(),
987 ASTDeclContextNameLookupTrait(*this, M));
993 void ASTReader::Error(StringRef Msg) {
994 Error(diag::err_fe_pch_malformed, Msg);
995 if (Context.getLangOpts().Modules && !Diags.isDiagnosticInFlight()) {
996 Diag(diag::note_module_cache_path)
997 << PP.getHeaderSearchInfo().getModuleCachePath();
1001 void ASTReader::Error(unsigned DiagID,
1002 StringRef Arg1, StringRef Arg2) {
1003 if (Diags.isDiagnosticInFlight())
1004 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2);
1006 Diag(DiagID) << Arg1 << Arg2;
1009 //===----------------------------------------------------------------------===//
1010 // Source Manager Deserialization
1011 //===----------------------------------------------------------------------===//
1013 /// \brief Read the line table in the source manager block.
1014 /// \returns true if there was an error.
1015 bool ASTReader::ParseLineTable(ModuleFile &F,
1016 SmallVectorImpl<uint64_t> &Record) {
1018 LineTableInfo &LineTable = SourceMgr.getLineTable();
1020 // Parse the file names
1021 std::map<int, int> FileIDs;
1022 for (int I = 0, N = Record[Idx++]; I != N; ++I) {
1023 // Extract the file name
1024 unsigned FilenameLen = Record[Idx++];
1025 std::string Filename(&Record[Idx], &Record[Idx] + FilenameLen);
1027 MaybeAddSystemRootToFilename(F, Filename);
1028 FileIDs[I] = LineTable.getLineTableFilenameID(Filename);
1031 // Parse the line entries
1032 std::vector<LineEntry> Entries;
1033 while (Idx < Record.size()) {
1034 int FID = Record[Idx++];
1035 assert(FID >= 0 && "Serialized line entries for non-local file.");
1036 // Remap FileID from 1-based old view.
1037 FID += F.SLocEntryBaseID - 1;
1039 // Extract the line entries
1040 unsigned NumEntries = Record[Idx++];
1041 assert(NumEntries && "Numentries is 00000");
1043 Entries.reserve(NumEntries);
1044 for (unsigned I = 0; I != NumEntries; ++I) {
1045 unsigned FileOffset = Record[Idx++];
1046 unsigned LineNo = Record[Idx++];
1047 int FilenameID = FileIDs[Record[Idx++]];
1048 SrcMgr::CharacteristicKind FileKind
1049 = (SrcMgr::CharacteristicKind)Record[Idx++];
1050 unsigned IncludeOffset = Record[Idx++];
1051 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID,
1052 FileKind, IncludeOffset));
1054 LineTable.AddEntry(FileID::get(FID), Entries);
1060 /// \brief Read a source manager block
1061 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) {
1062 using namespace SrcMgr;
1064 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor;
1066 // Set the source-location entry cursor to the current position in
1067 // the stream. This cursor will be used to read the contents of the
1068 // source manager block initially, and then lazily read
1069 // source-location entries as needed.
1070 SLocEntryCursor = F.Stream;
1072 // The stream itself is going to skip over the source manager block.
1073 if (F.Stream.SkipBlock()) {
1074 Error("malformed block record in AST file");
1078 // Enter the source manager block.
1079 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) {
1080 Error("malformed source manager block record in AST file");
1086 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks();
1089 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1090 case llvm::BitstreamEntry::Error:
1091 Error("malformed block record in AST file");
1093 case llvm::BitstreamEntry::EndBlock:
1095 case llvm::BitstreamEntry::Record:
1096 // The interesting case.
1103 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) {
1104 default: // Default behavior: ignore.
1107 case SM_SLOC_FILE_ENTRY:
1108 case SM_SLOC_BUFFER_ENTRY:
1109 case SM_SLOC_EXPANSION_ENTRY:
1110 // Once we hit one of the source location entries, we're done.
1116 /// \brief If a header file is not found at the path that we expect it to be
1117 /// and the PCH file was moved from its original location, try to resolve the
1118 /// file by assuming that header+PCH were moved together and the header is in
1119 /// the same place relative to the PCH.
1121 resolveFileRelativeToOriginalDir(const std::string &Filename,
1122 const std::string &OriginalDir,
1123 const std::string &CurrDir) {
1124 assert(OriginalDir != CurrDir &&
1125 "No point trying to resolve the file if the PCH dir didn't change");
1126 using namespace llvm::sys;
1127 SmallString<128> filePath(Filename);
1128 fs::make_absolute(filePath);
1129 assert(path::is_absolute(OriginalDir));
1130 SmallString<128> currPCHPath(CurrDir);
1132 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)),
1133 fileDirE = path::end(path::parent_path(filePath));
1134 path::const_iterator origDirI = path::begin(OriginalDir),
1135 origDirE = path::end(OriginalDir);
1136 // Skip the common path components from filePath and OriginalDir.
1137 while (fileDirI != fileDirE && origDirI != origDirE &&
1138 *fileDirI == *origDirI) {
1142 for (; origDirI != origDirE; ++origDirI)
1143 path::append(currPCHPath, "..");
1144 path::append(currPCHPath, fileDirI, fileDirE);
1145 path::append(currPCHPath, path::filename(Filename));
1146 return currPCHPath.str();
1149 bool ASTReader::ReadSLocEntry(int ID) {
1153 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1154 Error("source location entry ID out-of-range for AST file");
1158 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1159 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]);
1160 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor;
1161 unsigned BaseOffset = F->SLocEntryBaseOffset;
1163 ++NumSLocEntriesRead;
1164 llvm::BitstreamEntry Entry = SLocEntryCursor.advance();
1165 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1166 Error("incorrectly-formatted source location entry in AST file");
1172 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) {
1174 Error("incorrectly-formatted source location entry in AST file");
1177 case SM_SLOC_FILE_ENTRY: {
1178 // We will detect whether a file changed and return 'Failure' for it, but
1179 // we will also try to fail gracefully by setting up the SLocEntry.
1180 unsigned InputID = Record[4];
1181 InputFile IF = getInputFile(*F, InputID);
1182 const FileEntry *File = IF.getFile();
1183 bool OverriddenBuffer = IF.isOverridden();
1185 // Note that we only check if a File was returned. If it was out-of-date
1186 // we have complained but we will continue creating a FileID to recover
1191 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1192 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) {
1193 // This is the module's main file.
1194 IncludeLoc = getImportLocation(F);
1196 SrcMgr::CharacteristicKind
1197 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1198 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter,
1199 ID, BaseOffset + Record[0]);
1200 SrcMgr::FileInfo &FileInfo =
1201 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile());
1202 FileInfo.NumCreatedFIDs = Record[5];
1204 FileInfo.setHasLineDirectives();
1206 const DeclID *FirstDecl = F->FileSortedDecls + Record[6];
1207 unsigned NumFileDecls = Record[7];
1209 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?");
1210 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl,
1214 const SrcMgr::ContentCache *ContentCache
1215 = SourceMgr.getOrCreateContentCache(File,
1216 /*isSystemFile=*/FileCharacter != SrcMgr::C_User);
1217 if (OverriddenBuffer && !ContentCache->BufferOverridden &&
1218 ContentCache->ContentsEntry == ContentCache->OrigEntry) {
1219 unsigned Code = SLocEntryCursor.ReadCode();
1221 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob);
1223 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1224 Error("AST record has invalid code");
1228 llvm::MemoryBuffer *Buffer
1229 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), File->getName());
1230 SourceMgr.overrideFileContents(File, Buffer);
1236 case SM_SLOC_BUFFER_ENTRY: {
1237 const char *Name = Blob.data();
1238 unsigned Offset = Record[0];
1239 SrcMgr::CharacteristicKind
1240 FileCharacter = (SrcMgr::CharacteristicKind)Record[2];
1241 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]);
1242 if (IncludeLoc.isInvalid() && F->Kind == MK_Module) {
1243 IncludeLoc = getImportLocation(F);
1245 unsigned Code = SLocEntryCursor.ReadCode();
1248 = SLocEntryCursor.readRecord(Code, Record, &Blob);
1250 if (RecCode != SM_SLOC_BUFFER_BLOB) {
1251 Error("AST record has invalid code");
1255 llvm::MemoryBuffer *Buffer
1256 = llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name);
1257 SourceMgr.createFileID(Buffer, FileCharacter, ID, BaseOffset + Offset,
1262 case SM_SLOC_EXPANSION_ENTRY: {
1263 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]);
1264 SourceMgr.createExpansionLoc(SpellingLoc,
1265 ReadSourceLocation(*F, Record[2]),
1266 ReadSourceLocation(*F, Record[3]),
1269 BaseOffset + Record[0]);
1277 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) {
1279 return std::make_pair(SourceLocation(), "");
1281 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) {
1282 Error("source location entry ID out-of-range for AST file");
1283 return std::make_pair(SourceLocation(), "");
1286 // Find which module file this entry lands in.
1287 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
1288 if (M->Kind != MK_Module)
1289 return std::make_pair(SourceLocation(), "");
1291 // FIXME: Can we map this down to a particular submodule? That would be
1293 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName));
1296 /// \brief Find the location where the module F is imported.
1297 SourceLocation ASTReader::getImportLocation(ModuleFile *F) {
1298 if (F->ImportLoc.isValid())
1299 return F->ImportLoc;
1301 // Otherwise we have a PCH. It's considered to be "imported" at the first
1302 // location of its includer.
1303 if (F->ImportedBy.empty() || !F->ImportedBy[0]) {
1304 // Main file is the importer.
1305 assert(!SourceMgr.getMainFileID().isInvalid() && "missing main file");
1306 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
1308 return F->ImportedBy[0]->FirstLoc;
1311 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
1312 /// specified cursor. Read the abbreviations that are at the top of the block
1313 /// and then leave the cursor pointing into the block.
1314 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) {
1315 if (Cursor.EnterSubBlock(BlockID)) {
1316 Error("malformed block record in AST file");
1321 uint64_t Offset = Cursor.GetCurrentBitNo();
1322 unsigned Code = Cursor.ReadCode();
1324 // We expect all abbrevs to be at the start of the block.
1325 if (Code != llvm::bitc::DEFINE_ABBREV) {
1326 Cursor.JumpToBit(Offset);
1329 Cursor.ReadAbbrevRecord();
1333 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record,
1337 Tok.setLocation(ReadSourceLocation(F, Record, Idx));
1338 Tok.setLength(Record[Idx++]);
1339 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++]))
1340 Tok.setIdentifierInfo(II);
1341 Tok.setKind((tok::TokenKind)Record[Idx++]);
1342 Tok.setFlag((Token::TokenFlags)Record[Idx++]);
1346 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {
1347 BitstreamCursor &Stream = F.MacroCursor;
1349 // Keep track of where we are in the stream, then jump back there
1350 // after reading this macro.
1351 SavedStreamPosition SavedPosition(Stream);
1353 Stream.JumpToBit(Offset);
1355 SmallVector<IdentifierInfo*, 16> MacroArgs;
1356 MacroInfo *Macro = nullptr;
1359 // Advance to the next record, but if we get to the end of the block, don't
1360 // pop it (removing all the abbreviations from the cursor) since we want to
1361 // be able to reseek within the block and read entries.
1362 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
1363 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags);
1365 switch (Entry.Kind) {
1366 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1367 case llvm::BitstreamEntry::Error:
1368 Error("malformed block record in AST file");
1370 case llvm::BitstreamEntry::EndBlock:
1372 case llvm::BitstreamEntry::Record:
1373 // The interesting case.
1379 PreprocessorRecordTypes RecType =
1380 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record);
1382 case PP_MACRO_DIRECTIVE_HISTORY:
1385 case PP_MACRO_OBJECT_LIKE:
1386 case PP_MACRO_FUNCTION_LIKE: {
1387 // If we already have a macro, that means that we've hit the end
1388 // of the definition of the macro we were looking for. We're
1393 unsigned NextIndex = 1; // Skip identifier ID.
1394 SubmoduleID SubModID = getGlobalSubmoduleID(F, Record[NextIndex++]);
1395 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex);
1396 MacroInfo *MI = PP.AllocateDeserializedMacroInfo(Loc, SubModID);
1397 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));
1398 MI->setIsUsed(Record[NextIndex++]);
1399 MI->setUsedForHeaderGuard(Record[NextIndex++]);
1401 if (RecType == PP_MACRO_FUNCTION_LIKE) {
1402 // Decode function-like macro info.
1403 bool isC99VarArgs = Record[NextIndex++];
1404 bool isGNUVarArgs = Record[NextIndex++];
1405 bool hasCommaPasting = Record[NextIndex++];
1407 unsigned NumArgs = Record[NextIndex++];
1408 for (unsigned i = 0; i != NumArgs; ++i)
1409 MacroArgs.push_back(getLocalIdentifier(F, Record[NextIndex++]));
1411 // Install function-like macro info.
1412 MI->setIsFunctionLike();
1413 if (isC99VarArgs) MI->setIsC99Varargs();
1414 if (isGNUVarArgs) MI->setIsGNUVarargs();
1415 if (hasCommaPasting) MI->setHasCommaPasting();
1416 MI->setArgumentList(MacroArgs.data(), MacroArgs.size(),
1417 PP.getPreprocessorAllocator());
1420 // Remember that we saw this macro last so that we add the tokens that
1421 // form its body to it.
1424 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() &&
1425 Record[NextIndex]) {
1426 // We have a macro definition. Register the association
1427 PreprocessedEntityID
1428 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]);
1429 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
1430 PreprocessingRecord::PPEntityID
1431 PPID = PPRec.getPPEntityID(GlobalID-1, /*isLoaded=*/true);
1432 MacroDefinition *PPDef =
1433 cast_or_null<MacroDefinition>(PPRec.getPreprocessedEntity(PPID));
1435 PPRec.RegisterMacroDefinition(Macro, PPDef);
1443 // If we see a TOKEN before a PP_MACRO_*, then the file is
1444 // erroneous, just pretend we didn't see this.
1448 Token Tok = ReadToken(F, Record, Idx);
1449 Macro->AddTokenToBody(Tok);
1456 PreprocessedEntityID
1457 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const {
1458 ContinuousRangeMap<uint32_t, int, 2>::const_iterator
1459 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS);
1460 assert(I != M.PreprocessedEntityRemap.end()
1461 && "Invalid index into preprocessed entity index remap");
1463 return LocalID + I->second;
1466 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) {
1467 return llvm::hash_combine(ikey.Size, ikey.ModTime);
1470 HeaderFileInfoTrait::internal_key_type
1471 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) {
1472 internal_key_type ikey = { FE->getSize(), FE->getModificationTime(),
1477 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) {
1478 if (a.Size != b.Size || a.ModTime != b.ModTime)
1481 if (strcmp(a.Filename, b.Filename) == 0)
1484 // Determine whether the actual files are equivalent.
1485 FileManager &FileMgr = Reader.getFileManager();
1486 const FileEntry *FEA = FileMgr.getFile(a.Filename);
1487 const FileEntry *FEB = FileMgr.getFile(b.Filename);
1488 return (FEA && FEA == FEB);
1491 std::pair<unsigned, unsigned>
1492 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) {
1493 using namespace llvm::support;
1494 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d);
1495 unsigned DataLen = (unsigned) *d++;
1496 return std::make_pair(KeyLen, DataLen);
1499 HeaderFileInfoTrait::internal_key_type
1500 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) {
1501 using namespace llvm::support;
1502 internal_key_type ikey;
1503 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d));
1504 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d));
1505 ikey.Filename = (const char *)d;
1509 HeaderFileInfoTrait::data_type
1510 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d,
1512 const unsigned char *End = d + DataLen;
1513 using namespace llvm::support;
1515 unsigned Flags = *d++;
1516 HFI.HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>
1517 ((Flags >> 6) & 0x03);
1518 HFI.isImport = (Flags >> 5) & 0x01;
1519 HFI.isPragmaOnce = (Flags >> 4) & 0x01;
1520 HFI.DirInfo = (Flags >> 2) & 0x03;
1521 HFI.Resolved = (Flags >> 1) & 0x01;
1522 HFI.IndexHeaderMapHeader = Flags & 0x01;
1523 HFI.NumIncludes = endian::readNext<uint16_t, little, unaligned>(d);
1524 HFI.ControllingMacroID = Reader.getGlobalIdentifierID(
1525 M, endian::readNext<uint32_t, little, unaligned>(d));
1526 if (unsigned FrameworkOffset =
1527 endian::readNext<uint32_t, little, unaligned>(d)) {
1528 // The framework offset is 1 greater than the actual offset,
1529 // since 0 is used as an indicator for "no framework name".
1530 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1);
1531 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName);
1535 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d);
1537 // This header is part of a module. Associate it with the module to enable
1538 // implicit module import.
1539 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
1540 Module *Mod = Reader.getSubmodule(GlobalSMID);
1541 HFI.isModuleHeader = true;
1542 FileManager &FileMgr = Reader.getFileManager();
1544 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
1545 ModMap.addHeader(Mod, FileMgr.getFile(key.Filename), HFI.getHeaderRole());
1549 assert(End == d && "Wrong data length in HeaderFileInfo deserialization");
1552 // This HeaderFileInfo was externally loaded.
1553 HFI.External = true;
1558 ASTReader::addPendingMacroFromModule(IdentifierInfo *II, ModuleFile *M,
1559 GlobalMacroID GMacID,
1560 llvm::ArrayRef<SubmoduleID> Overrides) {
1561 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1562 SubmoduleID *OverrideData = nullptr;
1563 if (!Overrides.empty()) {
1564 OverrideData = new (Context) SubmoduleID[Overrides.size() + 1];
1565 OverrideData[0] = Overrides.size();
1566 for (unsigned I = 0; I != Overrides.size(); ++I)
1567 OverrideData[I + 1] = getGlobalSubmoduleID(*M, Overrides[I]);
1569 PendingMacroIDs[II].push_back(PendingMacroInfo(M, GMacID, OverrideData));
1572 void ASTReader::addPendingMacroFromPCH(IdentifierInfo *II,
1574 uint64_t MacroDirectivesOffset) {
1575 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard");
1576 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
1579 void ASTReader::ReadDefinedMacros() {
1580 // Note that we are loading defined macros.
1581 Deserializing Macros(this);
1583 for (ModuleReverseIterator I = ModuleMgr.rbegin(),
1584 E = ModuleMgr.rend(); I != E; ++I) {
1585 BitstreamCursor &MacroCursor = (*I)->MacroCursor;
1587 // If there was no preprocessor block, skip this file.
1588 if (!MacroCursor.getBitStreamReader())
1591 BitstreamCursor Cursor = MacroCursor;
1592 Cursor.JumpToBit((*I)->MacroStartOffset);
1596 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks();
1599 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
1600 case llvm::BitstreamEntry::Error:
1601 Error("malformed block record in AST file");
1603 case llvm::BitstreamEntry::EndBlock:
1606 case llvm::BitstreamEntry::Record:
1608 switch (Cursor.readRecord(E.ID, Record)) {
1609 default: // Default behavior: ignore.
1612 case PP_MACRO_OBJECT_LIKE:
1613 case PP_MACRO_FUNCTION_LIKE:
1614 getLocalIdentifier(**I, Record[0]);
1629 /// \brief Visitor class used to look up identifirs in an AST file.
1630 class IdentifierLookupVisitor {
1632 unsigned PriorGeneration;
1633 unsigned &NumIdentifierLookups;
1634 unsigned &NumIdentifierLookupHits;
1635 IdentifierInfo *Found;
1638 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration,
1639 unsigned &NumIdentifierLookups,
1640 unsigned &NumIdentifierLookupHits)
1641 : Name(Name), PriorGeneration(PriorGeneration),
1642 NumIdentifierLookups(NumIdentifierLookups),
1643 NumIdentifierLookupHits(NumIdentifierLookupHits),
1648 static bool visit(ModuleFile &M, void *UserData) {
1649 IdentifierLookupVisitor *This
1650 = static_cast<IdentifierLookupVisitor *>(UserData);
1652 // If we've already searched this module file, skip it now.
1653 if (M.Generation <= This->PriorGeneration)
1656 ASTIdentifierLookupTable *IdTable
1657 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable;
1661 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(),
1663 ++This->NumIdentifierLookups;
1664 ASTIdentifierLookupTable::iterator Pos = IdTable->find(This->Name,&Trait);
1665 if (Pos == IdTable->end())
1668 // Dereferencing the iterator has the effect of building the
1669 // IdentifierInfo node and populating it with the various
1670 // declarations it needs.
1671 ++This->NumIdentifierLookupHits;
1676 // \brief Retrieve the identifier info found within the module
1678 IdentifierInfo *getIdentifierInfo() const { return Found; }
1682 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) {
1683 // Note that we are loading an identifier.
1684 Deserializing AnIdentifier(this);
1686 unsigned PriorGeneration = 0;
1687 if (getContext().getLangOpts().Modules)
1688 PriorGeneration = IdentifierGeneration[&II];
1690 // If there is a global index, look there first to determine which modules
1691 // provably do not have any results for this identifier.
1692 GlobalModuleIndex::HitSet Hits;
1693 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
1694 if (!loadGlobalIndex()) {
1695 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) {
1700 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration,
1701 NumIdentifierLookups,
1702 NumIdentifierLookupHits);
1703 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
1704 markIdentifierUpToDate(&II);
1707 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) {
1711 II->setOutOfDate(false);
1713 // Update the generation for this identifier.
1714 if (getContext().getLangOpts().Modules)
1715 IdentifierGeneration[II] = getGeneration();
1718 struct ASTReader::ModuleMacroInfo {
1719 SubmoduleID SubModID;
1721 SubmoduleID *Overrides;
1722 // FIXME: Remove this.
1725 bool isDefine() const { return MI; }
1727 SubmoduleID getSubmoduleID() const { return SubModID; }
1729 llvm::ArrayRef<SubmoduleID> getOverriddenSubmodules() const {
1731 return llvm::ArrayRef<SubmoduleID>();
1732 return llvm::makeArrayRef(Overrides + 1, *Overrides);
1735 DefMacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const {
1738 return PP.AllocateDefMacroDirective(MI, ImportLoc, /*isImported=*/true);
1742 ASTReader::ModuleMacroInfo *
1743 ASTReader::getModuleMacro(const PendingMacroInfo &PMInfo) {
1744 ModuleMacroInfo Info;
1746 uint32_t ID = PMInfo.ModuleMacroData.MacID;
1748 // Macro undefinition.
1749 Info.SubModID = getGlobalSubmoduleID(*PMInfo.M, ID >> 1);
1752 // Macro definition.
1753 GlobalMacroID GMacID = getGlobalMacroID(*PMInfo.M, ID >> 1);
1756 // If this macro has already been loaded, don't do so again.
1757 // FIXME: This is highly dubious. Multiple macro definitions can have the
1758 // same MacroInfo (and hence the same GMacID) due to #pragma push_macro etc.
1759 if (MacrosLoaded[GMacID - NUM_PREDEF_MACRO_IDS])
1762 Info.MI = getMacro(GMacID);
1763 Info.SubModID = Info.MI->getOwningModuleID();
1765 Info.Overrides = PMInfo.ModuleMacroData.Overrides;
1768 return new (Context) ModuleMacroInfo(Info);
1771 void ASTReader::resolvePendingMacro(IdentifierInfo *II,
1772 const PendingMacroInfo &PMInfo) {
1775 if (PMInfo.M->Kind != MK_Module) {
1776 installPCHMacroDirectives(II, *PMInfo.M,
1777 PMInfo.PCHMacroData.MacroDirectivesOffset);
1783 ModuleMacroInfo *MMI = getModuleMacro(PMInfo);
1787 Module *Owner = getSubmodule(MMI->getSubmoduleID());
1788 if (Owner && Owner->NameVisibility == Module::Hidden) {
1789 // Macros in the owning module are hidden. Just remember this macro to
1790 // install if we make this module visible.
1791 HiddenNamesMap[Owner].HiddenMacros.insert(std::make_pair(II, MMI));
1793 installImportedMacro(II, MMI, Owner);
1797 void ASTReader::installPCHMacroDirectives(IdentifierInfo *II,
1798 ModuleFile &M, uint64_t Offset) {
1799 assert(M.Kind != MK_Module);
1801 BitstreamCursor &Cursor = M.MacroCursor;
1802 SavedStreamPosition SavedPosition(Cursor);
1803 Cursor.JumpToBit(Offset);
1805 llvm::BitstreamEntry Entry =
1806 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
1807 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1808 Error("malformed block record in AST file");
1813 PreprocessorRecordTypes RecType =
1814 (PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record);
1815 if (RecType != PP_MACRO_DIRECTIVE_HISTORY) {
1816 Error("malformed block record in AST file");
1820 // Deserialize the macro directives history in reverse source-order.
1821 MacroDirective *Latest = nullptr, *Earliest = nullptr;
1822 unsigned Idx = 0, N = Record.size();
1824 MacroDirective *MD = nullptr;
1825 SourceLocation Loc = ReadSourceLocation(M, Record, Idx);
1826 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++];
1828 case MacroDirective::MD_Define: {
1829 GlobalMacroID GMacID = getGlobalMacroID(M, Record[Idx++]);
1830 MacroInfo *MI = getMacro(GMacID);
1831 bool isImported = Record[Idx++];
1832 bool isAmbiguous = Record[Idx++];
1833 DefMacroDirective *DefMD =
1834 PP.AllocateDefMacroDirective(MI, Loc, isImported);
1835 DefMD->setAmbiguous(isAmbiguous);
1839 case MacroDirective::MD_Undefine:
1840 MD = PP.AllocateUndefMacroDirective(Loc);
1842 case MacroDirective::MD_Visibility: {
1843 bool isPublic = Record[Idx++];
1844 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
1852 Earliest->setPrevious(MD);
1856 PP.setLoadedMacroDirective(II, Latest);
1859 /// \brief For the given macro definitions, check if they are both in system
1861 static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI,
1862 Module *NewOwner, ASTReader &Reader) {
1863 assert(PrevMI && NewMI);
1864 Module *PrevOwner = nullptr;
1865 if (SubmoduleID PrevModID = PrevMI->getOwningModuleID())
1866 PrevOwner = Reader.getSubmodule(PrevModID);
1867 SourceManager &SrcMgr = Reader.getSourceManager();
1869 = PrevOwner? PrevOwner->IsSystem
1870 : SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc());
1872 = NewOwner? NewOwner->IsSystem
1873 : SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc());
1874 if (PrevOwner && PrevOwner == NewOwner)
1876 return PrevInSystem && NewInSystem;
1879 void ASTReader::removeOverriddenMacros(IdentifierInfo *II,
1880 AmbiguousMacros &Ambig,
1881 llvm::ArrayRef<SubmoduleID> Overrides) {
1882 for (unsigned OI = 0, ON = Overrides.size(); OI != ON; ++OI) {
1883 SubmoduleID OwnerID = Overrides[OI];
1885 // If this macro is not yet visible, remove it from the hidden names list.
1886 Module *Owner = getSubmodule(OwnerID);
1887 HiddenNames &Hidden = HiddenNamesMap[Owner];
1888 HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II);
1889 if (HI != Hidden.HiddenMacros.end()) {
1890 auto SubOverrides = HI->second->getOverriddenSubmodules();
1891 Hidden.HiddenMacros.erase(HI);
1892 removeOverriddenMacros(II, Ambig, SubOverrides);
1895 // If this macro is already in our list of conflicts, remove it from there.
1897 std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective *MD) {
1898 return MD->getInfo()->getOwningModuleID() == OwnerID;
1904 ASTReader::AmbiguousMacros *
1905 ASTReader::removeOverriddenMacros(IdentifierInfo *II,
1906 llvm::ArrayRef<SubmoduleID> Overrides) {
1907 MacroDirective *Prev = PP.getMacroDirective(II);
1908 if (!Prev && Overrides.empty())
1911 DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective()
1913 if (PrevDef && PrevDef->isAmbiguous()) {
1914 // We had a prior ambiguity. Check whether we resolve it (or make it worse).
1915 AmbiguousMacros &Ambig = AmbiguousMacroDefs[II];
1916 Ambig.push_back(PrevDef);
1918 removeOverriddenMacros(II, Ambig, Overrides);
1923 AmbiguousMacroDefs.erase(II);
1925 // There's no ambiguity yet. Maybe we're introducing one.
1926 AmbiguousMacros Ambig;
1928 Ambig.push_back(PrevDef);
1930 removeOverriddenMacros(II, Ambig, Overrides);
1932 if (!Ambig.empty()) {
1933 AmbiguousMacros &Result = AmbiguousMacroDefs[II];
1934 std::swap(Result, Ambig);
1939 // We ended up with no ambiguity.
1943 void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo *MMI,
1945 assert(II && Owner);
1947 SourceLocation ImportLoc = Owner->MacroVisibilityLoc;
1948 if (ImportLoc.isInvalid()) {
1949 // FIXME: If we made macros from this module visible but didn't provide a
1950 // source location for the import, we don't have a location for the macro.
1951 // Use the location at which the containing module file was first imported
1953 ImportLoc = MMI->F->DirectImportLoc;
1954 assert(ImportLoc.isValid() && "no import location for a visible macro?");
1957 AmbiguousMacros *Prev =
1958 removeOverriddenMacros(II, MMI->getOverriddenSubmodules());
1960 // Create a synthetic macro definition corresponding to the import (or null
1961 // if this was an undefinition of the macro).
1962 DefMacroDirective *MD = MMI->import(PP, ImportLoc);
1964 // If there's no ambiguity, just install the macro.
1967 PP.appendMacroDirective(II, MD);
1969 PP.appendMacroDirective(II, PP.AllocateUndefMacroDirective(ImportLoc));
1972 assert(!Prev->empty());
1975 // We imported a #undef that didn't remove all prior definitions. The most
1976 // recent prior definition remains, and we install it in the place of the
1977 // imported directive.
1978 MacroInfo *NewMI = Prev->back()->getInfo();
1980 MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc, /*Imported*/true);
1983 // We're introducing a macro definition that creates or adds to an ambiguity.
1984 // We can resolve that ambiguity if this macro is token-for-token identical to
1985 // all of the existing definitions.
1986 MacroInfo *NewMI = MD->getInfo();
1987 assert(NewMI && "macro definition with no MacroInfo?");
1988 while (!Prev->empty()) {
1989 MacroInfo *PrevMI = Prev->back()->getInfo();
1990 assert(PrevMI && "macro definition with no MacroInfo?");
1992 // Before marking the macros as ambiguous, check if this is a case where
1993 // both macros are in system headers. If so, we trust that the system
1994 // did not get it wrong. This also handles cases where Clang's own
1995 // headers have a different spelling of certain system macros:
1996 // #define LONG_MAX __LONG_MAX__ (clang's limits.h)
1997 // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h)
1999 // FIXME: Remove the defined-in-system-headers check. clang's limits.h
2000 // overrides the system limits.h's macros, so there's no conflict here.
2001 if (NewMI != PrevMI &&
2002 !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) &&
2003 !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this))
2006 // The previous definition is the same as this one (or both are defined in
2007 // system modules so we can assume they're equivalent); we don't need to
2008 // track it any more.
2013 MD->setAmbiguous(true);
2015 PP.appendMacroDirective(II, MD);
2018 ASTReader::InputFileInfo
2019 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
2020 // Go find this input file.
2021 BitstreamCursor &Cursor = F.InputFilesCursor;
2022 SavedStreamPosition SavedPosition(Cursor);
2023 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2025 unsigned Code = Cursor.ReadCode();
2029 unsigned Result = Cursor.readRecord(Code, Record, &Blob);
2030 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE &&
2031 "invalid record type for input file");
2034 std::string Filename;
2039 assert(Record[0] == ID && "Bogus stored ID or offset");
2040 StoredSize = static_cast<off_t>(Record[1]);
2041 StoredTime = static_cast<time_t>(Record[2]);
2042 Overridden = static_cast<bool>(Record[3]);
2044 MaybeAddSystemRootToFilename(F, Filename);
2046 InputFileInfo R = { std::move(Filename), StoredSize, StoredTime, Overridden };
2050 std::string ASTReader::getInputFileName(ModuleFile &F, unsigned int ID) {
2051 return readInputFileInfo(F, ID).Filename;
2054 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
2055 // If this ID is bogus, just return an empty input file.
2056 if (ID == 0 || ID > F.InputFilesLoaded.size())
2059 // If we've already loaded this input file, return it.
2060 if (F.InputFilesLoaded[ID-1].getFile())
2061 return F.InputFilesLoaded[ID-1];
2063 if (F.InputFilesLoaded[ID-1].isNotFound())
2066 // Go find this input file.
2067 BitstreamCursor &Cursor = F.InputFilesCursor;
2068 SavedStreamPosition SavedPosition(Cursor);
2069 Cursor.JumpToBit(F.InputFileOffsets[ID-1]);
2071 InputFileInfo FI = readInputFileInfo(F, ID);
2072 off_t StoredSize = FI.StoredSize;
2073 time_t StoredTime = FI.StoredTime;
2074 bool Overridden = FI.Overridden;
2075 StringRef Filename = FI.Filename;
2077 const FileEntry *File
2078 = Overridden? FileMgr.getVirtualFile(Filename, StoredSize, StoredTime)
2079 : FileMgr.getFile(Filename, /*OpenFile=*/false);
2081 // If we didn't find the file, resolve it relative to the
2082 // original directory from which this AST file was created.
2083 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() &&
2084 F.OriginalDir != CurrentDir) {
2085 std::string Resolved = resolveFileRelativeToOriginalDir(Filename,
2088 if (!Resolved.empty())
2089 File = FileMgr.getFile(Resolved);
2092 // For an overridden file, create a virtual file with the stored
2094 if (Overridden && File == nullptr) {
2095 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
2098 if (File == nullptr) {
2100 std::string ErrorStr = "could not find file '";
2101 ErrorStr += Filename;
2102 ErrorStr += "' referenced by AST file";
2103 Error(ErrorStr.c_str());
2105 // Record that we didn't find the file.
2106 F.InputFilesLoaded[ID-1] = InputFile::getNotFound();
2110 // Check if there was a request to override the contents of the file
2111 // that was part of the precompiled header. Overridding such a file
2112 // can lead to problems when lexing using the source locations from the
2114 SourceManager &SM = getSourceManager();
2115 if (!Overridden && SM.isFileOverridden(File)) {
2117 Error(diag::err_fe_pch_file_overridden, Filename);
2118 // After emitting the diagnostic, recover by disabling the override so
2119 // that the original file will be used.
2120 SM.disableFileContentsOverride(File);
2121 // The FileEntry is a virtual file entry with the size of the contents
2122 // that would override the original contents. Set it to the original's
2124 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File),
2125 StoredSize, StoredTime);
2128 bool IsOutOfDate = false;
2130 // For an overridden file, there is nothing to validate.
2131 if (!Overridden && (StoredSize != File->getSize()
2132 #if !defined(LLVM_ON_WIN32)
2133 // In our regression testing, the Windows file system seems to
2134 // have inconsistent modification times that sometimes
2135 // erroneously trigger this error-handling path.
2136 || StoredTime != File->getModificationTime()
2140 // Build a list of the PCH imports that got us here (in reverse).
2141 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2142 while (ImportStack.back()->ImportedBy.size() > 0)
2143 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2145 // The top-level PCH is stale.
2146 StringRef TopLevelPCHName(ImportStack.back()->FileName);
2147 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName);
2149 // Print the import stack.
2150 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) {
2151 Diag(diag::note_pch_required_by)
2152 << Filename << ImportStack[0]->FileName;
2153 for (unsigned I = 1; I < ImportStack.size(); ++I)
2154 Diag(diag::note_pch_required_by)
2155 << ImportStack[I-1]->FileName << ImportStack[I]->FileName;
2158 if (!Diags.isDiagnosticInFlight())
2159 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName;
2165 InputFile IF = InputFile(File, Overridden, IsOutOfDate);
2167 // Note that we've loaded this input file.
2168 F.InputFilesLoaded[ID-1] = IF;
2172 const FileEntry *ASTReader::getFileEntry(StringRef filenameStrRef) {
2173 ModuleFile &M = ModuleMgr.getPrimaryModule();
2174 std::string Filename = filenameStrRef;
2175 MaybeAddSystemRootToFilename(M, Filename);
2176 const FileEntry *File = FileMgr.getFile(Filename);
2177 if (File == nullptr && !M.OriginalDir.empty() && !CurrentDir.empty() &&
2178 M.OriginalDir != CurrentDir) {
2179 std::string resolved = resolveFileRelativeToOriginalDir(Filename,
2182 if (!resolved.empty())
2183 File = FileMgr.getFile(resolved);
2189 /// \brief If we are loading a relocatable PCH file, and the filename is
2190 /// not an absolute path, add the system root to the beginning of the file
2192 void ASTReader::MaybeAddSystemRootToFilename(ModuleFile &M,
2193 std::string &Filename) {
2194 // If this is not a relocatable PCH file, there's nothing to do.
2195 if (!M.RelocatablePCH)
2198 if (Filename.empty() || llvm::sys::path::is_absolute(Filename))
2201 if (isysroot.empty()) {
2202 // If no system root was given, default to '/'
2203 Filename.insert(Filename.begin(), '/');
2207 unsigned Length = isysroot.size();
2208 if (isysroot[Length - 1] != '/')
2209 Filename.insert(Filename.begin(), '/');
2211 Filename.insert(Filename.begin(), isysroot.begin(), isysroot.end());
2214 ASTReader::ASTReadResult
2215 ASTReader::ReadControlBlock(ModuleFile &F,
2216 SmallVectorImpl<ImportedModule> &Loaded,
2217 const ModuleFile *ImportedBy,
2218 unsigned ClientLoadCapabilities) {
2219 BitstreamCursor &Stream = F.Stream;
2221 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) {
2222 Error("malformed block record in AST file");
2226 // Read all of the records and blocks in the control block.
2229 llvm::BitstreamEntry Entry = Stream.advance();
2231 switch (Entry.Kind) {
2232 case llvm::BitstreamEntry::Error:
2233 Error("malformed block record in AST file");
2235 case llvm::BitstreamEntry::EndBlock: {
2236 // Validate input files.
2237 const HeaderSearchOptions &HSOpts =
2238 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2240 // All user input files reside at the index range [0, Record[1]), and
2241 // system input files reside at [Record[1], Record[0]).
2242 // Record is the one from INPUT_FILE_OFFSETS.
2243 unsigned NumInputs = Record[0];
2244 unsigned NumUserInputs = Record[1];
2246 if (!DisableValidation &&
2247 (ValidateSystemInputs || !HSOpts.ModulesValidateOncePerBuildSession ||
2248 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp)) {
2249 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
2251 // If we are reading a module, we will create a verification timestamp,
2252 // so we verify all input files. Otherwise, verify only user input
2255 unsigned N = NumUserInputs;
2256 if (ValidateSystemInputs ||
2257 (HSOpts.ModulesValidateOncePerBuildSession && F.Kind == MK_Module))
2260 for (unsigned I = 0; I < N; ++I) {
2261 InputFile IF = getInputFile(F, I+1, Complain);
2262 if (!IF.getFile() || IF.isOutOfDate())
2268 Listener->visitModuleFile(F.FileName);
2270 if (Listener && Listener->needsInputFileVisitation()) {
2271 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
2273 for (unsigned I = 0; I < N; ++I) {
2274 bool IsSystem = I >= NumUserInputs;
2275 InputFileInfo FI = readInputFileInfo(F, I+1);
2276 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);
2283 case llvm::BitstreamEntry::SubBlock:
2285 case INPUT_FILES_BLOCK_ID:
2286 F.InputFilesCursor = Stream;
2287 if (Stream.SkipBlock() || // Skip with the main cursor
2288 // Read the abbreviations
2289 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) {
2290 Error("malformed block record in AST file");
2296 if (Stream.SkipBlock()) {
2297 Error("malformed block record in AST file");
2303 case llvm::BitstreamEntry::Record:
2304 // The interesting case.
2308 // Read and process a record.
2311 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2313 if (Record[0] != VERSION_MAJOR && !DisableValidation) {
2314 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2315 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old
2316 : diag::err_pch_version_too_new);
2317 return VersionMismatch;
2320 bool hasErrors = Record[5];
2321 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) {
2322 Diag(diag::err_pch_with_compiler_errors);
2326 F.RelocatablePCH = Record[4];
2328 const std::string &CurBranch = getClangFullRepositoryVersion();
2329 StringRef ASTBranch = Blob;
2330 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
2331 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
2332 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch;
2333 return VersionMismatch;
2339 // Load each of the imported PCH files.
2340 unsigned Idx = 0, N = Record.size();
2342 // Read information about the AST file.
2343 ModuleKind ImportedKind = (ModuleKind)Record[Idx++];
2344 // The import location will be the local one for now; we will adjust
2345 // all import locations of module imports after the global source
2346 // location info are setup.
2347 SourceLocation ImportLoc =
2348 SourceLocation::getFromRawEncoding(Record[Idx++]);
2349 off_t StoredSize = (off_t)Record[Idx++];
2350 time_t StoredModTime = (time_t)Record[Idx++];
2351 unsigned Length = Record[Idx++];
2352 SmallString<128> ImportedFile(Record.begin() + Idx,
2353 Record.begin() + Idx + Length);
2356 // Load the AST file.
2357 switch(ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, Loaded,
2358 StoredSize, StoredModTime,
2359 ClientLoadCapabilities)) {
2360 case Failure: return Failure;
2361 // If we have to ignore the dependency, we'll have to ignore this too.
2363 case OutOfDate: return OutOfDate;
2364 case VersionMismatch: return VersionMismatch;
2365 case ConfigurationMismatch: return ConfigurationMismatch;
2366 case HadErrors: return HadErrors;
2367 case Success: break;
2373 case LANGUAGE_OPTIONS: {
2374 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
2375 if (Listener && &F == *ModuleMgr.begin() &&
2376 ParseLanguageOptions(Record, Complain, *Listener) &&
2377 !DisableValidation && !AllowConfigurationMismatch)
2378 return ConfigurationMismatch;
2382 case TARGET_OPTIONS: {
2383 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2384 if (Listener && &F == *ModuleMgr.begin() &&
2385 ParseTargetOptions(Record, Complain, *Listener) &&
2386 !DisableValidation && !AllowConfigurationMismatch)
2387 return ConfigurationMismatch;
2391 case DIAGNOSTIC_OPTIONS: {
2392 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate)==0;
2393 if (Listener && &F == *ModuleMgr.begin() &&
2394 ParseDiagnosticOptions(Record, Complain, *Listener) &&
2400 case FILE_SYSTEM_OPTIONS: {
2401 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2402 if (Listener && &F == *ModuleMgr.begin() &&
2403 ParseFileSystemOptions(Record, Complain, *Listener) &&
2404 !DisableValidation && !AllowConfigurationMismatch)
2405 return ConfigurationMismatch;
2409 case HEADER_SEARCH_OPTIONS: {
2410 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2411 if (Listener && &F == *ModuleMgr.begin() &&
2412 ParseHeaderSearchOptions(Record, Complain, *Listener) &&
2413 !DisableValidation && !AllowConfigurationMismatch)
2414 return ConfigurationMismatch;
2418 case PREPROCESSOR_OPTIONS: {
2419 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch)==0;
2420 if (Listener && &F == *ModuleMgr.begin() &&
2421 ParsePreprocessorOptions(Record, Complain, *Listener,
2422 SuggestedPredefines) &&
2423 !DisableValidation && !AllowConfigurationMismatch)
2424 return ConfigurationMismatch;
2429 F.OriginalSourceFileID = FileID::get(Record[0]);
2430 F.ActualOriginalSourceFileName = Blob;
2431 F.OriginalSourceFileName = F.ActualOriginalSourceFileName;
2432 MaybeAddSystemRootToFilename(F, F.OriginalSourceFileName);
2435 case ORIGINAL_FILE_ID:
2436 F.OriginalSourceFileID = FileID::get(Record[0]);
2439 case ORIGINAL_PCH_DIR:
2440 F.OriginalDir = Blob;
2444 F.ModuleName = Blob;
2446 Listener->ReadModuleName(F.ModuleName);
2449 case MODULE_MAP_FILE:
2450 F.ModuleMapPath = Blob;
2452 // Try to resolve ModuleName in the current header search context and
2453 // verify that it is found in the same module map file as we saved. If the
2454 // top-level AST file is a main file, skip this check because there is no
2455 // usable header search context.
2456 assert(!F.ModuleName.empty() &&
2457 "MODULE_NAME should come before MOUDLE_MAP_FILE");
2458 if (F.Kind == MK_Module &&
2459 (*ModuleMgr.begin())->Kind != MK_MainFile) {
2460 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName);
2462 assert(ImportedBy && "top-level import should be verified");
2463 if ((ClientLoadCapabilities & ARR_Missing) == 0)
2464 Diag(diag::err_imported_module_not_found)
2465 << F.ModuleName << ImportedBy->FileName;
2469 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath);
2470 if (StoredModMap == nullptr || StoredModMap != M->ModuleMap) {
2471 assert(M->ModuleMap && "found module is missing module map file");
2472 assert(M->Name == F.ModuleName && "found module with different name");
2473 assert(ImportedBy && "top-level import should be verified");
2474 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
2475 Diag(diag::err_imported_module_modmap_changed)
2476 << F.ModuleName << ImportedBy->FileName
2477 << M->ModuleMap->getName() << F.ModuleMapPath;
2483 Listener->ReadModuleMapFile(F.ModuleMapPath);
2486 case INPUT_FILE_OFFSETS:
2487 F.InputFileOffsets = (const uint32_t *)Blob.data();
2488 F.InputFilesLoaded.resize(Record[0]);
2494 ASTReader::ASTReadResult
2495 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
2496 BitstreamCursor &Stream = F.Stream;
2498 if (Stream.EnterSubBlock(AST_BLOCK_ID)) {
2499 Error("malformed block record in AST file");
2503 // Read all of the records and blocks for the AST file.
2506 llvm::BitstreamEntry Entry = Stream.advance();
2508 switch (Entry.Kind) {
2509 case llvm::BitstreamEntry::Error:
2510 Error("error at end of module block in AST file");
2512 case llvm::BitstreamEntry::EndBlock: {
2513 // Outside of C++, we do not store a lookup map for the translation unit.
2514 // Instead, mark it as needing a lookup map to be built if this module
2515 // contains any declarations lexically within it (which it always does!).
2516 // This usually has no cost, since we very rarely need the lookup map for
2517 // the translation unit outside C++.
2518 DeclContext *DC = Context.getTranslationUnitDecl();
2519 if (DC->hasExternalLexicalStorage() &&
2520 !getContext().getLangOpts().CPlusPlus)
2521 DC->setMustBuildLookupTable();
2525 case llvm::BitstreamEntry::SubBlock:
2527 case DECLTYPES_BLOCK_ID:
2528 // We lazily load the decls block, but we want to set up the
2529 // DeclsCursor cursor to point into it. Clone our current bitcode
2530 // cursor to it, enter the block and read the abbrevs in that block.
2531 // With the main cursor, we just skip over it.
2532 F.DeclsCursor = Stream;
2533 if (Stream.SkipBlock() || // Skip with the main cursor.
2534 // Read the abbrevs.
2535 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) {
2536 Error("malformed block record in AST file");
2541 case PREPROCESSOR_BLOCK_ID:
2542 F.MacroCursor = Stream;
2543 if (!PP.getExternalSource())
2544 PP.setExternalSource(this);
2546 if (Stream.SkipBlock() ||
2547 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) {
2548 Error("malformed block record in AST file");
2551 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo();
2554 case PREPROCESSOR_DETAIL_BLOCK_ID:
2555 F.PreprocessorDetailCursor = Stream;
2556 if (Stream.SkipBlock() ||
2557 ReadBlockAbbrevs(F.PreprocessorDetailCursor,
2558 PREPROCESSOR_DETAIL_BLOCK_ID)) {
2559 Error("malformed preprocessor detail record in AST file");
2562 F.PreprocessorDetailStartOffset
2563 = F.PreprocessorDetailCursor.GetCurrentBitNo();
2565 if (!PP.getPreprocessingRecord())
2566 PP.createPreprocessingRecord();
2567 if (!PP.getPreprocessingRecord()->getExternalSource())
2568 PP.getPreprocessingRecord()->SetExternalSource(*this);
2571 case SOURCE_MANAGER_BLOCK_ID:
2572 if (ReadSourceManagerBlock(F))
2576 case SUBMODULE_BLOCK_ID:
2577 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities))
2581 case COMMENTS_BLOCK_ID: {
2582 BitstreamCursor C = Stream;
2583 if (Stream.SkipBlock() ||
2584 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) {
2585 Error("malformed comments block in AST file");
2588 CommentsCursors.push_back(std::make_pair(C, &F));
2593 if (Stream.SkipBlock()) {
2594 Error("malformed block record in AST file");
2601 case llvm::BitstreamEntry::Record:
2602 // The interesting case.
2606 // Read and process a record.
2609 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) {
2610 default: // Default behavior: ignore.
2614 if (F.LocalNumTypes != 0) {
2615 Error("duplicate TYPE_OFFSET record in AST file");
2618 F.TypeOffsets = (const uint32_t *)Blob.data();
2619 F.LocalNumTypes = Record[0];
2620 unsigned LocalBaseTypeIndex = Record[1];
2621 F.BaseTypeIndex = getTotalNumTypes();
2623 if (F.LocalNumTypes > 0) {
2624 // Introduce the global -> local mapping for types within this module.
2625 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F));
2627 // Introduce the local -> global mapping for types within this module.
2628 F.TypeRemap.insertOrReplace(
2629 std::make_pair(LocalBaseTypeIndex,
2630 F.BaseTypeIndex - LocalBaseTypeIndex));
2632 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
2638 if (F.LocalNumDecls != 0) {
2639 Error("duplicate DECL_OFFSET record in AST file");
2642 F.DeclOffsets = (const DeclOffset *)Blob.data();
2643 F.LocalNumDecls = Record[0];
2644 unsigned LocalBaseDeclID = Record[1];
2645 F.BaseDeclID = getTotalNumDecls();
2647 if (F.LocalNumDecls > 0) {
2648 // Introduce the global -> local mapping for declarations within this
2650 GlobalDeclMap.insert(
2651 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F));
2653 // Introduce the local -> global mapping for declarations within this
2655 F.DeclRemap.insertOrReplace(
2656 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID));
2658 // Introduce the global -> local mapping for declarations within this
2660 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
2662 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
2667 case TU_UPDATE_LEXICAL: {
2668 DeclContext *TU = Context.getTranslationUnitDecl();
2669 DeclContextInfo &Info = F.DeclContextInfos[TU];
2670 Info.LexicalDecls = reinterpret_cast<const KindDeclIDPair *>(Blob.data());
2671 Info.NumLexicalDecls
2672 = static_cast<unsigned int>(Blob.size() / sizeof(KindDeclIDPair));
2673 TU->setHasExternalLexicalStorage(true);
2677 case UPDATE_VISIBLE: {
2679 serialization::DeclID ID = ReadDeclID(F, Record, Idx);
2680 ASTDeclContextNameLookupTable *Table =
2681 ASTDeclContextNameLookupTable::Create(
2682 (const unsigned char *)Blob.data() + Record[Idx++],
2683 (const unsigned char *)Blob.data() + sizeof(uint32_t),
2684 (const unsigned char *)Blob.data(),
2685 ASTDeclContextNameLookupTrait(*this, F));
2686 if (Decl *D = GetExistingDecl(ID)) {
2687 auto *DC = cast<DeclContext>(D);
2688 DC->getPrimaryContext()->setHasExternalVisibleStorage(true);
2689 auto *&LookupTable = F.DeclContextInfos[DC].NameLookupTableData;
2690 // FIXME: There should never be an existing lookup table.
2692 LookupTable = Table;
2694 PendingVisibleUpdates[ID].push_back(std::make_pair(Table, &F));
2698 case IDENTIFIER_TABLE:
2699 F.IdentifierTableData = Blob.data();
2701 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create(
2702 (const unsigned char *)F.IdentifierTableData + Record[0],
2703 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t),
2704 (const unsigned char *)F.IdentifierTableData,
2705 ASTIdentifierLookupTrait(*this, F));
2707 PP.getIdentifierTable().setExternalIdentifierLookup(this);
2711 case IDENTIFIER_OFFSET: {
2712 if (F.LocalNumIdentifiers != 0) {
2713 Error("duplicate IDENTIFIER_OFFSET record in AST file");
2716 F.IdentifierOffsets = (const uint32_t *)Blob.data();
2717 F.LocalNumIdentifiers = Record[0];
2718 unsigned LocalBaseIdentifierID = Record[1];
2719 F.BaseIdentifierID = getTotalNumIdentifiers();
2721 if (F.LocalNumIdentifiers > 0) {
2722 // Introduce the global -> local mapping for identifiers within this
2724 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1,
2727 // Introduce the local -> global mapping for identifiers within this
2729 F.IdentifierRemap.insertOrReplace(
2730 std::make_pair(LocalBaseIdentifierID,
2731 F.BaseIdentifierID - LocalBaseIdentifierID));
2733 IdentifiersLoaded.resize(IdentifiersLoaded.size()
2734 + F.LocalNumIdentifiers);
2739 case EAGERLY_DESERIALIZED_DECLS:
2740 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2741 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I]));
2745 if (SpecialTypes.empty()) {
2746 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2747 SpecialTypes.push_back(getGlobalTypeID(F, Record[I]));
2751 if (SpecialTypes.size() != Record.size()) {
2752 Error("invalid special-types record");
2756 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
2757 serialization::TypeID ID = getGlobalTypeID(F, Record[I]);
2758 if (!SpecialTypes[I])
2759 SpecialTypes[I] = ID;
2760 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate
2766 TotalNumStatements += Record[0];
2767 TotalNumMacros += Record[1];
2768 TotalLexicalDeclContexts += Record[2];
2769 TotalVisibleDeclContexts += Record[3];
2772 case UNUSED_FILESCOPED_DECLS:
2773 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2774 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I]));
2777 case DELEGATING_CTORS:
2778 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2779 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I]));
2782 case WEAK_UNDECLARED_IDENTIFIERS:
2783 if (Record.size() % 4 != 0) {
2784 Error("invalid weak identifiers record");
2788 // FIXME: Ignore weak undeclared identifiers from non-original PCH
2789 // files. This isn't the way to do it :)
2790 WeakUndeclaredIdentifiers.clear();
2792 // Translate the weak, undeclared identifiers into global IDs.
2793 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) {
2794 WeakUndeclaredIdentifiers.push_back(
2795 getGlobalIdentifierID(F, Record[I++]));
2796 WeakUndeclaredIdentifiers.push_back(
2797 getGlobalIdentifierID(F, Record[I++]));
2798 WeakUndeclaredIdentifiers.push_back(
2799 ReadSourceLocation(F, Record, I).getRawEncoding());
2800 WeakUndeclaredIdentifiers.push_back(Record[I++]);
2804 case LOCALLY_SCOPED_EXTERN_C_DECLS:
2805 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2806 LocallyScopedExternCDecls.push_back(getGlobalDeclID(F, Record[I]));
2809 case SELECTOR_OFFSETS: {
2810 F.SelectorOffsets = (const uint32_t *)Blob.data();
2811 F.LocalNumSelectors = Record[0];
2812 unsigned LocalBaseSelectorID = Record[1];
2813 F.BaseSelectorID = getTotalNumSelectors();
2815 if (F.LocalNumSelectors > 0) {
2816 // Introduce the global -> local mapping for selectors within this
2818 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
2820 // Introduce the local -> global mapping for selectors within this
2822 F.SelectorRemap.insertOrReplace(
2823 std::make_pair(LocalBaseSelectorID,
2824 F.BaseSelectorID - LocalBaseSelectorID));
2826 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
2832 F.SelectorLookupTableData = (const unsigned char *)Blob.data();
2834 F.SelectorLookupTable
2835 = ASTSelectorLookupTable::Create(
2836 F.SelectorLookupTableData + Record[0],
2837 F.SelectorLookupTableData,
2838 ASTSelectorLookupTrait(*this, F));
2839 TotalNumMethodPoolEntries += Record[1];
2842 case REFERENCED_SELECTOR_POOL:
2843 if (!Record.empty()) {
2844 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) {
2845 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
2847 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx).
2853 case PP_COUNTER_VALUE:
2854 if (!Record.empty() && Listener)
2855 Listener->ReadCounter(F, Record[0]);
2858 case FILE_SORTED_DECLS:
2859 F.FileSortedDecls = (const DeclID *)Blob.data();
2860 F.NumFileSortedDecls = Record[0];
2863 case SOURCE_LOCATION_OFFSETS: {
2864 F.SLocEntryOffsets = (const uint32_t *)Blob.data();
2865 F.LocalNumSLocEntries = Record[0];
2866 unsigned SLocSpaceSize = Record[1];
2867 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
2868 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
2870 // Make our entry in the range map. BaseID is negative and growing, so
2871 // we invert it. Because we invert it, though, we need the other end of
2873 unsigned RangeStart =
2874 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1;
2875 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
2876 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset);
2878 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing.
2879 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0);
2880 GlobalSLocOffsetMap.insert(
2881 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset
2882 - SLocSpaceSize,&F));
2884 // Initialize the remapping table.
2885 // Invalid stays invalid.
2886 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0));
2887 // This module. Base was 2 when being compiled.
2888 F.SLocRemap.insertOrReplace(std::make_pair(2U,
2889 static_cast<int>(F.SLocEntryBaseOffset - 2)));
2891 TotalNumSLocEntries += F.LocalNumSLocEntries;
2895 case MODULE_OFFSET_MAP: {
2896 // Additional remapping information.
2897 const unsigned char *Data = (const unsigned char*)Blob.data();
2898 const unsigned char *DataEnd = Data + Blob.size();
2900 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders.
2901 if (F.SLocRemap.find(0) == F.SLocRemap.end()) {
2902 F.SLocRemap.insert(std::make_pair(0U, 0));
2903 F.SLocRemap.insert(std::make_pair(2U, 1));
2906 // Continuous range maps we may be updating in our module.
2907 ContinuousRangeMap<uint32_t, int, 2>::Builder SLocRemap(F.SLocRemap);
2908 ContinuousRangeMap<uint32_t, int, 2>::Builder
2909 IdentifierRemap(F.IdentifierRemap);
2910 ContinuousRangeMap<uint32_t, int, 2>::Builder
2911 MacroRemap(F.MacroRemap);
2912 ContinuousRangeMap<uint32_t, int, 2>::Builder
2913 PreprocessedEntityRemap(F.PreprocessedEntityRemap);
2914 ContinuousRangeMap<uint32_t, int, 2>::Builder
2915 SubmoduleRemap(F.SubmoduleRemap);
2916 ContinuousRangeMap<uint32_t, int, 2>::Builder
2917 SelectorRemap(F.SelectorRemap);
2918 ContinuousRangeMap<uint32_t, int, 2>::Builder DeclRemap(F.DeclRemap);
2919 ContinuousRangeMap<uint32_t, int, 2>::Builder TypeRemap(F.TypeRemap);
2921 while(Data < DataEnd) {
2922 using namespace llvm::support;
2923 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data);
2924 StringRef Name = StringRef((const char*)Data, Len);
2926 ModuleFile *OM = ModuleMgr.lookup(Name);
2928 Error("SourceLocation remap refers to unknown module");
2932 uint32_t SLocOffset =
2933 endian::readNext<uint32_t, little, unaligned>(Data);
2934 uint32_t IdentifierIDOffset =
2935 endian::readNext<uint32_t, little, unaligned>(Data);
2936 uint32_t MacroIDOffset =
2937 endian::readNext<uint32_t, little, unaligned>(Data);
2938 uint32_t PreprocessedEntityIDOffset =
2939 endian::readNext<uint32_t, little, unaligned>(Data);
2940 uint32_t SubmoduleIDOffset =
2941 endian::readNext<uint32_t, little, unaligned>(Data);
2942 uint32_t SelectorIDOffset =
2943 endian::readNext<uint32_t, little, unaligned>(Data);
2944 uint32_t DeclIDOffset =
2945 endian::readNext<uint32_t, little, unaligned>(Data);
2946 uint32_t TypeIndexOffset =
2947 endian::readNext<uint32_t, little, unaligned>(Data);
2949 // Source location offset is mapped to OM->SLocEntryBaseOffset.
2950 SLocRemap.insert(std::make_pair(SLocOffset,
2951 static_cast<int>(OM->SLocEntryBaseOffset - SLocOffset)));
2952 IdentifierRemap.insert(
2953 std::make_pair(IdentifierIDOffset,
2954 OM->BaseIdentifierID - IdentifierIDOffset));
2955 MacroRemap.insert(std::make_pair(MacroIDOffset,
2956 OM->BaseMacroID - MacroIDOffset));
2957 PreprocessedEntityRemap.insert(
2958 std::make_pair(PreprocessedEntityIDOffset,
2959 OM->BasePreprocessedEntityID - PreprocessedEntityIDOffset));
2960 SubmoduleRemap.insert(std::make_pair(SubmoduleIDOffset,
2961 OM->BaseSubmoduleID - SubmoduleIDOffset));
2962 SelectorRemap.insert(std::make_pair(SelectorIDOffset,
2963 OM->BaseSelectorID - SelectorIDOffset));
2964 DeclRemap.insert(std::make_pair(DeclIDOffset,
2965 OM->BaseDeclID - DeclIDOffset));
2967 TypeRemap.insert(std::make_pair(TypeIndexOffset,
2968 OM->BaseTypeIndex - TypeIndexOffset));
2970 // Global -> local mappings.
2971 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset;
2976 case SOURCE_MANAGER_LINE_TABLE:
2977 if (ParseLineTable(F, Record))
2981 case SOURCE_LOCATION_PRELOADS: {
2982 // Need to transform from the local view (1-based IDs) to the global view,
2983 // which is based off F.SLocEntryBaseID.
2984 if (!F.PreloadSLocEntries.empty()) {
2985 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file");
2989 F.PreloadSLocEntries.swap(Record);
2993 case EXT_VECTOR_DECLS:
2994 for (unsigned I = 0, N = Record.size(); I != N; ++I)
2995 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I]));
2999 if (Record.size() % 3 != 0) {
3000 Error("Invalid VTABLE_USES record");
3004 // Later tables overwrite earlier ones.
3005 // FIXME: Modules will have some trouble with this. This is clearly not
3006 // the right way to do this.
3009 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) {
3010 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++]));
3011 VTableUses.push_back(
3012 ReadSourceLocation(F, Record, Idx).getRawEncoding());
3013 VTableUses.push_back(Record[Idx++]);
3017 case DYNAMIC_CLASSES:
3018 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3019 DynamicClasses.push_back(getGlobalDeclID(F, Record[I]));
3022 case PENDING_IMPLICIT_INSTANTIATIONS:
3023 if (PendingInstantiations.size() % 2 != 0) {
3024 Error("Invalid existing PendingInstantiations");
3028 if (Record.size() % 2 != 0) {
3029 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
3033 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3034 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++]));
3035 PendingInstantiations.push_back(
3036 ReadSourceLocation(F, Record, I).getRawEncoding());
3040 case SEMA_DECL_REFS:
3041 if (Record.size() != 2) {
3042 Error("Invalid SEMA_DECL_REFS block");
3045 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3046 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3049 case PPD_ENTITIES_OFFSETS: {
3050 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data();
3051 assert(Blob.size() % sizeof(PPEntityOffset) == 0);
3052 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset);
3054 unsigned LocalBasePreprocessedEntityID = Record[0];
3056 unsigned StartingID;
3057 if (!PP.getPreprocessingRecord())
3058 PP.createPreprocessingRecord();
3059 if (!PP.getPreprocessingRecord()->getExternalSource())
3060 PP.getPreprocessingRecord()->SetExternalSource(*this);
3062 = PP.getPreprocessingRecord()
3063 ->allocateLoadedEntities(F.NumPreprocessedEntities);
3064 F.BasePreprocessedEntityID = StartingID;
3066 if (F.NumPreprocessedEntities > 0) {
3067 // Introduce the global -> local mapping for preprocessed entities in
3069 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
3071 // Introduce the local -> global mapping for preprocessed entities in
3073 F.PreprocessedEntityRemap.insertOrReplace(
3074 std::make_pair(LocalBasePreprocessedEntityID,
3075 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID));
3081 case DECL_UPDATE_OFFSETS: {
3082 if (Record.size() % 2 != 0) {
3083 Error("invalid DECL_UPDATE_OFFSETS block in AST file");
3086 for (unsigned I = 0, N = Record.size(); I != N; I += 2) {
3087 GlobalDeclID ID = getGlobalDeclID(F, Record[I]);
3088 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1]));
3090 // If we've already loaded the decl, perform the updates when we finish
3091 // loading this block.
3092 if (Decl *D = GetExistingDecl(ID))
3093 PendingUpdateRecords.push_back(std::make_pair(ID, D));
3098 case DECL_REPLACEMENTS: {
3099 if (Record.size() % 3 != 0) {
3100 Error("invalid DECL_REPLACEMENTS block in AST file");
3103 for (unsigned I = 0, N = Record.size(); I != N; I += 3)
3104 ReplacedDecls[getGlobalDeclID(F, Record[I])]
3105 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]);
3109 case OBJC_CATEGORIES_MAP: {
3110 if (F.LocalNumObjCCategoriesInMap != 0) {
3111 Error("duplicate OBJC_CATEGORIES_MAP record in AST file");
3115 F.LocalNumObjCCategoriesInMap = Record[0];
3116 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data();
3120 case OBJC_CATEGORIES:
3121 F.ObjCCategories.swap(Record);
3124 case CXX_BASE_SPECIFIER_OFFSETS: {
3125 if (F.LocalNumCXXBaseSpecifiers != 0) {
3126 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file");
3130 F.LocalNumCXXBaseSpecifiers = Record[0];
3131 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data();
3132 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers;
3136 case DIAG_PRAGMA_MAPPINGS:
3137 if (F.PragmaDiagMappings.empty())
3138 F.PragmaDiagMappings.swap(Record);
3140 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(),
3141 Record.begin(), Record.end());
3144 case CUDA_SPECIAL_DECL_REFS:
3145 // Later tables overwrite earlier ones.
3146 // FIXME: Modules will have trouble with this.
3147 CUDASpecialDeclRefs.clear();
3148 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3149 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I]));
3152 case HEADER_SEARCH_TABLE: {
3153 F.HeaderFileInfoTableData = Blob.data();
3154 F.LocalNumHeaderFileInfos = Record[1];
3156 F.HeaderFileInfoTable
3157 = HeaderFileInfoLookupTable::Create(
3158 (const unsigned char *)F.HeaderFileInfoTableData + Record[0],
3159 (const unsigned char *)F.HeaderFileInfoTableData,
3160 HeaderFileInfoTrait(*this, F,
3161 &PP.getHeaderSearchInfo(),
3162 Blob.data() + Record[2]));
3164 PP.getHeaderSearchInfo().SetExternalSource(this);
3165 if (!PP.getHeaderSearchInfo().getExternalLookup())
3166 PP.getHeaderSearchInfo().SetExternalLookup(this);
3171 case FP_PRAGMA_OPTIONS:
3172 // Later tables overwrite earlier ones.
3173 FPPragmaOptions.swap(Record);
3176 case OPENCL_EXTENSIONS:
3177 // Later tables overwrite earlier ones.
3178 OpenCLExtensions.swap(Record);
3181 case TENTATIVE_DEFINITIONS:
3182 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3183 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I]));
3186 case KNOWN_NAMESPACES:
3187 for (unsigned I = 0, N = Record.size(); I != N; ++I)
3188 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
3191 case UNDEFINED_BUT_USED:
3192 if (UndefinedButUsed.size() % 2 != 0) {
3193 Error("Invalid existing UndefinedButUsed");
3197 if (Record.size() % 2 != 0) {
3198 Error("invalid undefined-but-used record");
3201 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
3202 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++]));
3203 UndefinedButUsed.push_back(
3204 ReadSourceLocation(F, Record, I).getRawEncoding());
3208 case IMPORTED_MODULES: {
3209 if (F.Kind != MK_Module) {
3210 // If we aren't loading a module (which has its own exports), make
3211 // all of the imported modules visible.
3212 // FIXME: Deal with macros-only imports.
3213 for (unsigned I = 0, N = Record.size(); I != N; /**/) {
3214 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
3215 SourceLocation Loc = ReadSourceLocation(F, Record, I);
3217 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
3223 case LOCAL_REDECLARATIONS: {
3224 F.RedeclarationChains.swap(Record);
3228 case LOCAL_REDECLARATIONS_MAP: {
3229 if (F.LocalNumRedeclarationsInMap != 0) {
3230 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file");
3234 F.LocalNumRedeclarationsInMap = Record[0];
3235 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data();
3239 case MERGED_DECLARATIONS: {
3240 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) {
3241 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]);
3242 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID];
3243 for (unsigned N = Record[Idx++]; N > 0; --N)
3244 Decls.push_back(getGlobalDeclID(F, Record[Idx++]));
3249 case MACRO_OFFSET: {
3250 if (F.LocalNumMacros != 0) {
3251 Error("duplicate MACRO_OFFSET record in AST file");
3254 F.MacroOffsets = (const uint32_t *)Blob.data();
3255 F.LocalNumMacros = Record[0];
3256 unsigned LocalBaseMacroID = Record[1];
3257 F.BaseMacroID = getTotalNumMacros();
3259 if (F.LocalNumMacros > 0) {
3260 // Introduce the global -> local mapping for macros within this module.
3261 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
3263 // Introduce the local -> global mapping for macros within this module.
3264 F.MacroRemap.insertOrReplace(
3265 std::make_pair(LocalBaseMacroID,
3266 F.BaseMacroID - LocalBaseMacroID));
3268 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
3274 // FIXME: Not used yet.
3278 case LATE_PARSED_TEMPLATE: {
3279 LateParsedTemplates.append(Record.begin(), Record.end());
3283 case OPTIMIZE_PRAGMA_OPTIONS:
3284 if (Record.size() != 1) {
3285 Error("invalid pragma optimize record");
3288 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]);
3294 /// \brief Move the given method to the back of the global list of methods.
3295 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) {
3296 // Find the entry for this selector in the method pool.
3297 Sema::GlobalMethodPool::iterator Known
3298 = S.MethodPool.find(Method->getSelector());
3299 if (Known == S.MethodPool.end())
3302 // Retrieve the appropriate method list.
3303 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
3304 : Known->second.second;
3306 for (ObjCMethodList *List = &Start; List; List = List->getNext()) {
3308 if (List->Method == Method) {
3316 if (List->getNext())
3317 List->Method = List->getNext()->Method;
3319 List->Method = Method;
3323 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) {
3324 for (unsigned I = 0, N = Names.HiddenDecls.size(); I != N; ++I) {
3325 Decl *D = Names.HiddenDecls[I];
3326 bool wasHidden = D->Hidden;
3329 if (wasHidden && SemaObj) {
3330 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) {
3331 moveMethodToBackOfGlobalList(*SemaObj, Method);
3336 for (HiddenMacrosMap::const_iterator I = Names.HiddenMacros.begin(),
3337 E = Names.HiddenMacros.end();
3339 installImportedMacro(I->first, I->second, Owner);
3342 void ASTReader::makeModuleVisible(Module *Mod,
3343 Module::NameVisibilityKind NameVisibility,
3344 SourceLocation ImportLoc,
3346 llvm::SmallPtrSet<Module *, 4> Visited;
3347 SmallVector<Module *, 4> Stack;
3348 Stack.push_back(Mod);
3349 while (!Stack.empty()) {
3350 Mod = Stack.pop_back_val();
3352 if (NameVisibility <= Mod->NameVisibility) {
3353 // This module already has this level of visibility (or greater), so
3354 // there is nothing more to do.
3358 if (!Mod->isAvailable()) {
3359 // Modules that aren't available cannot be made visible.
3363 // Update the module's name visibility.
3364 if (NameVisibility >= Module::MacrosVisible &&
3365 Mod->NameVisibility < Module::MacrosVisible)
3366 Mod->MacroVisibilityLoc = ImportLoc;
3367 Mod->NameVisibility = NameVisibility;
3369 // If we've already deserialized any names from this module,
3370 // mark them as visible.
3371 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
3372 if (Hidden != HiddenNamesMap.end()) {
3373 makeNamesVisible(Hidden->second, Hidden->first);
3374 HiddenNamesMap.erase(Hidden);
3377 // Push any exported modules onto the stack to be marked as visible.
3378 SmallVector<Module *, 16> Exports;
3379 Mod->getExportedModules(Exports);
3380 for (SmallVectorImpl<Module *>::iterator
3381 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
3382 Module *Exported = *I;
3383 if (Visited.insert(Exported))
3384 Stack.push_back(Exported);
3387 // Detect any conflicts.
3389 assert(ImportLoc.isValid() && "Missing import location");
3390 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) {
3391 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) {
3392 Diag(ImportLoc, diag::warn_module_conflict)
3393 << Mod->getFullModuleName()
3394 << Mod->Conflicts[I].Other->getFullModuleName()
3395 << Mod->Conflicts[I].Message;
3396 // FIXME: Need note where the other module was imported.
3403 bool ASTReader::loadGlobalIndex() {
3407 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
3408 !Context.getLangOpts().Modules)
3411 // Try to load the global index.
3412 TriedLoadingGlobalIndex = true;
3413 StringRef ModuleCachePath
3414 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath();
3415 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result
3416 = GlobalModuleIndex::readIndex(ModuleCachePath);
3420 GlobalIndex.reset(Result.first);
3421 ModuleMgr.setGlobalIndex(GlobalIndex.get());
3425 bool ASTReader::isGlobalIndexUnavailable() const {
3426 return Context.getLangOpts().Modules && UseGlobalIndex &&
3427 !hasGlobalIndex() && TriedLoadingGlobalIndex;
3430 static void updateModuleTimestamp(ModuleFile &MF) {
3431 // Overwrite the timestamp file contents so that file's mtime changes.
3432 std::string TimestampFilename = MF.getTimestampFilename();
3433 std::string ErrorInfo;
3434 llvm::raw_fd_ostream OS(TimestampFilename.c_str(), ErrorInfo,
3435 llvm::sys::fs::F_Text);
3436 if (!ErrorInfo.empty())
3438 OS << "Timestamp file\n";
3441 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
3443 SourceLocation ImportLoc,
3444 unsigned ClientLoadCapabilities) {
3445 llvm::SaveAndRestore<SourceLocation>
3446 SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
3448 // Defer any pending actions until we get to the end of reading the AST file.
3449 Deserializing AnASTFile(this);
3451 // Bump the generation number.
3452 unsigned PreviousGeneration = incrementGeneration(Context);
3454 unsigned NumModules = ModuleMgr.size();
3455 SmallVector<ImportedModule, 4> Loaded;
3456 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc,
3457 /*ImportedBy=*/nullptr, Loaded,
3459 ClientLoadCapabilities)) {
3463 case VersionMismatch:
3464 case ConfigurationMismatch:
3466 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet;
3467 for (const ImportedModule &IM : Loaded)
3468 LoadedSet.insert(IM.Mod);
3470 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(),
3472 Context.getLangOpts().Modules
3473 ? &PP.getHeaderSearchInfo().getModuleMap()
3476 // If we find that any modules are unusable, the global index is going
3477 // to be out-of-date. Just remove it.
3478 GlobalIndex.reset();
3479 ModuleMgr.setGlobalIndex(nullptr);
3486 // Here comes stuff that we only do once the entire chain is loaded.
3488 // Load the AST blocks of all of the modules that we loaded.
3489 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3490 MEnd = Loaded.end();
3492 ModuleFile &F = *M->Mod;
3494 // Read the AST block.
3495 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities))
3498 // Once read, set the ModuleFile bit base offset and update the size in
3499 // bits of all files we've seen.
3500 F.GlobalBitOffset = TotalModulesSizeInBits;
3501 TotalModulesSizeInBits += F.SizeInBits;
3502 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F));
3504 // Preload SLocEntries.
3505 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) {
3506 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID;
3507 // Load it through the SourceManager and don't call ReadSLocEntry()
3508 // directly because the entry may have already been loaded in which case
3509 // calling ReadSLocEntry() directly would trigger an assertion in
3511 SourceMgr.getLoadedSLocEntryByID(Index);
3515 // Setup the import locations and notify the module manager that we've
3516 // committed to these module files.
3517 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(),
3518 MEnd = Loaded.end();
3520 ModuleFile &F = *M->Mod;
3522 ModuleMgr.moduleFileAccepted(&F);
3524 // Set the import location.
3525 F.DirectImportLoc = ImportLoc;
3527 F.ImportLoc = M->ImportLoc;
3529 F.ImportLoc = ReadSourceLocation(*M->ImportedBy,
3530 M->ImportLoc.getRawEncoding());
3533 // Mark all of the identifiers in the identifier table as being out of date,
3534 // so that various accessors know to check the loaded modules when the
3535 // identifier is used.
3536 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(),
3537 IdEnd = PP.getIdentifierTable().end();
3539 Id->second->setOutOfDate(true);
3541 // Resolve any unresolved module exports.
3542 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
3543 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I];
3544 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID);
3545 Module *ResolvedMod = getSubmodule(GlobalID);
3547 switch (Unresolved.Kind) {
3548 case UnresolvedModuleRef::Conflict:
3550 Module::Conflict Conflict;
3551 Conflict.Other = ResolvedMod;
3552 Conflict.Message = Unresolved.String.str();
3553 Unresolved.Mod->Conflicts.push_back(Conflict);
3557 case UnresolvedModuleRef::Import:
3559 Unresolved.Mod->Imports.push_back(ResolvedMod);
3562 case UnresolvedModuleRef::Export:
3563 if (ResolvedMod || Unresolved.IsWildcard)
3564 Unresolved.Mod->Exports.push_back(
3565 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard));
3569 UnresolvedModuleRefs.clear();
3571 // FIXME: How do we load the 'use'd modules? They may not be submodules.
3572 // Might be unnecessary as use declarations are only used to build the
3575 InitializeContext();
3580 if (DeserializationListener)
3581 DeserializationListener->ReaderInitialized(this);
3583 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
3584 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) {
3585 PrimaryModule.OriginalSourceFileID
3586 = FileID::get(PrimaryModule.SLocEntryBaseID
3587 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1);
3589 // If this AST file is a precompiled preamble, then set the
3590 // preamble file ID of the source manager to the file source file
3591 // from which the preamble was built.
3592 if (Type == MK_Preamble) {
3593 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID);
3594 } else if (Type == MK_MainFile) {
3595 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID);
3599 // For any Objective-C class definitions we have already loaded, make sure
3600 // that we load any additional categories.
3601 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
3602 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
3603 ObjCClassesLoaded[I],
3604 PreviousGeneration);
3607 if (PP.getHeaderSearchInfo()
3608 .getHeaderSearchOpts()
3609 .ModulesValidateOncePerBuildSession) {
3610 // Now we are certain that the module and all modules it depends on are
3611 // up to date. Create or update timestamp files for modules that are
3612 // located in the module cache (not for PCH files that could be anywhere
3613 // in the filesystem).
3614 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) {
3615 ImportedModule &M = Loaded[I];
3616 if (M.Mod->Kind == MK_Module) {
3617 updateModuleTimestamp(*M.Mod);
3625 ASTReader::ASTReadResult
3626 ASTReader::ReadASTCore(StringRef FileName,
3628 SourceLocation ImportLoc,
3629 ModuleFile *ImportedBy,
3630 SmallVectorImpl<ImportedModule> &Loaded,
3631 off_t ExpectedSize, time_t ExpectedModTime,
3632 unsigned ClientLoadCapabilities) {
3634 std::string ErrorStr;
3635 ModuleManager::AddModuleResult AddResult
3636 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy,
3637 getGeneration(), ExpectedSize, ExpectedModTime,
3640 switch (AddResult) {
3641 case ModuleManager::AlreadyLoaded:
3644 case ModuleManager::NewlyLoaded:
3645 // Load module file below.
3648 case ModuleManager::Missing:
3649 // The module file was missing; if the client handle handle, that, return
3651 if (ClientLoadCapabilities & ARR_Missing)
3654 // Otherwise, return an error.
3656 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3662 case ModuleManager::OutOfDate:
3663 // We couldn't load the module file because it is out-of-date. If the
3664 // client can handle out-of-date, return it.
3665 if (ClientLoadCapabilities & ARR_OutOfDate)
3668 // Otherwise, return an error.
3670 std::string Msg = "Unable to load module \"" + FileName.str() + "\": "
3677 assert(M && "Missing module file");
3679 // FIXME: This seems rather a hack. Should CurrentDir be part of the
3681 if (FileName != "-") {
3682 CurrentDir = llvm::sys::path::parent_path(FileName);
3683 if (CurrentDir.empty()) CurrentDir = ".";
3687 BitstreamCursor &Stream = F.Stream;
3688 Stream.init(F.StreamFile);
3689 F.SizeInBits = F.Buffer->getBufferSize() * 8;
3691 // Sniff for the signature.
3692 if (Stream.Read(8) != 'C' ||
3693 Stream.Read(8) != 'P' ||
3694 Stream.Read(8) != 'C' ||
3695 Stream.Read(8) != 'H') {
3696 Diag(diag::err_not_a_pch_file) << FileName;
3700 // This is used for compatibility with older PCH formats.
3701 bool HaveReadControlBlock = false;
3704 llvm::BitstreamEntry Entry = Stream.advance();
3706 switch (Entry.Kind) {
3707 case llvm::BitstreamEntry::Error:
3708 case llvm::BitstreamEntry::EndBlock:
3709 case llvm::BitstreamEntry::Record:
3710 Error("invalid record at top-level of AST file");
3713 case llvm::BitstreamEntry::SubBlock:
3717 // We only know the control subblock ID.
3719 case llvm::bitc::BLOCKINFO_BLOCK_ID:
3720 if (Stream.ReadBlockInfoBlock()) {
3721 Error("malformed BlockInfoBlock in AST file");
3725 case CONTROL_BLOCK_ID:
3726 HaveReadControlBlock = true;
3727 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
3731 case Failure: return Failure;
3732 case Missing: return Missing;
3733 case OutOfDate: return OutOfDate;
3734 case VersionMismatch: return VersionMismatch;
3735 case ConfigurationMismatch: return ConfigurationMismatch;
3736 case HadErrors: return HadErrors;
3740 if (!HaveReadControlBlock) {
3741 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3742 Diag(diag::err_pch_version_too_old);
3743 return VersionMismatch;
3746 // Record that we've loaded this module.
3747 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
3751 if (Stream.SkipBlock()) {
3752 Error("malformed block record in AST file");
3762 void ASTReader::InitializeContext() {
3763 // If there's a listener, notify them that we "read" the translation unit.
3764 if (DeserializationListener)
3765 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID,
3766 Context.getTranslationUnitDecl());
3768 // FIXME: Find a better way to deal with collisions between these
3769 // built-in types. Right now, we just ignore the problem.
3771 // Load the special types.
3772 if (SpecialTypes.size() >= NumSpecialTypeIDs) {
3773 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) {
3774 if (!Context.CFConstantStringTypeDecl)
3775 Context.setCFConstantStringType(GetType(String));
3778 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) {
3779 QualType FileType = GetType(File);
3780 if (FileType.isNull()) {
3781 Error("FILE type is NULL");
3785 if (!Context.FILEDecl) {
3786 if (const TypedefType *Typedef = FileType->getAs<TypedefType>())
3787 Context.setFILEDecl(Typedef->getDecl());
3789 const TagType *Tag = FileType->getAs<TagType>();
3791 Error("Invalid FILE type in AST file");
3794 Context.setFILEDecl(Tag->getDecl());
3799 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) {
3800 QualType Jmp_bufType = GetType(Jmp_buf);
3801 if (Jmp_bufType.isNull()) {
3802 Error("jmp_buf type is NULL");
3806 if (!Context.jmp_bufDecl) {
3807 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>())
3808 Context.setjmp_bufDecl(Typedef->getDecl());
3810 const TagType *Tag = Jmp_bufType->getAs<TagType>();
3812 Error("Invalid jmp_buf type in AST file");
3815 Context.setjmp_bufDecl(Tag->getDecl());
3820 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) {
3821 QualType Sigjmp_bufType = GetType(Sigjmp_buf);
3822 if (Sigjmp_bufType.isNull()) {
3823 Error("sigjmp_buf type is NULL");
3827 if (!Context.sigjmp_bufDecl) {
3828 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>())
3829 Context.setsigjmp_bufDecl(Typedef->getDecl());
3831 const TagType *Tag = Sigjmp_bufType->getAs<TagType>();
3832 assert(Tag && "Invalid sigjmp_buf type in AST file");
3833 Context.setsigjmp_bufDecl(Tag->getDecl());
3838 if (unsigned ObjCIdRedef
3839 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) {
3840 if (Context.ObjCIdRedefinitionType.isNull())
3841 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef);
3844 if (unsigned ObjCClassRedef
3845 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) {
3846 if (Context.ObjCClassRedefinitionType.isNull())
3847 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef);
3850 if (unsigned ObjCSelRedef
3851 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) {
3852 if (Context.ObjCSelRedefinitionType.isNull())
3853 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef);
3856 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) {
3857 QualType Ucontext_tType = GetType(Ucontext_t);
3858 if (Ucontext_tType.isNull()) {
3859 Error("ucontext_t type is NULL");
3863 if (!Context.ucontext_tDecl) {
3864 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>())
3865 Context.setucontext_tDecl(Typedef->getDecl());
3867 const TagType *Tag = Ucontext_tType->getAs<TagType>();
3868 assert(Tag && "Invalid ucontext_t type in AST file");
3869 Context.setucontext_tDecl(Tag->getDecl());
3875 ReadPragmaDiagnosticMappings(Context.getDiagnostics());
3877 // If there were any CUDA special declarations, deserialize them.
3878 if (!CUDASpecialDeclRefs.empty()) {
3879 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!");
3880 Context.setcudaConfigureCallDecl(
3881 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
3884 // Re-export any modules that were imported by a non-module AST file.
3885 // FIXME: This does not make macro-only imports visible again. It also doesn't
3886 // make #includes mapped to module imports visible.
3887 for (auto &Import : ImportedModules) {
3888 if (Module *Imported = getSubmodule(Import.ID))
3889 makeModuleVisible(Imported, Module::AllVisible,
3890 /*ImportLoc=*/Import.ImportLoc,
3891 /*Complain=*/false);
3893 ImportedModules.clear();
3896 void ASTReader::finalizeForWriting() {
3897 for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(),
3898 HiddenEnd = HiddenNamesMap.end();
3899 Hidden != HiddenEnd; ++Hidden) {
3900 makeNamesVisible(Hidden->second, Hidden->first);
3902 HiddenNamesMap.clear();
3905 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the
3906 /// cursor into the start of the given block ID, returning false on success and
3907 /// true on failure.
3908 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) {
3910 llvm::BitstreamEntry Entry = Cursor.advance();
3911 switch (Entry.Kind) {
3912 case llvm::BitstreamEntry::Error:
3913 case llvm::BitstreamEntry::EndBlock:
3916 case llvm::BitstreamEntry::Record:
3917 // Ignore top-level records.
3918 Cursor.skipRecord(Entry.ID);
3921 case llvm::BitstreamEntry::SubBlock:
3922 if (Entry.ID == BlockID) {
3923 if (Cursor.EnterSubBlock(BlockID))
3929 if (Cursor.SkipBlock())
3935 /// \brief Retrieve the name of the original source file name
3936 /// directly from the AST file, without actually loading the AST
3938 std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName,
3939 FileManager &FileMgr,
3940 DiagnosticsEngine &Diags) {
3941 // Open the AST file.
3943 std::unique_ptr<llvm::MemoryBuffer> Buffer;
3944 Buffer.reset(FileMgr.getBufferForFile(ASTFileName, &ErrStr));
3946 Diags.Report(diag::err_fe_unable_to_read_pch_file) << ASTFileName << ErrStr;
3947 return std::string();
3950 // Initialize the stream
3951 llvm::BitstreamReader StreamFile;
3952 BitstreamCursor Stream;
3953 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
3954 (const unsigned char *)Buffer->getBufferEnd());
3955 Stream.init(StreamFile);
3957 // Sniff for the signature.
3958 if (Stream.Read(8) != 'C' ||
3959 Stream.Read(8) != 'P' ||
3960 Stream.Read(8) != 'C' ||
3961 Stream.Read(8) != 'H') {
3962 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName;
3963 return std::string();
3966 // Scan for the CONTROL_BLOCK_ID block.
3967 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) {
3968 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3969 return std::string();
3972 // Scan for ORIGINAL_FILE inside the control block.
3975 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
3976 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
3977 return std::string();
3979 if (Entry.Kind != llvm::BitstreamEntry::Record) {
3980 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
3981 return std::string();
3986 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE)
3992 class SimplePCHValidator : public ASTReaderListener {
3993 const LangOptions &ExistingLangOpts;
3994 const TargetOptions &ExistingTargetOpts;
3995 const PreprocessorOptions &ExistingPPOpts;
3996 FileManager &FileMgr;
3999 SimplePCHValidator(const LangOptions &ExistingLangOpts,
4000 const TargetOptions &ExistingTargetOpts,
4001 const PreprocessorOptions &ExistingPPOpts,
4002 FileManager &FileMgr)
4003 : ExistingLangOpts(ExistingLangOpts),
4004 ExistingTargetOpts(ExistingTargetOpts),
4005 ExistingPPOpts(ExistingPPOpts),
4010 bool ReadLanguageOptions(const LangOptions &LangOpts,
4011 bool Complain) override {
4012 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr);
4014 bool ReadTargetOptions(const TargetOptions &TargetOpts,
4015 bool Complain) override {
4016 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr);
4018 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
4020 std::string &SuggestedPredefines) override {
4021 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr,
4022 SuggestedPredefines, ExistingLangOpts);
4027 bool ASTReader::readASTFileControlBlock(StringRef Filename,
4028 FileManager &FileMgr,
4029 ASTReaderListener &Listener) {
4030 // Open the AST file.
4032 std::unique_ptr<llvm::MemoryBuffer> Buffer;
4033 Buffer.reset(FileMgr.getBufferForFile(Filename, &ErrStr));
4038 // Initialize the stream
4039 llvm::BitstreamReader StreamFile;
4040 BitstreamCursor Stream;
4041 StreamFile.init((const unsigned char *)Buffer->getBufferStart(),
4042 (const unsigned char *)Buffer->getBufferEnd());
4043 Stream.init(StreamFile);
4045 // Sniff for the signature.
4046 if (Stream.Read(8) != 'C' ||
4047 Stream.Read(8) != 'P' ||
4048 Stream.Read(8) != 'C' ||
4049 Stream.Read(8) != 'H') {
4053 // Scan for the CONTROL_BLOCK_ID block.
4054 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID))
4057 bool NeedsInputFiles = Listener.needsInputFileVisitation();
4058 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
4059 BitstreamCursor InputFilesCursor;
4060 if (NeedsInputFiles) {
4061 InputFilesCursor = Stream;
4062 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID))
4065 // Read the abbreviations
4067 uint64_t Offset = InputFilesCursor.GetCurrentBitNo();
4068 unsigned Code = InputFilesCursor.ReadCode();
4070 // We expect all abbrevs to be at the start of the block.
4071 if (Code != llvm::bitc::DEFINE_ABBREV) {
4072 InputFilesCursor.JumpToBit(Offset);
4075 InputFilesCursor.ReadAbbrevRecord();
4079 // Scan for ORIGINAL_FILE inside the control block.
4082 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
4083 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
4086 if (Entry.Kind != llvm::BitstreamEntry::Record)
4091 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
4092 switch ((ControlRecordTypes)RecCode) {
4094 if (Record[0] != VERSION_MAJOR)
4097 if (Listener.ReadFullVersionInformation(Blob))
4103 Listener.ReadModuleName(Blob);
4105 case MODULE_MAP_FILE:
4106 Listener.ReadModuleMapFile(Blob);
4108 case LANGUAGE_OPTIONS:
4109 if (ParseLanguageOptions(Record, false, Listener))
4113 case TARGET_OPTIONS:
4114 if (ParseTargetOptions(Record, false, Listener))
4118 case DIAGNOSTIC_OPTIONS:
4119 if (ParseDiagnosticOptions(Record, false, Listener))
4123 case FILE_SYSTEM_OPTIONS:
4124 if (ParseFileSystemOptions(Record, false, Listener))
4128 case HEADER_SEARCH_OPTIONS:
4129 if (ParseHeaderSearchOptions(Record, false, Listener))
4133 case PREPROCESSOR_OPTIONS: {
4134 std::string IgnoredSuggestedPredefines;
4135 if (ParsePreprocessorOptions(Record, false, Listener,
4136 IgnoredSuggestedPredefines))
4141 case INPUT_FILE_OFFSETS: {
4142 if (!NeedsInputFiles)
4145 unsigned NumInputFiles = Record[0];
4146 unsigned NumUserFiles = Record[1];
4147 const uint32_t *InputFileOffs = (const uint32_t *)Blob.data();
4148 for (unsigned I = 0; I != NumInputFiles; ++I) {
4149 // Go find this input file.
4150 bool isSystemFile = I >= NumUserFiles;
4152 if (isSystemFile && !NeedsSystemInputFiles)
4153 break; // the rest are system input files
4155 BitstreamCursor &Cursor = InputFilesCursor;
4156 SavedStreamPosition SavedPosition(Cursor);
4157 Cursor.JumpToBit(InputFileOffs[I]);
4159 unsigned Code = Cursor.ReadCode();
4162 bool shouldContinue = false;
4163 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) {
4165 bool Overridden = static_cast<bool>(Record[3]);
4166 shouldContinue = Listener.visitInputFile(Blob, isSystemFile, Overridden);
4169 if (!shouldContinue)
4176 // No other validation to perform.
4183 bool ASTReader::isAcceptableASTFile(StringRef Filename,
4184 FileManager &FileMgr,
4185 const LangOptions &LangOpts,
4186 const TargetOptions &TargetOpts,
4187 const PreprocessorOptions &PPOpts) {
4188 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, FileMgr);
4189 return !readASTFileControlBlock(Filename, FileMgr, validator);
4192 ASTReader::ASTReadResult
4193 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
4194 // Enter the submodule block.
4195 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) {
4196 Error("malformed submodule block record in AST file");
4200 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
4202 Module *CurrentModule = nullptr;
4205 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks();
4207 switch (Entry.Kind) {
4208 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
4209 case llvm::BitstreamEntry::Error:
4210 Error("malformed block record in AST file");
4212 case llvm::BitstreamEntry::EndBlock:
4214 case llvm::BitstreamEntry::Record:
4215 // The interesting case.
4222 switch (F.Stream.readRecord(Entry.ID, Record, &Blob)) {
4223 default: // Default behavior: ignore.
4226 case SUBMODULE_DEFINITION: {
4228 Error("missing submodule metadata record at beginning of block");
4232 if (Record.size() < 8) {
4233 Error("malformed module definition");
4237 StringRef Name = Blob;
4239 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
4240 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
4241 bool IsFramework = Record[Idx++];
4242 bool IsExplicit = Record[Idx++];
4243 bool IsSystem = Record[Idx++];
4244 bool IsExternC = Record[Idx++];
4245 bool InferSubmodules = Record[Idx++];
4246 bool InferExplicitSubmodules = Record[Idx++];
4247 bool InferExportWildcard = Record[Idx++];
4248 bool ConfigMacrosExhaustive = Record[Idx++];
4250 Module *ParentModule = nullptr;
4251 const FileEntry *ModuleMap = nullptr;
4253 ParentModule = getSubmodule(Parent);
4254 ModuleMap = ParentModule->ModuleMap;
4257 if (!F.ModuleMapPath.empty())
4258 ModuleMap = FileMgr.getFile(F.ModuleMapPath);
4260 // Retrieve this (sub)module from the module map, creating it if
4262 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, ModuleMap,
4265 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS;
4266 if (GlobalIndex >= SubmodulesLoaded.size() ||
4267 SubmodulesLoaded[GlobalIndex]) {
4268 Error("too many submodules");
4272 if (!ParentModule) {
4273 if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
4274 if (CurFile != F.File) {
4275 if (!Diags.isDiagnosticInFlight()) {
4276 Diag(diag::err_module_file_conflict)
4277 << CurrentModule->getTopLevelModuleName()
4278 << CurFile->getName()
4279 << F.File->getName();
4285 CurrentModule->setASTFile(F.File);
4288 CurrentModule->IsFromModuleFile = true;
4289 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
4290 CurrentModule->IsExternC = IsExternC;
4291 CurrentModule->InferSubmodules = InferSubmodules;
4292 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
4293 CurrentModule->InferExportWildcard = InferExportWildcard;
4294 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive;
4295 if (DeserializationListener)
4296 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
4298 SubmodulesLoaded[GlobalIndex] = CurrentModule;
4300 // Clear out data that will be replaced by what is the module file.
4301 CurrentModule->LinkLibraries.clear();
4302 CurrentModule->ConfigMacros.clear();
4303 CurrentModule->UnresolvedConflicts.clear();
4304 CurrentModule->Conflicts.clear();
4308 case SUBMODULE_UMBRELLA_HEADER: {
4310 Error("missing submodule metadata record at beginning of block");
4317 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) {
4318 if (!CurrentModule->getUmbrellaHeader())
4319 ModMap.setUmbrellaHeader(CurrentModule, Umbrella);
4320 else if (CurrentModule->getUmbrellaHeader() != Umbrella) {
4321 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4322 Error("mismatched umbrella headers in submodule");
4329 case SUBMODULE_HEADER: {
4331 Error("missing submodule metadata record at beginning of block");
4338 // We lazily associate headers with their modules via the HeaderInfoTable.
4339 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4340 // of complete filenames or remove it entirely.
4344 case SUBMODULE_EXCLUDED_HEADER: {
4346 Error("missing submodule metadata record at beginning of block");
4353 // We lazily associate headers with their modules via the HeaderInfoTable.
4354 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4355 // of complete filenames or remove it entirely.
4359 case SUBMODULE_PRIVATE_HEADER: {
4361 Error("missing submodule metadata record at beginning of block");
4368 // We lazily associate headers with their modules via the HeaderInfoTable.
4369 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead
4370 // of complete filenames or remove it entirely.
4374 case SUBMODULE_TOPHEADER: {
4376 Error("missing submodule metadata record at beginning of block");
4383 CurrentModule->addTopHeaderFilename(Blob);
4387 case SUBMODULE_UMBRELLA_DIR: {
4389 Error("missing submodule metadata record at beginning of block");
4396 if (const DirectoryEntry *Umbrella
4397 = PP.getFileManager().getDirectory(Blob)) {
4398 if (!CurrentModule->getUmbrellaDir())
4399 ModMap.setUmbrellaDir(CurrentModule, Umbrella);
4400 else if (CurrentModule->getUmbrellaDir() != Umbrella) {
4401 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
4402 Error("mismatched umbrella directories in submodule");
4409 case SUBMODULE_METADATA: {
4411 Error("submodule metadata record not at beginning of block");
4416 F.BaseSubmoduleID = getTotalNumSubmodules();
4417 F.LocalNumSubmodules = Record[0];
4418 unsigned LocalBaseSubmoduleID = Record[1];
4419 if (F.LocalNumSubmodules > 0) {
4420 // Introduce the global -> local mapping for submodules within this
4422 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
4424 // Introduce the local -> global mapping for submodules within this
4426 F.SubmoduleRemap.insertOrReplace(
4427 std::make_pair(LocalBaseSubmoduleID,
4428 F.BaseSubmoduleID - LocalBaseSubmoduleID));
4430 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
4435 case SUBMODULE_IMPORTS: {
4437 Error("missing submodule metadata record at beginning of block");
4444 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) {
4445 UnresolvedModuleRef Unresolved;
4446 Unresolved.File = &F;
4447 Unresolved.Mod = CurrentModule;
4448 Unresolved.ID = Record[Idx];
4449 Unresolved.Kind = UnresolvedModuleRef::Import;
4450 Unresolved.IsWildcard = false;
4451 UnresolvedModuleRefs.push_back(Unresolved);
4456 case SUBMODULE_EXPORTS: {
4458 Error("missing submodule metadata record at beginning of block");
4465 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
4466 UnresolvedModuleRef Unresolved;
4467 Unresolved.File = &F;
4468 Unresolved.Mod = CurrentModule;
4469 Unresolved.ID = Record[Idx];
4470 Unresolved.Kind = UnresolvedModuleRef::Export;
4471 Unresolved.IsWildcard = Record[Idx + 1];
4472 UnresolvedModuleRefs.push_back(Unresolved);
4475 // Once we've loaded the set of exports, there's no reason to keep
4476 // the parsed, unresolved exports around.
4477 CurrentModule->UnresolvedExports.clear();
4480 case SUBMODULE_REQUIRES: {
4482 Error("missing submodule metadata record at beginning of block");
4489 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(),
4490 Context.getTargetInfo());
4494 case SUBMODULE_LINK_LIBRARY:
4496 Error("missing submodule metadata record at beginning of block");
4503 CurrentModule->LinkLibraries.push_back(
4504 Module::LinkLibrary(Blob, Record[0]));
4507 case SUBMODULE_CONFIG_MACRO:
4509 Error("missing submodule metadata record at beginning of block");
4516 CurrentModule->ConfigMacros.push_back(Blob.str());
4519 case SUBMODULE_CONFLICT: {
4521 Error("missing submodule metadata record at beginning of block");
4528 UnresolvedModuleRef Unresolved;
4529 Unresolved.File = &F;
4530 Unresolved.Mod = CurrentModule;
4531 Unresolved.ID = Record[0];
4532 Unresolved.Kind = UnresolvedModuleRef::Conflict;
4533 Unresolved.IsWildcard = false;
4534 Unresolved.String = Blob;
4535 UnresolvedModuleRefs.push_back(Unresolved);
4542 /// \brief Parse the record that corresponds to a LangOptions data
4545 /// This routine parses the language options from the AST file and then gives
4546 /// them to the AST listener if one is set.
4548 /// \returns true if the listener deems the file unacceptable, false otherwise.
4549 bool ASTReader::ParseLanguageOptions(const RecordData &Record,
4551 ASTReaderListener &Listener) {
4552 LangOptions LangOpts;
4554 #define LANGOPT(Name, Bits, Default, Description) \
4555 LangOpts.Name = Record[Idx++];
4556 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
4557 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
4558 #include "clang/Basic/LangOptions.def"
4559 #define SANITIZER(NAME, ID) LangOpts.Sanitize.ID = Record[Idx++];
4560 #include "clang/Basic/Sanitizers.def"
4562 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++];
4563 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx);
4564 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
4566 unsigned Length = Record[Idx++];
4567 LangOpts.CurrentModule.assign(Record.begin() + Idx,
4568 Record.begin() + Idx + Length);
4573 for (unsigned N = Record[Idx++]; N; --N) {
4574 LangOpts.CommentOpts.BlockCommandNames.push_back(
4575 ReadString(Record, Idx));
4577 LangOpts.CommentOpts.ParseAllComments = Record[Idx++];
4579 return Listener.ReadLanguageOptions(LangOpts, Complain);
4582 bool ASTReader::ParseTargetOptions(const RecordData &Record,
4584 ASTReaderListener &Listener) {
4586 TargetOptions TargetOpts;
4587 TargetOpts.Triple = ReadString(Record, Idx);
4588 TargetOpts.CPU = ReadString(Record, Idx);
4589 TargetOpts.ABI = ReadString(Record, Idx);
4590 for (unsigned N = Record[Idx++]; N; --N) {
4591 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx));
4593 for (unsigned N = Record[Idx++]; N; --N) {
4594 TargetOpts.Features.push_back(ReadString(Record, Idx));
4597 return Listener.ReadTargetOptions(TargetOpts, Complain);
4600 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain,
4601 ASTReaderListener &Listener) {
4602 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
4604 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++];
4605 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
4606 DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
4607 #include "clang/Basic/DiagnosticOptions.def"
4609 for (unsigned N = Record[Idx++]; N; --N) {
4610 DiagOpts->Warnings.push_back(ReadString(Record, Idx));
4613 return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
4616 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain,
4617 ASTReaderListener &Listener) {
4618 FileSystemOptions FSOpts;
4620 FSOpts.WorkingDir = ReadString(Record, Idx);
4621 return Listener.ReadFileSystemOptions(FSOpts, Complain);
4624 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record,
4626 ASTReaderListener &Listener) {
4627 HeaderSearchOptions HSOpts;
4629 HSOpts.Sysroot = ReadString(Record, Idx);
4632 for (unsigned N = Record[Idx++]; N; --N) {
4633 std::string Path = ReadString(Record, Idx);
4634 frontend::IncludeDirGroup Group
4635 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]);
4636 bool IsFramework = Record[Idx++];
4637 bool IgnoreSysRoot = Record[Idx++];
4638 HSOpts.UserEntries.push_back(
4639 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot));
4642 // System header prefixes.
4643 for (unsigned N = Record[Idx++]; N; --N) {
4644 std::string Prefix = ReadString(Record, Idx);
4645 bool IsSystemHeader = Record[Idx++];
4646 HSOpts.SystemHeaderPrefixes.push_back(
4647 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader));
4650 HSOpts.ResourceDir = ReadString(Record, Idx);
4651 HSOpts.ModuleCachePath = ReadString(Record, Idx);
4652 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx);
4653 HSOpts.DisableModuleHash = Record[Idx++];
4654 HSOpts.UseBuiltinIncludes = Record[Idx++];
4655 HSOpts.UseStandardSystemIncludes = Record[Idx++];
4656 HSOpts.UseStandardCXXIncludes = Record[Idx++];
4657 HSOpts.UseLibcxx = Record[Idx++];
4659 return Listener.ReadHeaderSearchOptions(HSOpts, Complain);
4662 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record,
4664 ASTReaderListener &Listener,
4665 std::string &SuggestedPredefines) {
4666 PreprocessorOptions PPOpts;
4669 // Macro definitions/undefs
4670 for (unsigned N = Record[Idx++]; N; --N) {
4671 std::string Macro = ReadString(Record, Idx);
4672 bool IsUndef = Record[Idx++];
4673 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef));
4677 for (unsigned N = Record[Idx++]; N; --N) {
4678 PPOpts.Includes.push_back(ReadString(Record, Idx));
4682 for (unsigned N = Record[Idx++]; N; --N) {
4683 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx));
4686 PPOpts.UsePredefines = Record[Idx++];
4687 PPOpts.DetailedRecord = Record[Idx++];
4688 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx);
4689 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx);
4690 PPOpts.ObjCXXARCStandardLibrary =
4691 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]);
4692 SuggestedPredefines.clear();
4693 return Listener.ReadPreprocessorOptions(PPOpts, Complain,
4694 SuggestedPredefines);
4697 std::pair<ModuleFile *, unsigned>
4698 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
4699 GlobalPreprocessedEntityMapType::iterator
4700 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
4701 assert(I != GlobalPreprocessedEntityMap.end() &&
4702 "Corrupted global preprocessed entity map");
4703 ModuleFile *M = I->second;
4704 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID;
4705 return std::make_pair(M, LocalIndex);
4708 std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
4709 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
4710 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
4711 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
4712 Mod.NumPreprocessedEntities);
4714 return std::make_pair(PreprocessingRecord::iterator(),
4715 PreprocessingRecord::iterator());
4718 std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
4719 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
4720 return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
4721 ModuleDeclIterator(this, &Mod,
4722 Mod.FileSortedDecls + Mod.NumFileSortedDecls));
4725 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
4726 PreprocessedEntityID PPID = Index+1;
4727 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4728 ModuleFile &M = *PPInfo.first;
4729 unsigned LocalIndex = PPInfo.second;
4730 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4732 if (!PP.getPreprocessingRecord()) {
4733 Error("no preprocessing record");
4737 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor);
4738 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset);
4740 llvm::BitstreamEntry Entry =
4741 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
4742 if (Entry.Kind != llvm::BitstreamEntry::Record)
4746 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin),
4747 ReadSourceLocation(M, PPOffs.End));
4748 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord();
4751 PreprocessorDetailRecordTypes RecType =
4752 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord(
4753 Entry.ID, Record, &Blob);
4755 case PPD_MACRO_EXPANSION: {
4756 bool isBuiltin = Record[0];
4757 IdentifierInfo *Name = nullptr;
4758 MacroDefinition *Def = nullptr;
4760 Name = getLocalIdentifier(M, Record[1]);
4762 PreprocessedEntityID
4763 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]);
4764 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1));
4769 ME = new (PPRec) MacroExpansion(Name, Range);
4771 ME = new (PPRec) MacroExpansion(Def, Range);
4776 case PPD_MACRO_DEFINITION: {
4777 // Decode the identifier info and then check again; if the macro is
4778 // still defined and associated with the identifier,
4779 IdentifierInfo *II = getLocalIdentifier(M, Record[0]);
4781 = new (PPRec) MacroDefinition(II, Range);
4783 if (DeserializationListener)
4784 DeserializationListener->MacroDefinitionRead(PPID, MD);
4789 case PPD_INCLUSION_DIRECTIVE: {
4790 const char *FullFileNameStart = Blob.data() + Record[0];
4791 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]);
4792 const FileEntry *File = nullptr;
4793 if (!FullFileName.empty())
4794 File = PP.getFileManager().getFile(FullFileName);
4796 // FIXME: Stable encoding
4797 InclusionDirective::InclusionKind Kind
4798 = static_cast<InclusionDirective::InclusionKind>(Record[2]);
4799 InclusionDirective *ID
4800 = new (PPRec) InclusionDirective(PPRec, Kind,
4801 StringRef(Blob.data(), Record[0]),
4802 Record[1], Record[3],
4809 llvm_unreachable("Invalid PreprocessorDetailRecordTypes");
4812 /// \brief \arg SLocMapI points at a chunk of a module that contains no
4813 /// preprocessed entities or the entities it contains are not the ones we are
4814 /// looking for. Find the next module that contains entities and return the ID
4815 /// of the first entry.
4816 PreprocessedEntityID ASTReader::findNextPreprocessedEntity(
4817 GlobalSLocOffsetMapType::const_iterator SLocMapI) const {
4819 for (GlobalSLocOffsetMapType::const_iterator
4820 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
4821 ModuleFile &M = *SLocMapI->second;
4822 if (M.NumPreprocessedEntities)
4823 return M.BasePreprocessedEntityID;
4826 return getTotalNumPreprocessedEntities();
4831 template <unsigned PPEntityOffset::*PPLoc>
4832 struct PPEntityComp {
4833 const ASTReader &Reader;
4836 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { }
4838 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const {
4839 SourceLocation LHS = getLoc(L);
4840 SourceLocation RHS = getLoc(R);
4841 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4844 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const {
4845 SourceLocation LHS = getLoc(L);
4846 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4849 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const {
4850 SourceLocation RHS = getLoc(R);
4851 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
4854 SourceLocation getLoc(const PPEntityOffset &PPE) const {
4855 return Reader.ReadSourceLocation(M, PPE.*PPLoc);
4861 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc,
4862 bool EndsAfter) const {
4863 if (SourceMgr.isLocalSourceLocation(Loc))
4864 return getTotalNumPreprocessedEntities();
4866 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
4867 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
4868 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
4869 "Corrupted global sloc offset map");
4871 if (SLocMapI->second->NumPreprocessedEntities == 0)
4872 return findNextPreprocessedEntity(SLocMapI);
4874 ModuleFile &M = *SLocMapI->second;
4875 typedef const PPEntityOffset *pp_iterator;
4876 pp_iterator pp_begin = M.PreprocessedEntityOffsets;
4877 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities;
4879 size_t Count = M.NumPreprocessedEntities;
4881 pp_iterator First = pp_begin;
4885 PPI = std::upper_bound(pp_begin, pp_end, Loc,
4886 PPEntityComp<&PPEntityOffset::Begin>(*this, M));
4888 // Do a binary search manually instead of using std::lower_bound because
4889 // The end locations of entities may be unordered (when a macro expansion
4890 // is inside another macro argument), but for this case it is not important
4891 // whether we get the first macro expansion or its containing macro.
4895 std::advance(PPI, Half);
4896 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End),
4900 Count = Count - Half - 1;
4907 return findNextPreprocessedEntity(SLocMapI);
4909 return M.BasePreprocessedEntityID + (PPI - pp_begin);
4912 /// \brief Returns a pair of [Begin, End) indices of preallocated
4913 /// preprocessed entities that \arg Range encompasses.
4914 std::pair<unsigned, unsigned>
4915 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) {
4916 if (Range.isInvalid())
4917 return std::make_pair(0,0);
4918 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
4920 PreprocessedEntityID BeginID =
4921 findPreprocessedEntity(Range.getBegin(), false);
4922 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true);
4923 return std::make_pair(BeginID, EndID);
4926 /// \brief Optionally returns true or false if the preallocated preprocessed
4927 /// entity with index \arg Index came from file \arg FID.
4928 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index,
4930 if (FID.isInvalid())
4933 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
4934 ModuleFile &M = *PPInfo.first;
4935 unsigned LocalIndex = PPInfo.second;
4936 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex];
4938 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin);
4939 if (Loc.isInvalid())
4942 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
4949 /// \brief Visitor used to search for information about a header file.
4950 class HeaderFileInfoVisitor {
4951 const FileEntry *FE;
4953 Optional<HeaderFileInfo> HFI;
4956 explicit HeaderFileInfoVisitor(const FileEntry *FE)
4959 static bool visit(ModuleFile &M, void *UserData) {
4960 HeaderFileInfoVisitor *This
4961 = static_cast<HeaderFileInfoVisitor *>(UserData);
4963 HeaderFileInfoLookupTable *Table
4964 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable);
4968 // Look in the on-disk hash table for an entry for this file name.
4969 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE);
4970 if (Pos == Table->end())
4977 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
4981 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
4982 HeaderFileInfoVisitor Visitor(FE);
4983 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
4984 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
4987 return HeaderFileInfo();
4990 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) {
4991 // FIXME: Make it work properly with modules.
4992 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates;
4993 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) {
4994 ModuleFile &F = *(*I);
4997 assert(!Diag.DiagStates.empty());
4998 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one.
4999 while (Idx < F.PragmaDiagMappings.size()) {
5000 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]);
5001 unsigned DiagStateID = F.PragmaDiagMappings[Idx++];
5002 if (DiagStateID != 0) {
5003 Diag.DiagStatePoints.push_back(
5004 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1],
5005 FullSourceLoc(Loc, SourceMgr)));
5009 assert(DiagStateID == 0);
5010 // A new DiagState was created here.
5011 Diag.DiagStates.push_back(*Diag.GetCurDiagState());
5012 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back();
5013 DiagStates.push_back(NewState);
5014 Diag.DiagStatePoints.push_back(
5015 DiagnosticsEngine::DiagStatePoint(NewState,
5016 FullSourceLoc(Loc, SourceMgr)));
5018 assert(Idx < F.PragmaDiagMappings.size() &&
5019 "Invalid data, didn't find '-1' marking end of diag/map pairs");
5020 if (Idx >= F.PragmaDiagMappings.size()) {
5021 break; // Something is messed up but at least avoid infinite loop in
5024 unsigned DiagID = F.PragmaDiagMappings[Idx++];
5025 if (DiagID == (unsigned)-1) {
5026 break; // no more diag/map pairs for this location.
5028 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++];
5029 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc);
5030 Diag.GetCurDiagState()->setMapping(DiagID, Mapping);
5036 /// \brief Get the correct cursor and offset for loading a type.
5037 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) {
5038 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index);
5039 assert(I != GlobalTypeMap.end() && "Corrupted global type map");
5040 ModuleFile *M = I->second;
5041 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]);
5044 /// \brief Read and return the type with the given index..
5046 /// The index is the type ID, shifted and minus the number of predefs. This
5047 /// routine actually reads the record corresponding to the type at the given
5048 /// location. It is a helper routine for GetType, which deals with reading type
5050 QualType ASTReader::readTypeRecord(unsigned Index) {
5051 RecordLocation Loc = TypeCursorForIndex(Index);
5052 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
5054 // Keep track of where we are in the stream, then jump back there
5055 // after reading this type.
5056 SavedStreamPosition SavedPosition(DeclsCursor);
5058 ReadingKindTracker ReadingKind(Read_Type, *this);
5060 // Note that we are loading a type record.
5061 Deserializing AType(this);
5064 DeclsCursor.JumpToBit(Loc.Offset);
5066 unsigned Code = DeclsCursor.ReadCode();
5067 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) {
5068 case TYPE_EXT_QUAL: {
5069 if (Record.size() != 2) {
5070 Error("Incorrect encoding of extended qualifier type");
5073 QualType Base = readType(*Loc.F, Record, Idx);
5074 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]);
5075 return Context.getQualifiedType(Base, Quals);
5078 case TYPE_COMPLEX: {
5079 if (Record.size() != 1) {
5080 Error("Incorrect encoding of complex type");
5083 QualType ElemType = readType(*Loc.F, Record, Idx);
5084 return Context.getComplexType(ElemType);
5087 case TYPE_POINTER: {
5088 if (Record.size() != 1) {
5089 Error("Incorrect encoding of pointer type");
5092 QualType PointeeType = readType(*Loc.F, Record, Idx);
5093 return Context.getPointerType(PointeeType);
5096 case TYPE_DECAYED: {
5097 if (Record.size() != 1) {
5098 Error("Incorrect encoding of decayed type");
5101 QualType OriginalType = readType(*Loc.F, Record, Idx);
5102 QualType DT = Context.getAdjustedParameterType(OriginalType);
5103 if (!isa<DecayedType>(DT))
5104 Error("Decayed type does not decay");
5108 case TYPE_ADJUSTED: {
5109 if (Record.size() != 2) {
5110 Error("Incorrect encoding of adjusted type");
5113 QualType OriginalTy = readType(*Loc.F, Record, Idx);
5114 QualType AdjustedTy = readType(*Loc.F, Record, Idx);
5115 return Context.getAdjustedType(OriginalTy, AdjustedTy);
5118 case TYPE_BLOCK_POINTER: {
5119 if (Record.size() != 1) {
5120 Error("Incorrect encoding of block pointer type");
5123 QualType PointeeType = readType(*Loc.F, Record, Idx);
5124 return Context.getBlockPointerType(PointeeType);
5127 case TYPE_LVALUE_REFERENCE: {
5128 if (Record.size() != 2) {
5129 Error("Incorrect encoding of lvalue reference type");
5132 QualType PointeeType = readType(*Loc.F, Record, Idx);
5133 return Context.getLValueReferenceType(PointeeType, Record[1]);
5136 case TYPE_RVALUE_REFERENCE: {
5137 if (Record.size() != 1) {
5138 Error("Incorrect encoding of rvalue reference type");
5141 QualType PointeeType = readType(*Loc.F, Record, Idx);
5142 return Context.getRValueReferenceType(PointeeType);
5145 case TYPE_MEMBER_POINTER: {
5146 if (Record.size() != 2) {
5147 Error("Incorrect encoding of member pointer type");
5150 QualType PointeeType = readType(*Loc.F, Record, Idx);
5151 QualType ClassType = readType(*Loc.F, Record, Idx);
5152 if (PointeeType.isNull() || ClassType.isNull())
5155 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr());
5158 case TYPE_CONSTANT_ARRAY: {
5159 QualType ElementType = readType(*Loc.F, Record, Idx);
5160 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5161 unsigned IndexTypeQuals = Record[2];
5163 llvm::APInt Size = ReadAPInt(Record, Idx);
5164 return Context.getConstantArrayType(ElementType, Size,
5165 ASM, IndexTypeQuals);
5168 case TYPE_INCOMPLETE_ARRAY: {
5169 QualType ElementType = readType(*Loc.F, Record, Idx);
5170 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5171 unsigned IndexTypeQuals = Record[2];
5172 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals);
5175 case TYPE_VARIABLE_ARRAY: {
5176 QualType ElementType = readType(*Loc.F, Record, Idx);
5177 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1];
5178 unsigned IndexTypeQuals = Record[2];
5179 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]);
5180 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]);
5181 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F),
5182 ASM, IndexTypeQuals,
5183 SourceRange(LBLoc, RBLoc));
5187 if (Record.size() != 3) {
5188 Error("incorrect encoding of vector type in AST file");
5192 QualType ElementType = readType(*Loc.F, Record, Idx);
5193 unsigned NumElements = Record[1];
5194 unsigned VecKind = Record[2];
5195 return Context.getVectorType(ElementType, NumElements,
5196 (VectorType::VectorKind)VecKind);
5199 case TYPE_EXT_VECTOR: {
5200 if (Record.size() != 3) {
5201 Error("incorrect encoding of extended vector type in AST file");
5205 QualType ElementType = readType(*Loc.F, Record, Idx);
5206 unsigned NumElements = Record[1];
5207 return Context.getExtVectorType(ElementType, NumElements);
5210 case TYPE_FUNCTION_NO_PROTO: {
5211 if (Record.size() != 6) {
5212 Error("incorrect encoding of no-proto function type");
5215 QualType ResultType = readType(*Loc.F, Record, Idx);
5216 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3],
5217 (CallingConv)Record[4], Record[5]);
5218 return Context.getFunctionNoProtoType(ResultType, Info);
5221 case TYPE_FUNCTION_PROTO: {
5222 QualType ResultType = readType(*Loc.F, Record, Idx);
5224 FunctionProtoType::ExtProtoInfo EPI;
5225 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1],
5226 /*hasregparm*/ Record[2],
5227 /*regparm*/ Record[3],
5228 static_cast<CallingConv>(Record[4]),
5229 /*produces*/ Record[5]);
5232 unsigned NumParams = Record[Idx++];
5233 SmallVector<QualType, 16> ParamTypes;
5234 for (unsigned I = 0; I != NumParams; ++I)
5235 ParamTypes.push_back(readType(*Loc.F, Record, Idx));
5237 EPI.Variadic = Record[Idx++];
5238 EPI.HasTrailingReturn = Record[Idx++];
5239 EPI.TypeQuals = Record[Idx++];
5240 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]);
5241 SmallVector<QualType, 8> ExceptionStorage;
5242 readExceptionSpec(*Loc.F, ExceptionStorage, EPI, Record, Idx);
5243 return Context.getFunctionType(ResultType, ParamTypes, EPI);
5246 case TYPE_UNRESOLVED_USING: {
5248 return Context.getTypeDeclType(
5249 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx));
5252 case TYPE_TYPEDEF: {
5253 if (Record.size() != 2) {
5254 Error("incorrect encoding of typedef type");
5258 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx);
5259 QualType Canonical = readType(*Loc.F, Record, Idx);
5260 if (!Canonical.isNull())
5261 Canonical = Context.getCanonicalType(Canonical);
5262 return Context.getTypedefType(Decl, Canonical);
5265 case TYPE_TYPEOF_EXPR:
5266 return Context.getTypeOfExprType(ReadExpr(*Loc.F));
5269 if (Record.size() != 1) {
5270 Error("incorrect encoding of typeof(type) in AST file");
5273 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5274 return Context.getTypeOfType(UnderlyingType);
5277 case TYPE_DECLTYPE: {
5278 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5279 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType);
5282 case TYPE_UNARY_TRANSFORM: {
5283 QualType BaseType = readType(*Loc.F, Record, Idx);
5284 QualType UnderlyingType = readType(*Loc.F, Record, Idx);
5285 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2];
5286 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind);
5290 QualType Deduced = readType(*Loc.F, Record, Idx);
5291 bool IsDecltypeAuto = Record[Idx++];
5292 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false;
5293 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent);
5297 if (Record.size() != 2) {
5298 Error("incorrect encoding of record type");
5302 bool IsDependent = Record[Idx++];
5303 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx);
5304 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl());
5305 QualType T = Context.getRecordType(RD);
5306 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5311 if (Record.size() != 2) {
5312 Error("incorrect encoding of enum type");
5316 bool IsDependent = Record[Idx++];
5318 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx));
5319 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5323 case TYPE_ATTRIBUTED: {
5324 if (Record.size() != 3) {
5325 Error("incorrect encoding of attributed type");
5328 QualType modifiedType = readType(*Loc.F, Record, Idx);
5329 QualType equivalentType = readType(*Loc.F, Record, Idx);
5330 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]);
5331 return Context.getAttributedType(kind, modifiedType, equivalentType);
5335 if (Record.size() != 1) {
5336 Error("incorrect encoding of paren type");
5339 QualType InnerType = readType(*Loc.F, Record, Idx);
5340 return Context.getParenType(InnerType);
5343 case TYPE_PACK_EXPANSION: {
5344 if (Record.size() != 2) {
5345 Error("incorrect encoding of pack expansion type");
5348 QualType Pattern = readType(*Loc.F, Record, Idx);
5349 if (Pattern.isNull())
5351 Optional<unsigned> NumExpansions;
5353 NumExpansions = Record[1] - 1;
5354 return Context.getPackExpansionType(Pattern, NumExpansions);
5357 case TYPE_ELABORATED: {
5359 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5360 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5361 QualType NamedType = readType(*Loc.F, Record, Idx);
5362 return Context.getElaboratedType(Keyword, NNS, NamedType);
5365 case TYPE_OBJC_INTERFACE: {
5367 ObjCInterfaceDecl *ItfD
5368 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx);
5369 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl());
5372 case TYPE_OBJC_OBJECT: {
5374 QualType Base = readType(*Loc.F, Record, Idx);
5375 unsigned NumProtos = Record[Idx++];
5376 SmallVector<ObjCProtocolDecl*, 4> Protos;
5377 for (unsigned I = 0; I != NumProtos; ++I)
5378 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx));
5379 return Context.getObjCObjectType(Base, Protos.data(), NumProtos);
5382 case TYPE_OBJC_OBJECT_POINTER: {
5384 QualType Pointee = readType(*Loc.F, Record, Idx);
5385 return Context.getObjCObjectPointerType(Pointee);
5388 case TYPE_SUBST_TEMPLATE_TYPE_PARM: {
5390 QualType Parm = readType(*Loc.F, Record, Idx);
5391 QualType Replacement = readType(*Loc.F, Record, Idx);
5392 return Context.getSubstTemplateTypeParmType(
5393 cast<TemplateTypeParmType>(Parm),
5394 Context.getCanonicalType(Replacement));
5397 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: {
5399 QualType Parm = readType(*Loc.F, Record, Idx);
5400 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx);
5401 return Context.getSubstTemplateTypeParmPackType(
5402 cast<TemplateTypeParmType>(Parm),
5406 case TYPE_INJECTED_CLASS_NAME: {
5407 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx);
5408 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable
5409 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable
5410 // for AST reading, too much interdependencies.
5412 if (const Type *Existing = D->getTypeForDecl())
5414 else if (auto *Prev = D->getPreviousDecl())
5415 T = Prev->getTypeForDecl();
5417 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST);
5418 return QualType(T, 0);
5421 case TYPE_TEMPLATE_TYPE_PARM: {
5423 unsigned Depth = Record[Idx++];
5424 unsigned Index = Record[Idx++];
5425 bool Pack = Record[Idx++];
5426 TemplateTypeParmDecl *D
5427 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx);
5428 return Context.getTemplateTypeParmType(Depth, Index, Pack, D);
5431 case TYPE_DEPENDENT_NAME: {
5433 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5434 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5435 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5436 QualType Canon = readType(*Loc.F, Record, Idx);
5437 if (!Canon.isNull())
5438 Canon = Context.getCanonicalType(Canon);
5439 return Context.getDependentNameType(Keyword, NNS, Name, Canon);
5442 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: {
5444 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++];
5445 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx);
5446 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx);
5447 unsigned NumArgs = Record[Idx++];
5448 SmallVector<TemplateArgument, 8> Args;
5449 Args.reserve(NumArgs);
5451 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx));
5452 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name,
5453 Args.size(), Args.data());
5456 case TYPE_DEPENDENT_SIZED_ARRAY: {
5460 QualType ElementType = readType(*Loc.F, Record, Idx);
5461 ArrayType::ArraySizeModifier ASM
5462 = (ArrayType::ArraySizeModifier)Record[Idx++];
5463 unsigned IndexTypeQuals = Record[Idx++];
5465 // DependentSizedArrayType
5466 Expr *NumElts = ReadExpr(*Loc.F);
5467 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx);
5469 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM,
5470 IndexTypeQuals, Brackets);
5473 case TYPE_TEMPLATE_SPECIALIZATION: {
5475 bool IsDependent = Record[Idx++];
5476 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx);
5477 SmallVector<TemplateArgument, 8> Args;
5478 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx);
5479 QualType Underlying = readType(*Loc.F, Record, Idx);
5481 if (Underlying.isNull())
5482 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(),
5485 T = Context.getTemplateSpecializationType(Name, Args.data(),
5486 Args.size(), Underlying);
5487 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent);
5492 if (Record.size() != 1) {
5493 Error("Incorrect encoding of atomic type");
5496 QualType ValueType = readType(*Loc.F, Record, Idx);
5497 return Context.getAtomicType(ValueType);
5500 llvm_unreachable("Invalid TypeCode!");
5503 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile,
5504 SmallVectorImpl<QualType> &Exceptions,
5505 FunctionProtoType::ExtProtoInfo &EPI,
5506 const RecordData &Record, unsigned &Idx) {
5507 ExceptionSpecificationType EST =
5508 static_cast<ExceptionSpecificationType>(Record[Idx++]);
5509 EPI.ExceptionSpecType = EST;
5510 if (EST == EST_Dynamic) {
5511 EPI.NumExceptions = Record[Idx++];
5512 for (unsigned I = 0; I != EPI.NumExceptions; ++I)
5513 Exceptions.push_back(readType(ModuleFile, Record, Idx));
5514 EPI.Exceptions = Exceptions.data();
5515 } else if (EST == EST_ComputedNoexcept) {
5516 EPI.NoexceptExpr = ReadExpr(ModuleFile);
5517 } else if (EST == EST_Uninstantiated) {
5518 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5519 EPI.ExceptionSpecTemplate =
5520 ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5521 } else if (EST == EST_Unevaluated) {
5522 EPI.ExceptionSpecDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx);
5526 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> {
5529 const ASTReader::RecordData &Record;
5532 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
5534 return Reader.ReadSourceLocation(F, R, I);
5537 template<typename T>
5538 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) {
5539 return Reader.ReadDeclAs<T>(F, Record, Idx);
5543 TypeLocReader(ASTReader &Reader, ModuleFile &F,
5544 const ASTReader::RecordData &Record, unsigned &Idx)
5545 : Reader(Reader), F(F), Record(Record), Idx(Idx)
5548 // We want compile-time assurance that we've enumerated all of
5549 // these, so unfortunately we have to declare them first, then
5550 // define them out-of-line.
5551 #define ABSTRACT_TYPELOC(CLASS, PARENT)
5552 #define TYPELOC(CLASS, PARENT) \
5553 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
5554 #include "clang/AST/TypeLocNodes.def"
5556 void VisitFunctionTypeLoc(FunctionTypeLoc);
5557 void VisitArrayTypeLoc(ArrayTypeLoc);
5560 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
5563 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
5564 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx));
5565 if (TL.needsExtraLocalData()) {
5566 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++]));
5567 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++]));
5568 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++]));
5569 TL.setModeAttr(Record[Idx++]);
5572 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
5573 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5575 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
5576 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5578 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
5581 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
5584 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
5585 TL.setCaretLoc(ReadSourceLocation(Record, Idx));
5587 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
5588 TL.setAmpLoc(ReadSourceLocation(Record, Idx));
5590 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
5591 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx));
5593 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
5594 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5595 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5597 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) {
5598 TL.setLBracketLoc(ReadSourceLocation(Record, Idx));
5599 TL.setRBracketLoc(ReadSourceLocation(Record, Idx));
5601 TL.setSizeExpr(Reader.ReadExpr(F));
5603 TL.setSizeExpr(nullptr);
5605 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
5606 VisitArrayTypeLoc(TL);
5608 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
5609 VisitArrayTypeLoc(TL);
5611 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
5612 VisitArrayTypeLoc(TL);
5614 void TypeLocReader::VisitDependentSizedArrayTypeLoc(
5615 DependentSizedArrayTypeLoc TL) {
5616 VisitArrayTypeLoc(TL);
5618 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
5619 DependentSizedExtVectorTypeLoc TL) {
5620 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5622 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
5623 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5625 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
5626 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5628 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
5629 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx));
5630 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5631 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5632 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx));
5633 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {
5634 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx));
5637 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
5638 VisitFunctionTypeLoc(TL);
5640 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
5641 VisitFunctionTypeLoc(TL);
5643 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
5644 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5646 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
5647 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5649 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
5650 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5651 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5652 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5654 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
5655 TL.setTypeofLoc(ReadSourceLocation(Record, Idx));
5656 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5657 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5658 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5660 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
5661 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5663 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
5664 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5665 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5666 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5667 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx));
5669 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
5670 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5672 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) {
5673 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5675 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) {
5676 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5678 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
5679 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx));
5680 if (TL.hasAttrOperand()) {
5682 range.setBegin(ReadSourceLocation(Record, Idx));
5683 range.setEnd(ReadSourceLocation(Record, Idx));
5684 TL.setAttrOperandParensRange(range);
5686 if (TL.hasAttrExprOperand()) {
5688 TL.setAttrExprOperand(Reader.ReadExpr(F));
5690 TL.setAttrExprOperand(nullptr);
5691 } else if (TL.hasAttrEnumOperand())
5692 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx));
5694 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
5695 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5697 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
5698 SubstTemplateTypeParmTypeLoc TL) {
5699 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5701 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
5702 SubstTemplateTypeParmPackTypeLoc TL) {
5703 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5705 void TypeLocReader::VisitTemplateSpecializationTypeLoc(
5706 TemplateSpecializationTypeLoc TL) {
5707 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5708 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5709 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5710 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5711 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i)
5713 Reader.GetTemplateArgumentLocInfo(F,
5714 TL.getTypePtr()->getArg(i).getKind(),
5717 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
5718 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5719 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5721 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
5722 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5723 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5725 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
5726 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5728 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
5729 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5730 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5731 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5733 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc(
5734 DependentTemplateSpecializationTypeLoc TL) {
5735 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx));
5736 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
5737 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx));
5738 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx));
5739 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5740 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5741 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
5743 Reader.GetTemplateArgumentLocInfo(F,
5744 TL.getTypePtr()->getArg(I).getKind(),
5747 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
5748 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx));
5750 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
5751 TL.setNameLoc(ReadSourceLocation(Record, Idx));
5753 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
5754 TL.setHasBaseTypeAsWritten(Record[Idx++]);
5755 TL.setLAngleLoc(ReadSourceLocation(Record, Idx));
5756 TL.setRAngleLoc(ReadSourceLocation(Record, Idx));
5757 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i)
5758 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx));
5760 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
5761 TL.setStarLoc(ReadSourceLocation(Record, Idx));
5763 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
5764 TL.setKWLoc(ReadSourceLocation(Record, Idx));
5765 TL.setLParenLoc(ReadSourceLocation(Record, Idx));
5766 TL.setRParenLoc(ReadSourceLocation(Record, Idx));
5769 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F,
5770 const RecordData &Record,
5772 QualType InfoTy = readType(F, Record, Idx);
5773 if (InfoTy.isNull())
5776 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy);
5777 TypeLocReader TLR(*this, F, Record, Idx);
5778 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc())
5783 QualType ASTReader::GetType(TypeID ID) {
5784 unsigned FastQuals = ID & Qualifiers::FastMask;
5785 unsigned Index = ID >> Qualifiers::FastWidth;
5787 if (Index < NUM_PREDEF_TYPE_IDS) {
5789 switch ((PredefinedTypeIDs)Index) {
5790 case PREDEF_TYPE_NULL_ID: return QualType();
5791 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break;
5792 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break;
5794 case PREDEF_TYPE_CHAR_U_ID:
5795 case PREDEF_TYPE_CHAR_S_ID:
5796 // FIXME: Check that the signedness of CharTy is correct!
5800 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break;
5801 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break;
5802 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break;
5803 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break;
5804 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break;
5805 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break;
5806 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break;
5807 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break;
5808 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break;
5809 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break;
5810 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break;
5811 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break;
5812 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break;
5813 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break;
5814 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break;
5815 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break;
5816 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break;
5817 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break;
5818 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break;
5819 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break;
5820 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break;
5821 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break;
5822 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break;
5823 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break;
5824 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break;
5825 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break;
5826 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break;
5827 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break;
5828 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break;
5829 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break;
5830 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break;
5831 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break;
5832 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break;
5833 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break;
5834 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break;
5835 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break;
5836 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break;
5838 case PREDEF_TYPE_AUTO_RREF_DEDUCT:
5839 T = Context.getAutoRRefDeductType();
5842 case PREDEF_TYPE_ARC_UNBRIDGED_CAST:
5843 T = Context.ARCUnbridgedCastTy;
5846 case PREDEF_TYPE_VA_LIST_TAG:
5847 T = Context.getVaListTagType();
5850 case PREDEF_TYPE_BUILTIN_FN:
5851 T = Context.BuiltinFnTy;
5855 assert(!T.isNull() && "Unknown predefined type");
5856 return T.withFastQualifiers(FastQuals);
5859 Index -= NUM_PREDEF_TYPE_IDS;
5860 assert(Index < TypesLoaded.size() && "Type index out-of-range");
5861 if (TypesLoaded[Index].isNull()) {
5862 TypesLoaded[Index] = readTypeRecord(Index);
5863 if (TypesLoaded[Index].isNull())
5866 TypesLoaded[Index]->setFromAST();
5867 if (DeserializationListener)
5868 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID),
5869 TypesLoaded[Index]);
5872 return TypesLoaded[Index].withFastQualifiers(FastQuals);
5875 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) {
5876 return GetType(getGlobalTypeID(F, LocalID));
5879 serialization::TypeID
5880 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const {
5881 unsigned FastQuals = LocalID & Qualifiers::FastMask;
5882 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth;
5884 if (LocalIndex < NUM_PREDEF_TYPE_IDS)
5887 ContinuousRangeMap<uint32_t, int, 2>::iterator I
5888 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS);
5889 assert(I != F.TypeRemap.end() && "Invalid index into type index remap");
5891 unsigned GlobalIndex = LocalIndex + I->second;
5892 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals;
5895 TemplateArgumentLocInfo
5896 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F,
5897 TemplateArgument::ArgKind Kind,
5898 const RecordData &Record,
5901 case TemplateArgument::Expression:
5903 case TemplateArgument::Type:
5904 return GetTypeSourceInfo(F, Record, Index);
5905 case TemplateArgument::Template: {
5906 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5908 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5909 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5912 case TemplateArgument::TemplateExpansion: {
5913 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record,
5915 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index);
5916 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index);
5917 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc,
5920 case TemplateArgument::Null:
5921 case TemplateArgument::Integral:
5922 case TemplateArgument::Declaration:
5923 case TemplateArgument::NullPtr:
5924 case TemplateArgument::Pack:
5925 // FIXME: Is this right?
5926 return TemplateArgumentLocInfo();
5928 llvm_unreachable("unexpected template argument loc");
5932 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
5933 const RecordData &Record, unsigned &Index) {
5934 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index);
5936 if (Arg.getKind() == TemplateArgument::Expression) {
5937 if (Record[Index++]) // bool InfoHasSameExpr.
5938 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr()));
5940 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(),
5944 const ASTTemplateArgumentListInfo*
5945 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
5946 const RecordData &Record,
5948 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
5949 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
5950 unsigned NumArgsAsWritten = Record[Index++];
5951 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
5952 for (unsigned i = 0; i != NumArgsAsWritten; ++i)
5953 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
5954 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
5957 Decl *ASTReader::GetExternalDecl(uint32_t ID) {
5961 void ASTReader::CompleteRedeclChain(const Decl *D) {
5962 if (NumCurrentElementsDeserializing) {
5963 // We arrange to not care about the complete redeclaration chain while we're
5964 // deserializing. Just remember that the AST has marked this one as complete
5965 // but that it's not actually complete yet, so we know we still need to
5966 // complete it later.
5967 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D));
5971 const DeclContext *DC = D->getDeclContext()->getRedeclContext();
5973 // Recursively ensure that the decl context itself is complete
5974 // (in particular, this matters if the decl context is a namespace).
5976 // FIXME: This should be performed by lookup instead of here.
5977 cast<Decl>(DC)->getMostRecentDecl();
5979 // If this is a named declaration, complete it by looking it up
5980 // within its context.
5982 // FIXME: We don't currently handle the cases where we can't do this;
5983 // merging a class definition that contains unnamed entities should merge
5984 // those entities. Likewise, merging a function definition should merge
5985 // all mergeable entities within it.
5986 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) ||
5987 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) {
5988 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) {
5989 auto *II = Name.getAsIdentifierInfo();
5990 if (isa<TranslationUnitDecl>(DC) && II) {
5991 // Outside of C++, we don't have a lookup table for the TU, so update
5992 // the identifier instead. In C++, either way should work fine.
5993 if (II->isOutOfDate())
5994 updateOutOfDateIdentifier(*II);
6001 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M,
6002 const RecordData &Record,
6004 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) {
6005 Error("malformed AST file: missing C++ base specifier");
6009 unsigned LocalID = Record[Idx++];
6010 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]);
6013 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) {
6014 RecordLocation Loc = getLocalBitOffset(Offset);
6015 BitstreamCursor &Cursor = Loc.F->DeclsCursor;
6016 SavedStreamPosition SavedPosition(Cursor);
6017 Cursor.JumpToBit(Loc.Offset);
6018 ReadingKindTracker ReadingKind(Read_Decl, *this);
6020 unsigned Code = Cursor.ReadCode();
6021 unsigned RecCode = Cursor.readRecord(Code, Record);
6022 if (RecCode != DECL_CXX_BASE_SPECIFIERS) {
6023 Error("malformed AST file: missing C++ base specifiers");
6028 unsigned NumBases = Record[Idx++];
6029 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases);
6030 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases];
6031 for (unsigned I = 0; I != NumBases; ++I)
6032 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx);
6036 serialization::DeclID
6037 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const {
6038 if (LocalID < NUM_PREDEF_DECL_IDS)
6041 ContinuousRangeMap<uint32_t, int, 2>::iterator I
6042 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS);
6043 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap");
6045 return LocalID + I->second;
6048 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID,
6049 ModuleFile &M) const {
6050 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID);
6051 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6052 return &M == I->second;
6055 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) {
6056 if (!D->isFromASTFile())
6058 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID());
6059 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6063 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
6064 if (ID < NUM_PREDEF_DECL_IDS)
6065 return SourceLocation();
6067 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6069 if (Index > DeclsLoaded.size()) {
6070 Error("declaration ID out-of-range for AST file");
6071 return SourceLocation();
6074 if (Decl *D = DeclsLoaded[Index])
6075 return D->getLocation();
6077 unsigned RawLocation = 0;
6078 RecordLocation Rec = DeclCursorForID(ID, RawLocation);
6079 return ReadSourceLocation(*Rec.F, RawLocation);
6082 Decl *ASTReader::GetExistingDecl(DeclID ID) {
6083 if (ID < NUM_PREDEF_DECL_IDS) {
6084 switch ((PredefinedDeclIDs)ID) {
6085 case PREDEF_DECL_NULL_ID:
6088 case PREDEF_DECL_TRANSLATION_UNIT_ID:
6089 return Context.getTranslationUnitDecl();
6091 case PREDEF_DECL_OBJC_ID_ID:
6092 return Context.getObjCIdDecl();
6094 case PREDEF_DECL_OBJC_SEL_ID:
6095 return Context.getObjCSelDecl();
6097 case PREDEF_DECL_OBJC_CLASS_ID:
6098 return Context.getObjCClassDecl();
6100 case PREDEF_DECL_OBJC_PROTOCOL_ID:
6101 return Context.getObjCProtocolDecl();
6103 case PREDEF_DECL_INT_128_ID:
6104 return Context.getInt128Decl();
6106 case PREDEF_DECL_UNSIGNED_INT_128_ID:
6107 return Context.getUInt128Decl();
6109 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
6110 return Context.getObjCInstanceTypeDecl();
6112 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
6113 return Context.getBuiltinVaListDecl();
6117 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6119 if (Index >= DeclsLoaded.size()) {
6120 assert(0 && "declaration ID out-of-range for AST file");
6121 Error("declaration ID out-of-range for AST file");
6125 return DeclsLoaded[Index];
6128 Decl *ASTReader::GetDecl(DeclID ID) {
6129 if (ID < NUM_PREDEF_DECL_IDS)
6130 return GetExistingDecl(ID);
6132 unsigned Index = ID - NUM_PREDEF_DECL_IDS;
6134 if (Index >= DeclsLoaded.size()) {
6135 assert(0 && "declaration ID out-of-range for AST file");
6136 Error("declaration ID out-of-range for AST file");
6140 if (!DeclsLoaded[Index]) {
6142 if (DeserializationListener)
6143 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
6146 return DeclsLoaded[Index];
6149 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
6151 if (GlobalID < NUM_PREDEF_DECL_IDS)
6154 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID);
6155 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
6156 ModuleFile *Owner = I->second;
6158 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos
6159 = M.GlobalToLocalDeclIDs.find(Owner);
6160 if (Pos == M.GlobalToLocalDeclIDs.end())
6163 return GlobalID - Owner->BaseDeclID + Pos->second;
6166 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F,
6167 const RecordData &Record,
6169 if (Idx >= Record.size()) {
6170 Error("Corrupted AST file");
6174 return getGlobalDeclID(F, Record[Idx++]);
6177 /// \brief Resolve the offset of a statement into a statement.
6179 /// This operation will read a new statement from the external
6180 /// source each time it is called, and is meant to be used via a
6181 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
6182 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) {
6183 // Switch case IDs are per Decl.
6184 ClearSwitchCaseIDs();
6186 // Offset here is a global offset across the entire chain.
6187 RecordLocation Loc = getLocalBitOffset(Offset);
6188 Loc.F->DeclsCursor.JumpToBit(Loc.Offset);
6189 return ReadStmtFromStream(*Loc.F);
6193 class FindExternalLexicalDeclsVisitor {
6195 const DeclContext *DC;
6196 bool (*isKindWeWant)(Decl::Kind);
6198 SmallVectorImpl<Decl*> &Decls;
6199 bool PredefsVisited[NUM_PREDEF_DECL_IDS];
6202 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC,
6203 bool (*isKindWeWant)(Decl::Kind),
6204 SmallVectorImpl<Decl*> &Decls)
6205 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls)
6207 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I)
6208 PredefsVisited[I] = false;
6211 static bool visit(ModuleFile &M, bool Preorder, void *UserData) {
6215 FindExternalLexicalDeclsVisitor *This
6216 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData);
6218 ModuleFile::DeclContextInfosMap::iterator Info
6219 = M.DeclContextInfos.find(This->DC);
6220 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls)
6223 // Load all of the declaration IDs
6224 for (const KindDeclIDPair *ID = Info->second.LexicalDecls,
6225 *IDE = ID + Info->second.NumLexicalDecls;
6227 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first))
6230 // Don't add predefined declarations to the lexical context more
6232 if (ID->second < NUM_PREDEF_DECL_IDS) {
6233 if (This->PredefsVisited[ID->second])
6236 This->PredefsVisited[ID->second] = true;
6239 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) {
6240 if (!This->DC->isDeclInLexicalTraversal(D))
6241 This->Decls.push_back(D);
6250 ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC,
6251 bool (*isKindWeWant)(Decl::Kind),
6252 SmallVectorImpl<Decl*> &Decls) {
6253 // There might be lexical decls in multiple modules, for the TU at
6254 // least. Walk all of the modules in the order they were loaded.
6255 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls);
6256 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor);
6257 ++NumLexicalDeclContextsRead;
6268 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {}
6270 bool operator()(LocalDeclID L, LocalDeclID R) const {
6271 SourceLocation LHS = getLocation(L);
6272 SourceLocation RHS = getLocation(R);
6273 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6276 bool operator()(SourceLocation LHS, LocalDeclID R) const {
6277 SourceLocation RHS = getLocation(R);
6278 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6281 bool operator()(LocalDeclID L, SourceLocation RHS) const {
6282 SourceLocation LHS = getLocation(L);
6283 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS);
6286 SourceLocation getLocation(LocalDeclID ID) const {
6287 return Reader.getSourceManager().getFileLoc(
6288 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID)));
6294 void ASTReader::FindFileRegionDecls(FileID File,
6295 unsigned Offset, unsigned Length,
6296 SmallVectorImpl<Decl *> &Decls) {
6297 SourceManager &SM = getSourceManager();
6299 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File);
6300 if (I == FileDeclIDs.end())
6303 FileDeclsInfo &DInfo = I->second;
6304 if (DInfo.Decls.empty())
6308 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset);
6309 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length);
6311 DeclIDComp DIDComp(*this, *DInfo.Mod);
6312 ArrayRef<serialization::LocalDeclID>::iterator
6313 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6315 if (BeginIt != DInfo.Decls.begin())
6318 // If we are pointing at a top-level decl inside an objc container, we need
6319 // to backtrack until we find it otherwise we will fail to report that the
6320 // region overlaps with an objc container.
6321 while (BeginIt != DInfo.Decls.begin() &&
6322 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt))
6323 ->isTopLevelDeclInObjCContainer())
6326 ArrayRef<serialization::LocalDeclID>::iterator
6327 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(),
6329 if (EndIt != DInfo.Decls.end())
6332 for (ArrayRef<serialization::LocalDeclID>::iterator
6333 DIt = BeginIt; DIt != EndIt; ++DIt)
6334 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt)));
6338 /// \brief ModuleFile visitor used to perform name lookup into a
6339 /// declaration context.
6340 class DeclContextNameLookupVisitor {
6342 SmallVectorImpl<const DeclContext *> &Contexts;
6343 DeclarationName Name;
6344 SmallVectorImpl<NamedDecl *> &Decls;
6347 DeclContextNameLookupVisitor(ASTReader &Reader,
6348 SmallVectorImpl<const DeclContext *> &Contexts,
6349 DeclarationName Name,
6350 SmallVectorImpl<NamedDecl *> &Decls)
6351 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls) { }
6353 static bool visit(ModuleFile &M, void *UserData) {
6354 DeclContextNameLookupVisitor *This
6355 = static_cast<DeclContextNameLookupVisitor *>(UserData);
6357 // Check whether we have any visible declaration information for
6358 // this context in this module.
6359 ModuleFile::DeclContextInfosMap::iterator Info;
6360 bool FoundInfo = false;
6361 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6362 Info = M.DeclContextInfos.find(This->Contexts[I]);
6363 if (Info != M.DeclContextInfos.end() &&
6364 Info->second.NameLookupTableData) {
6373 // Look for this name within this module.
6374 ASTDeclContextNameLookupTable *LookupTable =
6375 Info->second.NameLookupTableData;
6376 ASTDeclContextNameLookupTable::iterator Pos
6377 = LookupTable->find(This->Name);
6378 if (Pos == LookupTable->end())
6381 bool FoundAnything = false;
6382 ASTDeclContextNameLookupTrait::data_type Data = *Pos;
6383 for (; Data.first != Data.second; ++Data.first) {
6384 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first);
6388 if (ND->getDeclName() != This->Name) {
6389 // A name might be null because the decl's redeclarable part is
6390 // currently read before reading its name. The lookup is triggered by
6391 // building that decl (likely indirectly), and so it is later in the
6392 // sense of "already existing" and can be ignored here.
6396 // Record this declaration.
6397 FoundAnything = true;
6398 This->Decls.push_back(ND);
6401 return FoundAnything;
6406 /// \brief Retrieve the "definitive" module file for the definition of the
6407 /// given declaration context, if there is one.
6409 /// The "definitive" module file is the only place where we need to look to
6410 /// find information about the declarations within the given declaration
6411 /// context. For example, C++ and Objective-C classes, C structs/unions, and
6412 /// Objective-C protocols, categories, and extensions are all defined in a
6413 /// single place in the source code, so they have definitive module files
6414 /// associated with them. C++ namespaces, on the other hand, can have
6415 /// definitions in multiple different module files.
6417 /// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's
6418 /// NDEBUG checking.
6419 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
6420 ASTReader &Reader) {
6421 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
6422 return Reader.getOwningModuleFile(cast<Decl>(DefDC));
6428 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC,
6429 DeclarationName Name) {
6430 assert(DC->hasExternalVisibleStorage() &&
6431 "DeclContext has no visible decls in storage");
6435 SmallVector<NamedDecl *, 64> Decls;
6437 // Compute the declaration contexts we need to look into. Multiple such
6438 // declaration contexts occur when two declaration contexts from disjoint
6439 // modules get merged, e.g., when two namespaces with the same name are
6440 // independently defined in separate modules.
6441 SmallVector<const DeclContext *, 2> Contexts;
6442 Contexts.push_back(DC);
6444 if (DC->isNamespace()) {
6445 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6446 if (Merged != MergedDecls.end()) {
6447 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6448 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6451 if (isa<CXXRecordDecl>(DC)) {
6452 auto Merged = MergedLookups.find(DC);
6453 if (Merged != MergedLookups.end())
6454 Contexts.insert(Contexts.end(), Merged->second.begin(),
6455 Merged->second.end());
6458 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls);
6460 // If we can definitively determine which module file to look into,
6461 // only look there. Otherwise, look in all module files.
6462 ModuleFile *Definitive;
6463 if (Contexts.size() == 1 &&
6464 (Definitive = getDefinitiveModuleFileFor(DC, *this))) {
6465 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor);
6467 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor);
6469 ++NumVisibleDeclContextsRead;
6470 SetExternalVisibleDeclsForName(DC, Name, Decls);
6471 return !Decls.empty();
6475 /// \brief ModuleFile visitor used to retrieve all visible names in a
6476 /// declaration context.
6477 class DeclContextAllNamesVisitor {
6479 SmallVectorImpl<const DeclContext *> &Contexts;
6484 DeclContextAllNamesVisitor(ASTReader &Reader,
6485 SmallVectorImpl<const DeclContext *> &Contexts,
6486 DeclsMap &Decls, bool VisitAll)
6487 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { }
6489 static bool visit(ModuleFile &M, void *UserData) {
6490 DeclContextAllNamesVisitor *This
6491 = static_cast<DeclContextAllNamesVisitor *>(UserData);
6493 // Check whether we have any visible declaration information for
6494 // this context in this module.
6495 ModuleFile::DeclContextInfosMap::iterator Info;
6496 bool FoundInfo = false;
6497 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) {
6498 Info = M.DeclContextInfos.find(This->Contexts[I]);
6499 if (Info != M.DeclContextInfos.end() &&
6500 Info->second.NameLookupTableData) {
6509 ASTDeclContextNameLookupTable *LookupTable =
6510 Info->second.NameLookupTableData;
6511 bool FoundAnything = false;
6512 for (ASTDeclContextNameLookupTable::data_iterator
6513 I = LookupTable->data_begin(), E = LookupTable->data_end();
6516 ASTDeclContextNameLookupTrait::data_type Data = *I;
6517 for (; Data.first != Data.second; ++Data.first) {
6518 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M,
6523 // Record this declaration.
6524 FoundAnything = true;
6525 This->Decls[ND->getDeclName()].push_back(ND);
6529 return FoundAnything && !This->VisitAll;
6534 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) {
6535 if (!DC->hasExternalVisibleStorage())
6539 // Compute the declaration contexts we need to look into. Multiple such
6540 // declaration contexts occur when two declaration contexts from disjoint
6541 // modules get merged, e.g., when two namespaces with the same name are
6542 // independently defined in separate modules.
6543 SmallVector<const DeclContext *, 2> Contexts;
6544 Contexts.push_back(DC);
6546 if (DC->isNamespace()) {
6547 MergedDeclsMap::iterator Merged
6548 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC)));
6549 if (Merged != MergedDecls.end()) {
6550 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I)
6551 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I])));
6555 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls,
6556 /*VisitAll=*/DC->isFileContext());
6557 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor);
6558 ++NumVisibleDeclContextsRead;
6560 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
6561 SetExternalVisibleDeclsForName(DC, I->first, I->second);
6563 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false);
6566 /// \brief Under non-PCH compilation the consumer receives the objc methods
6567 /// before receiving the implementation, and codegen depends on this.
6568 /// We simulate this by deserializing and passing to consumer the methods of the
6569 /// implementation before passing the deserialized implementation decl.
6570 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD,
6571 ASTConsumer *Consumer) {
6572 assert(ImplD && Consumer);
6574 for (auto *I : ImplD->methods())
6575 Consumer->HandleInterestingDecl(DeclGroupRef(I));
6577 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD));
6580 void ASTReader::PassInterestingDeclsToConsumer() {
6583 if (PassingDeclsToConsumer)
6586 // Guard variable to avoid recursively redoing the process of passing
6587 // decls to consumer.
6588 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
6591 while (!InterestingDecls.empty()) {
6592 Decl *D = InterestingDecls.front();
6593 InterestingDecls.pop_front();
6595 PassInterestingDeclToConsumer(D);
6599 void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
6600 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
6601 PassObjCImplDeclToConsumer(ImplD, Consumer);
6603 Consumer->HandleInterestingDecl(DeclGroupRef(D));
6606 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) {
6607 this->Consumer = Consumer;
6612 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) {
6613 // Force deserialization of this decl, which will cause it to be queued for
6614 // passing to the consumer.
6615 GetDecl(EagerlyDeserializedDecls[I]);
6617 EagerlyDeserializedDecls.clear();
6619 PassInterestingDeclsToConsumer();
6622 void ASTReader::PrintStats() {
6623 std::fprintf(stderr, "*** AST File Statistics:\n");
6625 unsigned NumTypesLoaded
6626 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(),
6628 unsigned NumDeclsLoaded
6629 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(),
6631 unsigned NumIdentifiersLoaded
6632 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(),
6633 IdentifiersLoaded.end(),
6634 (IdentifierInfo *)nullptr);
6635 unsigned NumMacrosLoaded
6636 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(),
6638 (MacroInfo *)nullptr);
6639 unsigned NumSelectorsLoaded
6640 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(),
6641 SelectorsLoaded.end(),
6644 if (unsigned TotalNumSLocEntries = getTotalNumSLocs())
6645 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n",
6646 NumSLocEntriesRead, TotalNumSLocEntries,
6647 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
6648 if (!TypesLoaded.empty())
6649 std::fprintf(stderr, " %u/%u types read (%f%%)\n",
6650 NumTypesLoaded, (unsigned)TypesLoaded.size(),
6651 ((float)NumTypesLoaded/TypesLoaded.size() * 100));
6652 if (!DeclsLoaded.empty())
6653 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n",
6654 NumDeclsLoaded, (unsigned)DeclsLoaded.size(),
6655 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100));
6656 if (!IdentifiersLoaded.empty())
6657 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n",
6658 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(),
6659 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
6660 if (!MacrosLoaded.empty())
6661 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6662 NumMacrosLoaded, (unsigned)MacrosLoaded.size(),
6663 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100));
6664 if (!SelectorsLoaded.empty())
6665 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n",
6666 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(),
6667 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
6668 if (TotalNumStatements)
6669 std::fprintf(stderr, " %u/%u statements read (%f%%)\n",
6670 NumStatementsRead, TotalNumStatements,
6671 ((float)NumStatementsRead/TotalNumStatements * 100));
6673 std::fprintf(stderr, " %u/%u macros read (%f%%)\n",
6674 NumMacrosRead, TotalNumMacros,
6675 ((float)NumMacrosRead/TotalNumMacros * 100));
6676 if (TotalLexicalDeclContexts)
6677 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n",
6678 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
6679 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
6681 if (TotalVisibleDeclContexts)
6682 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n",
6683 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
6684 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
6686 if (TotalNumMethodPoolEntries) {
6687 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n",
6688 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
6689 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
6692 if (NumMethodPoolLookups) {
6693 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n",
6694 NumMethodPoolHits, NumMethodPoolLookups,
6695 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
6697 if (NumMethodPoolTableLookups) {
6698 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n",
6699 NumMethodPoolTableHits, NumMethodPoolTableLookups,
6700 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups
6704 if (NumIdentifierLookupHits) {
6705 std::fprintf(stderr,
6706 " %u / %u identifier table lookups succeeded (%f%%)\n",
6707 NumIdentifierLookupHits, NumIdentifierLookups,
6708 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
6712 std::fprintf(stderr, "\n");
6713 GlobalIndex->printStats();
6716 std::fprintf(stderr, "\n");
6718 std::fprintf(stderr, "\n");
6721 template<typename Key, typename ModuleFile, unsigned InitialCapacity>
6723 dumpModuleIDMap(StringRef Name,
6724 const ContinuousRangeMap<Key, ModuleFile *,
6725 InitialCapacity> &Map) {
6726 if (Map.begin() == Map.end())
6729 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType;
6730 llvm::errs() << Name << ":\n";
6731 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
6733 llvm::errs() << " " << I->first << " -> " << I->second->FileName
6738 void ASTReader::dump() {
6739 llvm::errs() << "*** PCH/ModuleFile Remappings:\n";
6740 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap);
6741 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap);
6742 dumpModuleIDMap("Global type map", GlobalTypeMap);
6743 dumpModuleIDMap("Global declaration map", GlobalDeclMap);
6744 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap);
6745 dumpModuleIDMap("Global macro map", GlobalMacroMap);
6746 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap);
6747 dumpModuleIDMap("Global selector map", GlobalSelectorMap);
6748 dumpModuleIDMap("Global preprocessed entity map",
6749 GlobalPreprocessedEntityMap);
6751 llvm::errs() << "\n*** PCH/Modules Loaded:";
6752 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(),
6753 MEnd = ModuleMgr.end();
6758 /// Return the amount of memory used by memory buffers, breaking down
6759 /// by heap-backed versus mmap'ed memory.
6760 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
6761 for (ModuleConstIterator I = ModuleMgr.begin(),
6762 E = ModuleMgr.end(); I != E; ++I) {
6763 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) {
6764 size_t bytes = buf->getBufferSize();
6765 switch (buf->getBufferKind()) {
6766 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
6767 sizes.malloc_bytes += bytes;
6769 case llvm::MemoryBuffer::MemoryBuffer_MMap:
6770 sizes.mmap_bytes += bytes;
6777 void ASTReader::InitializeSema(Sema &S) {
6779 S.addExternalSource(this);
6781 // Makes sure any declarations that were deserialized "too early"
6782 // still get added to the identifier's declaration chains.
6783 for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) {
6784 pushExternalDeclIntoScope(PreloadedDecls[I],
6785 PreloadedDecls[I]->getDeclName());
6787 PreloadedDecls.clear();
6789 // FIXME: What happens if these are changed by a module import?
6790 if (!FPPragmaOptions.empty()) {
6791 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
6792 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
6795 // FIXME: What happens if these are changed by a module import?
6796 if (!OpenCLExtensions.empty()) {
6798 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++];
6799 #include "clang/Basic/OpenCLExtensions.def"
6801 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS");
6807 void ASTReader::UpdateSema() {
6808 assert(SemaObj && "no Sema to update");
6810 // Load the offsets of the declarations that Sema references.
6811 // They will be lazily deserialized when needed.
6812 if (!SemaDeclRefs.empty()) {
6813 assert(SemaDeclRefs.size() % 2 == 0);
6814 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) {
6815 if (!SemaObj->StdNamespace)
6816 SemaObj->StdNamespace = SemaDeclRefs[I];
6817 if (!SemaObj->StdBadAlloc)
6818 SemaObj->StdBadAlloc = SemaDeclRefs[I+1];
6820 SemaDeclRefs.clear();
6823 // Update the state of 'pragma clang optimize'. Use the same API as if we had
6824 // encountered the pragma in the source.
6825 if(OptimizeOffPragmaLocation.isValid())
6826 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation);
6829 IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) {
6830 // Note that we are loading an identifier.
6831 Deserializing AnIdentifier(this);
6832 StringRef Name(NameStart, NameEnd - NameStart);
6834 // If there is a global index, look there first to determine which modules
6835 // provably do not have any results for this identifier.
6836 GlobalModuleIndex::HitSet Hits;
6837 GlobalModuleIndex::HitSet *HitsPtr = nullptr;
6838 if (!loadGlobalIndex()) {
6839 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
6843 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0,
6844 NumIdentifierLookups,
6845 NumIdentifierLookupHits);
6846 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr);
6847 IdentifierInfo *II = Visitor.getIdentifierInfo();
6848 markIdentifierUpToDate(II);
6853 /// \brief An identifier-lookup iterator that enumerates all of the
6854 /// identifiers stored within a set of AST files.
6855 class ASTIdentifierIterator : public IdentifierIterator {
6856 /// \brief The AST reader whose identifiers are being enumerated.
6857 const ASTReader &Reader;
6859 /// \brief The current index into the chain of AST files stored in
6863 /// \brief The current position within the identifier lookup table
6864 /// of the current AST file.
6865 ASTIdentifierLookupTable::key_iterator Current;
6867 /// \brief The end position within the identifier lookup table of
6868 /// the current AST file.
6869 ASTIdentifierLookupTable::key_iterator End;
6872 explicit ASTIdentifierIterator(const ASTReader &Reader);
6874 StringRef Next() override;
6878 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader)
6879 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) {
6880 ASTIdentifierLookupTable *IdTable
6881 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable;
6882 Current = IdTable->key_begin();
6883 End = IdTable->key_end();
6886 StringRef ASTIdentifierIterator::Next() {
6887 while (Current == End) {
6888 // If we have exhausted all of our AST files, we're done.
6893 ASTIdentifierLookupTable *IdTable
6894 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].
6895 IdentifierLookupTable;
6896 Current = IdTable->key_begin();
6897 End = IdTable->key_end();
6900 // We have any identifiers remaining in the current AST file; return
6902 StringRef Result = *Current;
6907 IdentifierIterator *ASTReader::getIdentifiers() {
6908 if (!loadGlobalIndex())
6909 return GlobalIndex->createIdentifierIterator();
6911 return new ASTIdentifierIterator(*this);
6914 namespace clang { namespace serialization {
6915 class ReadMethodPoolVisitor {
6918 unsigned PriorGeneration;
6919 unsigned InstanceBits;
6920 unsigned FactoryBits;
6921 SmallVector<ObjCMethodDecl *, 4> InstanceMethods;
6922 SmallVector<ObjCMethodDecl *, 4> FactoryMethods;
6925 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel,
6926 unsigned PriorGeneration)
6927 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration),
6928 InstanceBits(0), FactoryBits(0) { }
6930 static bool visit(ModuleFile &M, void *UserData) {
6931 ReadMethodPoolVisitor *This
6932 = static_cast<ReadMethodPoolVisitor *>(UserData);
6934 if (!M.SelectorLookupTable)
6937 // If we've already searched this module file, skip it now.
6938 if (M.Generation <= This->PriorGeneration)
6941 ++This->Reader.NumMethodPoolTableLookups;
6942 ASTSelectorLookupTable *PoolTable
6943 = (ASTSelectorLookupTable*)M.SelectorLookupTable;
6944 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel);
6945 if (Pos == PoolTable->end())
6948 ++This->Reader.NumMethodPoolTableHits;
6949 ++This->Reader.NumSelectorsRead;
6950 // FIXME: Not quite happy with the statistics here. We probably should
6951 // disable this tracking when called via LoadSelector.
6952 // Also, should entries without methods count as misses?
6953 ++This->Reader.NumMethodPoolEntriesRead;
6954 ASTSelectorLookupTrait::data_type Data = *Pos;
6955 if (This->Reader.DeserializationListener)
6956 This->Reader.DeserializationListener->SelectorRead(Data.ID,
6959 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end());
6960 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end());
6961 This->InstanceBits = Data.InstanceBits;
6962 This->FactoryBits = Data.FactoryBits;
6966 /// \brief Retrieve the instance methods found by this visitor.
6967 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const {
6968 return InstanceMethods;
6971 /// \brief Retrieve the instance methods found by this visitor.
6972 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const {
6973 return FactoryMethods;
6976 unsigned getInstanceBits() const { return InstanceBits; }
6977 unsigned getFactoryBits() const { return FactoryBits; }
6979 } } // end namespace clang::serialization
6981 /// \brief Add the given set of methods to the method list.
6982 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods,
6983 ObjCMethodList &List) {
6984 for (unsigned I = 0, N = Methods.size(); I != N; ++I) {
6985 S.addMethodToGlobalList(&List, Methods[I]);
6989 void ASTReader::ReadMethodPool(Selector Sel) {
6990 // Get the selector generation and update it to the current generation.
6991 unsigned &Generation = SelectorGeneration[Sel];
6992 unsigned PriorGeneration = Generation;
6993 Generation = getGeneration();
6995 // Search for methods defined with this selector.
6996 ++NumMethodPoolLookups;
6997 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration);
6998 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor);
7000 if (Visitor.getInstanceMethods().empty() &&
7001 Visitor.getFactoryMethods().empty())
7004 ++NumMethodPoolHits;
7009 Sema &S = *getSema();
7010 Sema::GlobalMethodPool::iterator Pos
7011 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first;
7013 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first);
7014 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second);
7015 Pos->second.first.setBits(Visitor.getInstanceBits());
7016 Pos->second.second.setBits(Visitor.getFactoryBits());
7019 void ASTReader::ReadKnownNamespaces(
7020 SmallVectorImpl<NamespaceDecl *> &Namespaces) {
7023 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
7024 if (NamespaceDecl *Namespace
7025 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I])))
7026 Namespaces.push_back(Namespace);
7030 void ASTReader::ReadUndefinedButUsed(
7031 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) {
7032 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
7033 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++]));
7034 SourceLocation Loc =
7035 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]);
7036 Undefined.insert(std::make_pair(D, Loc));
7040 void ASTReader::ReadTentativeDefinitions(
7041 SmallVectorImpl<VarDecl *> &TentativeDefs) {
7042 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
7043 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I]));
7045 TentativeDefs.push_back(Var);
7047 TentativeDefinitions.clear();
7050 void ASTReader::ReadUnusedFileScopedDecls(
7051 SmallVectorImpl<const DeclaratorDecl *> &Decls) {
7052 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
7054 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
7058 UnusedFileScopedDecls.clear();
7061 void ASTReader::ReadDelegatingConstructors(
7062 SmallVectorImpl<CXXConstructorDecl *> &Decls) {
7063 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
7064 CXXConstructorDecl *D
7065 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I]));
7069 DelegatingCtorDecls.clear();
7072 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) {
7073 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
7075 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I]));
7079 ExtVectorDecls.clear();
7082 void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) {
7083 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) {
7085 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I]));
7089 DynamicClasses.clear();
7093 ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) {
7094 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) {
7096 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I]));
7100 LocallyScopedExternCDecls.clear();
7103 void ASTReader::ReadReferencedSelectors(
7104 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
7105 if (ReferencedSelectorsData.empty())
7108 // If there are @selector references added them to its pool. This is for
7109 // implementation of -Wselector.
7110 unsigned int DataSize = ReferencedSelectorsData.size()-1;
7112 while (I < DataSize) {
7113 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]);
7114 SourceLocation SelLoc
7115 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]);
7116 Sels.push_back(std::make_pair(Sel, SelLoc));
7118 ReferencedSelectorsData.clear();
7121 void ASTReader::ReadWeakUndeclaredIdentifiers(
7122 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) {
7123 if (WeakUndeclaredIdentifiers.empty())
7126 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) {
7127 IdentifierInfo *WeakId
7128 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7129 IdentifierInfo *AliasId
7130 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);
7132 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);
7133 bool Used = WeakUndeclaredIdentifiers[I++];
7134 WeakInfo WI(AliasId, Loc);
7136 WeakIDs.push_back(std::make_pair(WeakId, WI));
7138 WeakUndeclaredIdentifiers.clear();
7141 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
7142 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) {
7143 ExternalVTableUse VT;
7144 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++]));
7145 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]);
7146 VT.DefinitionRequired = VTableUses[Idx++];
7147 VTables.push_back(VT);
7153 void ASTReader::ReadPendingInstantiations(
7154 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
7155 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
7156 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
7158 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
7160 Pending.push_back(std::make_pair(D, Loc));
7162 PendingInstantiations.clear();
7165 void ASTReader::ReadLateParsedTemplates(
7166 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
7167 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
7169 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
7171 LateParsedTemplate *LT = new LateParsedTemplate;
7172 LT->D = GetDecl(LateParsedTemplates[Idx++]);
7174 ModuleFile *F = getOwningModuleFile(LT->D);
7175 assert(F && "No module");
7177 unsigned TokN = LateParsedTemplates[Idx++];
7178 LT->Toks.reserve(TokN);
7179 for (unsigned T = 0; T < TokN; ++T)
7180 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
7185 LateParsedTemplates.clear();
7188 void ASTReader::LoadSelector(Selector Sel) {
7189 // It would be complicated to avoid reading the methods anyway. So don't.
7190 ReadMethodPool(Sel);
7193 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) {
7194 assert(ID && "Non-zero identifier ID required");
7195 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range");
7196 IdentifiersLoaded[ID - 1] = II;
7197 if (DeserializationListener)
7198 DeserializationListener->IdentifierRead(ID, II);
7201 /// \brief Set the globally-visible declarations associated with the given
7204 /// If the AST reader is currently in a state where the given declaration IDs
7205 /// cannot safely be resolved, they are queued until it is safe to resolve
7208 /// \param II an IdentifierInfo that refers to one or more globally-visible
7211 /// \param DeclIDs the set of declaration IDs with the name @p II that are
7212 /// visible at global scope.
7214 /// \param Decls if non-null, this vector will be populated with the set of
7215 /// deserialized declarations. These declarations will not be pushed into
7218 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II,
7219 const SmallVectorImpl<uint32_t> &DeclIDs,
7220 SmallVectorImpl<Decl *> *Decls) {
7221 if (NumCurrentElementsDeserializing && !Decls) {
7222 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
7226 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
7227 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
7229 // If we're simply supposed to record the declarations, do so now.
7231 Decls->push_back(D);
7235 // Introduce this declaration into the translation-unit scope
7236 // and add it to the declaration chain for this identifier, so
7237 // that (unqualified) name lookup will find it.
7238 pushExternalDeclIntoScope(D, II);
7240 // Queue this declaration so that it will be added to the
7241 // translation unit scope and identifier's declaration chain
7242 // once a Sema object is known.
7243 PreloadedDecls.push_back(D);
7248 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) {
7252 if (IdentifiersLoaded.empty()) {
7253 Error("no identifier table in AST file");
7258 if (!IdentifiersLoaded[ID]) {
7259 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
7260 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
7261 ModuleFile *M = I->second;
7262 unsigned Index = ID - M->BaseIdentifierID;
7263 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index];
7265 // All of the strings in the AST file are preceded by a 16-bit length.
7266 // Extract that 16-bit length to avoid having to execute strlen().
7267 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as
7268 // unsigned integers. This is important to avoid integer overflow when
7269 // we cast them to 'unsigned'.
7270 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2;
7271 unsigned StrLen = (((unsigned) StrLenPtr[0])
7272 | (((unsigned) StrLenPtr[1]) << 8)) - 1;
7273 IdentifiersLoaded[ID]
7274 = &PP.getIdentifierTable().get(StringRef(Str, StrLen));
7275 if (DeserializationListener)
7276 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]);
7279 return IdentifiersLoaded[ID];
7282 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) {
7283 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID));
7286 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) {
7287 if (LocalID < NUM_PREDEF_IDENT_IDS)
7290 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7291 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS);
7292 assert(I != M.IdentifierRemap.end()
7293 && "Invalid index into identifier index remap");
7295 return LocalID + I->second;
7298 MacroInfo *ASTReader::getMacro(MacroID ID) {
7302 if (MacrosLoaded.empty()) {
7303 Error("no macro table in AST file");
7307 ID -= NUM_PREDEF_MACRO_IDS;
7308 if (!MacrosLoaded[ID]) {
7309 GlobalMacroMapType::iterator I
7310 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS);
7311 assert(I != GlobalMacroMap.end() && "Corrupted global macro map");
7312 ModuleFile *M = I->second;
7313 unsigned Index = ID - M->BaseMacroID;
7314 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]);
7316 if (DeserializationListener)
7317 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS,
7321 return MacrosLoaded[ID];
7324 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) {
7325 if (LocalID < NUM_PREDEF_MACRO_IDS)
7328 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7329 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS);
7330 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap");
7332 return LocalID + I->second;
7335 serialization::SubmoduleID
7336 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) {
7337 if (LocalID < NUM_PREDEF_SUBMODULE_IDS)
7340 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7341 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS);
7342 assert(I != M.SubmoduleRemap.end()
7343 && "Invalid index into submodule index remap");
7345 return LocalID + I->second;
7348 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) {
7349 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) {
7350 assert(GlobalID == 0 && "Unhandled global submodule ID");
7354 if (GlobalID > SubmodulesLoaded.size()) {
7355 Error("submodule ID out of range in AST file");
7359 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
7362 Module *ASTReader::getModule(unsigned ID) {
7363 return getSubmodule(ID);
7366 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
7367 return DecodeSelector(getGlobalSelectorID(M, LocalID));
7370 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) {
7374 if (ID > SelectorsLoaded.size()) {
7375 Error("selector ID out of range in AST file");
7379 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) {
7380 // Load this selector from the selector table.
7381 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID);
7382 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map");
7383 ModuleFile &M = *I->second;
7384 ASTSelectorLookupTrait Trait(*this, M);
7385 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS;
7386 SelectorsLoaded[ID - 1] =
7387 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0);
7388 if (DeserializationListener)
7389 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
7392 return SelectorsLoaded[ID - 1];
7395 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) {
7396 return DecodeSelector(ID);
7399 uint32_t ASTReader::GetNumExternalSelectors() {
7400 // ID 0 (the null selector) is considered an external selector.
7401 return getTotalNumSelectors() + 1;
7404 serialization::SelectorID
7405 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const {
7406 if (LocalID < NUM_PREDEF_SELECTOR_IDS)
7409 ContinuousRangeMap<uint32_t, int, 2>::iterator I
7410 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS);
7411 assert(I != M.SelectorRemap.end()
7412 && "Invalid index into selector index remap");
7414 return LocalID + I->second;
7418 ASTReader::ReadDeclarationName(ModuleFile &F,
7419 const RecordData &Record, unsigned &Idx) {
7420 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++];
7422 case DeclarationName::Identifier:
7423 return DeclarationName(GetIdentifierInfo(F, Record, Idx));
7425 case DeclarationName::ObjCZeroArgSelector:
7426 case DeclarationName::ObjCOneArgSelector:
7427 case DeclarationName::ObjCMultiArgSelector:
7428 return DeclarationName(ReadSelector(F, Record, Idx));
7430 case DeclarationName::CXXConstructorName:
7431 return Context.DeclarationNames.getCXXConstructorName(
7432 Context.getCanonicalType(readType(F, Record, Idx)));
7434 case DeclarationName::CXXDestructorName:
7435 return Context.DeclarationNames.getCXXDestructorName(
7436 Context.getCanonicalType(readType(F, Record, Idx)));
7438 case DeclarationName::CXXConversionFunctionName:
7439 return Context.DeclarationNames.getCXXConversionFunctionName(
7440 Context.getCanonicalType(readType(F, Record, Idx)));
7442 case DeclarationName::CXXOperatorName:
7443 return Context.DeclarationNames.getCXXOperatorName(
7444 (OverloadedOperatorKind)Record[Idx++]);
7446 case DeclarationName::CXXLiteralOperatorName:
7447 return Context.DeclarationNames.getCXXLiteralOperatorName(
7448 GetIdentifierInfo(F, Record, Idx));
7450 case DeclarationName::CXXUsingDirective:
7451 return DeclarationName::getUsingDirectiveName();
7454 llvm_unreachable("Invalid NameKind!");
7457 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F,
7458 DeclarationNameLoc &DNLoc,
7459 DeclarationName Name,
7460 const RecordData &Record, unsigned &Idx) {
7461 switch (Name.getNameKind()) {
7462 case DeclarationName::CXXConstructorName:
7463 case DeclarationName::CXXDestructorName:
7464 case DeclarationName::CXXConversionFunctionName:
7465 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx);
7468 case DeclarationName::CXXOperatorName:
7469 DNLoc.CXXOperatorName.BeginOpNameLoc
7470 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7471 DNLoc.CXXOperatorName.EndOpNameLoc
7472 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7475 case DeclarationName::CXXLiteralOperatorName:
7476 DNLoc.CXXLiteralOperatorName.OpNameLoc
7477 = ReadSourceLocation(F, Record, Idx).getRawEncoding();
7480 case DeclarationName::Identifier:
7481 case DeclarationName::ObjCZeroArgSelector:
7482 case DeclarationName::ObjCOneArgSelector:
7483 case DeclarationName::ObjCMultiArgSelector:
7484 case DeclarationName::CXXUsingDirective:
7489 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F,
7490 DeclarationNameInfo &NameInfo,
7491 const RecordData &Record, unsigned &Idx) {
7492 NameInfo.setName(ReadDeclarationName(F, Record, Idx));
7493 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx));
7494 DeclarationNameLoc DNLoc;
7495 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx);
7496 NameInfo.setInfo(DNLoc);
7499 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info,
7500 const RecordData &Record, unsigned &Idx) {
7501 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
7502 unsigned NumTPLists = Record[Idx++];
7503 Info.NumTemplParamLists = NumTPLists;
7505 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
7506 for (unsigned i=0; i != NumTPLists; ++i)
7507 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx);
7512 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record,
7514 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++];
7516 case TemplateName::Template:
7517 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx));
7519 case TemplateName::OverloadedTemplate: {
7520 unsigned size = Record[Idx++];
7521 UnresolvedSet<8> Decls;
7523 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx));
7525 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end());
7528 case TemplateName::QualifiedTemplate: {
7529 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7530 bool hasTemplKeyword = Record[Idx++];
7531 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx);
7532 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template);
7535 case TemplateName::DependentTemplate: {
7536 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx);
7537 if (Record[Idx++]) // isIdentifier
7538 return Context.getDependentTemplateName(NNS,
7539 GetIdentifierInfo(F, Record,
7541 return Context.getDependentTemplateName(NNS,
7542 (OverloadedOperatorKind)Record[Idx++]);
7545 case TemplateName::SubstTemplateTemplateParm: {
7546 TemplateTemplateParmDecl *param
7547 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7548 if (!param) return TemplateName();
7549 TemplateName replacement = ReadTemplateName(F, Record, Idx);
7550 return Context.getSubstTemplateTemplateParm(param, replacement);
7553 case TemplateName::SubstTemplateTemplateParmPack: {
7554 TemplateTemplateParmDecl *Param
7555 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx);
7557 return TemplateName();
7559 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx);
7560 if (ArgPack.getKind() != TemplateArgument::Pack)
7561 return TemplateName();
7563 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
7567 llvm_unreachable("Unhandled template name kind!");
7571 ASTReader::ReadTemplateArgument(ModuleFile &F,
7572 const RecordData &Record, unsigned &Idx) {
7573 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++];
7575 case TemplateArgument::Null:
7576 return TemplateArgument();
7577 case TemplateArgument::Type:
7578 return TemplateArgument(readType(F, Record, Idx));
7579 case TemplateArgument::Declaration: {
7580 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx);
7581 bool ForReferenceParam = Record[Idx++];
7582 return TemplateArgument(D, ForReferenceParam);
7584 case TemplateArgument::NullPtr:
7585 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true);
7586 case TemplateArgument::Integral: {
7587 llvm::APSInt Value = ReadAPSInt(Record, Idx);
7588 QualType T = readType(F, Record, Idx);
7589 return TemplateArgument(Context, Value, T);
7591 case TemplateArgument::Template:
7592 return TemplateArgument(ReadTemplateName(F, Record, Idx));
7593 case TemplateArgument::TemplateExpansion: {
7594 TemplateName Name = ReadTemplateName(F, Record, Idx);
7595 Optional<unsigned> NumTemplateExpansions;
7596 if (unsigned NumExpansions = Record[Idx++])
7597 NumTemplateExpansions = NumExpansions - 1;
7598 return TemplateArgument(Name, NumTemplateExpansions);
7600 case TemplateArgument::Expression:
7601 return TemplateArgument(ReadExpr(F));
7602 case TemplateArgument::Pack: {
7603 unsigned NumArgs = Record[Idx++];
7604 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs];
7605 for (unsigned I = 0; I != NumArgs; ++I)
7606 Args[I] = ReadTemplateArgument(F, Record, Idx);
7607 return TemplateArgument(Args, NumArgs);
7611 llvm_unreachable("Unhandled template argument kind!");
7614 TemplateParameterList *
7615 ASTReader::ReadTemplateParameterList(ModuleFile &F,
7616 const RecordData &Record, unsigned &Idx) {
7617 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx);
7618 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx);
7619 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx);
7621 unsigned NumParams = Record[Idx++];
7622 SmallVector<NamedDecl *, 16> Params;
7623 Params.reserve(NumParams);
7625 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx));
7627 TemplateParameterList* TemplateParams =
7628 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
7629 Params.data(), Params.size(), RAngleLoc);
7630 return TemplateParams;
7635 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
7636 ModuleFile &F, const RecordData &Record,
7638 unsigned NumTemplateArgs = Record[Idx++];
7639 TemplArgs.reserve(NumTemplateArgs);
7640 while (NumTemplateArgs--)
7641 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx));
7644 /// \brief Read a UnresolvedSet structure.
7645 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set,
7646 const RecordData &Record, unsigned &Idx) {
7647 unsigned NumDecls = Record[Idx++];
7648 Set.reserve(Context, NumDecls);
7649 while (NumDecls--) {
7650 DeclID ID = ReadDeclID(F, Record, Idx);
7651 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
7652 Set.addLazyDecl(Context, ID, AS);
7657 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F,
7658 const RecordData &Record, unsigned &Idx) {
7659 bool isVirtual = static_cast<bool>(Record[Idx++]);
7660 bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
7661 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
7662 bool inheritConstructors = static_cast<bool>(Record[Idx++]);
7663 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx);
7664 SourceRange Range = ReadSourceRange(F, Record, Idx);
7665 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx);
7666 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo,
7668 Result.setInheritConstructors(inheritConstructors);
7672 std::pair<CXXCtorInitializer **, unsigned>
7673 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record,
7675 CXXCtorInitializer **CtorInitializers = nullptr;
7676 unsigned NumInitializers = Record[Idx++];
7677 if (NumInitializers) {
7679 = new (Context) CXXCtorInitializer*[NumInitializers];
7680 for (unsigned i=0; i != NumInitializers; ++i) {
7681 TypeSourceInfo *TInfo = nullptr;
7682 bool IsBaseVirtual = false;
7683 FieldDecl *Member = nullptr;
7684 IndirectFieldDecl *IndirectMember = nullptr;
7686 CtorInitializerType Type = (CtorInitializerType)Record[Idx++];
7688 case CTOR_INITIALIZER_BASE:
7689 TInfo = GetTypeSourceInfo(F, Record, Idx);
7690 IsBaseVirtual = Record[Idx++];
7693 case CTOR_INITIALIZER_DELEGATING:
7694 TInfo = GetTypeSourceInfo(F, Record, Idx);
7697 case CTOR_INITIALIZER_MEMBER:
7698 Member = ReadDeclAs<FieldDecl>(F, Record, Idx);
7701 case CTOR_INITIALIZER_INDIRECT_MEMBER:
7702 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx);
7706 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx);
7707 Expr *Init = ReadExpr(F);
7708 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx);
7709 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx);
7710 bool IsWritten = Record[Idx++];
7711 unsigned SourceOrderOrNumArrayIndices;
7712 SmallVector<VarDecl *, 8> Indices;
7714 SourceOrderOrNumArrayIndices = Record[Idx++];
7716 SourceOrderOrNumArrayIndices = Record[Idx++];
7717 Indices.reserve(SourceOrderOrNumArrayIndices);
7718 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i)
7719 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx));
7722 CXXCtorInitializer *BOMInit;
7723 if (Type == CTOR_INITIALIZER_BASE) {
7724 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual,
7725 LParenLoc, Init, RParenLoc,
7726 MemberOrEllipsisLoc);
7727 } else if (Type == CTOR_INITIALIZER_DELEGATING) {
7728 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc,
7730 } else if (IsWritten) {
7732 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc,
7733 LParenLoc, Init, RParenLoc);
7735 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7736 MemberOrEllipsisLoc, LParenLoc,
7739 if (IndirectMember) {
7740 assert(Indices.empty() && "Indirect field improperly initialized");
7741 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember,
7742 MemberOrEllipsisLoc, LParenLoc,
7745 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc,
7746 LParenLoc, Init, RParenLoc,
7747 Indices.data(), Indices.size());
7752 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
7753 CtorInitializers[i] = BOMInit;
7757 return std::make_pair(CtorInitializers, NumInitializers);
7760 NestedNameSpecifier *
7761 ASTReader::ReadNestedNameSpecifier(ModuleFile &F,
7762 const RecordData &Record, unsigned &Idx) {
7763 unsigned N = Record[Idx++];
7764 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr;
7765 for (unsigned I = 0; I != N; ++I) {
7766 NestedNameSpecifier::SpecifierKind Kind
7767 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7769 case NestedNameSpecifier::Identifier: {
7770 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7771 NNS = NestedNameSpecifier::Create(Context, Prev, II);
7775 case NestedNameSpecifier::Namespace: {
7776 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7777 NNS = NestedNameSpecifier::Create(Context, Prev, NS);
7781 case NestedNameSpecifier::NamespaceAlias: {
7782 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7783 NNS = NestedNameSpecifier::Create(Context, Prev, Alias);
7787 case NestedNameSpecifier::TypeSpec:
7788 case NestedNameSpecifier::TypeSpecWithTemplate: {
7789 const Type *T = readType(F, Record, Idx).getTypePtrOrNull();
7793 bool Template = Record[Idx++];
7794 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T);
7798 case NestedNameSpecifier::Global: {
7799 NNS = NestedNameSpecifier::GlobalSpecifier(Context);
7800 // No associated value, and there can't be a prefix.
7809 NestedNameSpecifierLoc
7810 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record,
7812 unsigned N = Record[Idx++];
7813 NestedNameSpecifierLocBuilder Builder;
7814 for (unsigned I = 0; I != N; ++I) {
7815 NestedNameSpecifier::SpecifierKind Kind
7816 = (NestedNameSpecifier::SpecifierKind)Record[Idx++];
7818 case NestedNameSpecifier::Identifier: {
7819 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx);
7820 SourceRange Range = ReadSourceRange(F, Record, Idx);
7821 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd());
7825 case NestedNameSpecifier::Namespace: {
7826 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx);
7827 SourceRange Range = ReadSourceRange(F, Record, Idx);
7828 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
7832 case NestedNameSpecifier::NamespaceAlias: {
7833 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx);
7834 SourceRange Range = ReadSourceRange(F, Record, Idx);
7835 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd());
7839 case NestedNameSpecifier::TypeSpec:
7840 case NestedNameSpecifier::TypeSpecWithTemplate: {
7841 bool Template = Record[Idx++];
7842 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx);
7844 return NestedNameSpecifierLoc();
7845 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7847 // FIXME: 'template' keyword location not saved anywhere, so we fake it.
7848 Builder.Extend(Context,
7849 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(),
7850 T->getTypeLoc(), ColonColonLoc);
7854 case NestedNameSpecifier::Global: {
7855 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx);
7856 Builder.MakeGlobal(Context, ColonColonLoc);
7862 return Builder.getWithLocInContext(Context);
7866 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record,
7868 SourceLocation beg = ReadSourceLocation(F, Record, Idx);
7869 SourceLocation end = ReadSourceLocation(F, Record, Idx);
7870 return SourceRange(beg, end);
7873 /// \brief Read an integral value
7874 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) {
7875 unsigned BitWidth = Record[Idx++];
7876 unsigned NumWords = llvm::APInt::getNumWords(BitWidth);
7877 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]);
7882 /// \brief Read a signed integral value
7883 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) {
7884 bool isUnsigned = Record[Idx++];
7885 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned);
7888 /// \brief Read a floating-point value
7889 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record,
7890 const llvm::fltSemantics &Sem,
7892 return llvm::APFloat(Sem, ReadAPInt(Record, Idx));
7895 // \brief Read a string
7896 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) {
7897 unsigned Len = Record[Idx++];
7898 std::string Result(Record.data() + Idx, Record.data() + Idx + Len);
7903 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record,
7905 unsigned Major = Record[Idx++];
7906 unsigned Minor = Record[Idx++];
7907 unsigned Subminor = Record[Idx++];
7909 return VersionTuple(Major);
7911 return VersionTuple(Major, Minor - 1);
7912 return VersionTuple(Major, Minor - 1, Subminor - 1);
7915 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F,
7916 const RecordData &Record,
7918 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx);
7919 return CXXTemporary::Create(Context, Decl);
7922 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) {
7923 return Diag(CurrentImportLoc, DiagID);
7926 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) {
7927 return Diags.Report(Loc, DiagID);
7930 /// \brief Retrieve the identifier table associated with the
7932 IdentifierTable &ASTReader::getIdentifierTable() {
7933 return PP.getIdentifierTable();
7936 /// \brief Record that the given ID maps to the given switch-case
7938 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) {
7939 assert((*CurrSwitchCaseStmts)[ID] == nullptr &&
7940 "Already have a SwitchCase with this ID");
7941 (*CurrSwitchCaseStmts)[ID] = SC;
7944 /// \brief Retrieve the switch-case statement with the given ID.
7945 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) {
7946 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID");
7947 return (*CurrSwitchCaseStmts)[ID];
7950 void ASTReader::ClearSwitchCaseIDs() {
7951 CurrSwitchCaseStmts->clear();
7954 void ASTReader::ReadComments() {
7955 std::vector<RawComment *> Comments;
7956 for (SmallVectorImpl<std::pair<BitstreamCursor,
7957 serialization::ModuleFile *> >::iterator
7958 I = CommentsCursors.begin(),
7959 E = CommentsCursors.end();
7962 BitstreamCursor &Cursor = I->first;
7963 serialization::ModuleFile &F = *I->second;
7964 SavedStreamPosition SavedPosition(Cursor);
7968 llvm::BitstreamEntry Entry =
7969 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd);
7971 switch (Entry.Kind) {
7972 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
7973 case llvm::BitstreamEntry::Error:
7974 Error("malformed block record in AST file");
7976 case llvm::BitstreamEntry::EndBlock:
7978 case llvm::BitstreamEntry::Record:
7979 // The interesting case.
7985 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) {
7986 case COMMENTS_RAW_COMMENT: {
7988 SourceRange SR = ReadSourceRange(F, Record, Idx);
7989 RawComment::CommentKind Kind =
7990 (RawComment::CommentKind) Record[Idx++];
7991 bool IsTrailingComment = Record[Idx++];
7992 bool IsAlmostTrailingComment = Record[Idx++];
7993 Comments.push_back(new (Context) RawComment(
7994 SR, Kind, IsTrailingComment, IsAlmostTrailingComment,
7995 Context.getLangOpts().CommentOpts.ParseAllComments));
8001 Context.Comments.addDeserializedComments(Comments);
8005 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) {
8006 // If we know the owning module, use it.
8007 if (Module *M = D->getOwningModule())
8008 return M->getFullModuleName();
8010 // Otherwise, use the name of the top-level module the decl is within.
8011 if (ModuleFile *M = getOwningModuleFile(D))
8012 return M->ModuleName;
8014 // Not from a module.
8018 void ASTReader::finishPendingActions() {
8019 while (!PendingIdentifierInfos.empty() ||
8020 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||
8021 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
8022 !PendingUpdateRecords.empty() || !PendingOdrMergeChecks.empty()) {
8023 // If any identifiers with corresponding top-level declarations have
8024 // been loaded, load those declarations now.
8025 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> >
8027 TopLevelDeclsMap TopLevelDecls;
8029 while (!PendingIdentifierInfos.empty()) {
8030 IdentifierInfo *II = PendingIdentifierInfos.back().first;
8031 SmallVector<uint32_t, 4> DeclIDs =
8032 std::move(PendingIdentifierInfos.back().second);
8033 PendingIdentifierInfos.pop_back();
8035 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]);
8038 // For each decl chain that we wanted to complete while deserializing, mark
8039 // it as "still needs to be completed".
8040 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) {
8041 markIncompleteDeclChain(PendingIncompleteDeclChains[I]);
8043 PendingIncompleteDeclChains.clear();
8045 // Load pending declaration chains.
8046 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) {
8047 loadPendingDeclChain(PendingDeclChains[I]);
8048 PendingDeclChainsKnown.erase(PendingDeclChains[I]);
8050 PendingDeclChains.clear();
8052 // Make the most recent of the top-level declarations visible.
8053 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
8054 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
8055 IdentifierInfo *II = TLD->first;
8056 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
8057 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II);
8061 // Load any pending macro definitions.
8062 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
8063 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
8064 SmallVector<PendingMacroInfo, 2> GlobalIDs;
8065 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
8066 // Initialize the macro history from chained-PCHs ahead of module imports.
8067 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8069 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8070 if (Info.M->Kind != MK_Module)
8071 resolvePendingMacro(II, Info);
8073 // Handle module imports.
8074 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
8076 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
8077 if (Info.M->Kind == MK_Module)
8078 resolvePendingMacro(II, Info);
8081 PendingMacroIDs.clear();
8083 // Wire up the DeclContexts for Decls that we delayed setting until
8084 // recursive loading is completed.
8085 while (!PendingDeclContextInfos.empty()) {
8086 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
8087 PendingDeclContextInfos.pop_front();
8088 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC));
8089 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC));
8090 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext());
8093 // Perform any pending declaration updates.
8095 // Don't do this if we have known-incomplete redecl chains: it relies on
8096 // being able to walk redeclaration chains.
8097 while (PendingDeclChains.empty() && !PendingUpdateRecords.empty()) {
8098 auto Update = PendingUpdateRecords.pop_back_val();
8099 ReadingKindTracker ReadingKind(Read_Decl, *this);
8100 loadDeclUpdateRecords(Update.first, Update.second);
8103 // Trigger the import of the full definition of each class that had any
8104 // odr-merging problems, so we can produce better diagnostics for them.
8105 for (auto &Merge : PendingOdrMergeFailures) {
8106 Merge.first->buildLookup();
8107 Merge.first->decls_begin();
8108 Merge.first->bases_begin();
8109 Merge.first->vbases_begin();
8110 for (auto *RD : Merge.second) {
8117 // For each declaration from a merged context, check that the canonical
8118 // definition of that context also contains a declaration of the same
8120 while (!PendingOdrMergeChecks.empty()) {
8121 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
8123 // FIXME: Skip over implicit declarations for now. This matters for things
8124 // like implicitly-declared special member functions. This isn't entirely
8125 // correct; we can end up with multiple unmerged declarations of the same
8127 if (D->isImplicit())
8130 DeclContext *CanonDef = D->getDeclContext();
8131 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName());
8134 const Decl *DCanon = D->getCanonicalDecl();
8136 llvm::SmallVector<const NamedDecl*, 4> Candidates;
8137 for (DeclContext::lookup_iterator I = R.begin(), E = R.end();
8138 !Found && I != E; ++I) {
8139 for (auto RI : (*I)->redecls()) {
8140 if (RI->getLexicalDeclContext() == CanonDef) {
8141 // This declaration is present in the canonical definition. If it's
8142 // in the same redecl chain, it's the one we're looking for.
8143 if (RI->getCanonicalDecl() == DCanon)
8146 Candidates.push_back(cast<NamedDecl>(RI));
8153 D->setInvalidDecl();
8155 std::string CanonDefModule =
8156 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef));
8157 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl)
8158 << D << getOwningModuleNameForDiagnostic(D)
8159 << CanonDef << CanonDefModule.empty() << CanonDefModule;
8161 if (Candidates.empty())
8162 Diag(cast<Decl>(CanonDef)->getLocation(),
8163 diag::note_module_odr_violation_no_possible_decls) << D;
8165 for (unsigned I = 0, N = Candidates.size(); I != N; ++I)
8166 Diag(Candidates[I]->getLocation(),
8167 diag::note_module_odr_violation_possible_decl)
8171 DiagnosedOdrMergeFailures.insert(CanonDef);
8176 // If we deserialized any C++ or Objective-C class definitions, any
8177 // Objective-C protocol definitions, or any redeclarable templates, make sure
8178 // that all redeclarations point to the definitions. Note that this can only
8179 // happen now, after the redeclaration chains have been fully wired.
8180 for (llvm::SmallPtrSet<Decl *, 4>::iterator D = PendingDefinitions.begin(),
8181 DEnd = PendingDefinitions.end();
8183 if (TagDecl *TD = dyn_cast<TagDecl>(*D)) {
8184 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) {
8185 // Make sure that the TagType points at the definition.
8186 const_cast<TagType*>(TagT)->decl = TD;
8189 if (auto RD = dyn_cast<CXXRecordDecl>(*D)) {
8190 for (auto R : RD->redecls())
8191 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
8197 if (auto ID = dyn_cast<ObjCInterfaceDecl>(*D)) {
8198 // Make sure that the ObjCInterfaceType points at the definition.
8199 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl))
8202 for (auto R : ID->redecls())
8208 if (auto PD = dyn_cast<ObjCProtocolDecl>(*D)) {
8209 for (auto R : PD->redecls())
8215 auto RTD = cast<RedeclarableTemplateDecl>(*D)->getCanonicalDecl();
8216 for (auto R : RTD->redecls())
8217 R->Common = RTD->Common;
8219 PendingDefinitions.clear();
8221 // Load the bodies of any functions or methods we've encountered. We do
8222 // this now (delayed) so that we can be sure that the declaration chains
8223 // have been fully wired up.
8224 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
8225 PBEnd = PendingBodies.end();
8226 PB != PBEnd; ++PB) {
8227 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
8228 // FIXME: Check for =delete/=default?
8229 // FIXME: Complain about ODR violations here?
8230 if (!getContext().getLangOpts().Modules || !FD->hasBody())
8231 FD->setLazyBody(PB->second);
8235 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first);
8236 if (!getContext().getLangOpts().Modules || !MD->hasBody())
8237 MD->setLazyBody(PB->second);
8239 PendingBodies.clear();
8241 // Issue any pending ODR-failure diagnostics.
8242 for (auto &Merge : PendingOdrMergeFailures) {
8243 if (!DiagnosedOdrMergeFailures.insert(Merge.first))
8246 bool Diagnosed = false;
8247 for (auto *RD : Merge.second) {
8248 // Multiple different declarations got merged together; tell the user
8249 // where they came from.
8250 if (Merge.first != RD) {
8251 // FIXME: Walk the definition, figure out what's different,
8252 // and diagnose that.
8254 std::string Module = getOwningModuleNameForDiagnostic(Merge.first);
8255 Diag(Merge.first->getLocation(),
8256 diag::err_module_odr_violation_different_definitions)
8257 << Merge.first << Module.empty() << Module;
8261 Diag(RD->getLocation(),
8262 diag::note_module_odr_violation_different_definitions)
8263 << getOwningModuleNameForDiagnostic(RD);
8268 // All definitions are updates to the same declaration. This happens if a
8269 // module instantiates the declaration of a class template specialization
8270 // and two or more other modules instantiate its definition.
8272 // FIXME: Indicate which modules had instantiations of this definition.
8273 // FIXME: How can this even happen?
8274 Diag(Merge.first->getLocation(),
8275 diag::err_module_odr_violation_different_instantiations)
8279 PendingOdrMergeFailures.clear();
8282 void ASTReader::FinishedDeserializing() {
8283 assert(NumCurrentElementsDeserializing &&
8284 "FinishedDeserializing not paired with StartedDeserializing");
8285 if (NumCurrentElementsDeserializing == 1) {
8286 // We decrease NumCurrentElementsDeserializing only after pending actions
8287 // are finished, to avoid recursively re-calling finishPendingActions().
8288 finishPendingActions();
8290 --NumCurrentElementsDeserializing;
8292 if (NumCurrentElementsDeserializing == 0 && Consumer) {
8293 // We are not in recursive loading, so it's safe to pass the "interesting"
8294 // decls to the consumer.
8295 PassInterestingDeclsToConsumer();
8299 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) {
8300 D = D->getMostRecentDecl();
8302 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
8303 SemaObj->TUScope->AddDecl(D);
8304 } else if (SemaObj->TUScope) {
8305 // Adding the decl to IdResolver may have failed because it was already in
8306 // (even though it was not added in scope). If it is already in, make sure
8307 // it gets in the scope as well.
8308 if (std::find(SemaObj->IdResolver.begin(Name),
8309 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end())
8310 SemaObj->TUScope->AddDecl(D);
8314 ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot,
8315 bool DisableValidation, bool AllowASTWithCompilerErrors,
8316 bool AllowConfigurationMismatch, bool ValidateSystemInputs,
8317 bool UseGlobalIndex)
8318 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr),
8319 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()),
8320 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()),
8321 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr),
8322 ModuleMgr(PP.getFileManager()), isysroot(isysroot),
8323 DisableValidation(DisableValidation),
8324 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
8325 AllowConfigurationMismatch(AllowConfigurationMismatch),
8326 ValidateSystemInputs(ValidateSystemInputs),
8327 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false),
8328 CurrSwitchCaseStmts(&SwitchCaseStmts),
8329 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0),
8330 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0),
8331 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0),
8332 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0),
8333 NumMethodPoolHits(0), NumMethodPoolTableLookups(0),
8334 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0),
8335 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0),
8336 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0),
8337 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0),
8338 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0),
8339 ReadingKind(Read_None) {
8340 SourceMgr.setExternalSLocEntrySource(this);
8343 ASTReader::~ASTReader() {
8344 if (OwnsDeserializationListener)
8345 delete DeserializationListener;
8347 for (DeclContextVisibleUpdatesPending::iterator
8348 I = PendingVisibleUpdates.begin(),
8349 E = PendingVisibleUpdates.end();
8351 for (DeclContextVisibleUpdates::iterator J = I->second.begin(),
8352 F = I->second.end();