98#include "llvm/ADT/APFloat.h"
99#include "llvm/ADT/APInt.h"
100#include "llvm/ADT/ArrayRef.h"
101#include "llvm/ADT/DenseMap.h"
102#include "llvm/ADT/FoldingSet.h"
103#include "llvm/ADT/IntrusiveRefCntPtr.h"
104#include "llvm/ADT/STLExtras.h"
105#include "llvm/ADT/ScopeExit.h"
106#include "llvm/ADT/Sequence.h"
107#include "llvm/ADT/SmallPtrSet.h"
108#include "llvm/ADT/SmallVector.h"
109#include "llvm/ADT/StringExtras.h"
110#include "llvm/ADT/StringMap.h"
111#include "llvm/ADT/StringRef.h"
112#include "llvm/ADT/iterator_range.h"
113#include "llvm/Bitstream/BitstreamReader.h"
114#include "llvm/Support/Compiler.h"
115#include "llvm/Support/Compression.h"
116#include "llvm/Support/DJB.h"
117#include "llvm/Support/Endian.h"
118#include "llvm/Support/Error.h"
119#include "llvm/Support/ErrorHandling.h"
120#include "llvm/Support/LEB128.h"
121#include "llvm/Support/MemoryBuffer.h"
122#include "llvm/Support/Path.h"
123#include "llvm/Support/SaveAndRestore.h"
124#include "llvm/Support/TimeProfiler.h"
125#include "llvm/Support/Timer.h"
126#include "llvm/Support/VersionTuple.h"
127#include "llvm/Support/VirtualFileSystem.h"
128#include "llvm/Support/raw_ostream.h"
129#include "llvm/TargetParser/Triple.h"
142#include <system_error>
147using namespace clang;
150using llvm::BitstreamCursor;
158 return First->ReadFullVersionInformation(FullVersion) ||
159 Second->ReadFullVersionInformation(FullVersion);
163 First->ReadModuleName(ModuleName);
164 Second->ReadModuleName(ModuleName);
168 First->ReadModuleMapFile(ModuleMapPath);
169 Second->ReadModuleMapFile(ModuleMapPath);
173 const LangOptions &LangOpts, StringRef ModuleFilename,
bool Complain,
174 bool AllowCompatibleDifferences) {
175 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
176 AllowCompatibleDifferences) ||
177 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
178 AllowCompatibleDifferences);
182 const CodeGenOptions &CGOpts, StringRef ModuleFilename,
bool Complain,
183 bool AllowCompatibleDifferences) {
184 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
185 AllowCompatibleDifferences) ||
186 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
187 AllowCompatibleDifferences);
191 const TargetOptions &TargetOpts, StringRef ModuleFilename,
bool Complain,
192 bool AllowCompatibleDifferences) {
193 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
194 AllowCompatibleDifferences) ||
195 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
196 AllowCompatibleDifferences);
201 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
202 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
208 return First->ReadFileSystemOptions(FSOpts, Complain) ||
209 Second->ReadFileSystemOptions(FSOpts, Complain);
214 StringRef ContextHash,
bool Complain) {
215 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
217 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
223 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
224 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
225 Complain, SuggestedPredefines) ||
226 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
227 Complain, SuggestedPredefines);
232 First->ReadCounter(M,
Value);
233 Second->ReadCounter(M,
Value);
237 return First->needsInputFileVisitation() ||
238 Second->needsInputFileVisitation();
242 return First->needsSystemInputFileVisitation() ||
243 Second->needsSystemInputFileVisitation();
248 bool DirectlyImported) {
249 First->visitModuleFile(Filename, Kind, DirectlyImported);
250 Second->visitModuleFile(Filename, Kind, DirectlyImported);
256 bool isExplicitModule) {
257 bool Continue =
false;
258 if (First->needsInputFileVisitation() &&
259 (!isSystem || First->needsSystemInputFileVisitation()))
260 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
262 if (Second->needsInputFileVisitation() &&
263 (!isSystem || Second->needsSystemInputFileVisitation()))
264 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
271 First->readModuleFileExtension(Metadata);
272 Second->readModuleFileExtension(Metadata);
283 bool CurrentValue, StringRef ModuleFilename) {
286 return Diags->
Report(diag::err_ast_file_langopt_mismatch)
287 << Description << SerializedValue << CurrentValue << ModuleFilename;
294 return Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
295 << Description << ModuleFilename;
308 StringRef ModuleFilename,
310 bool AllowCompatibleDifferences =
true) {
314#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
315 if constexpr (CK::Compatibility != CK::Benign) { \
316 if ((CK::Compatibility == CK::NotCompatible) || \
317 (CK::Compatibility == CK::Compatible && \
318 !AllowCompatibleDifferences)) { \
319 if (ExistingLangOpts.Name != LangOpts.Name) { \
321 return diagnoseLanguageOptionFlagMismatch( \
322 Diags, Description, LangOpts.Name, ExistingLangOpts.Name, \
324 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
330#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
331 if constexpr (CK::Compatibility != CK::Benign) { \
332 if ((CK::Compatibility == CK::NotCompatible) || \
333 (CK::Compatibility == CK::Compatible && \
334 !AllowCompatibleDifferences)) { \
335 if (ExistingLangOpts.Name != LangOpts.Name) { \
336 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
342#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
343 if constexpr (CK::Compatibility != CK::Benign) { \
344 if ((CK::Compatibility == CK::NotCompatible) || \
345 (CK::Compatibility == CK::Compatible && \
346 !AllowCompatibleDifferences)) { \
347 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
348 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
354#include "clang/Basic/LangOptions.def"
363 Diags,
"target Objective-C runtime", ModuleFilename);
376 if (!AllowCompatibleDifferences) {
380 ExistingSanitizers.
clear(ModularSanitizers);
381 ImportedSanitizers.
clear(ModularSanitizers);
382 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
383 const std::string Flag =
"-fsanitize=";
385#define SANITIZER(NAME, ID) \
387 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
388 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
389 if (InExistingModule != InImportedModule) \
390 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
391 << InExistingModule << ModuleFilename << (Flag + NAME); \
393#include "clang/Basic/Sanitizers.def"
404 StringRef ModuleFilename,
406 bool AllowCompatibleDifferences =
true) {
410#define CODEGENOPT(Name, Bits, Default, Compatibility) \
411 if constexpr (CK::Compatibility != CK::Benign) { \
412 if ((CK::Compatibility == CK::NotCompatible) || \
413 (CK::Compatibility == CK::Compatible && \
414 !AllowCompatibleDifferences)) { \
415 if (ExistingCGOpts.Name != CGOpts.Name) { \
418 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
419 << #Name << CGOpts.Name << ExistingCGOpts.Name \
422 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
423 << #Name << ModuleFilename; \
430#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
431 if constexpr (CK::Compatibility != CK::Benign) { \
432 if ((CK::Compatibility == CK::NotCompatible) || \
433 (CK::Compatibility == CK::Compatible && \
434 !AllowCompatibleDifferences)) { \
435 if (ExistingCGOpts.Name != CGOpts.Name) { \
437 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
438 << #Name << ModuleFilename; \
443#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
444 if constexpr (CK::Compatibility != CK::Benign) { \
445 if ((CK::Compatibility == CK::NotCompatible) || \
446 (CK::Compatibility == CK::Compatible && \
447 !AllowCompatibleDifferences)) { \
448 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
450 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
451 << #Name << ModuleFilename; \
456#define DEBUGOPT(Name, Bits, Default, Compatibility)
457#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
458#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
459#include "clang/Basic/CodeGenOptions.def"
464static std::vector<std::string>
466 llvm::erase_if(FeaturesAsWritten, [](
const std::string &S) {
467 return S.empty() || (S[0] !=
'+' && S[0] !=
'-');
469 llvm::stable_sort(FeaturesAsWritten,
470 [](
const std::string &A,
const std::string &B) {
471 return A.substr(1) < B.substr(1);
474 std::unique(FeaturesAsWritten.rbegin(), FeaturesAsWritten.rend(),
475 [](
const std::string &A,
const std::string &B) {
476 return A.substr(1) == B.substr(1);
480 FeaturesAsWritten.erase(FeaturesAsWritten.begin(), NewRend.base());
481 return FeaturesAsWritten;
492 StringRef ModuleFilename,
494 bool AllowCompatibleDifferences =
true) {
495#define CHECK_TARGET_OPT(Field, Name) \
496 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
498 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
499 << ModuleFilename << Name << TargetOpts.Field \
500 << ExistingTargetOpts.Field; \
511 if (!AllowCompatibleDifferences) {
516#undef CHECK_TARGET_OPT
521 std::vector<std::string> ExistingFeatures =
523 std::vector<std::string> ReadFeatures =
528 auto FeatureLess = [](StringRef A, StringRef B) {
529 return A.substr(1) < B.substr(1);
533 std::set_difference(ExistingFeatures.begin(), ExistingFeatures.end(),
534 ReadFeatures.begin(), ReadFeatures.end(),
535 std::back_inserter(UnmatchedExistingFeatures),
537 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
538 ExistingFeatures.begin(), ExistingFeatures.end(),
539 std::back_inserter(UnmatchedReadFeatures), FeatureLess);
543 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
547 for (StringRef
Feature : UnmatchedReadFeatures)
548 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
549 <<
false << ModuleFilename <<
Feature;
550 for (StringRef
Feature : UnmatchedExistingFeatures)
551 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
552 <<
true << ModuleFilename <<
Feature;
555 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
559 StringRef ModuleFilename,
bool Complain,
560 bool AllowCompatibleDifferences) {
561 const LangOptions &ExistingLangOpts = PP.getLangOpts();
563 Complain ? &Reader.Diags :
nullptr,
564 AllowCompatibleDifferences);
568 StringRef ModuleFilename,
bool Complain,
569 bool AllowCompatibleDifferences) {
572 Complain ? &Reader.Diags :
nullptr,
573 AllowCompatibleDifferences);
577 StringRef ModuleFilename,
bool Complain,
578 bool AllowCompatibleDifferences) {
579 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
581 Complain ? &Reader.Diags :
nullptr,
582 AllowCompatibleDifferences);
587using MacroDefinitionsMap =
588 llvm::StringMap<std::pair<StringRef,
bool >>;
597 bool empty()
const {
return Decls.empty(); }
599 bool insert(NamedDecl *ND) {
600 auto [_, Inserted] =
Found.insert(ND);
607using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
613 StringRef ModuleFilename,
623 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
632 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
634 ->getWarningOptionForDiag(DiagID)
654 StringRef ModuleFilename,
bool IsSystem,
655 bool SystemHeaderWarningsInModule,
664 !SystemHeaderWarningsInModule) {
666 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
667 <<
"-Wsystem-headers" << ModuleFilename;
674 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
675 <<
"-Werror" << ModuleFilename;
682 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
683 <<
"-Weverything -Werror" << ModuleFilename;
690 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
691 <<
"-pedantic-errors" << ModuleFilename;
716 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
720 assert(M &&
"missing module");
725 StringRef ModuleFilename,
729 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
733 PP.getFileManager().getVirtualFileSystem(),
737 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
743 Module *Importer = PP.getCurrentModule();
746 bool SystemHeaderWarningsInModule =
753 TopM->
IsSystem, SystemHeaderWarningsInModule,
761 MacroDefinitionsMap &Macros,
763 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
765 bool IsUndef = PPOpts.
Macros[I].second;
767 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
768 StringRef MacroName = MacroPair.first;
769 StringRef MacroBody = MacroPair.second;
773 auto [It, Inserted] = Macros.try_emplace(MacroName);
774 if (MacroNames && Inserted)
775 MacroNames->push_back(MacroName);
777 It->second = std::make_pair(
"",
true);
782 if (MacroName.size() ==
Macro.size())
786 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
787 MacroBody = MacroBody.substr(0, End);
790 auto [It, Inserted] = Macros.try_emplace(MacroName);
791 if (MacroNames && Inserted)
792 MacroNames->push_back(MacroName);
793 It->second = std::make_pair(MacroBody,
false);
817 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
821 MacroDefinitionsMap ASTFileMacros;
823 MacroDefinitionsMap ExistingMacros;
826 &ExistingMacroNames);
830 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
832 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
834 StringRef MacroName = ExistingMacroNames[I];
835 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
838 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
839 ASTFileMacros.find(MacroName);
845 Diags->
Report(diag::err_ast_file_macro_def_undef)
846 << MacroName <<
true << ModuleFilename;
854 if (Existing.second) {
855 SuggestedPredefines +=
"#undef ";
856 SuggestedPredefines += MacroName.str();
857 SuggestedPredefines +=
'\n';
859 SuggestedPredefines +=
"#define ";
860 SuggestedPredefines += MacroName.str();
861 SuggestedPredefines +=
' ';
862 SuggestedPredefines += Existing.first.str();
863 SuggestedPredefines +=
'\n';
870 if (Existing.second != Known->second.second) {
872 Diags->
Report(diag::err_ast_file_macro_def_undef)
873 << MacroName << Known->second.second << ModuleFilename;
880 if (Existing.second || Existing.first == Known->second.first) {
881 ASTFileMacros.erase(Known);
887 Diags->
Report(diag::err_ast_file_macro_def_conflict)
888 << MacroName << Known->second.first << Existing.first
895 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
900 for (
const auto &MacroName : ASTFileMacros.keys()) {
902 Diags->
Report(diag::err_ast_file_macro_def_undef)
903 << MacroName <<
false << ModuleFilename;
914 Diags->
Report(diag::err_ast_file_undef)
921 if (LangOpts.Modules &&
925 Diags->
Report(diag::err_ast_file_pp_detailed_record)
932 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
937 SuggestedPredefines +=
"#__include_macros \"";
938 SuggestedPredefines +=
File;
939 SuggestedPredefines +=
"\"\n##\n";
942 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
949 SuggestedPredefines +=
"#include \"";
950 SuggestedPredefines +=
File;
951 SuggestedPredefines +=
"\"\n";
961 SuggestedPredefines +=
"#include \"";
962 SuggestedPredefines +=
File;
963 SuggestedPredefines +=
"\"\n";
970 StringRef ModuleFilename,
971 bool ReadMacros,
bool Complain,
972 std::string &SuggestedPredefines) {
976 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
977 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
978 SuggestedPredefines, PP.getLangOpts());
983 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
985 ModuleFilename, ReadMacros,
nullptr,
986 PP.getFileManager(), SuggestedPredefines,
995 StringRef ExistingSpecificModuleCachePath,
996 StringRef ASTFilename,
1004 std::string(ContextHash));
1007 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
1009 auto EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1010 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
1011 if (EqualOrErr && *EqualOrErr)
1017 EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1019 if (EqualOrErr && *EqualOrErr)
1020 Diags->
Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
1022 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
1023 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1030 StringRef ASTFilename,
1031 StringRef ContextHash,
1033 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1036 ASTFilename, Complain ? &Reader.Diags :
nullptr,
1037 PP.getLangOpts(), PP.getPreprocessorOpts(),
1042 PP.setCounterValue(
Value);
1050 unsigned Length = 0;
1051 const char *
Error =
nullptr;
1053 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1055 llvm::report_fatal_error(
Error);
1061static std::pair<unsigned, unsigned>
1064 if ((
unsigned)KeyLen != KeyLen)
1065 llvm::report_fatal_error(
"key too large");
1068 if ((
unsigned)DataLen != DataLen)
1069 llvm::report_fatal_error(
"data too large");
1071 return std::make_pair(KeyLen, DataLen);
1075 bool TakeOwnership) {
1076 DeserializationListener = Listener;
1077 OwnsDeserializationListener = TakeOwnership;
1088 Reader.ReadModuleOffsetMap(MF);
1090 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1091 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1097 assert(OwningModuleFile);
1101 if (!ModuleFileIndex)
1104 assert(LocalDeclID < LocalNumDecls);
1112 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1117std::pair<unsigned, unsigned>
1124 using namespace llvm::support;
1127 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1129 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1136 Args.push_back(FirstII);
1137 for (
unsigned I = 1; I != N; ++I)
1138 Args.push_back(Reader.getLocalIdentifier(
1139 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1147 using namespace llvm::support;
1151 Result.ID = Reader.getGlobalSelectorID(
1152 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1153 unsigned FullInstanceBits =
1154 endian::readNext<uint16_t, llvm::endianness::little>(d);
1155 unsigned FullFactoryBits =
1156 endian::readNext<uint16_t, llvm::endianness::little>(d);
1157 Result.InstanceBits = FullInstanceBits & 0x3;
1158 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1159 Result.FactoryBits = FullFactoryBits & 0x3;
1160 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1161 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1162 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1165 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1169 endian::readNext<DeclID, llvm::endianness::little>(d))))
1174 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1178 endian::readNext<DeclID, llvm::endianness::little>(d))))
1186 return llvm::djbHash(a);
1189std::pair<unsigned, unsigned>
1196 assert(n >= 2 && d[n-1] ==
'\0');
1197 return StringRef((
const char*) d, n-1);
1203 bool IsInteresting =
1214 bool Value = Bits & 0x1;
1220 using namespace llvm::support;
1223 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1224 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1237 const unsigned char* d,
1239 using namespace llvm::support;
1242 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1243 bool IsInteresting = RawID & 0x01;
1253 II = &Reader.getIdentifierTable().getOwn(k);
1256 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1258 Reader.markIdentifierUpToDate(II);
1260 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1261 if (!IsInteresting) {
1264 Reader.SetIdentifierInfo(ID, II);
1268 unsigned ObjCOrBuiltinID =
1269 endian::readNext<uint16_t, llvm::endianness::little>(d);
1270 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1271 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1272 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1273 bool Poisoned =
readBit(Bits);
1274 bool ExtensionToken =
readBit(Bits);
1275 bool HasMacroDefinition =
readBit(Bits);
1277 assert(Bits == 0 &&
"Extra bits in the identifier?");
1278 DataLen -=
sizeof(uint16_t) * 2;
1282 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1287 "Incorrect extension token flag");
1288 (void)ExtensionToken;
1292 "Incorrect C++ operator keyword flag");
1293 (void)CPlusPlusOperatorKeyword;
1297 if (HasMacroDefinition) {
1298 uint32_t MacroDirectivesOffset =
1299 endian::readNext<uint32_t, llvm::endianness::little>(d);
1302 if (MacroDirectivesOffset)
1303 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1305 hasMacroDefinitionInDependencies =
true;
1308 Reader.SetIdentifierInfo(ID, II);
1314 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1315 DeclIDs.push_back(Reader.getGlobalDeclID(
1318 endian::readNext<DeclID, llvm::endianness::little>(d))));
1319 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1326 : Kind(Name.getNameKind()) {
1356 llvm::FoldingSetNodeID ID;
1357 ID.AddInteger(Kind);
1380 return ID.computeStableHash();
1385 using namespace llvm::support;
1387 uint32_t ModuleFileID =
1388 endian::readNext<uint32_t, llvm::endianness::little>(d);
1389 return Reader.getLocalModuleFile(
F, ModuleFileID);
1392std::pair<unsigned, unsigned>
1399 using namespace llvm::support;
1408 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1415 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1439 using namespace llvm::support;
1441 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1443 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1449 const unsigned char *d,
1457 llvm::FoldingSetNodeID ID;
1458 ID.AddInteger(Key.first.getHash());
1459 ID.AddInteger(Key.second);
1460 return ID.computeStableHash();
1471 return {Name, *ModuleHash};
1477 unsigned PrimaryModuleHash =
1478 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1479 return {Name, PrimaryModuleHash};
1483 const unsigned char *d,
1491 using namespace llvm::support;
1493 uint32_t ModuleFileID =
1494 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1495 return Reader.getLocalModuleFile(F, ModuleFileID);
1500 using namespace llvm::support;
1501 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1504std::pair<unsigned, unsigned>
1510 const unsigned char *d,
1513 using namespace llvm::support;
1515 for (
unsigned NumDecls =
1517 NumDecls; --NumDecls) {
1520 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1521 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1525bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1526 BitstreamCursor &Cursor,
1529 assert(Offset != 0);
1532 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1533 Error(std::move(Err));
1541 Error(MaybeCode.takeError());
1544 unsigned Code = MaybeCode.get();
1547 if (!MaybeRecCode) {
1548 Error(MaybeRecCode.takeError());
1551 unsigned RecCode = MaybeRecCode.get();
1553 Error(
"Expected lexical block");
1558 "expected a TU_UPDATE_LEXICAL record for TU");
1563 auto &Lex = LexicalDecls[DC];
1565 Lex = std::make_pair(
1568 Blob.size() /
sizeof(
DeclID)));
1574bool ASTReader::ReadVisibleDeclContextStorage(
1575 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1576 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1577 assert(Offset != 0);
1579 SavedStreamPosition SavedPosition(Cursor);
1580 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1581 Error(std::move(Err));
1587 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1589 Error(MaybeCode.takeError());
1592 unsigned Code = MaybeCode.get();
1594 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1595 if (!MaybeRecCode) {
1596 Error(MaybeRecCode.takeError());
1599 unsigned RecCode = MaybeRecCode.get();
1600 switch (VisibleKind) {
1601 case VisibleDeclContextStorageKind::GenerallyVisible:
1603 Error(
"Expected visible lookup table block");
1607 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1609 Error(
"Expected module local visible lookup table block");
1613 case VisibleDeclContextStorageKind::TULocalVisible:
1615 Error(
"Expected TU local lookup table block");
1623 auto *
Data = (
const unsigned char*)Blob.data();
1624 switch (VisibleKind) {
1625 case VisibleDeclContextStorageKind::GenerallyVisible:
1626 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1628 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1629 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1631 case VisibleDeclContextStorageKind::TULocalVisible:
1633 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1639void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1643 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1644 SpecLookups[D].Table.add(&M,
Data,
1648bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1649 uint64_t Offset, Decl *D,
bool IsPartial) {
1650 assert(Offset != 0);
1652 SavedStreamPosition SavedPosition(Cursor);
1653 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1654 Error(std::move(Err));
1660 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1662 Error(MaybeCode.takeError());
1665 unsigned Code = MaybeCode.get();
1667 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1668 if (!MaybeRecCode) {
1669 Error(MaybeRecCode.takeError());
1672 unsigned RecCode = MaybeRecCode.get();
1675 Error(
"Expected decl specs block");
1679 auto *
Data = (
const unsigned char *)Blob.data();
1680 AddSpecializations(D,
Data, M, IsPartial);
1684void ASTReader::Error(StringRef Msg)
const {
1685 Error(diag::err_fe_ast_file_malformed, Msg);
1686 if (PP.getLangOpts().Modules &&
1687 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1688 Diag(diag::note_module_cache_path)
1689 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1693void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1694 StringRef Arg3)
const {
1695 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1699struct AlreadyReportedDiagnosticError
1700 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1703 void log(raw_ostream &OS)
const override {
1704 llvm_unreachable(
"reporting an already-reported diagnostic error");
1707 std::error_code convertToErrorCode()
const override {
1708 return llvm::inconvertibleErrorCode();
1712char AlreadyReportedDiagnosticError::ID = 0;
1715void ASTReader::Error(llvm::Error &&Err)
const {
1717 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1718 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1728 LineTableInfo &LineTable = SourceMgr.getLineTable();
1731 std::map<int, int> FileIDs;
1733 for (
unsigned I = 0;
Record[Idx]; ++I) {
1735 auto Filename = ReadPath(F,
Record, Idx);
1741 std::vector<LineEntry> Entries;
1742 while (Idx <
Record.size()) {
1743 FileID FID = ReadFileID(F,
Record, Idx);
1746 unsigned NumEntries =
Record[Idx++];
1747 assert(NumEntries &&
"no line entries for file ID");
1749 Entries.reserve(NumEntries);
1750 for (
unsigned I = 0; I != NumEntries; ++I) {
1751 unsigned FileOffset =
Record[Idx++];
1752 unsigned LineNo =
Record[Idx++];
1753 int FilenameID = FileIDs[
Record[Idx++]];
1756 unsigned IncludeOffset =
Record[Idx++];
1758 FileKind, IncludeOffset));
1765llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1766 using namespace SrcMgr;
1774 SLocEntryCursor = F.
Stream;
1777 if (llvm::Error Err = F.
Stream.SkipBlock())
1787 Expected<llvm::BitstreamEntry> MaybeE =
1788 SLocEntryCursor.advanceSkippingSubblocks();
1790 return MaybeE.takeError();
1791 llvm::BitstreamEntry E = MaybeE.get();
1794 case llvm::BitstreamEntry::SubBlock:
1795 case llvm::BitstreamEntry::Error:
1796 return llvm::createStringError(std::errc::illegal_byte_sequence,
1797 "malformed block record in AST file");
1798 case llvm::BitstreamEntry::EndBlock:
1799 return llvm::Error::success();
1800 case llvm::BitstreamEntry::Record:
1808 Expected<unsigned> MaybeRecord =
1809 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1811 return MaybeRecord.takeError();
1812 switch (MaybeRecord.get()) {
1820 return llvm::Error::success();
1825llvm::Expected<SourceLocation::UIntTy>
1831 return std::move(Err);
1835 return MaybeEntry.takeError();
1837 llvm::BitstreamEntry Entry = MaybeEntry.get();
1838 if (Entry.Kind != llvm::BitstreamEntry::Record)
1839 return llvm::createStringError(
1840 std::errc::illegal_byte_sequence,
1841 "incorrectly-formatted source location entry in AST file");
1847 return MaybeSLOC.takeError();
1849 switch (MaybeSLOC.get()) {
1851 return llvm::createStringError(
1852 std::errc::illegal_byte_sequence,
1853 "incorrectly-formatted source location entry in AST file");
1863 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1864 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1865 "Corrupted global sloc offset map");
1870 auto It = llvm::upper_bound(
1873 int ID = F->SLocEntryBaseID + LocalIndex;
1874 std::size_t Index = -ID - 2;
1875 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1876 assert(!SourceMgr.SLocEntryLoaded[Index]);
1877 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1878 if (!MaybeEntryOffset) {
1879 Error(MaybeEntryOffset.takeError());
1883 SourceMgr.LoadedSLocEntryTable[Index] =
1884 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1885 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1887 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1903 Error(
"source location entry ID out-of-range for AST file");
1909 auto ReadBuffer = [
this](
1910 BitstreamCursor &SLocEntryCursor,
1911 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1916 Error(MaybeCode.takeError());
1919 unsigned Code = MaybeCode.get();
1922 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1923 if (!MaybeRecCode) {
1924 Error(MaybeRecCode.takeError());
1927 unsigned RecCode = MaybeRecCode.get();
1932 const llvm::compression::Format F =
1933 Blob.size() > 0 && Blob.data()[0] == 0x78
1934 ? llvm::compression::Format::Zlib
1935 : llvm::compression::Format::Zstd;
1936 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1941 if (llvm::Error E = llvm::compression::decompress(
1942 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1943 Error(
"could not decompress embedded file contents: " +
1944 llvm::toString(std::move(E)));
1947 return llvm::MemoryBuffer::getMemBufferCopy(
1948 llvm::toStringRef(Decompressed), Name);
1950 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1952 Error(
"AST record has invalid code");
1957 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1961 Error(std::move(Err));
1968 ++NumSLocEntriesRead;
1971 Error(MaybeEntry.takeError());
1974 llvm::BitstreamEntry Entry = MaybeEntry.get();
1976 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1977 Error(
"incorrectly-formatted source location entry in AST file");
1984 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1986 Error(MaybeSLOC.takeError());
1989 switch (MaybeSLOC.get()) {
1991 Error(
"incorrectly-formatted source location entry in AST file");
1997 unsigned InputID =
Record[4];
1998 InputFile IF = getInputFile(*F, InputID);
2011 IncludeLoc = getImportLocation(F);
2015 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
2018 FileInfo.NumCreatedFIDs =
Record[5];
2022 unsigned NumFileDecls =
Record[7];
2023 if (NumFileDecls && ContextObj) {
2025 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
2031 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
2035 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
2038 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
2045 const char *Name = Blob.data();
2046 unsigned Offset =
Record[0];
2051 IncludeLoc = getImportLocation(F);
2054 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2057 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2058 BaseOffset + Offset, IncludeLoc);
2060 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2061 FileInfo.setHasLineDirectives();
2070 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2085 Error(
"source location entry ID out-of-range for AST file");
2090 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2108 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2109 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2119 uint64_t *StartOfBlockOffset) {
2120 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2123 if (StartOfBlockOffset)
2124 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2127 uint64_t Offset = Cursor.GetCurrentBitNo();
2130 return MaybeCode.takeError();
2131 unsigned Code = MaybeCode.get();
2134 if (Code != llvm::bitc::DEFINE_ABBREV) {
2135 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2137 return llvm::Error::success();
2139 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2152 if (
Tok.isAnnotation()) {
2154 switch (
Tok.getKind()) {
2155 case tok::annot_pragma_loop_hint: {
2159 unsigned NumTokens =
Record[Idx++];
2161 Toks.reserve(NumTokens);
2162 for (
unsigned I = 0; I < NumTokens; ++I)
2164 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2165 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2168 case tok::annot_pragma_pack: {
2173 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2175 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2179 case tok::annot_pragma_openmp:
2180 case tok::annot_pragma_openmp_end:
2181 case tok::annot_pragma_unused:
2182 case tok::annot_pragma_openacc:
2183 case tok::annot_pragma_openacc_end:
2184 case tok::annot_repl_input_end:
2187 llvm_unreachable(
"missing deserialization code for annotation token");
2192 Tok.setIdentifierInfo(II);
2204 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2206 consumeError(std::move(Err));
2218 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2220 Stream.advanceSkippingSubblocks(Flags);
2222 Error(MaybeEntry.takeError());
2225 llvm::BitstreamEntry Entry = MaybeEntry.get();
2227 switch (Entry.Kind) {
2228 case llvm::BitstreamEntry::SubBlock:
2229 case llvm::BitstreamEntry::Error:
2230 Error(
"malformed block record in AST file");
2232 case llvm::BitstreamEntry::EndBlock:
2234 case llvm::BitstreamEntry::Record:
2245 Error(MaybeRecType.takeError());
2261 unsigned NextIndex = 1;
2263 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2268 PP.getPreprocessorAllocator());
2271 bool isC99VarArgs =
Record[NextIndex++];
2272 bool isGNUVarArgs =
Record[NextIndex++];
2273 bool hasCommaPasting =
Record[NextIndex++];
2274 MacroParams.clear();
2275 unsigned NumArgs =
Record[NextIndex++];
2276 for (
unsigned i = 0; i != NumArgs; ++i)
2291 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2296 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2298 PreprocessingRecord::PPEntityID PPID =
2299 PPRec.getPPEntityID(Index,
true);
2301 PPRec.getPreprocessedEntity(PPID));
2303 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2314 if (MacroTokens.empty()) {
2315 Error(
"unexpected number of macro tokens for a macro in AST file");
2321 MacroTokens = MacroTokens.drop_front();
2332 ReadModuleOffsetMap(M);
2334 unsigned ModuleFileIndex = LocalID >> 32;
2335 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2338 assert(MF &&
"malformed identifier ID encoding?");
2340 if (!ModuleFileIndex) {
2349HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2352 return FileMgr.getOptionalFileRef(Key.Filename);
2356 return FileMgr.getOptionalFileRef(*Resolved);
2360 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2363 return llvm::xxh3_64bits(buf);
2384 return FEA && FEA == FEB;
2387std::pair<unsigned, unsigned>
2394 using namespace llvm::support;
2397 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2399 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2408 using namespace llvm::support;
2410 const unsigned char *End = d + DataLen;
2412 unsigned Flags = *d++;
2415 bool Included = (Flags >> 6) & 0x01;
2417 if ((FE = getFile(key)))
2420 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2423 HFI.
isImport |= (Flags >> 5) & 0x01;
2425 HFI.
DirInfo = (Flags >> 1) & 0x07;
2427 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2429 assert((End - d) % 4 == 0 &&
2430 "Wrong data length in HeaderFileInfo deserialization");
2432 uint32_t LocalSMID =
2433 endian::readNext<uint32_t, llvm::endianness::little>(d);
2439 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2440 Module *Mod = Reader.getSubmodule(GlobalSMID);
2442 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2444 if (FE || (FE = getFile(key))) {
2447 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2459 uint32_t MacroDirectivesOffset) {
2460 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2461 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2468 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2469 BitstreamCursor &MacroCursor = I.MacroCursor;
2472 if (MacroCursor.getBitcodeBytes().empty())
2475 BitstreamCursor Cursor = MacroCursor;
2476 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2477 Error(std::move(Err));
2485 Error(MaybeE.takeError());
2488 llvm::BitstreamEntry E = MaybeE.get();
2491 case llvm::BitstreamEntry::SubBlock:
2492 case llvm::BitstreamEntry::Error:
2493 Error(
"malformed block record in AST file");
2495 case llvm::BitstreamEntry::EndBlock:
2498 case llvm::BitstreamEntry::Record: {
2502 Error(MaybeRecord.takeError());
2505 switch (MaybeRecord.get()) {
2532 class IdentifierLookupVisitor {
2535 unsigned PriorGeneration;
2536 unsigned &NumIdentifierLookups;
2537 unsigned &NumIdentifierLookupHits;
2541 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2542 unsigned &NumIdentifierLookups,
2543 unsigned &NumIdentifierLookupHits)
2545 PriorGeneration(PriorGeneration),
2546 NumIdentifierLookups(NumIdentifierLookups),
2547 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2561 ++NumIdentifierLookups;
2562 ASTIdentifierLookupTable::iterator Pos =
2563 IdTable->find_hashed(Name, NameHash, &Trait);
2564 if (Pos == IdTable->end())
2570 ++NumIdentifierLookupHits;
2572 if (Trait.hasMoreInformationInDependencies()) {
2581 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2590 unsigned PriorGeneration = 0;
2592 PriorGeneration = IdentifierGeneration[&II];
2599 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2604 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2605 NumIdentifierLookups,
2606 NumIdentifierLookupHits);
2607 ModuleMgr.visit(Visitor, HitsPtr);
2624 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2625 uint64_t LocalIndex =
Record[Idx++];
2630 const PendingMacroInfo &PMInfo) {
2635 if (llvm::Error Err =
2637 Error(std::move(Err));
2641 struct ModuleMacroRecord {
2654 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2656 Error(MaybeEntry.takeError());
2659 llvm::BitstreamEntry Entry = MaybeEntry.get();
2661 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2662 Error(
"malformed block record in AST file");
2669 Error(MaybePP.takeError());
2677 ModuleMacros.push_back(ModuleMacroRecord());
2678 auto &Info = ModuleMacros.back();
2682 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2688 Error(
"malformed block record in AST file");
2699 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2701 for (
auto &MMR : ModuleMacros) {
2703 for (
unsigned ModID : MMR.Overrides) {
2705 auto *
Macro = PP.getModuleMacro(Mod, II);
2706 assert(
Macro &&
"missing definition for overridden macro");
2707 Overrides.push_back(
Macro);
2710 bool Inserted =
false;
2712 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2723 unsigned Idx = 0, N =
Record.size();
2731 MD = PP.AllocateDefMacroDirective(MI, Loc);
2735 MD = PP.AllocateUndefMacroDirective(Loc);
2738 bool isPublic =
Record[Idx++];
2739 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2751 PP.setLoadedMacroDirective(II, Earliest, Latest);
2754bool ASTReader::shouldDisableValidationForFile(
2777static std::pair<StringRef, StringRef>
2779 const StringRef InputBlob) {
2781 return {InputBlob.substr(0, AsRequestedLength),
2782 InputBlob.substr(AsRequestedLength)};
2796 SavedStreamPosition SavedPosition(Cursor);
2800 consumeError(std::move(Err));
2803 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2806 consumeError(MaybeCode.takeError());
2808 unsigned Code = MaybeCode.get();
2812 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2814 "invalid record type for input file");
2817 consumeError(
Maybe.takeError());
2820 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2822 R.StoredSize =
static_cast<off_t
>(
Record[1]);
2823 R.StoredTime =
static_cast<time_t
>(
Record[2]);
2824 R.Overridden =
static_cast<bool>(
Record[3]);
2825 R.Transient =
static_cast<bool>(
Record[4]);
2826 R.TopLevel =
static_cast<bool>(
Record[5]);
2827 R.ModuleMap =
static_cast<bool>(
Record[6]);
2828 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2830 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2831 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2832 ? UnresolvedFilenameAsRequested
2833 : UnresolvedFilename;
2835 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2837 consumeError(MaybeEntry.takeError());
2838 llvm::BitstreamEntry Entry = MaybeEntry.get();
2839 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2840 "expected record type for input file hash");
2843 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2845 "invalid record type for input file hash");
2848 consumeError(
Maybe.takeError());
2873 SavedStreamPosition SavedPosition(Cursor);
2877 consumeError(std::move(Err));
2892 const HeaderSearchOptions &HSOpts =
2893 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2906 if ((Overridden || Transient || SkipChecks) && !
File)
2911 std::string ErrorStr =
"could not find file '";
2912 ErrorStr += *Filename;
2913 ErrorStr +=
"' referenced by AST file '";
2927 SourceManager &SM = getSourceManager();
2929 if ((!Overridden && !Transient) && !SkipChecks &&
2932 Error(diag::err_fe_pch_file_overridden, *Filename);
2943 auto HasInputContentChanged = [&](
Change OriginalChange) {
2944 assert(ValidateASTInputFilesContent &&
2945 "We should only check the content of the inputs with "
2946 "ValidateASTInputFilesContent enabled.");
2948 if (StoredContentHash == 0)
2949 return OriginalChange;
2952 if (!MemBuffOrError) {
2954 return OriginalChange;
2955 std::string ErrorStr =
"could not get buffer for file '";
2956 ErrorStr +=
File->getName();
2959 return OriginalChange;
2962 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2963 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2968 auto HasInputFileChanged = [&]() {
2969 if (StoredSize !=
File->getSize())
2971 if (!shouldDisableValidationForFile(F) && StoredTime &&
2972 StoredTime !=
File->getModificationTime()) {
2974 File->getModificationTime()};
2978 if (ValidateASTInputFilesContent)
2979 return HasInputContentChanged(MTimeChange);
2986 bool IsOutOfDate =
false;
2993 FileChange = HasInputContentChanged(FileChange);
2999 if (!StoredTime && ValidateASTInputFilesContent &&
3001 FileChange = HasInputContentChanged(FileChange);
3007 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
3008 while (!ImportStack.back()->ImportedBy.empty())
3009 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
3012 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
3013 Diag(diag::err_fe_ast_file_modified)
3015 << TopLevelASTFileName;
3016 Diag(diag::note_fe_ast_file_modified)
3017 << FileChange.Kind << (FileChange.Old && FileChange.New)
3018 << llvm::itostr(FileChange.Old.value_or(0))
3019 << llvm::itostr(FileChange.New.value_or(0));
3020 if (getModuleManager()
3022 .getInMemoryModuleCache()
3027 if (ImportStack.size() > 1) {
3028 Diag(diag::note_ast_file_required_by)
3029 << *Filename << ImportStack[0]->FileName;
3030 for (
unsigned I = 1; I < ImportStack.size(); ++I)
3031 Diag(diag::note_ast_file_required_by)
3032 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3036 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3037 Diag(diag::note_ast_file_input_files_validation_status)
3053ASTReader::TemporarilyOwnedStringRef
3059ASTReader::TemporarilyOwnedStringRef
3062 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3064 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3065 Path ==
"<built-in>" || Path ==
"<command line>")
3069 llvm::sys::path::append(Buf, Prefix, Path);
3070 StringRef ResolvedPath{Buf.data(), Buf.size()};
3071 return {ResolvedPath, Buf};
3084 return ResolvedPath->str();
3099 llvm_unreachable(
"unknown ASTReadResult");
3103 BitstreamCursor &Stream, StringRef Filename,
3104 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3105 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3108 consumeError(std::move(Err));
3116 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3119 consumeError(MaybeEntry.takeError());
3122 llvm::BitstreamEntry Entry = MaybeEntry.get();
3124 switch (Entry.Kind) {
3125 case llvm::BitstreamEntry::Error:
3126 case llvm::BitstreamEntry::SubBlock:
3129 case llvm::BitstreamEntry::EndBlock:
3132 case llvm::BitstreamEntry::Record:
3139 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3140 if (!MaybeRecordType) {
3142 consumeError(MaybeRecordType.takeError());
3147 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3148 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3149 AllowCompatibleConfigurationMismatch))
3150 Result = ConfigurationMismatch;
3155 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3156 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3157 AllowCompatibleConfigurationMismatch))
3158 Result = ConfigurationMismatch;
3163 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3164 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3165 AllowCompatibleConfigurationMismatch))
3166 Result = ConfigurationMismatch;
3171 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3172 if (!AllowCompatibleConfigurationMismatch &&
3173 ParseFileSystemOptions(
Record, Complain, Listener))
3174 Result = ConfigurationMismatch;
3179 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3180 if (!AllowCompatibleConfigurationMismatch &&
3181 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3182 Result = ConfigurationMismatch;
3187 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3188 if (!AllowCompatibleConfigurationMismatch &&
3189 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3190 SuggestedPredefines))
3191 Result = ConfigurationMismatch;
3198static std::pair<bool, bool>
3201 const bool EnablesBSValidation =
3203 const bool WasValidated =
3204 EnablesBSValidation &&
3206 return {EnablesBSValidation, WasValidated};
3209ASTReader::RelocationResult
3210ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3212 const bool IgnoreError =
3213 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3216 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3217 return {std::nullopt, IgnoreError};
3221 if (!DirectoryCheck &&
3222 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3223 return {std::nullopt, IgnoreError};
3225 const HeaderSearchOptions &HSOpts =
3226 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3231 auto [EnablesBSValidation, WasValidated] =
3233 const bool SkipModuleLookup =
3234 !PP.getPreprocessorOpts().ModulesForceRedundantLookup &&
3236 (EnablesBSValidation &&
3239 if (SkipModuleLookup)
3240 return {std::nullopt, IgnoreError};
3247 Module *M = PP.getHeaderSearchInfo().lookupModule(
3252 return {M, IgnoreError};
3257 SmallVectorImpl<ImportedModule> &Loaded,
3259 unsigned ClientLoadCapabilities) {
3260 BitstreamCursor &Stream = F.
Stream;
3263 Error(std::move(Err));
3273 bool HasReadUnhashedControlBlock =
false;
3274 auto readUnhashedControlBlockOnce = [&]() {
3275 if (!HasReadUnhashedControlBlock) {
3276 HasReadUnhashedControlBlock =
true;
3277 if (ASTReadResult
Result =
3278 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3284 bool DisableValidation = shouldDisableValidationForFile(F);
3288 unsigned NumInputs = 0;
3289 unsigned NumUserInputs = 0;
3290 StringRef BaseDirectoryAsWritten;
3292 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3294 Error(MaybeEntry.takeError());
3297 llvm::BitstreamEntry Entry = MaybeEntry.get();
3299 switch (Entry.Kind) {
3300 case llvm::BitstreamEntry::Error:
3301 Error(
"malformed block record in AST file");
3303 case llvm::BitstreamEntry::EndBlock: {
3306 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3310 const HeaderSearchOptions &HSOpts =
3311 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3319 !canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities);
3325 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3331 N = ForceValidateUserInputs ? NumUserInputs : 0;
3333 ForceValidateUserInputs
3339 Diag(diag::remark_module_validation)
3342 for (
unsigned I = 0; I < N; ++I) {
3343 InputFile IF = getInputFile(F, I+1, Complain);
3357 for (
unsigned I = 0; I < N; ++I) {
3358 bool IsSystem = I >= NumUserInputs;
3360 auto FilenameAsRequested = ResolveImportedPath(
3363 *FilenameAsRequested, IsSystem, FI.
Overridden,
3371 case llvm::BitstreamEntry::SubBlock:
3375 if (llvm::Error Err = Stream.SkipBlock()) {
3376 Error(std::move(Err));
3380 Error(
"malformed block record in AST file");
3390 if (Listener && !ImportedBy) {
3396 bool AllowCompatibleConfigurationMismatch =
3400 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3401 AllowCompatibleConfigurationMismatch, *Listener,
3402 SuggestedPredefines);
3404 Error(
"malformed block record in AST file");
3408 if (DisableValidation ||
3409 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3417 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3418 Error(std::move(Err));
3424 if (llvm::Error Err = Stream.SkipBlock()) {
3425 Error(std::move(Err));
3431 case llvm::BitstreamEntry::Record:
3439 Expected<unsigned> MaybeRecordType =
3440 Stream.readRecord(Entry.ID,
Record, &Blob);
3441 if (!MaybeRecordType) {
3442 Error(MaybeRecordType.takeError());
3448 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3450 : diag::err_ast_file_version_too_new)
3455 bool hasErrors =
Record[7];
3456 if (hasErrors && !DisableValidation) {
3459 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3460 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3463 if (!AllowASTWithCompilerErrors) {
3464 Diag(diag::err_ast_file_with_compiler_errors)
3470 Diags.ErrorOccurred =
true;
3471 Diags.UncompilableErrorOccurred =
true;
3472 Diags.UnrecoverableErrorOccurred =
true;
3485 StringRef ASTBranch = Blob;
3486 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3487 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3488 Diag(diag::err_ast_file_different_branch)
3500 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3510 auto [ImportLoc, ImportModuleFileIndex] =
3511 ReadUntranslatedSourceLocation(
Record[Idx++]);
3513 assert(ImportModuleFileIndex == 0);
3515 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3517 bool IsImportingStdCXXModule =
Record[Idx++];
3519 off_t StoredSize = 0;
3520 time_t StoredModTime = 0;
3521 unsigned FileNameKind = 0;
3522 ASTFileSignature StoredSignature;
3523 ModuleFileName ImportedFile;
3524 std::string StoredFile;
3525 bool IgnoreImportedByNote =
false;
3534 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3535 ImportedName, !IsImportingStdCXXModule);
3537 if (IsImportingStdCXXModule && ImportedFile.
empty()) {
3538 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3542 if (!IsImportingStdCXXModule) {
3543 StoredSize = (off_t)
Record[Idx++];
3544 StoredModTime = (time_t)
Record[Idx++];
3545 FileNameKind = (unsigned)
Record[Idx++];
3549 SignatureBytes.end());
3552 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3553 if (ImportedFile.
empty()) {
3555 }
else if (!getDiags().isIgnored(
3556 diag::warn_module_file_mapping_mismatch,
3557 CurrentImportLoc)) {
3558 auto ImportedFileRef =
3559 PP.getFileManager().getOptionalFileRef(ImportedFile);
3560 auto StoredFileRef =
3561 PP.getFileManager().getOptionalFileRef(StoredFile);
3562 if ((ImportedFileRef && StoredFileRef) &&
3563 (*ImportedFileRef != *StoredFileRef)) {
3564 Diag(diag::warn_module_file_mapping_mismatch)
3565 << ImportedFile << StoredFile;
3566 Diag(diag::note_module_file_imported_by)
3568 IgnoreImportedByNote =
true;
3575 unsigned Capabilities = ClientLoadCapabilities;
3576 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3577 Capabilities &= ~ARR_Missing;
3580 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3581 Loaded, StoredSize, StoredModTime,
3582 StoredSignature, Capabilities);
3587 if (IsImportingStdCXXModule) {
3588 if (
const auto *Imported =
3589 getModuleManager().lookupByFileName(ImportedFile);
3590 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3591 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3597 bool recompilingFinalized =
Result == OutOfDate &&
3598 (Capabilities & ARR_OutOfDate) &&
3601 .getInMemoryModuleCache()
3603 if (!IgnoreImportedByNote &&
3605 Diag(diag::note_module_file_imported_by)
3612 case OutOfDate:
return OutOfDate;
3614 case ConfigurationMismatch:
return ConfigurationMismatch;
3615 case HadErrors:
return HadErrors;
3634 Diag(diag::remark_module_import)
3636 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3642 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3650 BaseDirectoryAsWritten = Blob;
3652 "MODULE_DIRECTORY found before MODULE_NAME");
3655 auto [MaybeM, IgnoreError] =
3656 getModuleForRelocationChecks(F,
true);
3657 if (!MaybeM.has_value())
3660 Module *M = MaybeM.value();
3672 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3673 if (BuildDir && (*BuildDir == M->
Directory)) {
3677 Diag(diag::remark_module_relocated)
3680 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3681 Diag(diag::err_imported_module_relocated)
3687 if (ASTReadResult
Result =
3688 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3694 NumUserInputs =
Record[1];
3696 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3705llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3706 unsigned ClientLoadCapabilities) {
3707 BitstreamCursor &Stream = F.
Stream;
3709 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3716 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3718 return MaybeEntry.takeError();
3719 llvm::BitstreamEntry Entry = MaybeEntry.get();
3721 switch (Entry.Kind) {
3722 case llvm::BitstreamEntry::Error:
3723 return llvm::createStringError(
3724 std::errc::illegal_byte_sequence,
3725 "error at end of module block in AST file");
3726 case llvm::BitstreamEntry::EndBlock:
3732 if (ASTContext *Ctx = ContextObj) {
3733 DeclContext *DC = Ctx->getTranslationUnitDecl();
3738 return llvm::Error::success();
3739 case llvm::BitstreamEntry::SubBlock:
3747 if (llvm::Error Err = Stream.SkipBlock())
3749 if (llvm::Error Err = ReadBlockAbbrevs(
3756 if (!PP.getExternalSource())
3757 PP.setExternalSource(
this);
3759 if (llvm::Error Err = Stream.SkipBlock())
3761 if (llvm::Error Err =
3770 if (llvm::Error Err = Stream.SkipBlock()) {
3779 if (!PP.getPreprocessingRecord())
3780 PP.createPreprocessingRecord();
3781 if (!PP.getPreprocessingRecord()->getExternalSource())
3782 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3786 if (llvm::Error Err = ReadSourceManagerBlock(F))
3792 if (llvm::Error Err = Stream.SkipBlock())
3794 if (llvm::Error Err =
3801 BitstreamCursor
C = Stream;
3803 if (llvm::Error Err = Stream.SkipBlock())
3807 CommentsCursors.push_back(std::make_pair(
C, &F));
3812 if (llvm::Error Err = Stream.SkipBlock())
3818 case llvm::BitstreamEntry::Record:
3826 Expected<unsigned> MaybeRecordType =
3827 Stream.readRecord(Entry.ID,
Record, &Blob);
3828 if (!MaybeRecordType)
3829 return MaybeRecordType.takeError();
3834 switch (RecordType) {
3856 switch (RecordType) {
3866 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3870 GlobalSubmoduleMap.insert(
3871 std::make_pair(getTotalNumSubmodules() + 1, &F));
3882 auto ReadSubmodule = [&](
unsigned LocalID) ->
Module * {
3883 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3886 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.
ModuleName)) {
3892 ReadSubmodule(LocalID);
3906 return llvm::createStringError(
3907 std::errc::illegal_byte_sequence,
3908 "duplicate TYPE_OFFSET record in AST file");
3921 return llvm::createStringError(
3922 std::errc::illegal_byte_sequence,
3923 "duplicate DECL_OFFSET record in AST file");
3935 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3936 LexicalContents Contents(
3938 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3939 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3946 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3947 auto *
Data = (
const unsigned char*)Blob.data();
3948 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3951 if (Decl *D = GetExistingDecl(ID))
3952 PendingUpdateRecords.push_back(
3953 PendingUpdateRecord(ID, D,
false));
3959 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3960 auto *
Data = (
const unsigned char *)Blob.data();
3961 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3964 if (Decl *D = GetExistingDecl(ID))
3965 PendingUpdateRecords.push_back(
3966 PendingUpdateRecord(ID, D,
false));
3974 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3975 auto *
Data = (
const unsigned char *)Blob.data();
3976 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3979 if (Decl *D = GetExistingDecl(ID))
3980 PendingUpdateRecords.push_back(
3981 PendingUpdateRecord(ID, D,
false));
3987 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3988 auto *
Data = (
const unsigned char *)Blob.data();
3989 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3992 if (Decl *D = GetExistingDecl(ID))
3993 PendingUpdateRecords.push_back(
3994 PendingUpdateRecord(ID, D,
false));
4000 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
4001 auto *
Data = (
const unsigned char *)Blob.data();
4002 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
4005 if (Decl *D = GetExistingDecl(ID))
4006 PendingUpdateRecords.push_back(
4007 PendingUpdateRecord(ID, D,
false));
4013 reinterpret_cast<const unsigned char *
>(Blob.data());
4019 ASTIdentifierLookupTrait(*
this, F));
4021 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
4027 return llvm::createStringError(
4028 std::errc::illegal_byte_sequence,
4029 "duplicate IDENTIFIER_OFFSET record in AST file");
4035 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4047 for (
unsigned I = 0, N =
Record.size(); I != N; )
4048 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4055 getContext().getLangOpts().BuildingPCHWithObjectFile)
4056 for (
unsigned I = 0, N =
Record.size(); I != N; )
4057 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4061 if (SpecialTypes.empty()) {
4062 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
4063 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
4070 if (SpecialTypes.size() !=
Record.size())
4071 return llvm::createStringError(std::errc::illegal_byte_sequence,
4072 "invalid special-types record");
4074 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4076 if (!SpecialTypes[I])
4077 SpecialTypes[I] =
ID;
4084 TotalNumStatements +=
Record[0];
4085 TotalNumMacros +=
Record[1];
4086 TotalLexicalDeclContexts +=
Record[2];
4087 TotalVisibleDeclContexts +=
Record[3];
4088 TotalModuleLocalVisibleDeclContexts +=
Record[4];
4089 TotalTULocalVisibleDeclContexts +=
Record[5];
4093 for (
unsigned I = 0, N =
Record.size(); I != N; )
4094 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4098 for (
unsigned I = 0, N =
Record.size(); I != N; )
4099 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4103 if (
Record.size() % 3 != 0)
4104 return llvm::createStringError(std::errc::illegal_byte_sequence,
4105 "invalid weak identifiers record");
4109 WeakUndeclaredIdentifiers.clear();
4112 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4113 WeakUndeclaredIdentifiers.push_back(
4114 getGlobalIdentifierID(F,
Record[I++]));
4115 WeakUndeclaredIdentifiers.push_back(
4116 getGlobalIdentifierID(F,
Record[I++]));
4117 WeakUndeclaredIdentifiers.push_back(
4118 ReadSourceLocation(F,
Record, I).getRawEncoding());
4123 if (
Record.size() % 3 != 0)
4124 return llvm::createStringError(std::errc::illegal_byte_sequence,
4125 "invalid extname identifiers record");
4129 ExtnameUndeclaredIdentifiers.clear();
4133 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4134 ExtnameUndeclaredIdentifiers.push_back(
4135 getGlobalIdentifierID(F,
Record[I++]));
4136 ExtnameUndeclaredIdentifiers.push_back(
4137 getGlobalIdentifierID(F,
Record[I++]));
4138 ExtnameUndeclaredIdentifiers.push_back(
4139 ReadSourceLocation(F,
Record, I).getRawEncoding());
4146 unsigned LocalBaseSelectorID =
Record[1];
4152 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4157 std::make_pair(LocalBaseSelectorID,
4169 = ASTSelectorLookupTable::Create(
4172 ASTSelectorLookupTrait(*
this, F));
4173 TotalNumMethodPoolEntries +=
Record[1];
4178 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4179 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4181 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4190 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4191 ReadSourceLocation(F,
Record, Idx));
4197 SmallVector<SourceLocation, 64> SrcLocs;
4199 while (Idx <
Record.size())
4200 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4201 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4208 unsigned Idx = 0, End =
Record.size() - 1;
4209 bool ReachedEOFWhileSkipping =
Record[Idx++];
4210 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4211 if (ReachedEOFWhileSkipping) {
4212 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4213 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4214 bool FoundNonSkipPortion =
Record[Idx++];
4215 bool FoundElse =
Record[Idx++];
4216 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4217 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4218 FoundElse, ElseLoc);
4220 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4222 auto Loc = ReadSourceLocation(F,
Record, Idx);
4223 bool WasSkipping =
Record[Idx++];
4224 bool FoundNonSkip =
Record[Idx++];
4225 bool FoundElse =
Record[Idx++];
4226 ConditionalStack.push_back(
4227 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4229 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4234 if (!
Record.empty() && Listener)
4252 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4253 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4254 return llvm::createStringError(std::errc::invalid_argument,
4255 "ran out of source locations");
4260 unsigned RangeStart =
4262 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4267 GlobalSLocOffsetMap.insert(
4269 - SLocSpaceSize,&F));
4280 ParseLineTable(F,
Record);
4284 for (
unsigned I = 0, N =
Record.size(); I != N; )
4285 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4289 if (
Record.size() % 3 != 0)
4290 return llvm::createStringError(std::errc::illegal_byte_sequence,
4291 "Invalid VTABLE_USES record");
4298 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4299 VTableUses.push_back(
4300 {ReadDeclID(F,
Record, Idx),
4301 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4308 if (
Record.size() % 2 != 0)
4309 return llvm::createStringError(
4310 std::errc::illegal_byte_sequence,
4311 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4316 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4317 PendingInstantiations.push_back(
4318 {ReadDeclID(F,
Record, I),
4319 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4326 return llvm::createStringError(std::errc::illegal_byte_sequence,
4327 "Invalid SEMA_DECL_REFS block");
4328 for (
unsigned I = 0, N =
Record.size(); I != N; )
4329 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4337 unsigned StartingID;
4338 if (!PP.getPreprocessingRecord())
4339 PP.createPreprocessingRecord();
4340 if (!PP.getPreprocessingRecord()->getExternalSource())
4341 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4343 = PP.getPreprocessingRecord()
4350 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4361 if (!PP.getPreprocessingRecord())
4362 PP.createPreprocessingRecord();
4363 if (!PP.getPreprocessingRecord()->getExternalSource())
4364 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4369 GlobalSkippedRangeMap.insert(
4375 if (
Record.size() % 2 != 0)
4376 return llvm::createStringError(
4377 std::errc::illegal_byte_sequence,
4378 "invalid DECL_UPDATE_OFFSETS block in AST file");
4379 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4380 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4381 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4385 if (Decl *D = GetExistingDecl(ID))
4386 PendingUpdateRecords.push_back(
4387 PendingUpdateRecord(ID, D,
false));
4392 if (
Record.size() % 5 != 0)
4393 return llvm::createStringError(
4394 std::errc::illegal_byte_sequence,
4395 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4397 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4398 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4401 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4404 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4407 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4410 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4413 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4415 DelayedNamespaceOffsetMap[
ID] = {
4416 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4418 assert(!GetExistingDecl(ID) &&
4419 "We shouldn't load the namespace in the front of delayed "
4420 "namespace lexical and visible block");
4426 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4427 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4428 auto &RelatedDecls = RelatedDeclsMap[
ID];
4429 unsigned NN =
Record[I++];
4430 RelatedDecls.reserve(NN);
4431 for (
unsigned II = 0; II < NN; II++)
4432 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4438 return llvm::createStringError(
4439 std::errc::illegal_byte_sequence,
4440 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4453 CUDASpecialDeclRefs.clear();
4454 for (
unsigned I = 0, N =
Record.size(); I != N; )
4455 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4465 HeaderFileInfoTrait(*
this, F));
4467 PP.getHeaderSearchInfo().SetExternalSource(
this);
4468 if (!PP.getHeaderSearchInfo().getExternalLookup())
4469 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4475 FPPragmaOptions.swap(
Record);
4479 for (
unsigned I = 0, N =
Record.size(); I != N; )
4480 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4484 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4485 auto Name = ReadString(
Record, I);
4486 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4487 OptInfo.Supported =
Record[I++] != 0;
4488 OptInfo.Enabled =
Record[I++] != 0;
4489 OptInfo.WithPragma =
Record[I++] != 0;
4490 OptInfo.Avail =
Record[I++];
4491 OptInfo.Core =
Record[I++];
4492 OptInfo.Opt =
Record[I++];
4497 for (
unsigned I = 0, N =
Record.size(); I != N; )
4498 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4502 for (
unsigned I = 0, N =
Record.size(); I != N; )
4503 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4507 if (
Record.size() % 2 != 0)
4508 return llvm::createStringError(std::errc::illegal_byte_sequence,
4509 "invalid undefined-but-used record");
4510 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4511 UndefinedButUsed.push_back(
4512 {ReadDeclID(F,
Record, I),
4513 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4518 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4519 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4521 DelayedDeleteExprs.push_back(Count);
4522 for (uint64_t
C = 0;
C < Count; ++
C) {
4523 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4524 bool IsArrayForm =
Record[I++] == 1;
4525 DelayedDeleteExprs.push_back(IsArrayForm);
4532 getContext().getLangOpts().BuildingPCHWithObjectFile)
4533 for (
unsigned I = 0, N =
Record.size(); I != N;)
4534 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4542 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4543 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4544 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4546 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4547 if (DeserializationListener)
4548 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4556 return llvm::createStringError(
4557 std::errc::illegal_byte_sequence,
4558 "duplicate MACRO_OFFSET record in AST file");
4570 LateParsedTemplates.emplace_back(
4571 std::piecewise_construct, std::forward_as_tuple(&F),
4577 return llvm::createStringError(std::errc::illegal_byte_sequence,
4578 "invalid pragma optimize record");
4579 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4584 return llvm::createStringError(std::errc::illegal_byte_sequence,
4585 "invalid pragma ms_struct record");
4586 PragmaMSStructState =
Record[0];
4591 return llvm::createStringError(
4592 std::errc::illegal_byte_sequence,
4593 "invalid pragma pointers to members record");
4594 PragmaMSPointersToMembersState =
Record[0];
4595 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4599 for (
unsigned I = 0, N =
Record.size(); I != N; )
4600 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4605 return llvm::createStringError(std::errc::illegal_byte_sequence,
4606 "invalid cuda pragma options record");
4607 ForceHostDeviceDepth =
Record[0];
4612 return llvm::createStringError(std::errc::illegal_byte_sequence,
4613 "invalid pragma pack record");
4614 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4615 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4616 unsigned NumStackEntries =
Record[2];
4619 PragmaAlignPackStack.clear();
4620 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4621 PragmaAlignPackStackEntry Entry;
4622 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4623 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4624 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4625 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4626 Entry.SlotLabel = PragmaAlignPackStrings.back();
4627 PragmaAlignPackStack.push_back(Entry);
4634 return llvm::createStringError(std::errc::illegal_byte_sequence,
4635 "invalid pragma float control record");
4637 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4638 unsigned NumStackEntries =
Record[2];
4641 FpPragmaStack.clear();
4642 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4643 FpPragmaStackEntry Entry;
4645 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4646 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4647 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4648 Entry.SlotLabel = FpPragmaStrings.back();
4649 FpPragmaStack.push_back(Entry);
4655 for (
unsigned I = 0, N =
Record.size(); I != N; )
4656 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4660 unsigned NumRecords =
Record.front();
4662 if (
Record.size() - 1 != NumRecords)
4663 return llvm::createStringError(std::errc::illegal_byte_sequence,
4664 "invalid rvv intrinsic pragma record");
4666 if (RISCVVecIntrinsicPragma.empty())
4667 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4670 for (
unsigned i = 0; i < NumRecords; ++i)
4671 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4678void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4691 assert(ImportedModuleVector.empty());
4693 while (
Data < DataEnd) {
4697 using namespace llvm::support;
4699 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4700 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4701 StringRef Name = StringRef((
const char*)
Data, Len);
4706 ? ModuleMgr.lookupByModuleName(Name)
4711 std::string Msg =
"refers to unknown module, cannot find ";
4712 Msg.append(std::string(Name));
4717 ImportedModuleVector.push_back(OM);
4720 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4722 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4725 RemapBuilder &Remap) {
4726 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4728 Remap.insert(std::make_pair(Offset,
4729 static_cast<int>(BaseOffset - Offset)));
4740 unsigned ClientLoadCapabilities) {
4749 "MODULE_NAME should come before MODULE_MAP_FILE");
4750 auto [MaybeM, IgnoreError] =
4751 getModuleForRelocationChecks(F,
false);
4752 if (MaybeM.has_value()) {
4755 Module *M = MaybeM.value();
4756 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4758 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4759 if (!IgnoreError && !ModMap) {
4761 Diag(diag::remark_module_relocated)
4764 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4767 Diag(diag::err_module_file_conflict)
4772 Diag(diag::err_imported_module_not_found)
4779 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4780 Diag(diag::note_imported_by_pch_module_not_found)
4787 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4791 if (!StoredModMap || *StoredModMap != ModMap) {
4792 assert(ModMap &&
"found module is missing module map file");
4794 "top-level import should be verified");
4796 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4797 Diag(diag::err_imported_module_modmap_changed)
4804 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4806 std::string Filename = ReadPath(F,
Record, Idx);
4809 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4810 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4813 AdditionalStoredMaps.insert(*SF);
4818 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4819 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4822 if (!AdditionalStoredMaps.erase(ModMap)) {
4823 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4824 Diag(diag::err_module_different_modmap)
4833 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4834 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4835 Diag(diag::err_module_different_modmap)
4849 SemaObjC::GlobalMethodPool::iterator Known =
4855 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4856 : Known->second.second;
4860 if (List->getMethod() == Method) {
4868 if (List->getNext())
4869 List->setMethod(List->getNext()->getMethod());
4871 List->setMethod(Method);
4877 for (
Decl *D : Names) {
4881 if (wasHidden && SemaObj) {
4894 Stack.push_back(Mod);
4895 while (!Stack.empty()) {
4896 Mod = Stack.pop_back_val();
4898 if (NameVisibility <= Mod->NameVisibility) {
4914 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4915 if (Hidden != HiddenNamesMap.end()) {
4916 auto HiddenNames = std::move(*Hidden);
4917 HiddenNamesMap.erase(Hidden);
4919 assert(!HiddenNamesMap.contains(Mod) &&
4920 "making names visible added hidden names");
4927 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4929 if (Visited.insert(Exported).second)
4930 Stack.push_back(Exported);
4948 PendingMergedDefinitionsToDeduplicate.insert(Def);
4957 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4958 !PP.getLangOpts().Modules)
4962 TriedLoadingGlobalIndex =
true;
4963 StringRef SpecificModuleCachePath =
4965 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4967 if (llvm::Error Err = std::move(
Result.second)) {
4969 consumeError(std::move(Err));
4973 GlobalIndex.reset(
Result.first);
4974 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4979 return PP.getLangOpts().Modules && UseGlobalIndex &&
4991 consumeError(MaybeEntry.takeError());
4994 llvm::BitstreamEntry Entry = MaybeEntry.get();
4996 switch (Entry.Kind) {
4997 case llvm::BitstreamEntry::Error:
4998 case llvm::BitstreamEntry::EndBlock:
5001 case llvm::BitstreamEntry::Record:
5007 consumeError(Skipped.takeError());
5011 case llvm::BitstreamEntry::SubBlock:
5012 if (Entry.ID == BlockID) {
5013 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
5015 consumeError(std::move(Err));
5022 if (llvm::Error Err = Cursor.SkipBlock()) {
5024 consumeError(std::move(Err));
5034 unsigned ClientLoadCapabilities,
5036 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
5040 CurrentDeserializingModuleKind,
Type);
5046 unsigned PreviousGeneration = 0;
5050 unsigned NumModules = ModuleMgr.size();
5055 ClientLoadCapabilities)) {
5056 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5060 GlobalIndex.reset();
5061 ModuleMgr.setGlobalIndex(
nullptr);
5065 if (NewLoadedModuleFile && !Loaded.empty())
5066 *NewLoadedModuleFile = Loaded.back().Mod;
5079 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
5082 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5083 Error(std::move(Err));
5089 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
5095 if (llvm::Error Err = ReadExtensionBlock(F)) {
5096 Error(std::move(Err));
5125 if (!PP.getLangOpts().CPlusPlus) {
5132 auto It = PP.getIdentifierTable().find(Key);
5133 if (It == PP.getIdentifierTable().end())
5142 II = &PP.getIdentifierTable().getOwn(Key);
5160 for (
auto &Id : PP.getIdentifierTable())
5161 Id.second->setOutOfDate(
true);
5164 for (
const auto &Sel : SelectorGeneration)
5165 SelectorOutOfDate[Sel.first] =
true;
5172 ModuleMgr.moduleFileAccepted(&F);
5194 if (DeserializationListener)
5195 DeserializationListener->ReaderInitialized(
this);
5197 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5212 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5213 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5214 ObjCClassesLoaded[I], PreviousGeneration);
5219 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5224 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5243 if (!Stream.canSkipToPos(4))
5244 return llvm::createStringError(
5245 std::errc::illegal_byte_sequence,
5246 "file too small to contain precompiled file magic");
5247 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5250 return llvm::createStringError(
5251 std::errc::illegal_byte_sequence,
5252 "file doesn't start with precompiled file magic");
5254 return Res.takeError();
5255 return llvm::Error::success();
5270 llvm_unreachable(
"unknown module kind");
5276 off_t ExpectedSize, time_t ExpectedModTime,
5278 auto Result = ModuleMgr.addModule(
5283 switch (
Result.getKind()) {
5285 Diag(diag::remark_module_import)
5287 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5302 Diag(diag::err_ast_file_not_found)
5304 if (!
Result.getBufferError().empty())
5305 Diag(diag::note_ast_file_buffer_failed) <<
Result.getBufferError();
5315 Diag(diag::err_ast_file_out_of_date)
5317 for (
const auto &
C :
Result.getChanges()) {
5318 Diag(diag::note_fe_ast_file_modified)
5319 <<
C.Kind << (
C.Old &&
C.New) << llvm::itostr(
C.Old.value_or(0))
5320 << llvm::itostr(
C.New.value_or(0));
5322 Diag(diag::note_ast_file_input_files_validation_status)
5323 <<
Result.getValidationStatus();
5324 if (!
Result.getSignatureError().empty())
5325 Diag(diag::note_ast_file_signature_failed) <<
Result.getSignatureError();
5329 llvm_unreachable(
"Unexpected value from adding module.");
5332 assert(M &&
"Missing module file");
5334 bool ShouldFinalizePCM =
false;
5335 llvm::scope_exit FinalizeOrDropPCM([&]() {
5337 if (ShouldFinalizePCM)
5343 BitstreamCursor &Stream = F.
Stream;
5344 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5345 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5349 Diag(diag::err_ast_file_invalid)
5355 bool HaveReadControlBlock =
false;
5359 Error(MaybeEntry.takeError());
5362 llvm::BitstreamEntry Entry = MaybeEntry.get();
5364 switch (Entry.Kind) {
5365 case llvm::BitstreamEntry::Error:
5366 case llvm::BitstreamEntry::Record:
5367 case llvm::BitstreamEntry::EndBlock:
5368 Error(
"invalid record at top-level of AST file");
5371 case llvm::BitstreamEntry::SubBlock:
5377 HaveReadControlBlock =
true;
5378 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5386 F.ModuleName.empty()) {
5405 if (!HaveReadControlBlock) {
5407 Diag(diag::err_ast_file_version_too_old)
5414 ShouldFinalizePCM =
true;
5418 if (llvm::Error Err = Stream.SkipBlock()) {
5419 Error(std::move(Err));
5426 llvm_unreachable(
"unexpected break; expected return");
5430ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5431 unsigned ClientLoadCapabilities) {
5433 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5434 bool AllowCompatibleConfigurationMismatch =
5436 bool DisableValidation = shouldDisableValidationForFile(F);
5438 ASTReadResult
Result = readUnhashedControlBlockImpl(
5440 AllowCompatibleConfigurationMismatch, Listener.get(),
5445 if (DisableValidation || WasImportedBy ||
5446 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5450 Error(
"malformed block record in AST file");
5473 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5475 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5484 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5485 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5486 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5488 BitstreamCursor Stream(StreamData);
5493 consumeError(std::move(Err));
5505 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5508 consumeError(MaybeEntry.takeError());
5511 llvm::BitstreamEntry Entry = MaybeEntry.get();
5513 switch (Entry.Kind) {
5514 case llvm::BitstreamEntry::Error:
5515 case llvm::BitstreamEntry::SubBlock:
5518 case llvm::BitstreamEntry::EndBlock:
5521 case llvm::BitstreamEntry::Record:
5529 Expected<unsigned> MaybeRecordType =
5530 Stream.readRecord(Entry.ID,
Record, &Blob);
5531 if (!MaybeRecordType) {
5540 "Dummy AST file signature not backpatched in ASTWriter.");
5547 "Dummy AST block hash not backpatched in ASTWriter.");
5551 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5552 if (Listener && ValidateDiagnosticOptions &&
5553 !AllowCompatibleConfigurationMismatch &&
5554 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5559 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5560 if (Listener && !AllowCompatibleConfigurationMismatch &&
5561 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5562 Result = ConfigurationMismatch;
5591 if (
Record.size() < 4)
return true;
5596 unsigned BlockNameLen =
Record[2];
5597 unsigned UserInfoLen =
Record[3];
5599 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5601 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5602 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5603 Blob.data() + BlockNameLen + UserInfoLen);
5607llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5608 BitstreamCursor &Stream = F.
Stream;
5612 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5614 return MaybeEntry.takeError();
5615 llvm::BitstreamEntry Entry = MaybeEntry.get();
5617 switch (Entry.Kind) {
5618 case llvm::BitstreamEntry::SubBlock:
5619 if (llvm::Error Err = Stream.SkipBlock())
5622 case llvm::BitstreamEntry::EndBlock:
5623 return llvm::Error::success();
5624 case llvm::BitstreamEntry::Error:
5625 return llvm::createStringError(std::errc::illegal_byte_sequence,
5626 "malformed block record in AST file");
5627 case llvm::BitstreamEntry::Record:
5633 Expected<unsigned> MaybeRecCode =
5634 Stream.readRecord(Entry.ID,
Record, &Blob);
5636 return MaybeRecCode.takeError();
5637 switch (MaybeRecCode.get()) {
5639 ModuleFileExtensionMetadata Metadata;
5641 return llvm::createStringError(
5642 std::errc::illegal_byte_sequence,
5643 "malformed EXTENSION_METADATA in AST file");
5646 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5647 if (Known == ModuleFileExtensions.end())
break;
5650 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5660 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5664 assert(ContextObj &&
"no context to initialize");
5668 if (DeserializationListener)
5669 DeserializationListener->DeclRead(
5671 Context.getTranslationUnitDecl());
5679 if (!Context.CFConstantStringTypeDecl)
5680 Context.setCFConstantStringType(
GetType(String));
5685 if (FileType.isNull()) {
5686 Error(
"FILE type is NULL");
5690 if (!Context.FILEDecl) {
5692 Context.setFILEDecl(
Typedef->getDecl());
5694 const TagType *Tag = FileType->getAs<TagType>();
5696 Error(
"Invalid FILE type in AST file");
5699 Context.setFILEDecl(Tag->getDecl());
5706 if (Jmp_bufType.
isNull()) {
5707 Error(
"jmp_buf type is NULL");
5711 if (!Context.jmp_bufDecl) {
5713 Context.setjmp_bufDecl(
Typedef->getDecl());
5715 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5717 Error(
"Invalid jmp_buf type in AST file");
5720 Context.setjmp_bufDecl(Tag->getDecl());
5727 if (Sigjmp_bufType.
isNull()) {
5728 Error(
"sigjmp_buf type is NULL");
5732 if (!Context.sigjmp_bufDecl) {
5734 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5736 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5737 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5738 Context.setsigjmp_bufDecl(Tag->getDecl());
5744 if (Context.ObjCIdRedefinitionType.isNull())
5745 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5748 if (
TypeID ObjCClassRedef =
5750 if (Context.ObjCClassRedefinitionType.isNull())
5751 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5754 if (
TypeID ObjCSelRedef =
5756 if (Context.ObjCSelRedefinitionType.isNull())
5757 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5762 if (Ucontext_tType.
isNull()) {
5763 Error(
"ucontext_t type is NULL");
5767 if (!Context.ucontext_tDecl) {
5769 Context.setucontext_tDecl(
Typedef->getDecl());
5771 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5772 assert(Tag &&
"Invalid ucontext_t type in AST file");
5773 Context.setucontext_tDecl(Tag->getDecl());
5782 if (!CUDASpecialDeclRefs.empty()) {
5783 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5784 Context.setcudaConfigureCallDecl(
5785 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5786 Context.setcudaGetParameterBufferDecl(
5787 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5788 Context.setcudaLaunchDeviceDecl(
5789 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5794 for (
auto &Import : PendingImportedModules) {
5798 if (Import.ImportLoc.isValid())
5799 PP.makeModuleVisible(Imported, Import.ImportLoc);
5806 PendingImportedModulesSema.append(PendingImportedModules);
5807 PendingImportedModules.clear();
5817 BitstreamCursor Stream(
PCH);
5820 consumeError(std::move(Err));
5832 Stream.advanceSkippingSubblocks();
5835 consumeError(MaybeEntry.takeError());
5838 llvm::BitstreamEntry Entry = MaybeEntry.get();
5840 if (Entry.Kind != llvm::BitstreamEntry::Record)
5848 consumeError(MaybeRecord.takeError());
5854 "Dummy AST file signature not backpatched in ASTWriter.");
5864 const std::string &ASTFileName,
FileManager &FileMgr,
5867 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5872 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5873 << ASTFileName << Buffer.getError().message();
5874 return std::string();
5878 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5882 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5883 return std::string();
5888 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5889 return std::string();
5896 Stream.advanceSkippingSubblocks();
5899 consumeError(MaybeEntry.takeError());
5900 return std::string();
5902 llvm::BitstreamEntry Entry = MaybeEntry.get();
5904 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5905 return std::string();
5907 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5908 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5909 return std::string();
5917 consumeError(MaybeRecord.takeError());
5918 return std::string();
5933 std::string ExistingSpecificModuleCachePath;
5935 bool StrictOptionMatches;
5938 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5943 StringRef ExistingSpecificModuleCachePath,
5945 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5946 ExistingTargetOpts(ExistingTargetOpts),
5947 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5948 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5951 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5952 StringRef ModuleFilename,
bool Complain,
5953 bool AllowCompatibleDifferences)
override {
5955 nullptr, AllowCompatibleDifferences);
5958 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5959 StringRef ModuleFilename,
bool Complain,
5960 bool AllowCompatibleDifferences)
override {
5962 nullptr, AllowCompatibleDifferences);
5965 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5966 StringRef ModuleFilename,
bool Complain,
5967 bool AllowCompatibleDifferences)
override {
5969 nullptr, AllowCompatibleDifferences);
5972 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5973 StringRef ASTFilename, StringRef ContextHash,
5974 bool Complain)
override {
5976 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5977 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5980 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5981 StringRef ModuleFilename,
bool ReadMacros,
5983 std::string &SuggestedPredefines)
override {
5985 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5986 FileMgr, SuggestedPredefines, ExistingLangOpts,
5998 unsigned ClientLoadCapabilities) {
6002 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
6003 llvm::MemoryBuffer *Buffer =
6012 auto Entry = Filename ==
"-" ? FileMgr.getSTDIN()
6013 : FileMgr.getFileRef(Filename,
6018 llvm::consumeError(Entry.takeError());
6022 FileMgr.getBufferForFile(*Entry,
6029 OwnedBuffer = std::move(*BufferOrErr);
6030 Buffer = OwnedBuffer.get();
6034 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6035 BitstreamCursor Stream(Bytes);
6039 consumeError(std::move(Err));
6047 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6048 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6049 bool NeedsImports = Listener.needsImportVisitation();
6050 BitstreamCursor InputFilesCursor;
6051 uint64_t InputFilesOffsetBase = 0;
6054 std::string ModuleDir;
6055 bool DoneWithControlBlock =
false;
6057 PathBuf.reserve(256);
6062 AdditionalPathBuf.reserve(256);
6063 while (!DoneWithControlBlock) {
6067 consumeError(MaybeEntry.takeError());
6070 llvm::BitstreamEntry Entry = MaybeEntry.get();
6072 switch (Entry.Kind) {
6073 case llvm::BitstreamEntry::SubBlock: {
6076 std::string IgnoredSuggestedPredefines;
6077 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6079 Listener, IgnoredSuggestedPredefines) !=
Success)
6085 InputFilesCursor = Stream;
6086 if (llvm::Error Err = Stream.SkipBlock()) {
6088 consumeError(std::move(Err));
6091 if (NeedsInputFiles &&
6094 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6098 if (llvm::Error Err = Stream.SkipBlock()) {
6100 consumeError(std::move(Err));
6109 case llvm::BitstreamEntry::EndBlock:
6110 DoneWithControlBlock =
true;
6113 case llvm::BitstreamEntry::Error:
6116 case llvm::BitstreamEntry::Record:
6120 if (DoneWithControlBlock)
break;
6125 Stream.readRecord(Entry.ID,
Record, &Blob);
6126 if (!MaybeRecCode) {
6134 if (Listener.ReadFullVersionInformation(Blob))
6138 Listener.ReadModuleName(Blob);
6141 ModuleDir = std::string(Blob);
6147 Listener.ReadModuleMapFile(*Path);
6151 if (!NeedsInputFiles)
6154 unsigned NumInputFiles =
Record[0];
6155 unsigned NumUserFiles =
Record[1];
6156 const llvm::support::unaligned_uint64_t *InputFileOffs =
6157 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6158 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6160 bool isSystemFile = I >= NumUserFiles;
6162 if (isSystemFile && !NeedsSystemInputFiles)
6165 BitstreamCursor &Cursor = InputFilesCursor;
6167 if (llvm::Error Err =
6168 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6170 consumeError(std::move(Err));
6176 consumeError(MaybeCode.takeError());
6178 unsigned Code = MaybeCode.get();
6182 bool shouldContinue =
false;
6184 Cursor.readRecord(Code,
Record, &Blob);
6185 if (!MaybeRecordType) {
6187 consumeError(MaybeRecordType.takeError());
6193 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6194 bool Overridden =
static_cast<bool>(
Record[3]);
6195 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6198 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6200 if (UnresolvedFilename.empty())
6201 Filename = *FilenameAsRequestedBuf;
6204 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6205 Filename = *FilenameBuf;
6207 shouldContinue = Listener.visitInputFileAsRequested(
6208 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6212 if (!shouldContinue)
6233 bool IsStandardCXXModule =
Record[Idx++];
6237 if (IsStandardCXXModule) {
6238 Listener.visitImport(ModuleName,
"");
6249 Listener.visitImport(ModuleName, *Filename);
6260 if (FindModuleFileExtensions) {
6261 BitstreamCursor SavedStream = Stream;
6263 bool DoneWithExtensionBlock =
false;
6264 while (!DoneWithExtensionBlock) {
6270 llvm::BitstreamEntry Entry = MaybeEntry.get();
6272 switch (Entry.Kind) {
6273 case llvm::BitstreamEntry::SubBlock:
6274 if (llvm::Error Err = Stream.SkipBlock()) {
6276 consumeError(std::move(Err));
6281 case llvm::BitstreamEntry::EndBlock:
6282 DoneWithExtensionBlock =
true;
6285 case llvm::BitstreamEntry::Error:
6288 case llvm::BitstreamEntry::Record:
6295 Stream.readRecord(Entry.ID,
Record, &Blob);
6296 if (!MaybeRecCode) {
6300 switch (MaybeRecCode.get()) {
6306 Listener.readModuleFileExtension(Metadata);
6312 Stream = std::move(SavedStream);
6316 if (readUnhashedControlBlockImpl(
6317 nullptr, Bytes, Filename, ClientLoadCapabilities,
6319 ValidateDiagnosticOptions) !=
Success)
6330 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6331 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6332 SpecificModuleCachePath, FileMgr,
6333 RequireStrictOptionMatches);
6341 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
6346 if (GlobalIndex >= SubmodulesLoaded.size()) {
6347 Error(
"submodule ID out of range in AST file");
6351 if (SubmodulesLoaded[GlobalIndex])
6352 return SubmodulesLoaded[GlobalIndex];
6355 assert(It != GlobalSubmoduleMap.end());
6358 [[maybe_unused]]
unsigned LocalID =
6365 Error(std::move(Err));
6369 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6374 auto CreateModule = !KnowsTopLevelModule
6378 Module *CurrentModule =
nullptr;
6383 Error(MaybeEntry.takeError());
6386 llvm::BitstreamEntry Entry = MaybeEntry.get();
6388 switch (Entry.Kind) {
6389 case llvm::BitstreamEntry::SubBlock:
6390 case llvm::BitstreamEntry::Error:
6391 case llvm::BitstreamEntry::EndBlock: {
6392 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6393 "malformed block record in AST file"));
6396 case llvm::BitstreamEntry::Record:
6406 Error(MaybeKind.takeError());
6413 if (!CurrentModule) {
6414 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6415 "malformed module definition"));
6418 return CurrentModule;
6421 if (
Record.size() < 13) {
6422 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6423 "malformed module definition"));
6427 StringRef Name = Blob;
6429 [[maybe_unused]]
unsigned ReadLocalID =
Record[Idx++];
6430 assert(LocalID == ReadLocalID);
6436 bool IsFramework =
Record[Idx++];
6437 bool IsExplicit =
Record[Idx++];
6438 bool IsSystem =
Record[Idx++];
6439 bool IsExternC =
Record[Idx++];
6440 bool InferSubmodules =
Record[Idx++];
6441 bool InferExplicitSubmodules =
Record[Idx++];
6442 bool InferExportWildcard =
Record[Idx++];
6443 bool ConfigMacrosExhaustive =
Record[Idx++];
6444 bool ModuleMapIsPrivate =
Record[Idx++];
6445 bool NamedModuleHasInit =
Record[Idx++];
6447 Module *ParentModule =
nullptr;
6454 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6455 IsFramework, IsExplicit);
6457 if (!ParentModule) {
6461 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6463 assert(*CurFileKey != F.
FileKey &&
6464 "ModuleManager did not de-duplicate");
6466 Diag(diag::err_module_file_conflict)
6470 auto CurModMapFile =
6472 auto ModMapFile = FileMgr.getOptionalFileRef(F.
ModuleMapPath);
6473 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6474 Diag(diag::note_module_file_conflict)
6475 << CurModMapFile->getName() << ModMapFile->getName();
6486 CurrentModule->
Kind = Kind;
6496 if (InferredAllowedBy.
isValid())
6508 if (
auto Dir = FileMgr.getOptionalDirectoryRef(F.
BaseDirectory))
6510 }
else if (ParentModule && ParentModule->
Directory) {
6515 if (DeserializationListener)
6516 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6518 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6542 CurrentModule, Blob.str(), RelativePathName)) {
6578 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6588 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6595 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6603 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6605 bool IsWildcard =
Record[Idx + 1];
6608 if (ExportedMod || IsWildcard)
6609 CurrentModule->
Exports.push_back({ExportedMod, IsWildcard});
6619 PP.getTargetInfo());
6636 Conflict.
Message = Blob.str();
6637 CurrentModule->
Conflicts.push_back(Conflict);
6647 for (
unsigned I = 0; I <
Record.size(); )
6649 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6676bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6677 StringRef ModuleFilename,
bool Complain,
6679 bool AllowCompatibleDifferences) {
6683#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6684 LangOpts.Name = Record[Idx++];
6685#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6686 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6687#include "clang/Basic/LangOptions.def"
6688#define SANITIZER(NAME, ID) \
6689 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6690#include "clang/Basic/Sanitizers.def"
6692 for (
unsigned N =
Record[Idx++]; N; --N)
6696 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6702 for (
unsigned N =
Record[Idx++]; N; --N) {
6704 ReadString(
Record, Idx));
6709 for (
unsigned N =
Record[Idx++]; N; --N) {
6716 AllowCompatibleDifferences);
6719bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6720 StringRef ModuleFilename,
bool Complain,
6721 ASTReaderListener &Listener,
6722 bool AllowCompatibleDifferences) {
6724 CodeGenOptions CGOpts;
6726#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6727 if constexpr (CK::Compatibility != CK::Benign) \
6728 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6729#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6730 if constexpr (CK::Compatibility != CK::Benign) \
6731 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6732#define DEBUGOPT(Name, Bits, Default, Compatibility)
6733#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6734#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6735#include "clang/Basic/CodeGenOptions.def"
6738 AllowCompatibleDifferences);
6741bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6742 StringRef ModuleFilename,
bool Complain,
6743 ASTReaderListener &Listener,
6744 bool AllowCompatibleDifferences) {
6746 TargetOptions TargetOpts;
6748 TargetOpts.
CPU = ReadString(
Record, Idx);
6750 TargetOpts.
ABI = ReadString(
Record, Idx);
6751 for (
unsigned N =
Record[Idx++]; N; --N) {
6754 for (
unsigned N =
Record[Idx++]; N; --N) {
6759 AllowCompatibleDifferences);
6762bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6763 StringRef ModuleFilename,
bool Complain,
6764 ASTReaderListener &Listener) {
6765 DiagnosticOptions DiagOpts;
6767#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6768#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6769 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6770#include "clang/Basic/DiagnosticOptions.def"
6772 for (
unsigned N =
Record[Idx++]; N; --N)
6774 for (
unsigned N =
Record[Idx++]; N; --N)
6780bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6781 ASTReaderListener &Listener) {
6782 FileSystemOptions FSOpts;
6788bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6789 StringRef ModuleFilename,
6791 ASTReaderListener &Listener) {
6792 HeaderSearchOptions HSOpts;
6807 std::string ContextHash = ReadString(
Record, Idx);
6813bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6814 ASTReaderListener &Listener) {
6815 HeaderSearchOptions HSOpts;
6819 for (
unsigned N =
Record[Idx++]; N; --N) {
6820 std::string Path = ReadString(
Record, Idx);
6823 bool IsFramework =
Record[Idx++];
6824 bool IgnoreSysRoot =
Record[Idx++];
6825 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6830 for (
unsigned N =
Record[Idx++]; N; --N) {
6831 std::string Prefix = ReadString(
Record, Idx);
6832 bool IsSystemHeader =
Record[Idx++];
6837 for (
unsigned N =
Record[Idx++]; N; --N) {
6838 std::string VFSOverlayFile = ReadString(
Record, Idx);
6845bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6846 StringRef ModuleFilename,
6848 ASTReaderListener &Listener,
6849 std::string &SuggestedPredefines) {
6850 PreprocessorOptions PPOpts;
6854 bool ReadMacros =
Record[Idx++];
6856 for (
unsigned N =
Record[Idx++]; N; --N) {
6858 bool IsUndef =
Record[Idx++];
6859 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6864 for (
unsigned N =
Record[Idx++]; N; --N) {
6869 for (
unsigned N =
Record[Idx++]; N; --N) {
6878 SuggestedPredefines.clear();
6880 Complain, SuggestedPredefines);
6883std::pair<ModuleFile *, unsigned>
6884ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6885 GlobalPreprocessedEntityMapType::iterator
6886 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6887 assert(I != GlobalPreprocessedEntityMap.end() &&
6888 "Corrupted global preprocessed entity map");
6891 return std::make_pair(M, LocalIndex);
6894llvm::iterator_range<PreprocessingRecord::iterator>
6895ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6896 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6900 return llvm::make_range(PreprocessingRecord::iterator(),
6901 PreprocessingRecord::iterator());
6904bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6905 unsigned int ClientLoadCapabilities) {
6906 return ClientLoadCapabilities & ARR_OutOfDate &&
6909 .getInMemoryModuleCache()
6910 .isPCMFinal(ModuleFileName);
6913llvm::iterator_range<ASTReader::ModuleDeclIterator>
6915 return llvm::make_range(
6922 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6923 assert(I != GlobalSkippedRangeMap.end() &&
6924 "Corrupted global skipped range map");
6927 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6931 assert(Range.isValid());
6937 unsigned ModuleFileIndex = ID >> 32;
6938 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6939 assert(getModuleManager().size() > ModuleFileIndex - 1);
6940 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6942 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6947 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6949 unsigned LocalIndex = PPInfo.second;
6954 if (!PP.getPreprocessingRecord()) {
6955 Error(
"no preprocessing record");
6962 Error(std::move(Err));
6969 Error(MaybeEntry.takeError());
6972 llvm::BitstreamEntry Entry = MaybeEntry.get();
6974 if (Entry.Kind != llvm::BitstreamEntry::Record)
6985 if (!MaybeRecType) {
6986 Error(MaybeRecType.takeError());
6991 bool isBuiltin =
Record[0];
6999 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
7019 if (DeserializationListener)
7020 DeserializationListener->MacroDefinitionRead(PPID, MD);
7026 const char *FullFileNameStart = Blob.data() +
Record[0];
7027 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
7029 if (!FullFileName.empty())
7030 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7037 StringRef(Blob.data(),
Record[0]),
7045 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
7054unsigned ASTReader::findNextPreprocessedEntity(
7055 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
7057 for (GlobalSLocOffsetMapType::const_iterator
7058 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7064 return getTotalNumPreprocessedEntities();
7069struct PPEntityComp {
7070 const ASTReader &Reader;
7073 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7075 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
7076 SourceLocation LHS = getLoc(L);
7077 SourceLocation RHS = getLoc(R);
7081 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
7082 SourceLocation LHS = getLoc(L);
7086 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
7087 SourceLocation RHS = getLoc(R);
7091 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7098unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7099 bool EndsAfter)
const {
7100 if (SourceMgr.isLocalSourceLocation(Loc))
7101 return getTotalNumPreprocessedEntities();
7103 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7104 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7105 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7106 "Corrupted global sloc offset map");
7108 if (SLocMapI->second->NumPreprocessedEntities == 0)
7109 return findNextPreprocessedEntity(SLocMapI);
7120 pp_iterator
First = pp_begin;
7124 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7125 PPEntityComp(*
this, M));
7134 std::advance(PPI,
Half);
7135 if (SourceMgr.isBeforeInTranslationUnit(
7136 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7139 Count = Count -
Half - 1;
7146 return findNextPreprocessedEntity(SLocMapI);
7153std::pair<unsigned, unsigned>
7155 if (Range.isInvalid())
7156 return std::make_pair(0,0);
7157 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7159 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7160 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7161 return std::make_pair(BeginID, EndID);
7171 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7173 unsigned LocalIndex = PPInfo.second;
7180 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7189 class HeaderFileInfoVisitor {
7191 std::optional<HeaderFileInfo> HFI;
7194 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7203 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7204 if (Pos == Table->end())
7211 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7217 HeaderFileInfoVisitor Visitor(FE);
7218 ModuleMgr.visit(Visitor);
7219 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7226 using DiagState = DiagnosticsEngine::DiagState;
7237 auto ReadDiagState = [&](
const DiagState &BasedOn,
7238 bool IncludeNonPragmaStates) {
7239 unsigned BackrefID =
Record[Idx++];
7241 return DiagStates[BackrefID - 1];
7244 Diag.DiagStates.push_back(BasedOn);
7245 DiagState *NewState = &
Diag.DiagStates.back();
7246 DiagStates.push_back(NewState);
7247 unsigned Size =
Record[Idx++];
7248 assert(Idx + Size * 2 <=
Record.size() &&
7249 "Invalid data, not enough diag/map pairs");
7251 unsigned DiagID =
Record[Idx++];
7254 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7267 Mapping = NewMapping;
7273 DiagState *FirstState;
7278 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7279 DiagStates.push_back(FirstState);
7283 "Invalid data, unexpected backref in initial state");
7285 assert(Idx <
Record.size() &&
7286 "Invalid data, not enough state change pairs in initial state");
7291 unsigned Flags =
Record[Idx++];
7292 DiagState Initial(*
Diag.getDiagnosticIDs());
7293 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7294 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7295 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7296 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7297 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7299 FirstState = ReadDiagState(Initial,
true);
7307 .StateTransitions.push_back({FirstState, 0});
7312 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7316 unsigned NumLocations =
Record[Idx++];
7317 while (NumLocations--) {
7318 assert(Idx <
Record.size() &&
7319 "Invalid data, missing pragma diagnostic states");
7321 assert(FID.
isValid() &&
"invalid FileID for transition");
7322 unsigned Transitions =
Record[Idx++];
7328 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7329 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7330 for (
unsigned I = 0; I != Transitions; ++I) {
7331 unsigned Offset =
Record[Idx++];
7332 auto *State = ReadDiagState(*FirstState,
false);
7333 F.StateTransitions.push_back({State, Offset});
7338 assert(Idx <
Record.size() &&
7339 "Invalid data, missing final pragma diagnostic state");
7341 auto *CurState = ReadDiagState(*FirstState,
false);
7344 Diag.DiagStatesByLoc.CurDiagState = CurState;
7345 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7350 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7352 T.push_back({CurState, 0});
7354 T[0].State = CurState;
7360 assert(Idx <
Record.size() &&
7361 "Invalid data, missing diagnostic push stack");
7362 unsigned NumPushes =
Record[Idx++];
7363 for (
unsigned I = 0; I != NumPushes; ++I) {
7364 auto *State = ReadDiagState(*FirstState,
false);
7366 Diag.DiagStateOnPushStack.push_back(State);
7375ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7376 auto [M, Index] = translateTypeIDToIndex(ID);
7383#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7384 case TYPE_##CODE_ID: return Type::CLASS_ID;
7385#include "clang/Serialization/TypeBitCodes.def"
7387 return std::nullopt;
7397QualType ASTReader::readTypeRecord(
TypeID ID) {
7398 assert(ContextObj &&
"reading type with no AST context");
7399 ASTContext &Context = *ContextObj;
7400 RecordLocation Loc = TypeCursorForIndex(ID);
7401 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7405 SavedStreamPosition SavedPosition(DeclsCursor);
7407 ReadingKindTracker ReadingKind(Read_Type, *
this);
7410 Deserializing AType(
this);
7412 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7413 Error(std::move(Err));
7416 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7418 Error(RawCode.takeError());
7422 ASTRecordReader
Record(*
this, *Loc.F);
7423 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7425 Error(Code.takeError());
7429 QualType baseType =
Record.readQualType();
7430 Qualifiers quals =
Record.readQualifiers();
7436 Error(
"Unexpected code for type");
7440 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7441 return TypeReader.read(*maybeClass);
7449 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7450 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7453 return Reader.readTypeSourceInfo();
7457 return Reader.readNestedNameSpecifierLoc();
7461 return Reader.readAttr();
7470#define ABSTRACT_TYPELOC(CLASS, PARENT)
7471#define TYPELOC(CLASS, PARENT) \
7472 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7473#include "clang/AST/TypeLocNodes.def"
7482void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7486void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7496void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7500void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7504void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7508void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7512void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7516void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7520void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7524void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7528void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7532void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7540 if (Reader.readBool())
7547 VisitArrayTypeLoc(TL);
7551 VisitArrayTypeLoc(TL);
7554void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7555 VisitArrayTypeLoc(TL);
7558void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7559 DependentSizedArrayTypeLoc TL) {
7560 VisitArrayTypeLoc(TL);
7563void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7564 DependentAddressSpaceTypeLoc TL) {
7571void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7572 DependentSizedExtVectorTypeLoc TL) {
7576void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7580void TypeLocReader::VisitDependentVectorTypeLoc(
7581 DependentVectorTypeLoc TL) {
7585void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7589void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7596void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7597 DependentSizedMatrixTypeLoc TL) {
7610 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7616 VisitFunctionTypeLoc(TL);
7620 VisitFunctionTypeLoc(TL);
7623void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7624 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7625 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7626 SourceLocation NameLoc = readSourceLocation();
7627 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7630void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7631 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7632 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7633 SourceLocation NameLoc = readSourceLocation();
7634 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7637void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7638 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7639 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7640 SourceLocation NameLoc = readSourceLocation();
7641 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7644void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7650void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7657void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7662void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7666void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7678 auto NamedConcept = readTemplateName();
7680 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7685void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7687 if (Reader.readBool())
7689 if (Reader.readBool())
7693void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7707 VisitTagTypeLoc(TL);
7711 VisitTagTypeLoc(TL);
7714void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7716void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7720void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7724void TypeLocReader::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
7726 "should be replaced with a concrete type before serialization");
7729void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7733void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7737void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7738 HLSLAttributedResourceTypeLoc TL) {
7742void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7746void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7750void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7751 SubstTemplateTypeParmTypeLoc TL) {
7755void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7756 SubstTemplateTypeParmPackTypeLoc TL) {
7760void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7761 SubstBuiltinTemplatePackTypeLoc TL) {
7765void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7766 TemplateSpecializationTypeLoc TL) {
7767 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7768 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7769 SourceLocation TemplateKeywordLoc = readSourceLocation();
7770 SourceLocation NameLoc = readSourceLocation();
7771 SourceLocation LAngleLoc = readSourceLocation();
7772 SourceLocation RAngleLoc = readSourceLocation();
7773 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7774 LAngleLoc, RAngleLoc);
7775 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7776 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7777 Args[I] = Reader.readTemplateArgumentLocInfo(
7778 TL.
getTypePtr()->template_arguments()[I].getKind());
7781void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7786void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7792void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7796void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7801void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7810void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7822void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7826void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7832void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7836void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7840void TypeLocReader::VisitDependentBitIntTypeLoc(
7841 clang::DependentBitIntTypeLoc TL) {
7845void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7879std::pair<ModuleFile *, unsigned>
7882 "Predefined type shouldn't be in TypesLoaded");
7884 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7886 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7887 assert(OwningModuleFile &&
7888 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7890 return {OwningModuleFile,
7895 assert(ContextObj &&
"reading type with no AST context");
7906 llvm_unreachable(
"Invalid predefined type");
7922 T = Context.UnsignedCharTy;
7925 T = Context.UnsignedShortTy;
7928 T = Context.UnsignedIntTy;
7931 T = Context.UnsignedLongTy;
7934 T = Context.UnsignedLongLongTy;
7937 T = Context.UnsignedInt128Ty;
7940 T = Context.SignedCharTy;
7943 T = Context.WCharTy;
7946 T = Context.ShortTy;
7955 T = Context.LongLongTy;
7958 T = Context.Int128Ty;
7961 T = Context.BFloat16Ty;
7967 T = Context.FloatTy;
7970 T = Context.DoubleTy;
7973 T = Context.LongDoubleTy;
7976 T = Context.ShortAccumTy;
7979 T = Context.AccumTy;
7982 T = Context.LongAccumTy;
7985 T = Context.UnsignedShortAccumTy;
7988 T = Context.UnsignedAccumTy;
7991 T = Context.UnsignedLongAccumTy;
7994 T = Context.ShortFractTy;
7997 T = Context.FractTy;
8000 T = Context.LongFractTy;
8003 T = Context.UnsignedShortFractTy;
8006 T = Context.UnsignedFractTy;
8009 T = Context.UnsignedLongFractTy;
8012 T = Context.SatShortAccumTy;
8015 T = Context.SatAccumTy;
8018 T = Context.SatLongAccumTy;
8021 T = Context.SatUnsignedShortAccumTy;
8024 T = Context.SatUnsignedAccumTy;
8027 T = Context.SatUnsignedLongAccumTy;
8030 T = Context.SatShortFractTy;
8033 T = Context.SatFractTy;
8036 T = Context.SatLongFractTy;
8039 T = Context.SatUnsignedShortFractTy;
8042 T = Context.SatUnsignedFractTy;
8045 T = Context.SatUnsignedLongFractTy;
8048 T = Context.Float16Ty;
8051 T = Context.Float128Ty;
8054 T = Context.Ibm128Ty;
8057 T = Context.OverloadTy;
8060 T = Context.UnresolvedTemplateTy;
8063 T = Context.BoundMemberTy;
8066 T = Context.PseudoObjectTy;
8069 T = Context.DependentTy;
8072 T = Context.UnknownAnyTy;
8075 T = Context.NullPtrTy;
8078 T = Context.Char8Ty;
8081 T = Context.Char16Ty;
8084 T = Context.Char32Ty;
8087 T = Context.ObjCBuiltinIdTy;
8090 T = Context.ObjCBuiltinClassTy;
8093 T = Context.ObjCBuiltinSelTy;
8095#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8096 case PREDEF_TYPE_##Id##_ID: \
8097 T = Context.SingletonId; \
8099#include "clang/Basic/OpenCLImageTypes.def"
8100#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8101 case PREDEF_TYPE_##Id##_ID: \
8102 T = Context.Id##Ty; \
8104#include "clang/Basic/OpenCLExtensionTypes.def"
8106 T = Context.OCLSamplerTy;
8109 T = Context.OCLEventTy;
8112 T = Context.OCLClkEventTy;
8115 T = Context.OCLQueueTy;
8118 T = Context.OCLReserveIDTy;
8121 T = Context.getAutoDeductType();
8124 T = Context.getAutoRRefDeductType();
8127 T = Context.ARCUnbridgedCastTy;
8130 T = Context.BuiltinFnTy;
8133 T = Context.IncompleteMatrixIdxTy;
8136 T = Context.ArraySectionTy;
8139 T = Context.OMPArrayShapingTy;
8142 T = Context.OMPIteratorTy;
8144#define SVE_TYPE(Name, Id, SingletonId) \
8145 case PREDEF_TYPE_##Id##_ID: \
8146 T = Context.SingletonId; \
8148#include "clang/Basic/AArch64ACLETypes.def"
8149#define PPC_VECTOR_TYPE(Name, Id, Size) \
8150 case PREDEF_TYPE_##Id##_ID: \
8151 T = Context.Id##Ty; \
8153#include "clang/Basic/PPCTypes.def"
8154#define RVV_TYPE(Name, Id, SingletonId) \
8155 case PREDEF_TYPE_##Id##_ID: \
8156 T = Context.SingletonId; \
8158#include "clang/Basic/RISCVVTypes.def"
8159#define WASM_TYPE(Name, Id, SingletonId) \
8160 case PREDEF_TYPE_##Id##_ID: \
8161 T = Context.SingletonId; \
8163#include "clang/Basic/WebAssemblyReferenceTypes.def"
8164#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8165 case PREDEF_TYPE_##Id##_ID: \
8166 T = Context.SingletonId; \
8168#include "clang/Basic/AMDGPUTypes.def"
8169#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8170 case PREDEF_TYPE_##Id##_ID: \
8171 T = Context.SingletonId; \
8173#include "clang/Basic/HLSLIntangibleTypes.def"
8174#define SPIRV_TYPE(Name, Id, SingletonId) \
8175 case PREDEF_TYPE_##Id##_ID: \
8176 T = Context.SingletonId; \
8178#include "clang/Basic/SPIRVTypes.def"
8181 assert(!
T.isNull() &&
"Unknown predefined type");
8182 return T.withFastQualifiers(FastQuals);
8185 unsigned Index = translateTypeIDToIndex(ID).second;
8187 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8188 if (TypesLoaded[Index].isNull()) {
8189 TypesLoaded[Index] = readTypeRecord(ID);
8190 if (TypesLoaded[Index].isNull())
8193 TypesLoaded[Index]->setFromAST();
8194 if (DeserializationListener)
8196 TypesLoaded[Index]);
8199 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8212 ReadModuleOffsetMap(F);
8215 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8217 if (ModuleFileIndex == 0)
8222 ModuleFileIndex = MF.
Index + 1;
8223 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8242 TemplateNameLoc, EllipsisLoc);
8253 llvm_unreachable(
"unexpected template argument loc");
8270 unsigned NumArgsAsWritten =
readInt();
8271 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8285 if (NumCurrentElementsDeserializing) {
8290 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8313 auto *II = Name.getAsIdentifierInfo();
8314 assert(II &&
"non-identifier name in C?");
8315 if (II->isOutOfDate())
8332 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8333 Template = CTSD->getSpecializedTemplate();
8334 Args = CTSD->getTemplateArgs().asArray();
8335 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8336 Template = VTSD->getSpecializedTemplate();
8337 Args = VTSD->getTemplateArgs().asArray();
8338 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8339 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8341 Args = FD->getTemplateSpecializationArgs()->asArray();
8346 Template->loadLazySpecializationsImpl(Args);
8351 RecordLocation Loc = getLocalBitOffset(Offset);
8354 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8355 Error(std::move(Err));
8358 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8363 Error(MaybeCode.takeError());
8366 unsigned Code = MaybeCode.get();
8370 if (!MaybeRecCode) {
8371 Error(MaybeRecCode.takeError());
8375 Error(
"malformed AST file: missing C++ ctor initializers");
8379 return Record.readCXXCtorInitializers();
8383 assert(ContextObj &&
"reading base specifiers with no AST context");
8386 RecordLocation Loc = getLocalBitOffset(Offset);
8389 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8390 Error(std::move(Err));
8393 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8398 Error(MaybeCode.takeError());
8401 unsigned Code = MaybeCode.get();
8405 if (!MaybeRecCode) {
8406 Error(MaybeCode.takeError());
8409 unsigned RecCode = MaybeRecCode.get();
8412 Error(
"malformed AST file: missing C++ base specifiers");
8416 unsigned NumBases =
Record.readInt();
8419 for (
unsigned I = 0; I != NumBases; ++I)
8420 Bases[I] =
Record.readCXXBaseSpecifier();
8433 ReadModuleOffsetMap(F);
8436 OwningModuleFileIndex == 0
8440 if (OwningModuleFileIndex == 0)
8443 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8452 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8453 return M.
Index == ModuleFileIndex - 1;
8461 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8462 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8482 DeclCursorForID(ID, Loc);
8487 assert(ContextObj &&
"reading predefined decl without AST context");
8489 Decl *NewLoaded =
nullptr;
8495 return Context.getTranslationUnitDecl();
8498 if (Context.ObjCIdDecl)
8499 return Context.ObjCIdDecl;
8500 NewLoaded = Context.getObjCIdDecl();
8504 if (Context.ObjCSelDecl)
8505 return Context.ObjCSelDecl;
8506 NewLoaded = Context.getObjCSelDecl();
8510 if (Context.ObjCClassDecl)
8511 return Context.ObjCClassDecl;
8512 NewLoaded = Context.getObjCClassDecl();
8516 if (Context.ObjCProtocolClassDecl)
8517 return Context.ObjCProtocolClassDecl;
8518 NewLoaded = Context.getObjCProtocolDecl();
8522 if (Context.Int128Decl)
8523 return Context.Int128Decl;
8524 NewLoaded = Context.getInt128Decl();
8528 if (Context.UInt128Decl)
8529 return Context.UInt128Decl;
8530 NewLoaded = Context.getUInt128Decl();
8534 if (Context.ObjCInstanceTypeDecl)
8535 return Context.ObjCInstanceTypeDecl;
8536 NewLoaded = Context.getObjCInstanceTypeDecl();
8540 if (Context.BuiltinVaListDecl)
8541 return Context.BuiltinVaListDecl;
8542 NewLoaded = Context.getBuiltinVaListDecl();
8546 if (Context.VaListTagDecl)
8547 return Context.VaListTagDecl;
8548 NewLoaded = Context.getVaListTagDecl();
8552 if (Context.BuiltinMSVaListDecl)
8553 return Context.BuiltinMSVaListDecl;
8554 NewLoaded = Context.getBuiltinMSVaListDecl();
8558 if (Context.BuiltinZOSVaListDecl)
8559 return Context.BuiltinZOSVaListDecl;
8560 NewLoaded = Context.getBuiltinZOSVaListDecl();
8565 return Context.getMSGuidTagDecl();
8568 if (Context.ExternCContext)
8569 return Context.ExternCContext;
8570 NewLoaded = Context.getExternCContextDecl();
8574 if (Context.CFConstantStringTypeDecl)
8575 return Context.CFConstantStringTypeDecl;
8576 NewLoaded = Context.getCFConstantStringDecl();
8580 if (Context.CFConstantStringTagDecl)
8581 return Context.CFConstantStringTagDecl;
8582 NewLoaded = Context.getCFConstantStringTagDecl();
8586 return Context.getMSTypeInfoTagDecl();
8588#define BuiltinTemplate(BTName) \
8589 case PREDEF_DECL##BTName##_ID: \
8590 if (Context.Decl##BTName) \
8591 return Context.Decl##BTName; \
8592 NewLoaded = Context.get##BTName##Decl(); \
8594#include "clang/Basic/BuiltinTemplates.inc"
8597 llvm_unreachable(
"Invalid decl ID");
8601 assert(NewLoaded &&
"Failed to load predefined decl?");
8603 if (DeserializationListener)
8604 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8609unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8610 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8611 if (!OwningModuleFile) {
8620 assert(ContextObj &&
"reading decl with no AST context");
8629 Merged.push_back(ID);
8634 unsigned Index = translateGlobalDeclIDToIndex(ID);
8636 if (Index >= DeclsLoaded.size()) {
8637 assert(0 &&
"declaration ID out-of-range for AST file");
8638 Error(
"declaration ID out-of-range for AST file");
8642 return DeclsLoaded[Index];
8649 unsigned Index = translateGlobalDeclIDToIndex(ID);
8651 if (Index >= DeclsLoaded.size()) {
8652 assert(0 &&
"declaration ID out-of-range for AST file");
8653 Error(
"declaration ID out-of-range for AST file");
8657 if (!DeclsLoaded[Index]) {
8659 if (DeserializationListener)
8660 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8663 return DeclsLoaded[Index];
8672 ReadModuleOffsetMap(M);
8682 uint64_t OrignalModuleFileIndex = 0;
8685 OrignalModuleFileIndex = I + 1;
8689 if (!OrignalModuleFileIndex)
8697 if (Idx >=
Record.size()) {
8698 Error(
"Corrupted AST file");
8715 RecordLocation Loc = getLocalBitOffset(Offset);
8716 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8717 Error(std::move(Err));
8720 assert(NumCurrentElementsDeserializing == 0 &&
8721 "should not be called while already deserializing");
8723 return ReadStmtFromStream(*Loc.F);
8726bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8730 auto It = SpecLookups.find(D);
8731 if (It == SpecLookups.end())
8737 It->second.Table.findAll();
8741 SpecLookups.erase(It);
8743 bool NewSpecsFound =
false;
8744 Deserializing LookupResults(
this);
8745 for (
auto &Info : Infos) {
8746 if (GetExistingDecl(Info))
8748 NewSpecsFound =
true;
8752 return NewSpecsFound;
8759 bool NewSpecsFound =
8760 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8762 return NewSpecsFound;
8764 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8765 return NewSpecsFound;
8768bool ASTReader::LoadExternalSpecializationsImpl(
8769 SpecLookupTableTy &SpecLookups,
const Decl *D,
8773 auto It = SpecLookups.find(D);
8774 if (It == SpecLookups.end())
8777 Deserializing LookupResults(
this);
8781 It->second.Table.find(HashValue);
8783 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8785 llvm::raw_string_ostream OS(Name);
8792 bool NewSpecsFound =
false;
8793 for (
auto &Info : Infos) {
8794 if (GetExistingDecl(Info))
8796 NewSpecsFound =
true;
8800 return NewSpecsFound;
8807 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8808 PartialSpecializationsLookups, D, TemplateArgs);
8810 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8812 return NewDeclsFound;
8820 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8821 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8822 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8824 if (!IsKindWeWant(K))
8827 auto ID = (
DeclID) + LexicalDecls[I + 1];
8832 if (PredefsVisited[ID])
8835 PredefsVisited[ID] =
true;
8839 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8847 for (
const auto &Lexical : TULexicalDecls)
8848 Visit(Lexical.first, Lexical.second);
8850 auto I = LexicalDecls.find(DC);
8851 if (I != LexicalDecls.end())
8852 Visit(I->second.first, I->second.second);
8855 ++NumLexicalDeclContextsRead;
8860class UnalignedDeclIDComp {
8866 : Reader(Reader), Mod(M) {}
8875 SourceLocation RHS = getLocation(R);
8880 SourceLocation LHS = getLocation(L);
8894 unsigned Offset,
unsigned Length,
8898 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8899 if (I == FileDeclIDs.end())
8902 FileDeclsInfo &DInfo = I->second;
8903 if (DInfo.Decls.empty())
8910 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8912 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8913 if (BeginIt != DInfo.Decls.begin())
8919 while (BeginIt != DInfo.Decls.begin() &&
8922 ->isTopLevelDeclInObjCContainer())
8926 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8927 if (EndIt != DInfo.Decls.end())
8940 "DeclContext has no visible decls in storage");
8947 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8969 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8970 ++NumVisibleDeclContextsRead;
8971 Find(It->second.Table, Name);
8974 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8975 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8976 ++NumModuleLocalVisibleDeclContexts;
8977 Find(It->second.Table, std::make_pair(Name, NamedModule));
8980 if (
auto *NamedModule =
8981 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8983 FindModuleLocalLookup(NamedModule);
8988 if (ContextObj && ContextObj->getCurrentNamedModule())
8989 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8991 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8992 ++NumTULocalVisibleDeclContexts;
8993 Find(It->second.Table, Name);
9006 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
9007 auto It = LookupTables.find(DC);
9008 if (It == LookupTables.end())
9030 findAll(Lookups, NumVisibleDeclContextsRead);
9031 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
9032 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9034 for (
auto &[Name, DS] : Decls)
9037 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
9042 auto I = Lookups.find(Primary);
9043 return I == Lookups.end() ?
nullptr : &I->second;
9048 auto I = ModuleLocalLookups.find(Primary);
9049 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
9054 auto I = TULocalLookups.find(Primary);
9055 return I == TULocalLookups.end() ?
nullptr : &I->second;
9062 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9063 auto I = LookupTable.find(D);
9064 return I == LookupTable.end() ?
nullptr : &I->second;
9069 return PartialSpecializationsLookups.contains(D) ||
9070 SpecializationsLookups.contains(D);
9079 assert(ImplD && Consumer);
9081 for (
auto *I : ImplD->
methods())
9087void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9088 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9091 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9094void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9095 Consumer->HandleVTable(RD);
9099 this->Consumer = Consumer;
9102 PassInterestingDeclsToConsumer();
9104 if (DeserializationListener)
9105 DeserializationListener->ReaderInitialized(
this);
9109 std::fprintf(
stderr,
"*** AST File Statistics:\n");
9111 unsigned NumTypesLoaded =
9112 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
9113 unsigned NumDeclsLoaded =
9114 DeclsLoaded.size() -
9115 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9116 unsigned NumIdentifiersLoaded =
9117 IdentifiersLoaded.size() -
9119 unsigned NumMacrosLoaded =
9120 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9121 unsigned NumSelectorsLoaded =
9122 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9125 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9126 NumSLocEntriesRead, TotalNumSLocEntries,
9127 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9128 if (!TypesLoaded.empty())
9129 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9130 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9131 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9132 if (!DeclsLoaded.empty())
9133 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9134 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9135 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9136 if (!IdentifiersLoaded.empty())
9137 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9138 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9139 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9140 if (!MacrosLoaded.empty())
9141 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9142 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9143 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9144 if (!SelectorsLoaded.empty())
9145 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9146 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9147 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9148 if (TotalNumStatements)
9149 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9150 NumStatementsRead, TotalNumStatements,
9151 ((
float)NumStatementsRead/TotalNumStatements * 100));
9153 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9154 NumMacrosRead, TotalNumMacros,
9155 ((
float)NumMacrosRead/TotalNumMacros * 100));
9156 if (TotalLexicalDeclContexts)
9157 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9158 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9159 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9161 if (TotalVisibleDeclContexts)
9162 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9163 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9164 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9166 if (TotalModuleLocalVisibleDeclContexts)
9168 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9169 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9170 ((
float)NumModuleLocalVisibleDeclContexts /
9171 TotalModuleLocalVisibleDeclContexts * 100));
9172 if (TotalTULocalVisibleDeclContexts)
9173 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9174 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9175 ((
float)NumTULocalVisibleDeclContexts /
9176 TotalTULocalVisibleDeclContexts * 100));
9177 if (TotalNumMethodPoolEntries)
9178 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9179 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9180 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9182 if (NumMethodPoolLookups)
9183 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9184 NumMethodPoolHits, NumMethodPoolLookups,
9185 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9186 if (NumMethodPoolTableLookups)
9187 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9188 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9189 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9191 if (NumIdentifierLookupHits)
9193 " %u / %u identifier table lookups succeeded (%f%%)\n",
9194 NumIdentifierLookupHits, NumIdentifierLookups,
9195 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9198 std::fprintf(
stderr,
"\n");
9199 GlobalIndex->printStats();
9202 std::fprintf(
stderr,
"\n");
9204 std::fprintf(
stderr,
"\n");
9207template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9208LLVM_DUMP_METHOD
static void
9211 InitialCapacity> &Map) {
9212 if (Map.begin() == Map.end())
9217 llvm::errs() << Name <<
":\n";
9218 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9220 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9225 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9227 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9231 GlobalPreprocessedEntityMap);
9233 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9242 if (llvm::MemoryBuffer *buf = I.Buffer) {
9243 size_t bytes = buf->getBufferSize();
9244 switch (buf->getBufferKind()) {
9245 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9248 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9269 if (!FPPragmaOptions.empty()) {
9270 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9273 SemaObj->CurFPFeatures =
9279 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9280 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9281 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9282 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9284 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9286 DeclsWithEffectsToVerify.clear();
9288 SemaObj->OpenCLFeatures = OpenCLExtensions;
9294 assert(SemaObj &&
"no Sema to update");
9298 if (!SemaDeclRefs.empty()) {
9299 assert(SemaDeclRefs.size() % 3 == 0);
9300 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9301 if (!SemaObj->StdNamespace)
9302 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9303 if (!SemaObj->StdBadAlloc)
9304 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9305 if (!SemaObj->StdAlignValT)
9306 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9308 SemaDeclRefs.clear();
9313 if(OptimizeOffPragmaLocation.isValid())
9314 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9315 if (PragmaMSStructState != -1)
9317 if (PointersToMembersPragmaLocation.isValid()) {
9318 SemaObj->ActOnPragmaMSPointersToMembers(
9320 PragmaMSPointersToMembersState,
9321 PointersToMembersPragmaLocation);
9323 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9324 if (!RISCVVecIntrinsicPragma.empty()) {
9325 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9326 "Wrong number of RISCVVecIntrinsicPragma");
9327 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9328 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9329 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9332 if (PragmaAlignPackCurrentValue) {
9336 bool DropFirst =
false;
9337 if (!PragmaAlignPackStack.empty() &&
9338 PragmaAlignPackStack.front().Location.isInvalid()) {
9339 assert(PragmaAlignPackStack.front().Value ==
9340 SemaObj->AlignPackStack.DefaultValue &&
9341 "Expected a default alignment value");
9342 SemaObj->AlignPackStack.Stack.emplace_back(
9343 PragmaAlignPackStack.front().SlotLabel,
9344 SemaObj->AlignPackStack.CurrentValue,
9345 SemaObj->AlignPackStack.CurrentPragmaLocation,
9346 PragmaAlignPackStack.front().PushLocation);
9349 for (
const auto &Entry :
9350 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9351 SemaObj->AlignPackStack.Stack.emplace_back(
9352 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9354 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9355 assert(*PragmaAlignPackCurrentValue ==
9356 SemaObj->AlignPackStack.DefaultValue &&
9357 "Expected a default align and pack value");
9360 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9361 SemaObj->AlignPackStack.CurrentPragmaLocation =
9362 PragmaAlignPackCurrentLocation;
9365 if (FpPragmaCurrentValue) {
9369 bool DropFirst =
false;
9370 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9371 assert(FpPragmaStack.front().Value ==
9372 SemaObj->FpPragmaStack.DefaultValue &&
9373 "Expected a default pragma float_control value");
9374 SemaObj->FpPragmaStack.Stack.emplace_back(
9375 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9376 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9377 FpPragmaStack.front().PushLocation);
9380 for (
const auto &Entry :
9382 SemaObj->FpPragmaStack.Stack.emplace_back(
9383 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9384 if (FpPragmaCurrentLocation.isInvalid()) {
9385 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9386 "Expected a default pragma float_control value");
9389 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9390 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9395 for (
auto &Import : PendingImportedModulesSema) {
9396 if (Import.ImportLoc.isInvalid())
9399 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9402 PendingImportedModulesSema.clear();
9409 IdentifierLookupVisitor Visitor(Name, 0,
9410 NumIdentifierLookups,
9411 NumIdentifierLookupHits);
9417 if (PP.getLangOpts().CPlusPlus) {
9418 for (
auto *F : ModuleMgr.pch_modules())
9427 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9432 ModuleMgr.visit(Visitor, HitsPtr);
9454 ASTIdentifierLookupTable::key_iterator Current;
9458 ASTIdentifierLookupTable::key_iterator End;
9465 bool SkipModules =
false);
9467 StringRef
Next()
override;
9474 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9478 while (Current == End) {
9490 Current = IdTable->key_begin();
9491 End = IdTable->key_end();
9496 StringRef
Result = *Current;
9505 std::unique_ptr<IdentifierIterator> Current;
9506 std::unique_ptr<IdentifierIterator> Queued;
9509 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9510 std::unique_ptr<IdentifierIterator> Second)
9511 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9513 StringRef
Next()
override {
9517 StringRef result = Current->Next();
9518 if (!result.empty())
9523 std::swap(Current, Queued);
9532 std::unique_ptr<IdentifierIterator> ReaderIter(
9534 std::unique_ptr<IdentifierIterator> ModulesIter(
9535 GlobalIndex->createIdentifierIterator());
9536 return new ChainedIdentifierIterator(std::move(ReaderIter),
9537 std::move(ModulesIter));
9549 unsigned PriorGeneration;
9550 unsigned InstanceBits = 0;
9551 unsigned FactoryBits = 0;
9552 bool InstanceHasMoreThanOneDecl =
false;
9553 bool FactoryHasMoreThanOneDecl =
false;
9559 unsigned PriorGeneration)
9560 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9570 ++Reader.NumMethodPoolTableLookups;
9573 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9574 if (Pos == PoolTable->end())
9577 ++Reader.NumMethodPoolTableHits;
9578 ++Reader.NumSelectorsRead;
9582 ++Reader.NumMethodPoolEntriesRead;
9584 if (Reader.DeserializationListener)
9585 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9590 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9591 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9592 InstanceBits =
Data.InstanceBits;
9593 FactoryBits =
Data.FactoryBits;
9594 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9595 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9601 return InstanceMethods;
9606 return FactoryMethods;
9613 return InstanceHasMoreThanOneDecl;
9631 unsigned &Generation = SelectorGeneration[Sel];
9632 unsigned PriorGeneration = Generation;
9634 SelectorOutOfDate[Sel] =
false;
9637 ++NumMethodPoolLookups;
9639 ModuleMgr.visit(Visitor);
9645 ++NumMethodPoolHits;
9666 if (SelectorOutOfDate[Sel])
9674 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9676 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9677 Namespaces.push_back(Namespace);
9682 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9683 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9684 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9687 Undefined.insert(std::make_pair(D, Loc));
9689 UndefinedButUsed.clear();
9695 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9698 uint64_t Count = DelayedDeleteExprs[Idx++];
9699 for (uint64_t
C = 0;
C < Count; ++
C) {
9702 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9703 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9710 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9711 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9713 TentativeDefs.push_back(Var);
9715 TentativeDefinitions.clear();
9720 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9722 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9726 UnusedFileScopedDecls.clear();
9731 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9733 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9737 DelegatingCtorDecls.clear();
9741 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9743 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9747 ExtVectorDecls.clear();
9751 llvm::SmallPtrSetImpl<const TypedefNameDecl *> &Decls) {
9752 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9755 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9759 UnusedLocalTypedefNameCandidates.clear();
9764 for (
auto I : DeclsToCheckForDeferredDiags) {
9765 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9769 DeclsToCheckForDeferredDiags.clear();
9774 if (ReferencedSelectorsData.empty())
9779 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9781 while (I < DataSize) {
9785 Sels.push_back(std::make_pair(Sel, SelLoc));
9787 ReferencedSelectorsData.clear();
9792 if (WeakUndeclaredIdentifiers.empty())
9795 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9803 WeakIDs.push_back(std::make_pair(WeakId, WI));
9805 WeakUndeclaredIdentifiers.clear();
9809 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9810 if (ExtnameUndeclaredIdentifiers.empty())
9813 for (
unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9820 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
9824 ExtnameIDs.push_back(std::make_pair(NameId,
Attr));
9826 ExtnameUndeclaredIdentifiers.clear();
9830 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9832 VTableUse &TableInfo = VTableUses[Idx++];
9833 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9836 VTables.push_back(VT);
9844 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9845 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9849 Pending.push_back(std::make_pair(D, Loc));
9851 PendingInstantiations.clear();
9855 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9857 for (
auto &LPT : LateParsedTemplates) {
9860 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9864 auto LT = std::make_unique<LateParsedTemplate>();
9865 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9869 assert(F &&
"No module");
9871 unsigned TokN = LateParsed[Idx++];
9872 LT->Toks.reserve(TokN);
9873 for (
unsigned T = 0;
T < TokN; ++
T)
9874 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9876 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9880 LateParsedTemplates.clear();
9889 assert(ID &&
"Non-zero identifier ID required");
9890 unsigned Index = translateIdentifierIDToIndex(ID).second;
9891 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9892 IdentifiersLoaded[Index] = II;
9893 if (DeserializationListener)
9894 DeserializationListener->IdentifierRead(ID, II);
9916 if (NumCurrentElementsDeserializing && !Decls) {
9917 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9921 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9934 Decls->push_back(D);
9941 pushExternalDeclIntoScope(D, II);
9945std::pair<ModuleFile *, unsigned>
9946ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9948 return {
nullptr, 0};
9950 unsigned ModuleFileIndex = ID >> 32;
9951 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9953 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9965 if (IdentifiersLoaded.empty()) {
9966 Error(
"no identifier table in AST file");
9970 auto [M, Index] = translateIdentifierIDToIndex(ID);
9971 if (!IdentifiersLoaded[Index]) {
9972 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9975 const unsigned char *
Data =
9981 auto &II = PP.getIdentifierTable().get(Key);
9982 IdentifiersLoaded[Index] = &II;
9985 if (DeserializationListener)
9986 DeserializationListener->IdentifierRead(ID, &II);
9989 return IdentifiersLoaded[Index];
10001 ReadModuleOffsetMap(M);
10003 unsigned ModuleFileIndex = LocalID >> 32;
10004 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
10007 assert(MF &&
"malformed identifier ID encoding?");
10009 if (!ModuleFileIndex)
10015std::pair<ModuleFile *, unsigned>
10016ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
10018 return {
nullptr, 0};
10020 unsigned ModuleFileIndex = ID >> 32;
10021 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
10025 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10034 if (MacrosLoaded.empty()) {
10035 Error(
"no macro table in AST file");
10039 auto [M, Index] = translateMacroIDToIndex(ID);
10040 if (!MacrosLoaded[Index]) {
10041 assert(M !=
nullptr &&
"Untranslated Macro ID?");
10047 if (DeserializationListener)
10048 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10051 return MacrosLoaded[Index];
10059 ReadModuleOffsetMap(M);
10061 unsigned ModuleFileIndex = LocalID >> 32;
10062 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10065 assert(MF &&
"malformed identifier ID encoding?");
10067 if (!ModuleFileIndex) {
10072 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
10081 ReadModuleOffsetMap(M);
10086 &&
"Invalid index into submodule index remap");
10088 return LocalID + I->second;
10099 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10102 int IndexFromEnd =
static_cast<int>(ID >> 1);
10103 assert(IndexFromEnd &&
"got reference to unknown module file");
10120 auto I = llvm::find(PCHModules, M);
10121 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10122 return std::distance(I, PCHModules.end()) << 1;
10131 const auto &PCHChain = ModuleMgr.pch_modules();
10132 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10133 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10137 llvm::sys::path::parent_path(MF.
FileName),
10140 return std::nullopt;
10144 auto I = DefinitionSource.find(FD);
10145 if (I == DefinitionSource.end())
10151 return ThisDeclarationWasADefinitionSet.contains(FD);
10162 if (ID > SelectorsLoaded.size()) {
10163 Error(
"selector ID out of range in AST file");
10167 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10170 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10174 SelectorsLoaded[ID - 1] =
10176 if (DeserializationListener)
10177 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10180 return SelectorsLoaded[ID - 1];
10198 ReadModuleOffsetMap(M);
10203 &&
"Invalid index into selector index remap");
10205 return LocalID + I->second;
10236 NameInfo.
setName(readDeclarationName());
10250 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10251 assert(Op.isValid());
10257 unsigned NumTPLists =
readInt();
10262 for (
unsigned i = 0; i != NumTPLists; ++i)
10273 unsigned NumParams =
readInt();
10275 Params.reserve(NumParams);
10276 while (NumParams--)
10279 bool HasRequiresClause =
readBool();
10280 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10283 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10284 return TemplateParams;
10289 bool Canonicalize) {
10290 unsigned NumTemplateArgs =
readInt();
10291 TemplArgs.reserve(NumTemplateArgs);
10292 while (NumTemplateArgs--)
10298 unsigned NumDecls =
readInt();
10300 while (NumDecls--) {
10312 bool inheritConstructors =
readBool();
10318 Result.setInheritConstructors(inheritConstructors);
10325 unsigned NumInitializers =
readInt();
10326 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10328 for (
unsigned i = 0; i != NumInitializers; ++i) {
10330 bool IsBaseVirtual =
false;
10361 BOMInit =
new (Context)
10363 RParenLoc, MemberOrEllipsisLoc);
10365 BOMInit =
new (Context)
10368 BOMInit =
new (Context)
10372 BOMInit =
new (Context)
10374 LParenLoc,
Init, RParenLoc);
10377 unsigned SourceOrder =
readInt();
10381 CtorInitializers[i] = BOMInit;
10384 return CtorInitializers;
10392 for (
unsigned I = 0; I != N; ++I) {
10393 auto Kind = readNestedNameSpecifierKind();
10398 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10407 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10413 Builder.MakeGlobal(Context, ColonColonLoc);
10420 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10425 llvm_unreachable(
"unexpected null nested name specifier");
10440 const StringRef Blob) {
10441 unsigned Count =
Record[0];
10442 const char *Byte = Blob.data();
10443 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10444 for (
unsigned I = 0; I < Count; ++Byte)
10445 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10446 if (*Byte & (1 << Bit))
10453 return llvm::APFloat(Sem,
readAPInt());
10458 unsigned Len =
Record[Idx++];
10466 unsigned Len =
Record[Idx++];
10467 StringRef
Result = Blob.substr(0, Len);
10468 Blob = Blob.substr(Len);
10492 unsigned Major =
Record[Idx++];
10493 unsigned Minor =
Record[Idx++];
10494 unsigned Subminor =
Record[Idx++];
10496 return VersionTuple(Major);
10498 return VersionTuple(Major, Minor - 1);
10499 return VersionTuple(Major, Minor - 1, Subminor - 1);
10510 return Diag(CurrentImportLoc, DiagID);
10514 return Diags.Report(Loc, DiagID);
10518 llvm::function_ref<
void()> Fn) {
10521 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10525 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10531 return PP.getIdentifierTable();
10537 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10538 "Already have a SwitchCase with this ID");
10539 (*CurrSwitchCaseStmts)[ID] = SC;
10544 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10545 return (*CurrSwitchCaseStmts)[ID];
10549 CurrSwitchCaseStmts->clear();
10554 std::vector<RawComment *> Comments;
10561 BitstreamCursor &Cursor = I->first;
10568 Cursor.advanceSkippingSubblocks(
10569 BitstreamCursor::AF_DontPopBlockAtEnd);
10571 Error(MaybeEntry.takeError());
10574 llvm::BitstreamEntry Entry = MaybeEntry.get();
10576 switch (Entry.Kind) {
10577 case llvm::BitstreamEntry::SubBlock:
10578 case llvm::BitstreamEntry::Error:
10579 Error(
"malformed block record in AST file");
10581 case llvm::BitstreamEntry::EndBlock:
10583 case llvm::BitstreamEntry::Record:
10591 if (!MaybeComment) {
10592 Error(MaybeComment.takeError());
10601 bool IsTrailingComment =
Record[Idx++];
10602 bool IsAlmostTrailingComment =
Record[Idx++];
10603 Comments.push_back(
new (Context)
RawComment(
10604 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10614 if (Loc.first.isValid())
10615 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10628 assert(NumUserInputs <= NumInputs);
10629 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10630 for (
unsigned I = 0; I < N; ++I) {
10631 bool IsSystem = I >= NumUserInputs;
10633 Visitor(IFI, IsSystem);
10638 bool IncludeSystem,
bool Complain,
10640 bool isSystem)> Visitor) {
10643 assert(NumUserInputs <= NumInputs);
10644 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10645 for (
unsigned I = 0; I < N; ++I) {
10646 bool IsSystem = I >= NumUserInputs;
10647 InputFile IF = getInputFile(MF, I+1, Complain);
10648 Visitor(IF, IsSystem);
10656 for (
unsigned I = 0; I < NumInputs; ++I) {
10659 if (
auto FE = getInputFile(MF, I + 1).getFile())
10664void ASTReader::finishPendingActions() {
10665 while (!PendingIdentifierInfos.empty() ||
10666 !PendingDeducedFunctionTypes.empty() ||
10667 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10668 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10669 !PendingUpdateRecords.empty() ||
10670 !PendingObjCExtensionIvarRedeclarations.empty()) {
10673 using TopLevelDeclsMap =
10674 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10675 TopLevelDeclsMap TopLevelDecls;
10677 while (!PendingIdentifierInfos.empty()) {
10680 std::move(PendingIdentifierInfos.back().second);
10681 PendingIdentifierInfos.pop_back();
10688 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10689 auto *FD = PendingDeducedFunctionTypes[I].first;
10690 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10692 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10695 if (DT->isDeduced()) {
10696 PendingDeducedTypeUpdates.insert(
10697 {FD->getCanonicalDecl(), FD->getReturnType()});
10704 PendingUndeducedFunctionDecls.push_back(FD);
10708 PendingDeducedFunctionTypes.clear();
10712 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10713 auto *VD = PendingDeducedVarTypes[I].first;
10714 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10716 PendingDeducedVarTypes.clear();
10719 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10720 loadPendingDeclChain(PendingDeclChains[I].first,
10721 PendingDeclChains[I].second);
10722 PendingDeclChains.clear();
10725 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10726 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10727 IdentifierInfo *II = TLD->first;
10728 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10734 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10735 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10736 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10737 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10739 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10741 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10742 if (!Info.M->isModule())
10746 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10748 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10749 if (Info.M->isModule())
10753 PendingMacroIDs.clear();
10757 while (!PendingDeclContextInfos.empty()) {
10758 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10759 PendingDeclContextInfos.pop_front();
10762 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10766 while (!PendingUpdateRecords.empty()) {
10767 auto Update = PendingUpdateRecords.pop_back_val();
10768 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10769 loadDeclUpdateRecords(
Update);
10772 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10773 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10774 auto DuplicateIvars =
10775 PendingObjCExtensionIvarRedeclarations.back().second;
10777 StructuralEquivalenceContext Ctx(
10778 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10779 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10783 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10785 for (
auto IvarPair : DuplicateIvars) {
10786 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10788 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10794 ExtensionsPair.first->setInvalidDecl();
10795 ExtensionsPair.second->getClassInterface()
10797 ->setIvarList(
nullptr);
10799 for (
auto IvarPair : DuplicateIvars) {
10800 Diag(IvarPair.first->getLocation(),
10801 diag::err_duplicate_ivar_declaration)
10802 << IvarPair.first->getIdentifier();
10803 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10806 PendingObjCExtensionIvarRedeclarations.pop_back();
10812 assert(PendingFakeDefinitionData.empty() &&
10813 "faked up a class definition but never saw the real one");
10819 for (Decl *D : PendingDefinitions) {
10820 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10821 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10822 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10823 R =
R->getPreviousDecl()) {
10826 "declaration thinks it's the definition but it isn't");
10834 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10839 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10845 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10846 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10853 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10856 PendingDefinitions.clear();
10858 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10859 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10860 if (
auto *VD = dyn_cast<VarDecl>(D))
10861 return VD->isThisDeclarationADefinition() ||
10862 VD->isThisDeclarationADemotedDefinition();
10864 if (
auto *TD = dyn_cast<TagDecl>(D))
10865 return TD->isThisDeclarationADefinition() ||
10866 TD->isThisDeclarationADemotedDefinition();
10868 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10869 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10871 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10872 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10879 return hasDefinitionImpl(D, hasDefinitionImpl);
10895 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10901 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10902 PBEnd = PendingBodies.end();
10903 PB != PBEnd; ++PB) {
10904 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10906 const FunctionDecl *Defn =
nullptr;
10907 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10908 FD->setLazyBody(PB->second);
10910 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10913 if (!FD->isLateTemplateParsed() &&
10914 !NonConstDefn->isLateTemplateParsed() &&
10919 FD->getODRHash() != NonConstDefn->getODRHash()) {
10921 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10922 }
else if (FD->getLexicalParent()->isFileContext() &&
10923 NonConstDefn->getLexicalParent()->isFileContext()) {
10927 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10938 PendingBodies.clear();
10941 for (
auto [RD, MD] : PendingAddedClassMembers) {
10942 RD->addedMember(MD);
10944 PendingAddedClassMembers.clear();
10947 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10949 PendingMergedDefinitionsToDeduplicate.clear();
10953 for (Decl *D : PendingIncompleteDeclChains)
10954 markIncompleteDeclChain(D);
10955 PendingIncompleteDeclChains.clear();
10957 assert(PendingIdentifierInfos.empty() &&
10958 "Should be empty at the end of finishPendingActions");
10959 assert(PendingDeducedFunctionTypes.empty() &&
10960 "Should be empty at the end of finishPendingActions");
10961 assert(PendingDeducedVarTypes.empty() &&
10962 "Should be empty at the end of finishPendingActions");
10963 assert(PendingDeclChains.empty() &&
10964 "Should be empty at the end of finishPendingActions");
10965 assert(PendingMacroIDs.empty() &&
10966 "Should be empty at the end of finishPendingActions");
10967 assert(PendingDeclContextInfos.empty() &&
10968 "Should be empty at the end of finishPendingActions");
10969 assert(PendingUpdateRecords.empty() &&
10970 "Should be empty at the end of finishPendingActions");
10971 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10972 "Should be empty at the end of finishPendingActions");
10973 assert(PendingFakeDefinitionData.empty() &&
10974 "Should be empty at the end of finishPendingActions");
10975 assert(PendingDefinitions.empty() &&
10976 "Should be empty at the end of finishPendingActions");
10977 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10978 "Should be empty at the end of finishPendingActions");
10979 assert(PendingBodies.empty() &&
10980 "Should be empty at the end of finishPendingActions");
10981 assert(PendingAddedClassMembers.empty() &&
10982 "Should be empty at the end of finishPendingActions");
10983 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10984 "Should be empty at the end of finishPendingActions");
10985 assert(PendingIncompleteDeclChains.empty() &&
10986 "Should be empty at the end of finishPendingActions");
10989void ASTReader::diagnoseOdrViolations() {
10990 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10991 PendingRecordOdrMergeFailures.empty() &&
10992 PendingFunctionOdrMergeFailures.empty() &&
10993 PendingEnumOdrMergeFailures.empty() &&
10994 PendingObjCInterfaceOdrMergeFailures.empty() &&
10995 PendingObjCProtocolOdrMergeFailures.empty())
11002 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
11003 PendingOdrMergeFailures.clear();
11004 for (
auto &Merge : OdrMergeFailures) {
11005 Merge.first->buildLookup();
11006 Merge.first->decls_begin();
11007 Merge.first->bases_begin();
11008 Merge.first->vbases_begin();
11009 for (
auto &RecordPair : Merge.second) {
11010 auto *RD = RecordPair.first;
11018 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11019 PendingRecordOdrMergeFailures.clear();
11020 for (
auto &Merge : RecordOdrMergeFailures) {
11021 Merge.first->decls_begin();
11022 for (
auto &D : Merge.second)
11027 auto ObjCInterfaceOdrMergeFailures =
11028 std::move(PendingObjCInterfaceOdrMergeFailures);
11029 PendingObjCInterfaceOdrMergeFailures.clear();
11030 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11031 Merge.first->decls_begin();
11032 for (
auto &InterfacePair : Merge.second)
11033 InterfacePair.first->decls_begin();
11037 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11038 PendingFunctionOdrMergeFailures.clear();
11039 for (
auto &Merge : FunctionOdrMergeFailures) {
11040 Merge.first->buildLookup();
11041 Merge.first->decls_begin();
11042 Merge.first->getBody();
11043 for (
auto &FD : Merge.second) {
11051 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11052 PendingEnumOdrMergeFailures.clear();
11053 for (
auto &Merge : EnumOdrMergeFailures) {
11054 Merge.first->decls_begin();
11055 for (
auto &
Enum : Merge.second) {
11056 Enum->decls_begin();
11061 auto ObjCProtocolOdrMergeFailures =
11062 std::move(PendingObjCProtocolOdrMergeFailures);
11063 PendingObjCProtocolOdrMergeFailures.clear();
11064 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11065 Merge.first->decls_begin();
11066 for (
auto &ProtocolPair : Merge.second)
11067 ProtocolPair.first->decls_begin();
11076 while (!PendingOdrMergeChecks.empty()) {
11077 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11088 bool Found =
false;
11091 for (
auto *RI : D->
redecls()) {
11092 if (RI->getLexicalDeclContext() == CanonDef) {
11106 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11107 for (
auto *CanonMember : CanonDef->
decls()) {
11108 if (CanonMember->getCanonicalDecl() == DCanon) {
11117 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11119 Candidates.push_back(ND);
11132 std::string CanonDefModule =
11137 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11139 if (Candidates.empty())
11141 diag::note_module_odr_violation_no_possible_decls) << D;
11143 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11144 Diag(Candidates[I]->getLocation(),
11145 diag::note_module_odr_violation_possible_decl)
11149 DiagnosedOdrMergeFailures.insert(CanonDef);
11153 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11154 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11155 ObjCInterfaceOdrMergeFailures.empty() &&
11156 ObjCProtocolOdrMergeFailures.empty())
11159 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11163 for (
auto &Merge : OdrMergeFailures) {
11166 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11169 bool Diagnosed =
false;
11170 CXXRecordDecl *FirstRecord = Merge.first;
11171 for (
auto &RecordPair : Merge.second) {
11172 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11173 RecordPair.second)) {
11186 Diag(Merge.first->getLocation(),
11187 diag::err_module_odr_violation_different_instantiations)
11194 for (
auto &Merge : RecordOdrMergeFailures) {
11197 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11200 RecordDecl *FirstRecord = Merge.first;
11201 bool Diagnosed =
false;
11202 for (
auto *SecondRecord : Merge.second) {
11203 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11209 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11213 for (
auto &Merge : FunctionOdrMergeFailures) {
11214 FunctionDecl *FirstFunction = Merge.first;
11215 bool Diagnosed =
false;
11216 for (
auto &SecondFunction : Merge.second) {
11217 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11223 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11227 for (
auto &Merge : EnumOdrMergeFailures) {
11230 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11233 EnumDecl *FirstEnum = Merge.first;
11234 bool Diagnosed =
false;
11235 for (
auto &SecondEnum : Merge.second) {
11236 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11242 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11245 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11248 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11251 bool Diagnosed =
false;
11252 ObjCInterfaceDecl *FirstID = Merge.first;
11253 for (
auto &InterfacePair : Merge.second) {
11254 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11255 InterfacePair.second)) {
11261 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11264 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11267 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11270 ObjCProtocolDecl *FirstProtocol = Merge.first;
11271 bool Diagnosed =
false;
11272 for (
auto &ProtocolPair : Merge.second) {
11273 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11274 ProtocolPair.second)) {
11280 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11285 if (llvm::Timer *
T = ReadTimer.get();
11286 ++NumCurrentElementsDeserializing == 1 &&
T)
11287 ReadTimeRegion.emplace(
T);
11291 assert(NumCurrentElementsDeserializing &&
11292 "FinishedDeserializing not paired with StartedDeserializing");
11293 if (NumCurrentElementsDeserializing == 1) {
11296 finishPendingActions();
11298 --NumCurrentElementsDeserializing;
11300 if (NumCurrentElementsDeserializing == 0) {
11304 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11312 while (!PendingExceptionSpecUpdates.empty() ||
11313 !PendingDeducedTypeUpdates.empty() ||
11314 !PendingUndeducedFunctionDecls.empty()) {
11315 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11316 PendingExceptionSpecUpdates.clear();
11317 for (
auto Update : ESUpdates) {
11318 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11321 if (
auto *Listener =
getContext().getASTMutationListener())
11323 for (
auto *Redecl :
Update.second->redecls())
11327 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11328 PendingDeducedTypeUpdates.clear();
11329 for (
auto Update : DTUpdates) {
11330 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11337 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11338 PendingUndeducedFunctionDecls.clear();
11342 (void)UndeducedFD->getMostRecentDecl();
11345 ReadTimeRegion.reset();
11347 diagnoseOdrViolations();
11353 PassInterestingDeclsToConsumer();
11360 auto It = PendingFakeLookupResults.find(II);
11361 if (It != PendingFakeLookupResults.end()) {
11362 for (
auto *ND : It->second)
11367 It->second.clear();
11371 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11372 SemaObj->TUScope->AddDecl(D);
11373 }
else if (SemaObj->TUScope) {
11377 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11378 SemaObj->TUScope->AddDecl(D);
11386 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11387 StringRef isysroot,
11389 bool AllowASTWithCompilerErrors,
11390 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11391 bool ForceValidateUserInputs,
11392 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11393 std::unique_ptr<llvm::Timer> ReadTimer)
11398 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11399 StackHandler(Diags), PP(PP), ContextObj(Context),
11400 CodeGenOpts(CodeGenOpts),
11402 PP.getHeaderSearchInfo()),
11403 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11404 DisableValidationKind(DisableValidationKind),
11405 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11406 AllowConfigurationMismatch(AllowConfigurationMismatch),
11407 ValidateSystemInputs(ValidateSystemInputs),
11408 ForceValidateUserInputs(ForceValidateUserInputs),
11409 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11410 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11411 SourceMgr.setExternalSLocEntrySource(
this);
11413 PathBuf.reserve(256);
11415 for (
const auto &Ext : Extensions) {
11416 auto BlockName = Ext->getExtensionMetadata().BlockName;
11417 auto Known = ModuleFileExtensions.find(BlockName);
11418 if (Known != ModuleFileExtensions.end()) {
11419 Diags.Report(diag::warn_duplicate_module_file_extension)
11424 ModuleFileExtensions.insert({BlockName, Ext});
11429 if (OwnsDeserializationListener)
11430 delete DeserializationListener;
11434 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11438 unsigned AbbrevID) {
11441 return Cursor.readRecord(AbbrevID, Record);
11457 : Record(Record), Context(Record.getContext()) {}
11458#define GEN_CLANG_CLAUSE_CLASS
11459#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11460#include "llvm/Frontend/OpenMP/OMP.inc"
11474 switch (llvm::omp::Clause(Record.readInt())) {
11475 case llvm::omp::OMPC_if:
11478 case llvm::omp::OMPC_final:
11481 case llvm::omp::OMPC_num_threads:
11484 case llvm::omp::OMPC_safelen:
11487 case llvm::omp::OMPC_simdlen:
11490 case llvm::omp::OMPC_sizes: {
11491 unsigned NumSizes = Record.readInt();
11495 case llvm::omp::OMPC_counts: {
11496 unsigned NumCounts = Record.readInt();
11500 case llvm::omp::OMPC_permutation: {
11501 unsigned NumLoops = Record.readInt();
11505 case llvm::omp::OMPC_full:
11508 case llvm::omp::OMPC_partial:
11511 case llvm::omp::OMPC_looprange:
11514 case llvm::omp::OMPC_allocator:
11517 case llvm::omp::OMPC_collapse:
11520 case llvm::omp::OMPC_default:
11523 case llvm::omp::OMPC_proc_bind:
11524 C =
new (Context) OMPProcBindClause();
11526 case llvm::omp::OMPC_schedule:
11527 C =
new (Context) OMPScheduleClause();
11529 case llvm::omp::OMPC_ordered:
11530 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11532 case llvm::omp::OMPC_nowait:
11533 C =
new (Context) OMPNowaitClause();
11535 case llvm::omp::OMPC_untied:
11536 C =
new (Context) OMPUntiedClause();
11538 case llvm::omp::OMPC_mergeable:
11539 C =
new (Context) OMPMergeableClause();
11541 case llvm::omp::OMPC_threadset:
11544 case llvm::omp::OMPC_transparent:
11545 C =
new (Context) OMPTransparentClause();
11547 case llvm::omp::OMPC_read:
11548 C =
new (Context) OMPReadClause();
11550 case llvm::omp::OMPC_write:
11551 C =
new (Context) OMPWriteClause();
11553 case llvm::omp::OMPC_update:
11554 C =
new (Context) OMPUpdateClause();
11556 case llvm::omp::OMPC_update_depend_objects:
11557 C = OMPUpdateDependObjectsClause::CreateEmpty(Context);
11559 case llvm::omp::OMPC_capture:
11560 C =
new (Context) OMPCaptureClause();
11562 case llvm::omp::OMPC_compare:
11563 C =
new (Context) OMPCompareClause();
11565 case llvm::omp::OMPC_fail:
11566 C =
new (Context) OMPFailClause();
11568 case llvm::omp::OMPC_seq_cst:
11569 C =
new (Context) OMPSeqCstClause();
11571 case llvm::omp::OMPC_acq_rel:
11572 C =
new (Context) OMPAcqRelClause();
11574 case llvm::omp::OMPC_absent: {
11575 unsigned NumKinds = Record.readInt();
11576 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11579 case llvm::omp::OMPC_holds:
11580 C =
new (Context) OMPHoldsClause();
11582 case llvm::omp::OMPC_contains: {
11583 unsigned NumKinds = Record.readInt();
11584 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11587 case llvm::omp::OMPC_no_openmp:
11588 C =
new (Context) OMPNoOpenMPClause();
11590 case llvm::omp::OMPC_no_openmp_routines:
11591 C =
new (Context) OMPNoOpenMPRoutinesClause();
11593 case llvm::omp::OMPC_no_openmp_constructs:
11594 C =
new (Context) OMPNoOpenMPConstructsClause();
11596 case llvm::omp::OMPC_no_parallelism:
11597 C =
new (Context) OMPNoParallelismClause();
11599 case llvm::omp::OMPC_acquire:
11600 C =
new (Context) OMPAcquireClause();
11602 case llvm::omp::OMPC_release:
11603 C =
new (Context) OMPReleaseClause();
11605 case llvm::omp::OMPC_relaxed:
11606 C =
new (Context) OMPRelaxedClause();
11608 case llvm::omp::OMPC_weak:
11609 C =
new (Context) OMPWeakClause();
11611 case llvm::omp::OMPC_threads:
11614 case llvm::omp::OMPC_simd:
11617 case llvm::omp::OMPC_nogroup:
11620 case llvm::omp::OMPC_unified_address:
11621 C =
new (Context) OMPUnifiedAddressClause();
11623 case llvm::omp::OMPC_unified_shared_memory:
11624 C =
new (Context) OMPUnifiedSharedMemoryClause();
11626 case llvm::omp::OMPC_reverse_offload:
11627 C =
new (Context) OMPReverseOffloadClause();
11629 case llvm::omp::OMPC_dynamic_allocators:
11630 C =
new (Context) OMPDynamicAllocatorsClause();
11632 case llvm::omp::OMPC_atomic_default_mem_order:
11633 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11635 case llvm::omp::OMPC_self_maps:
11636 C =
new (Context) OMPSelfMapsClause();
11638 case llvm::omp::OMPC_at:
11639 C =
new (Context) OMPAtClause();
11641 case llvm::omp::OMPC_severity:
11642 C =
new (Context) OMPSeverityClause();
11644 case llvm::omp::OMPC_message:
11645 C =
new (Context) OMPMessageClause();
11647 case llvm::omp::OMPC_private:
11648 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11650 case llvm::omp::OMPC_firstprivate:
11651 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11653 case llvm::omp::OMPC_lastprivate:
11654 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11656 case llvm::omp::OMPC_shared:
11657 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11659 case llvm::omp::OMPC_reduction: {
11660 unsigned N = Record.readInt();
11662 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11665 case llvm::omp::OMPC_task_reduction:
11666 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11668 case llvm::omp::OMPC_in_reduction:
11669 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11671 case llvm::omp::OMPC_linear:
11672 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11674 case llvm::omp::OMPC_aligned:
11677 case llvm::omp::OMPC_copyin:
11680 case llvm::omp::OMPC_copyprivate:
11683 case llvm::omp::OMPC_flush:
11686 case llvm::omp::OMPC_depobj:
11689 case llvm::omp::OMPC_depend: {
11690 unsigned NumVars = Record.readInt();
11691 unsigned NumLoops = Record.readInt();
11695 case llvm::omp::OMPC_device:
11698 case llvm::omp::OMPC_map: {
11700 Sizes.
NumVars = Record.readInt();
11707 case llvm::omp::OMPC_num_teams:
11710 case llvm::omp::OMPC_thread_limit:
11713 case llvm::omp::OMPC_priority:
11716 case llvm::omp::OMPC_grainsize:
11719 case llvm::omp::OMPC_num_tasks:
11722 case llvm::omp::OMPC_hint:
11725 case llvm::omp::OMPC_dist_schedule:
11728 case llvm::omp::OMPC_defaultmap:
11731 case llvm::omp::OMPC_to: {
11733 Sizes.
NumVars = Record.readInt();
11740 case llvm::omp::OMPC_from: {
11742 Sizes.
NumVars = Record.readInt();
11749 case llvm::omp::OMPC_use_device_ptr: {
11751 Sizes.
NumVars = Record.readInt();
11758 case llvm::omp::OMPC_use_device_addr: {
11760 Sizes.
NumVars = Record.readInt();
11767 case llvm::omp::OMPC_is_device_ptr: {
11769 Sizes.
NumVars = Record.readInt();
11776 case llvm::omp::OMPC_has_device_addr: {
11778 Sizes.
NumVars = Record.readInt();
11785 case llvm::omp::OMPC_allocate:
11788 case llvm::omp::OMPC_nontemporal:
11791 case llvm::omp::OMPC_inclusive:
11794 case llvm::omp::OMPC_exclusive:
11797 case llvm::omp::OMPC_order:
11800 case llvm::omp::OMPC_init: {
11801 unsigned VarListSize = Record.readInt();
11802 unsigned NumAttrs = Record.readInt();
11807 case llvm::omp::OMPC_use:
11810 case llvm::omp::OMPC_destroy:
11813 case llvm::omp::OMPC_novariants:
11816 case llvm::omp::OMPC_nocontext:
11819 case llvm::omp::OMPC_detach:
11822 case llvm::omp::OMPC_uses_allocators:
11825 case llvm::omp::OMPC_affinity:
11828 case llvm::omp::OMPC_filter:
11831 case llvm::omp::OMPC_bind:
11834 case llvm::omp::OMPC_align:
11837 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11840 case llvm::omp::OMPC_dyn_groupprivate:
11843 case llvm::omp::OMPC_doacross: {
11844 unsigned NumVars = Record.readInt();
11845 unsigned NumLoops = Record.readInt();
11849 case llvm::omp::OMPC_ompx_attribute:
11852 case llvm::omp::OMPC_ompx_bare:
11855#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11856 case llvm::omp::Enum: \
11858#include "llvm/Frontend/OpenMP/OMPKinds.def"
11862 assert(
C &&
"Unknown OMPClause type");
11865 C->setLocStart(Record.readSourceLocation());
11866 C->setLocEnd(Record.readSourceLocation());
11872 C->setPreInitStmt(Record.readSubStmt(),
11878 C->setPostUpdateExpr(Record.readSubExpr());
11881void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11884 C->setNameModifierLoc(
Record.readSourceLocation());
11885 C->setColonLoc(
Record.readSourceLocation());
11886 C->setCondition(
Record.readSubExpr());
11887 C->setLParenLoc(
Record.readSourceLocation());
11892 C->setCondition(
Record.readSubExpr());
11893 C->setLParenLoc(
Record.readSourceLocation());
11897 C->setPrescriptivenessModifier(
11899 C->setPrescriptivenessModifierLoc(Record.readSourceLocation());
11901 C->setDimsModifierLoc(Record.readSourceLocation());
11902 C->setDimsModifierExpr(Record.readSubExpr());
11904 C->setLParenLoc(Record.readSourceLocation());
11905 unsigned NumVars =
C->varlist_size();
11906 SmallVector<Expr *, 16> Vars;
11907 Vars.reserve(NumVars);
11908 for (
unsigned I = 0; I != NumVars; ++I)
11909 Vars.push_back(Record.readSubExpr());
11910 C->setVarRefs(Vars);
11914 C->setSafelen(Record.readSubExpr());
11915 C->setLParenLoc(Record.readSourceLocation());
11919 C->setSimdlen(Record.readSubExpr());
11920 C->setLParenLoc(Record.readSourceLocation());
11924 for (Expr *&E :
C->getSizesRefs())
11925 E = Record.readSubExpr();
11926 C->setLParenLoc(Record.readSourceLocation());
11930 bool HasFill = Record.readBool();
11932 C->setOmpFillIndex(Record.readInt());
11933 C->setOmpFillLoc(Record.readSourceLocation());
11934 for (Expr *&E :
C->getCountsRefs())
11935 E = Record.readSubExpr();
11936 C->setLParenLoc(Record.readSourceLocation());
11940 for (Expr *&E :
C->getArgsRefs())
11941 E = Record.readSubExpr();
11942 C->setLParenLoc(Record.readSourceLocation());
11948 C->setFactor(Record.readSubExpr());
11949 C->setLParenLoc(Record.readSourceLocation());
11953 C->setFirst(Record.readSubExpr());
11954 C->setCount(Record.readSubExpr());
11955 C->setLParenLoc(Record.readSourceLocation());
11956 C->setFirstLoc(Record.readSourceLocation());
11957 C->setCountLoc(Record.readSourceLocation());
11961 C->setAllocator(Record.readExpr());
11962 C->setLParenLoc(Record.readSourceLocation());
11966 C->setNumForLoops(Record.readSubExpr());
11967 C->setLParenLoc(Record.readSourceLocation());
11971 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11972 C->setLParenLoc(Record.readSourceLocation());
11973 C->setDefaultKindKwLoc(Record.readSourceLocation());
11974 C->setDefaultVariableCategory(
11976 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11982 C->setLParenLoc(Record.readSourceLocation());
11983 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11984 C->setThreadsetKindLoc(ThreadsetKindLoc);
11987 C->setThreadsetKind(TKind);
11990void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11991 C->setLParenLoc(Record.readSourceLocation());
11992 C->setImpexTypeKind(Record.readSubExpr());
11995void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11996 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11997 C->setLParenLoc(Record.readSourceLocation());
11998 C->setProcBindKindKwLoc(Record.readSourceLocation());
12001void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
12003 C->setScheduleKind(
12005 C->setFirstScheduleModifier(
12007 C->setSecondScheduleModifier(
12009 C->setChunkSize(Record.readSubExpr());
12010 C->setLParenLoc(Record.readSourceLocation());
12011 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12012 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12013 C->setScheduleKindLoc(Record.readSourceLocation());
12014 C->setCommaLoc(Record.readSourceLocation());
12017void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
12018 C->setNumForLoops(Record.readSubExpr());
12019 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12020 C->setLoopNumIterations(I, Record.readSubExpr());
12021 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12022 C->setLoopCounter(I, Record.readSubExpr());
12023 C->setLParenLoc(Record.readSourceLocation());
12026void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
12027 C->setEventHandler(Record.readSubExpr());
12028 C->setLParenLoc(Record.readSourceLocation());
12031void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
12032 C->setCondition(Record.readSubExpr());
12033 C->setLParenLoc(Record.readSourceLocation());
12036void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12038void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12040void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12042void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12044void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
12046void OMPClauseReader::VisitOMPUpdateDependObjectsClause(
12047 OMPUpdateDependObjectsClause *
C) {
12048 C->setLParenLoc(Record.readSourceLocation());
12049 C->setArgumentLoc(Record.readSourceLocation());
12053void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12055void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12059void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
12060 C->setLParenLoc(Record.readSourceLocation());
12061 SourceLocation FailParameterLoc = Record.readSourceLocation();
12062 C->setFailParameterLoc(FailParameterLoc);
12064 C->setFailParameter(CKind);
12067void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
12068 unsigned Count =
C->getDirectiveKinds().size();
12069 C->setLParenLoc(Record.readSourceLocation());
12070 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12071 DKVec.reserve(Count);
12072 for (
unsigned I = 0; I < Count; I++) {
12075 C->setDirectiveKinds(DKVec);
12078void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
12079 C->setExpr(Record.readExpr());
12080 C->setLParenLoc(Record.readSourceLocation());
12083void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
12084 unsigned Count =
C->getDirectiveKinds().size();
12085 C->setLParenLoc(Record.readSourceLocation());
12086 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12087 DKVec.reserve(Count);
12088 for (
unsigned I = 0; I < Count; I++) {
12091 C->setDirectiveKinds(DKVec);
12094void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12096void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12097 OMPNoOpenMPRoutinesClause *) {}
12099void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12100 OMPNoOpenMPConstructsClause *) {}
12102void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12104void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12106void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12108void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12110void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12112void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12114void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12116void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12118void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12120void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12122void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
12123 unsigned NumVars =
C->varlist_size();
12124 SmallVector<Expr *, 16> Vars;
12125 Vars.reserve(NumVars);
12126 for (
unsigned I = 0; I != NumVars; ++I)
12127 Vars.push_back(Record.readSubExpr());
12128 C->setVarRefs(Vars);
12129 C->setIsTarget(Record.readBool());
12130 C->setIsTargetSync(Record.readBool());
12131 C->setHasPreferAttrs(Record.readBool());
12133 unsigned NumPrefs =
C->varlist_size() - 1;
12134 SmallVector<unsigned, 4> Counts;
12135 SmallVector<Expr *, 8> Attrs;
12136 Counts.reserve(NumPrefs);
12137 for (
unsigned I = 0; I < NumPrefs; ++I) {
12138 unsigned NA = Record.readInt();
12139 Counts.push_back(NA);
12140 for (
unsigned J = 0; J < NA; ++J)
12141 Attrs.push_back(Record.readSubExpr());
12143 C->setAttrs(Counts, Attrs);
12145 C->setLParenLoc(Record.readSourceLocation());
12146 C->setVarLoc(Record.readSourceLocation());
12149void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12150 C->setInteropVar(Record.readSubExpr());
12151 C->setLParenLoc(Record.readSourceLocation());
12152 C->setVarLoc(Record.readSourceLocation());
12155void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12156 C->setInteropVar(Record.readSubExpr());
12157 C->setLParenLoc(Record.readSourceLocation());
12158 C->setVarLoc(Record.readSourceLocation());
12161void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12163 C->setCondition(Record.readSubExpr());
12164 C->setLParenLoc(Record.readSourceLocation());
12167void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12169 C->setCondition(Record.readSubExpr());
12170 C->setLParenLoc(Record.readSourceLocation());
12173void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12175void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12176 OMPUnifiedSharedMemoryClause *) {}
12178void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12181OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12184void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12185 OMPAtomicDefaultMemOrderClause *
C) {
12186 C->setAtomicDefaultMemOrderKind(
12188 C->setLParenLoc(Record.readSourceLocation());
12189 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12192void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12194void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12196 C->setLParenLoc(Record.readSourceLocation());
12197 C->setAtKindKwLoc(Record.readSourceLocation());
12200void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12202 C->setLParenLoc(Record.readSourceLocation());
12203 C->setSeverityKindKwLoc(Record.readSourceLocation());
12206void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12208 C->setMessageString(Record.readSubExpr());
12209 C->setLParenLoc(Record.readSourceLocation());
12212void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12213 C->setLParenLoc(Record.readSourceLocation());
12214 unsigned NumVars =
C->varlist_size();
12215 SmallVector<Expr *, 16> Vars;
12216 Vars.reserve(NumVars);
12217 for (
unsigned i = 0; i != NumVars; ++i)
12218 Vars.push_back(Record.readSubExpr());
12219 C->setVarRefs(Vars);
12221 for (
unsigned i = 0; i != NumVars; ++i)
12222 Vars.push_back(Record.readSubExpr());
12223 C->setPrivateCopies(Vars);
12226void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12228 C->setLParenLoc(Record.readSourceLocation());
12229 unsigned NumVars =
C->varlist_size();
12230 SmallVector<Expr *, 16> Vars;
12231 Vars.reserve(NumVars);
12232 for (
unsigned i = 0; i != NumVars; ++i)
12233 Vars.push_back(Record.readSubExpr());
12234 C->setVarRefs(Vars);
12236 for (
unsigned i = 0; i != NumVars; ++i)
12237 Vars.push_back(Record.readSubExpr());
12238 C->setPrivateCopies(Vars);
12240 for (
unsigned i = 0; i != NumVars; ++i)
12241 Vars.push_back(Record.readSubExpr());
12245void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12247 C->setLParenLoc(Record.readSourceLocation());
12249 C->setKindLoc(Record.readSourceLocation());
12250 C->setColonLoc(Record.readSourceLocation());
12251 unsigned NumVars =
C->varlist_size();
12252 SmallVector<Expr *, 16> Vars;
12253 Vars.reserve(NumVars);
12254 for (
unsigned i = 0; i != NumVars; ++i)
12255 Vars.push_back(Record.readSubExpr());
12256 C->setVarRefs(Vars);
12258 for (
unsigned i = 0; i != NumVars; ++i)
12259 Vars.push_back(Record.readSubExpr());
12260 C->setPrivateCopies(Vars);
12262 for (
unsigned i = 0; i != NumVars; ++i)
12263 Vars.push_back(Record.readSubExpr());
12264 C->setSourceExprs(Vars);
12266 for (
unsigned i = 0; i != NumVars; ++i)
12267 Vars.push_back(Record.readSubExpr());
12268 C->setDestinationExprs(Vars);
12270 for (
unsigned i = 0; i != NumVars; ++i)
12271 Vars.push_back(Record.readSubExpr());
12272 C->setAssignmentOps(Vars);
12275void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12276 C->setLParenLoc(Record.readSourceLocation());
12277 unsigned NumVars =
C->varlist_size();
12278 SmallVector<Expr *, 16> Vars;
12279 Vars.reserve(NumVars);
12280 for (
unsigned i = 0; i != NumVars; ++i)
12281 Vars.push_back(Record.readSubExpr());
12282 C->setVarRefs(Vars);
12285void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12287 C->setLParenLoc(Record.readSourceLocation());
12288 C->setModifierLoc(Record.readSourceLocation());
12289 C->setColonLoc(Record.readSourceLocation());
12290 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12291 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12292 C->setQualifierLoc(NNSL);
12293 C->setNameInfo(DNI);
12295 unsigned NumVars =
C->varlist_size();
12296 SmallVector<Expr *, 16> Vars;
12297 Vars.reserve(NumVars);
12298 for (
unsigned i = 0; i != NumVars; ++i)
12299 Vars.push_back(Record.readSubExpr());
12300 C->setVarRefs(Vars);
12302 for (
unsigned i = 0; i != NumVars; ++i)
12303 Vars.push_back(Record.readSubExpr());
12304 C->setPrivates(Vars);
12306 for (
unsigned i = 0; i != NumVars; ++i)
12307 Vars.push_back(Record.readSubExpr());
12308 C->setLHSExprs(Vars);
12310 for (
unsigned i = 0; i != NumVars; ++i)
12311 Vars.push_back(Record.readSubExpr());
12312 C->setRHSExprs(Vars);
12314 for (
unsigned i = 0; i != NumVars; ++i)
12315 Vars.push_back(Record.readSubExpr());
12316 C->setReductionOps(Vars);
12317 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12319 for (
unsigned i = 0; i != NumVars; ++i)
12320 Vars.push_back(Record.readSubExpr());
12321 C->setInscanCopyOps(Vars);
12323 for (
unsigned i = 0; i != NumVars; ++i)
12324 Vars.push_back(Record.readSubExpr());
12325 C->setInscanCopyArrayTemps(Vars);
12327 for (
unsigned i = 0; i != NumVars; ++i)
12328 Vars.push_back(Record.readSubExpr());
12329 C->setInscanCopyArrayElems(Vars);
12331 unsigned NumFlags = Record.readInt();
12332 SmallVector<bool, 16> Flags;
12333 Flags.reserve(NumFlags);
12334 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12335 Flags.push_back(Record.readInt());
12336 C->setPrivateVariableReductionFlags(Flags);
12339void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12341 C->setLParenLoc(Record.readSourceLocation());
12342 C->setColonLoc(Record.readSourceLocation());
12343 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12344 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12345 C->setQualifierLoc(NNSL);
12346 C->setNameInfo(DNI);
12348 unsigned NumVars =
C->varlist_size();
12349 SmallVector<Expr *, 16> Vars;
12350 Vars.reserve(NumVars);
12351 for (
unsigned I = 0; I != NumVars; ++I)
12352 Vars.push_back(Record.readSubExpr());
12353 C->setVarRefs(Vars);
12355 for (
unsigned I = 0; I != NumVars; ++I)
12356 Vars.push_back(Record.readSubExpr());
12357 C->setPrivates(Vars);
12359 for (
unsigned I = 0; I != NumVars; ++I)
12360 Vars.push_back(Record.readSubExpr());
12361 C->setLHSExprs(Vars);
12363 for (
unsigned I = 0; I != NumVars; ++I)
12364 Vars.push_back(Record.readSubExpr());
12365 C->setRHSExprs(Vars);
12367 for (
unsigned I = 0; I != NumVars; ++I)
12368 Vars.push_back(Record.readSubExpr());
12369 C->setReductionOps(Vars);
12372void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12374 C->setLParenLoc(Record.readSourceLocation());
12375 C->setColonLoc(Record.readSourceLocation());
12376 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12377 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12378 C->setQualifierLoc(NNSL);
12379 C->setNameInfo(DNI);
12381 unsigned NumVars =
C->varlist_size();
12382 SmallVector<Expr *, 16> Vars;
12383 Vars.reserve(NumVars);
12384 for (
unsigned I = 0; I != NumVars; ++I)
12385 Vars.push_back(Record.readSubExpr());
12386 C->setVarRefs(Vars);
12388 for (
unsigned I = 0; I != NumVars; ++I)
12389 Vars.push_back(Record.readSubExpr());
12390 C->setPrivates(Vars);
12392 for (
unsigned I = 0; I != NumVars; ++I)
12393 Vars.push_back(Record.readSubExpr());
12394 C->setLHSExprs(Vars);
12396 for (
unsigned I = 0; I != NumVars; ++I)
12397 Vars.push_back(Record.readSubExpr());
12398 C->setRHSExprs(Vars);
12400 for (
unsigned I = 0; I != NumVars; ++I)
12401 Vars.push_back(Record.readSubExpr());
12402 C->setReductionOps(Vars);
12404 for (
unsigned I = 0; I != NumVars; ++I)
12405 Vars.push_back(Record.readSubExpr());
12406 C->setTaskgroupDescriptors(Vars);
12409void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12411 C->setLParenLoc(Record.readSourceLocation());
12412 C->setColonLoc(Record.readSourceLocation());
12414 C->setModifierLoc(Record.readSourceLocation());
12415 unsigned NumVars =
C->varlist_size();
12416 SmallVector<Expr *, 16> Vars;
12417 Vars.reserve(NumVars);
12418 for (
unsigned i = 0; i != NumVars; ++i)
12419 Vars.push_back(Record.readSubExpr());
12420 C->setVarRefs(Vars);
12422 for (
unsigned i = 0; i != NumVars; ++i)
12423 Vars.push_back(Record.readSubExpr());
12424 C->setPrivates(Vars);
12426 for (
unsigned i = 0; i != NumVars; ++i)
12427 Vars.push_back(Record.readSubExpr());
12430 for (
unsigned i = 0; i != NumVars; ++i)
12431 Vars.push_back(Record.readSubExpr());
12432 C->setUpdates(Vars);
12434 for (
unsigned i = 0; i != NumVars; ++i)
12435 Vars.push_back(Record.readSubExpr());
12436 C->setFinals(Vars);
12437 C->setStep(Record.readSubExpr());
12438 C->setCalcStep(Record.readSubExpr());
12440 for (
unsigned I = 0; I != NumVars + 1; ++I)
12441 Vars.push_back(Record.readSubExpr());
12442 C->setUsedExprs(Vars);
12445void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12446 C->setLParenLoc(Record.readSourceLocation());
12447 C->setColonLoc(Record.readSourceLocation());
12448 unsigned NumVars =
C->varlist_size();
12449 SmallVector<Expr *, 16> Vars;
12450 Vars.reserve(NumVars);
12451 for (
unsigned i = 0; i != NumVars; ++i)
12452 Vars.push_back(Record.readSubExpr());
12453 C->setVarRefs(Vars);
12454 C->setAlignment(Record.readSubExpr());
12457void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12458 C->setLParenLoc(Record.readSourceLocation());
12459 unsigned NumVars =
C->varlist_size();
12460 SmallVector<Expr *, 16> Exprs;
12461 Exprs.reserve(NumVars);
12462 for (
unsigned i = 0; i != NumVars; ++i)
12463 Exprs.push_back(Record.readSubExpr());
12464 C->setVarRefs(Exprs);
12466 for (
unsigned i = 0; i != NumVars; ++i)
12467 Exprs.push_back(Record.readSubExpr());
12468 C->setSourceExprs(Exprs);
12470 for (
unsigned i = 0; i != NumVars; ++i)
12471 Exprs.push_back(Record.readSubExpr());
12472 C->setDestinationExprs(Exprs);
12474 for (
unsigned i = 0; i != NumVars; ++i)
12475 Exprs.push_back(Record.readSubExpr());
12476 C->setAssignmentOps(Exprs);
12479void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12480 C->setLParenLoc(Record.readSourceLocation());
12481 unsigned NumVars =
C->varlist_size();
12482 SmallVector<Expr *, 16> Exprs;
12483 Exprs.reserve(NumVars);
12484 for (
unsigned i = 0; i != NumVars; ++i)
12485 Exprs.push_back(Record.readSubExpr());
12486 C->setVarRefs(Exprs);
12488 for (
unsigned i = 0; i != NumVars; ++i)
12489 Exprs.push_back(Record.readSubExpr());
12490 C->setSourceExprs(Exprs);
12492 for (
unsigned i = 0; i != NumVars; ++i)
12493 Exprs.push_back(Record.readSubExpr());
12494 C->setDestinationExprs(Exprs);
12496 for (
unsigned i = 0; i != NumVars; ++i)
12497 Exprs.push_back(Record.readSubExpr());
12498 C->setAssignmentOps(Exprs);
12501void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12502 C->setLParenLoc(Record.readSourceLocation());
12503 unsigned NumVars =
C->varlist_size();
12504 SmallVector<Expr *, 16> Vars;
12505 Vars.reserve(NumVars);
12506 for (
unsigned i = 0; i != NumVars; ++i)
12507 Vars.push_back(Record.readSubExpr());
12508 C->setVarRefs(Vars);
12511void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12512 C->setDepobj(Record.readSubExpr());
12513 C->setLParenLoc(Record.readSourceLocation());
12516void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12517 C->setLParenLoc(Record.readSourceLocation());
12518 C->setModifier(Record.readSubExpr());
12519 C->setDependencyKind(
12521 C->setDependencyLoc(Record.readSourceLocation());
12522 C->setColonLoc(Record.readSourceLocation());
12523 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12524 unsigned NumVars =
C->varlist_size();
12525 SmallVector<Expr *, 16> Vars;
12526 Vars.reserve(NumVars);
12527 for (
unsigned I = 0; I != NumVars; ++I)
12528 Vars.push_back(Record.readSubExpr());
12529 C->setVarRefs(Vars);
12530 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12531 C->setLoopData(I, Record.readSubExpr());
12534void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12537 C->setDevice(Record.readSubExpr());
12538 C->setModifierLoc(Record.readSourceLocation());
12539 C->setLParenLoc(Record.readSourceLocation());
12542void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12543 C->setLParenLoc(Record.readSourceLocation());
12544 bool HasIteratorModifier =
false;
12546 C->setMapTypeModifier(
12548 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12549 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12550 HasIteratorModifier =
true;
12552 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12553 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12556 C->setMapLoc(Record.readSourceLocation());
12557 C->setColonLoc(Record.readSourceLocation());
12558 auto NumVars =
C->varlist_size();
12559 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12560 auto TotalLists =
C->getTotalComponentListNum();
12561 auto TotalComponents =
C->getTotalComponentsNum();
12563 SmallVector<Expr *, 16> Vars;
12564 Vars.reserve(NumVars);
12565 for (
unsigned i = 0; i != NumVars; ++i)
12566 Vars.push_back(Record.readExpr());
12567 C->setVarRefs(Vars);
12569 SmallVector<Expr *, 16> UDMappers;
12570 UDMappers.reserve(NumVars);
12571 for (
unsigned I = 0; I < NumVars; ++I)
12572 UDMappers.push_back(Record.readExpr());
12573 C->setUDMapperRefs(UDMappers);
12575 if (HasIteratorModifier)
12576 C->setIteratorModifier(Record.readExpr());
12578 SmallVector<ValueDecl *, 16> Decls;
12579 Decls.reserve(UniqueDecls);
12580 for (
unsigned i = 0; i < UniqueDecls; ++i)
12581 Decls.push_back(Record.readDeclAs<ValueDecl>());
12582 C->setUniqueDecls(Decls);
12584 SmallVector<unsigned, 16> ListsPerDecl;
12585 ListsPerDecl.reserve(UniqueDecls);
12586 for (
unsigned i = 0; i < UniqueDecls; ++i)
12587 ListsPerDecl.push_back(Record.readInt());
12588 C->setDeclNumLists(ListsPerDecl);
12590 SmallVector<unsigned, 32> ListSizes;
12591 ListSizes.reserve(TotalLists);
12592 for (
unsigned i = 0; i < TotalLists; ++i)
12593 ListSizes.push_back(Record.readInt());
12594 C->setComponentListSizes(ListSizes);
12596 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12597 Components.reserve(TotalComponents);
12598 for (
unsigned i = 0; i < TotalComponents; ++i) {
12599 Expr *AssociatedExprPr = Record.readExpr();
12600 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12601 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12604 C->setComponents(Components, ListSizes);
12610 C->setLParenLoc(Record.readSourceLocation());
12611 C->setColonLoc(Record.readSourceLocation());
12612 C->setAllocator(Record.readSubExpr());
12613 C->setAlignment(Record.readSubExpr());
12614 unsigned NumVars =
C->varlist_size();
12615 SmallVector<Expr *, 16> Vars;
12616 Vars.reserve(NumVars);
12617 for (
unsigned i = 0; i != NumVars; ++i)
12618 Vars.push_back(Record.readSubExpr());
12619 C->setVarRefs(Vars);
12622void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12624 C->setModifierLoc(Record.readSourceLocation());
12625 C->setModifierExpr(Record.readSubExpr());
12627 C->setLParenLoc(Record.readSourceLocation());
12628 unsigned NumVars =
C->varlist_size();
12629 SmallVector<Expr *, 16> Vars;
12630 Vars.reserve(NumVars);
12631 for (
unsigned I = 0; I != NumVars; ++I)
12632 Vars.push_back(Record.readSubExpr());
12633 C->setVarRefs(Vars);
12636void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12638 C->setModifierLoc(Record.readSourceLocation());
12639 C->setModifierExpr(Record.readSubExpr());
12641 C->setLParenLoc(Record.readSourceLocation());
12642 unsigned NumVars =
C->varlist_size();
12643 SmallVector<Expr *, 16> Vars;
12644 Vars.reserve(NumVars);
12645 for (
unsigned I = 0; I != NumVars; ++I)
12646 Vars.push_back(Record.readSubExpr());
12647 C->setVarRefs(Vars);
12650void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12652 C->setPriority(Record.readSubExpr());
12653 C->setLParenLoc(Record.readSourceLocation());
12656void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12659 C->setGrainsize(Record.readSubExpr());
12660 C->setModifierLoc(Record.readSourceLocation());
12661 C->setLParenLoc(Record.readSourceLocation());
12664void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12667 C->setNumTasks(Record.readSubExpr());
12668 C->setModifierLoc(Record.readSourceLocation());
12669 C->setLParenLoc(Record.readSourceLocation());
12672void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12673 C->setHint(Record.readSubExpr());
12674 C->setLParenLoc(Record.readSourceLocation());
12677void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12679 C->setDistScheduleKind(
12681 C->setChunkSize(Record.readSubExpr());
12682 C->setLParenLoc(Record.readSourceLocation());
12683 C->setDistScheduleKindLoc(Record.readSourceLocation());
12684 C->setCommaLoc(Record.readSourceLocation());
12687void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12688 C->setDefaultmapKind(
12690 C->setDefaultmapModifier(
12692 C->setLParenLoc(Record.readSourceLocation());
12693 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12694 C->setDefaultmapKindLoc(Record.readSourceLocation());
12697void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12698 C->setLParenLoc(Record.readSourceLocation());
12700 C->setMotionModifier(
12702 C->setMotionModifierLoc(I, Record.readSourceLocation());
12703 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12704 C->setIteratorModifier(Record.readExpr());
12706 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12707 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12708 C->setColonLoc(Record.readSourceLocation());
12709 auto NumVars =
C->varlist_size();
12710 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12711 auto TotalLists =
C->getTotalComponentListNum();
12712 auto TotalComponents =
C->getTotalComponentsNum();
12714 SmallVector<Expr *, 16> Vars;
12715 Vars.reserve(NumVars);
12716 for (
unsigned i = 0; i != NumVars; ++i)
12717 Vars.push_back(Record.readSubExpr());
12718 C->setVarRefs(Vars);
12720 SmallVector<Expr *, 16> UDMappers;
12721 UDMappers.reserve(NumVars);
12722 for (
unsigned I = 0; I < NumVars; ++I)
12723 UDMappers.push_back(Record.readSubExpr());
12724 C->setUDMapperRefs(UDMappers);
12726 SmallVector<ValueDecl *, 16> Decls;
12727 Decls.reserve(UniqueDecls);
12728 for (
unsigned i = 0; i < UniqueDecls; ++i)
12729 Decls.push_back(Record.readDeclAs<ValueDecl>());
12730 C->setUniqueDecls(Decls);
12732 SmallVector<unsigned, 16> ListsPerDecl;
12733 ListsPerDecl.reserve(UniqueDecls);
12734 for (
unsigned i = 0; i < UniqueDecls; ++i)
12735 ListsPerDecl.push_back(Record.readInt());
12736 C->setDeclNumLists(ListsPerDecl);
12738 SmallVector<unsigned, 32> ListSizes;
12739 ListSizes.reserve(TotalLists);
12740 for (
unsigned i = 0; i < TotalLists; ++i)
12741 ListSizes.push_back(Record.readInt());
12742 C->setComponentListSizes(ListSizes);
12744 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12745 Components.reserve(TotalComponents);
12746 for (
unsigned i = 0; i < TotalComponents; ++i) {
12747 Expr *AssociatedExprPr = Record.readSubExpr();
12748 bool IsNonContiguous = Record.readBool();
12749 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12750 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12752 C->setComponents(Components, ListSizes);
12755void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12756 C->setLParenLoc(Record.readSourceLocation());
12758 C->setMotionModifier(
12760 C->setMotionModifierLoc(I, Record.readSourceLocation());
12761 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12762 C->setIteratorModifier(Record.readExpr());
12764 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12765 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12766 C->setColonLoc(Record.readSourceLocation());
12767 auto NumVars =
C->varlist_size();
12768 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12769 auto TotalLists =
C->getTotalComponentListNum();
12770 auto TotalComponents =
C->getTotalComponentsNum();
12772 SmallVector<Expr *, 16> Vars;
12773 Vars.reserve(NumVars);
12774 for (
unsigned i = 0; i != NumVars; ++i)
12775 Vars.push_back(Record.readSubExpr());
12776 C->setVarRefs(Vars);
12778 SmallVector<Expr *, 16> UDMappers;
12779 UDMappers.reserve(NumVars);
12780 for (
unsigned I = 0; I < NumVars; ++I)
12781 UDMappers.push_back(Record.readSubExpr());
12782 C->setUDMapperRefs(UDMappers);
12784 SmallVector<ValueDecl *, 16> Decls;
12785 Decls.reserve(UniqueDecls);
12786 for (
unsigned i = 0; i < UniqueDecls; ++i)
12787 Decls.push_back(Record.readDeclAs<ValueDecl>());
12788 C->setUniqueDecls(Decls);
12790 SmallVector<unsigned, 16> ListsPerDecl;
12791 ListsPerDecl.reserve(UniqueDecls);
12792 for (
unsigned i = 0; i < UniqueDecls; ++i)
12793 ListsPerDecl.push_back(Record.readInt());
12794 C->setDeclNumLists(ListsPerDecl);
12796 SmallVector<unsigned, 32> ListSizes;
12797 ListSizes.reserve(TotalLists);
12798 for (
unsigned i = 0; i < TotalLists; ++i)
12799 ListSizes.push_back(Record.readInt());
12800 C->setComponentListSizes(ListSizes);
12802 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12803 Components.reserve(TotalComponents);
12804 for (
unsigned i = 0; i < TotalComponents; ++i) {
12805 Expr *AssociatedExprPr = Record.readSubExpr();
12806 bool IsNonContiguous = Record.readBool();
12807 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12808 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12810 C->setComponents(Components, ListSizes);
12813void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12814 C->setLParenLoc(Record.readSourceLocation());
12816 C->setFallbackModifierLoc(Record.readSourceLocation());
12817 auto NumVars =
C->varlist_size();
12818 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12819 auto TotalLists =
C->getTotalComponentListNum();
12820 auto TotalComponents =
C->getTotalComponentsNum();
12822 SmallVector<Expr *, 16> Vars;
12823 Vars.reserve(NumVars);
12824 for (
unsigned i = 0; i != NumVars; ++i)
12825 Vars.push_back(Record.readSubExpr());
12826 C->setVarRefs(Vars);
12828 for (
unsigned i = 0; i != NumVars; ++i)
12829 Vars.push_back(Record.readSubExpr());
12830 C->setPrivateCopies(Vars);
12832 for (
unsigned i = 0; i != NumVars; ++i)
12833 Vars.push_back(Record.readSubExpr());
12836 SmallVector<ValueDecl *, 16> Decls;
12837 Decls.reserve(UniqueDecls);
12838 for (
unsigned i = 0; i < UniqueDecls; ++i)
12839 Decls.push_back(Record.readDeclAs<ValueDecl>());
12840 C->setUniqueDecls(Decls);
12842 SmallVector<unsigned, 16> ListsPerDecl;
12843 ListsPerDecl.reserve(UniqueDecls);
12844 for (
unsigned i = 0; i < UniqueDecls; ++i)
12845 ListsPerDecl.push_back(Record.readInt());
12846 C->setDeclNumLists(ListsPerDecl);
12848 SmallVector<unsigned, 32> ListSizes;
12849 ListSizes.reserve(TotalLists);
12850 for (
unsigned i = 0; i < TotalLists; ++i)
12851 ListSizes.push_back(Record.readInt());
12852 C->setComponentListSizes(ListSizes);
12854 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12855 Components.reserve(TotalComponents);
12856 for (
unsigned i = 0; i < TotalComponents; ++i) {
12857 auto *AssociatedExprPr = Record.readSubExpr();
12858 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12859 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12862 C->setComponents(Components, ListSizes);
12865void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12866 C->setLParenLoc(Record.readSourceLocation());
12867 auto NumVars =
C->varlist_size();
12868 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12869 auto TotalLists =
C->getTotalComponentListNum();
12870 auto TotalComponents =
C->getTotalComponentsNum();
12872 SmallVector<Expr *, 16> Vars;
12873 Vars.reserve(NumVars);
12874 for (
unsigned i = 0; i != NumVars; ++i)
12875 Vars.push_back(Record.readSubExpr());
12876 C->setVarRefs(Vars);
12878 SmallVector<ValueDecl *, 16> Decls;
12879 Decls.reserve(UniqueDecls);
12880 for (
unsigned i = 0; i < UniqueDecls; ++i)
12881 Decls.push_back(Record.readDeclAs<ValueDecl>());
12882 C->setUniqueDecls(Decls);
12884 SmallVector<unsigned, 16> ListsPerDecl;
12885 ListsPerDecl.reserve(UniqueDecls);
12886 for (
unsigned i = 0; i < UniqueDecls; ++i)
12887 ListsPerDecl.push_back(Record.readInt());
12888 C->setDeclNumLists(ListsPerDecl);
12890 SmallVector<unsigned, 32> ListSizes;
12891 ListSizes.reserve(TotalLists);
12892 for (
unsigned i = 0; i < TotalLists; ++i)
12893 ListSizes.push_back(Record.readInt());
12894 C->setComponentListSizes(ListSizes);
12896 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12897 Components.reserve(TotalComponents);
12898 for (
unsigned i = 0; i < TotalComponents; ++i) {
12899 Expr *AssociatedExpr = Record.readSubExpr();
12900 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12901 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12904 C->setComponents(Components, ListSizes);
12907void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12908 C->setLParenLoc(Record.readSourceLocation());
12909 auto NumVars =
C->varlist_size();
12910 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12911 auto TotalLists =
C->getTotalComponentListNum();
12912 auto TotalComponents =
C->getTotalComponentsNum();
12914 SmallVector<Expr *, 16> Vars;
12915 Vars.reserve(NumVars);
12916 for (
unsigned i = 0; i != NumVars; ++i)
12917 Vars.push_back(Record.readSubExpr());
12918 C->setVarRefs(Vars);
12921 SmallVector<ValueDecl *, 16> Decls;
12922 Decls.reserve(UniqueDecls);
12923 for (
unsigned i = 0; i < UniqueDecls; ++i)
12924 Decls.push_back(Record.readDeclAs<ValueDecl>());
12925 C->setUniqueDecls(Decls);
12927 SmallVector<unsigned, 16> ListsPerDecl;
12928 ListsPerDecl.reserve(UniqueDecls);
12929 for (
unsigned i = 0; i < UniqueDecls; ++i)
12930 ListsPerDecl.push_back(Record.readInt());
12931 C->setDeclNumLists(ListsPerDecl);
12933 SmallVector<unsigned, 32> ListSizes;
12934 ListSizes.reserve(TotalLists);
12935 for (
unsigned i = 0; i < TotalLists; ++i)
12936 ListSizes.push_back(Record.readInt());
12937 C->setComponentListSizes(ListSizes);
12939 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12940 Components.reserve(TotalComponents);
12941 for (
unsigned i = 0; i < TotalComponents; ++i) {
12942 Expr *AssociatedExpr = Record.readSubExpr();
12943 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12944 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12947 C->setComponents(Components, ListSizes);
12950void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12951 C->setLParenLoc(Record.readSourceLocation());
12952 auto NumVars =
C->varlist_size();
12953 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12954 auto TotalLists =
C->getTotalComponentListNum();
12955 auto TotalComponents =
C->getTotalComponentsNum();
12957 SmallVector<Expr *, 16> Vars;
12958 Vars.reserve(NumVars);
12959 for (
unsigned I = 0; I != NumVars; ++I)
12960 Vars.push_back(Record.readSubExpr());
12961 C->setVarRefs(Vars);
12964 SmallVector<ValueDecl *, 16> Decls;
12965 Decls.reserve(UniqueDecls);
12966 for (
unsigned I = 0; I < UniqueDecls; ++I)
12967 Decls.push_back(Record.readDeclAs<ValueDecl>());
12968 C->setUniqueDecls(Decls);
12970 SmallVector<unsigned, 16> ListsPerDecl;
12971 ListsPerDecl.reserve(UniqueDecls);
12972 for (
unsigned I = 0; I < UniqueDecls; ++I)
12973 ListsPerDecl.push_back(Record.readInt());
12974 C->setDeclNumLists(ListsPerDecl);
12976 SmallVector<unsigned, 32> ListSizes;
12977 ListSizes.reserve(TotalLists);
12978 for (
unsigned i = 0; i < TotalLists; ++i)
12979 ListSizes.push_back(Record.readInt());
12980 C->setComponentListSizes(ListSizes);
12982 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12983 Components.reserve(TotalComponents);
12984 for (
unsigned I = 0; I < TotalComponents; ++I) {
12985 Expr *AssociatedExpr = Record.readSubExpr();
12986 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12987 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12990 C->setComponents(Components, ListSizes);
12993void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12994 C->setLParenLoc(Record.readSourceLocation());
12995 unsigned NumVars =
C->varlist_size();
12996 SmallVector<Expr *, 16> Vars;
12997 Vars.reserve(NumVars);
12998 for (
unsigned i = 0; i != NumVars; ++i)
12999 Vars.push_back(Record.readSubExpr());
13000 C->setVarRefs(Vars);
13002 Vars.reserve(NumVars);
13003 for (
unsigned i = 0; i != NumVars; ++i)
13004 Vars.push_back(Record.readSubExpr());
13005 C->setPrivateRefs(Vars);
13008void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
13009 C->setLParenLoc(Record.readSourceLocation());
13010 unsigned NumVars =
C->varlist_size();
13011 SmallVector<Expr *, 16> Vars;
13012 Vars.reserve(NumVars);
13013 for (
unsigned i = 0; i != NumVars; ++i)
13014 Vars.push_back(Record.readSubExpr());
13015 C->setVarRefs(Vars);
13018void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
13019 C->setLParenLoc(Record.readSourceLocation());
13020 unsigned NumVars =
C->varlist_size();
13021 SmallVector<Expr *, 16> Vars;
13022 Vars.reserve(NumVars);
13023 for (
unsigned i = 0; i != NumVars; ++i)
13024 Vars.push_back(Record.readSubExpr());
13025 C->setVarRefs(Vars);
13028void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
13029 C->setLParenLoc(Record.readSourceLocation());
13030 unsigned NumOfAllocators =
C->getNumberOfAllocators();
13031 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
13032 Data.reserve(NumOfAllocators);
13033 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
13034 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
13037 D.
LParenLoc = Record.readSourceLocation();
13038 D.
RParenLoc = Record.readSourceLocation();
13040 C->setAllocatorsData(
Data);
13043void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
13044 C->setLParenLoc(Record.readSourceLocation());
13045 C->setModifier(Record.readSubExpr());
13046 C->setColonLoc(Record.readSourceLocation());
13047 unsigned NumOfLocators =
C->varlist_size();
13048 SmallVector<Expr *, 4> Locators;
13049 Locators.reserve(NumOfLocators);
13050 for (
unsigned I = 0; I != NumOfLocators; ++I)
13051 Locators.push_back(Record.readSubExpr());
13052 C->setVarRefs(Locators);
13055void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
13058 C->setLParenLoc(Record.readSourceLocation());
13059 C->setKindKwLoc(Record.readSourceLocation());
13060 C->setModifierKwLoc(Record.readSourceLocation());
13063void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
13065 C->setThreadID(Record.readSubExpr());
13066 C->setLParenLoc(Record.readSourceLocation());
13069void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
13071 C->setLParenLoc(Record.readSourceLocation());
13072 C->setBindKindLoc(Record.readSourceLocation());
13076 C->setAlignment(Record.readExpr());
13077 C->setLParenLoc(Record.readSourceLocation());
13080void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
13082 C->setSize(Record.readSubExpr());
13083 C->setLParenLoc(Record.readSourceLocation());
13086void OMPClauseReader::VisitOMPDynGroupprivateClause(
13087 OMPDynGroupprivateClause *
C) {
13089 C->setDynGroupprivateModifier(
13091 C->setDynGroupprivateFallbackModifier(
13093 C->setSize(Record.readSubExpr());
13094 C->setLParenLoc(Record.readSourceLocation());
13095 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13096 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13099void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
13100 C->setLParenLoc(Record.readSourceLocation());
13101 C->setDependenceType(
13103 C->setDependenceLoc(Record.readSourceLocation());
13104 C->setColonLoc(Record.readSourceLocation());
13105 unsigned NumVars =
C->varlist_size();
13106 SmallVector<Expr *, 16> Vars;
13107 Vars.reserve(NumVars);
13108 for (
unsigned I = 0; I != NumVars; ++I)
13109 Vars.push_back(Record.readSubExpr());
13110 C->setVarRefs(Vars);
13111 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
13112 C->setLoopData(I, Record.readSubExpr());
13115void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
13117 Record.readAttributes(Attrs);
13118 C->setAttrs(Attrs);
13119 C->setLocStart(Record.readSourceLocation());
13120 C->setLParenLoc(Record.readSourceLocation());
13121 C->setLocEnd(Record.readSourceLocation());
13124void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
13134 Selector.ScoreOrCondition =
nullptr;
13136 Selector.ScoreOrCondition = readExprRef();
13148 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13153 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13155 Data->setClauses(Clauses);
13156 if (
Data->hasAssociatedStmt())
13158 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13163 unsigned NumVars =
readInt();
13165 for (
unsigned I = 0; I < NumVars; ++I)
13171 unsigned NumExprs =
readInt();
13173 for (
unsigned I = 0; I < NumExprs; ++I)
13183 switch (ClauseKind) {
13198 bool isConditionExprClause =
readBool();
13199 if (isConditionExprClause) {
13204 unsigned NumVars =
readInt();
13206 for (
unsigned I = 0; I < NumVars; ++I)
13213 unsigned NumClauses =
readInt();
13215 for (
unsigned I = 0; I < NumClauses; ++I)
13249 for (
unsigned I = 0; I < VarList.size(); ++I) {
13252 RecipeList.push_back({Alloca});
13256 VarList, RecipeList, EndLoc);
13274 for (
unsigned I = 0; I < VarList.size(); ++I) {
13278 RecipeList.push_back({Recipe, RecipeTemp});
13282 VarList, RecipeList, EndLoc);
13333 LParenLoc, ModList, VarList, EndLoc);
13342 LParenLoc, ModList, VarList, EndLoc);
13351 LParenLoc, ModList, VarList, EndLoc);
13360 LParenLoc, ModList, VarList, EndLoc);
13366 AsyncExpr, EndLoc);
13374 DevNumExpr, QueuesLoc, QueueIdExprs,
13381 unsigned NumArchs =
readInt();
13383 for (
unsigned I = 0; I < NumArchs; ++I) {
13386 Archs.emplace_back(Loc, Ident);
13390 LParenLoc, Archs, EndLoc);
13398 for (
unsigned I = 0; I < VarList.size(); ++I) {
13402 3 *
sizeof(
int *));
13405 unsigned NumCombiners =
readInt();
13406 for (
unsigned I = 0; I < NumCombiners; ++I) {
13411 Combiners.push_back({LHS, RHS, Op});
13414 RecipeList.push_back({Recipe, Combiners});
13418 VarList, RecipeList, EndLoc);
13437 HasForce, LoopCount, EndLoc);
13441 unsigned NumClauses =
readInt();
13443 for (
unsigned I = 0; I < NumClauses; ++I)
13446 SizeExprs, EndLoc);
13450 unsigned NumExprs =
readInt();
13453 for (
unsigned I = 0; I < NumExprs; ++I) {
13459 GangKinds, Exprs, EndLoc);
13465 WorkerExpr, EndLoc);
13471 VectorExpr, EndLoc);
13483 LParenLoc, VarList, EndLoc);
13497 llvm_unreachable(
"Clause serialization not yet implemented");
13499 llvm_unreachable(
"Invalid Clause Kind");
13504 for (
unsigned I = 0; I < Clauses.size(); ++I)
13509 unsigned NumVars =
readInt();
13510 A->Clauses.resize(NumVars);
13517 llvm::FoldingSetNodeID ID;
13518 ID.AddString(PrimaryModuleName);
13519 return ID.computeStableHash();
13524 return std::nullopt;
13527 return std::nullopt;
13530 return std::nullopt;
Defines the clang::ASTContext interface.
static unsigned moduleKindForDiagnostic(ModuleKind Kind)
static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, ASTConsumer *Consumer)
Under non-PCH compilation the consumer receives the objc methods before receiving the implementation,...
static bool checkCodegenOptions(const CodeGenOptions &CGOpts, const CodeGenOptions &ExistingCGOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream)
Whether Stream doesn't start with the AST file magic number 'CPCH'.
static std::vector< std::string > accumulateFeaturesAsWritten(std::vector< std::string > FeaturesAsWritten)
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionValueMismatch(DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename)
static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static std::pair< bool, bool > wasValidatedInBuildSession(const ModuleFile &MF, const HeaderSearchOptions &HSOpts)
Returns {build-session validation applies, MF was validated this session}.
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionFlagMismatch(DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue, bool CurrentValue, StringRef ModuleFilename)
static void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
@ OptionValidateStrictMatches
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash, StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, const HeaderSearchOptions &ASTFileHSOpts)
Check that the specified and the existing module cache paths are equivalent.
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Defines some OpenACC-specific enums and functions.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
Defines the clang::SanitizerKind enum.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis functions specific to RISC-V.
Defines the clang::SourceLocation class and associated facilities.
Defines implementation details of the clang::SourceManager class.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TargetOptions class.
#define IMPORT(DERIVED, BASE)
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
void Visit(PTR(OMPClause) S)
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
static OMPDepobjClause * CreateEmpty(const ASTContext &C)
Creates an empty clause.
This represents 'destroy' clause in the 'pragma omp depobj' directive or the 'pragma omp interop' dir...
This represents 'detach' clause in the 'pragma omp task' directive.
This represents 'device' clause in the 'pragma omp ...' directive.
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
This represents 'dyn_groupprivate' clause in 'pragma omp target ...' and 'pragma omp teams ....
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'filter' clause in the 'pragma omp ...' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'grainsize' clause in the 'pragma omp ...' directive.
static OMPHasDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'hint' clause in the 'pragma omp ...' directive.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned NumPrefs, unsigned NumAttrs)
Creates an empty clause sized for NumPrefs pref-specs and NumAttrs total attr() exprs across them.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
static OMPNontemporalClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'novariants' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'threads' clause in the 'pragma omp ...' directive.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents the 'use' clause in 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the 'pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the 'pragma omp target ...' directive.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual void HandleInterestingDecl(DeclGroupRef D)
HandleInterestingDecl - Handle the specified interesting declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
const clang::PrintingPolicy & getPrintingPolicy() const
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported)
This is called for each AST file loaded.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void ReadModuleName(StringRef ModuleName)
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallPtrSetImpl< const TypedefNameDecl * > &Decls) override
Read the set of potentially unused typedefs known to the source.
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ReadExtnameUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, AsmLabelAttr * > > &ExtnameIDs) override
Read the set of pragma redefine_extname'd, undeclared identifiers known to the external Sema source.
void ClearSwitchCaseIDs()
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
ASTReadResult ReadASTCore(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
friend class serialization::ReadMethodPoolVisitor
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
llvm::iterator_range< ModuleDeclIterator > getModuleFileLevelDecls(ModuleFile &Mod)
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement into a statement.
Selector GetExternalSelector(serialization::SelectorID ID) override
Resolve a selector ID into a selector.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
GlobalDeclID getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const
Map from a local declaration ID within a given module to a global declaration ID.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WeakIDs) override
Read the set of weak, undeclared identifiers known to the external Sema source.
void completeVisibleDeclsMap(const DeclContext *DC) override
Load all external visible decls in the given DeclContext.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
Module * getSubmodule(uint32_t GlobalID) override
Retrieve the submodule that corresponds to a global submodule ID.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
static llvm::BitVector ReadBitVector(const RecordData &Record, const StringRef Blob)
ModuleFile * getLocalModuleFile(ModuleFile &M, unsigned ID) const
Retrieve the module file with a given local ID within the specified ModuleFile.
ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ForceValidateUserInputs=true, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag)
void makeNamesVisible(const HiddenNames &Names, Module *Owner)
Make the names within this set of hidden names visible.
void UpdateSema()
Update the state of Sema after loading some additional modules.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
CXXTemporary * ReadCXXTemporary(ModuleFile &F, const RecordData &Record, unsigned &Idx)
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
void PrintStats() override
Print some statistics about AST usage.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
ASTReadResult ReadAST(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported) override
This is called for each AST file loaded.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateName NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
typename Representation::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
DeclID getRawValue() const
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
@ CXXConversionFunctionName
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setAttrNameLoc(SourceLocation loc)
void setAttrOperandParensRange(SourceRange range)
void setAttrExprOperand(Expr *e)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
A little helper class used to produce diagnostics.
bool wasUpgradedFromWarning() const
Whether this mapping attempted to map the diagnostic to a warning, but was overruled because the diag...
bool isErrorOrFatal() const
void setSeverity(diag::Severity Value)
static DiagnosticMapping deserialize(unsigned Bits)
Deserialize a mapping.
void setUpgradedFromWarning(bool Value)
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool getEnableAllWarnings() const
Level
The level of the diagnostic, after it has been through mapping.
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
bool getSuppressSystemWarnings() const
bool getWarningsAsErrors() const
diag::Severity getExtensionHandlingBehavior() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
FPOptions applyOverrides(FPOptions Base)
static FPOptions getFromOpaqueInt(storage_type Value)
Represents a member of a struct/union/class.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
time_t getModificationTime() const
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Wrapper for source info for functions.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierIterator()=default
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename, off_t &Size, time_t &ModTime) const
Get a pointer to the PCM if it exists and set Size and ModTime to its on-disk size and modification t...
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
LangStandard::Kind LangStd
The used language standard.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
void setUsedForHeaderGuard(bool Val)
void setHasCommaPasting()
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
void setIsFunctionLike()
Function/Object-likeness.
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
void setExpansionLoc(SourceLocation Loc)
void setAttrRowOperand(Expr *e)
void setAttrColumnOperand(Expr *e)
void setAttrOperandParensRange(SourceRange range)
void setAttrNameLoc(SourceLocation loc)
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
The module cache used for compiling modules implicitly.
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
Deduplication key for a loaded module file in ModuleManager.
Identifies a module file to be loaded.
bool empty() const
Checks whether the module file name is empty.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
static ModuleFileName makeInMemory(StringRef Name)
Creates a file name for an in-memory module.
StringRef str() const
Returns the plain module file name.
static ModuleFileName makeFromRaw(StringRef Name, unsigned RawKind)
Creates a file name from the raw kind value.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
Reference to a module that consists of either an existing/materialized Module object,...
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
@ Hidden
All of the names in this module are hidden.
@ AllVisible
All of the names in this module are visible.
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
const ModuleFileName * getASTFileName() const
The serialized AST file name for this module, if one was created.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
llvm::SmallVector< ModuleRef, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned IsAvailable
Whether this module is available in the current translation unit.
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
void addSubmodule(StringRef Name, Module *Submodule)
Add a child submodule.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Represent a C++ namespace.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents the 'counts' clause in the 'pragma omp split' directive.
static OMPCountsClause * CreateEmpty(const ASTContext &C, unsigned NumCounts)
Build an empty 'counts' AST node for deserialization.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
static OMPNumThreadsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N expressions.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
static OMPPartialClause * CreateEmpty(const ASTContext &C)
Build an empty 'partial' AST node for deserialization.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
static OMPSizesClause * CreateEmpty(const ASTContext &C, unsigned NumSizes)
Build an empty 'sizes' AST node for deserialization.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
method_range methods() const
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
ObjCMethodDecl - Represents an instance or class method declaration.
bool hasBody() const override
Determine whether this method has a body.
void setLazyBody(uint64_t Offset)
void setStarLoc(SourceLocation Loc)
void setTypeArgsRAngleLoc(SourceLocation Loc)
unsigned getNumTypeArgs() const
unsigned getNumProtocols() const
void setTypeArgsLAngleLoc(SourceLocation Loc)
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
void setHasBaseTypeAsWritten(bool HasBaseType)
void setProtocolLoc(unsigned i, SourceLocation Loc)
The basic abstraction for the target Objective-C runtime.
Kind
The basic Objective-C runtimes that we know about.
unsigned getNumProtocols() const
void setProtocolLoc(unsigned i, SourceLocation Loc)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
void setAttrLoc(SourceLocation loc)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
void setEllipsisLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
void setKWLoc(SourceLocation Loc)
void setStarLoc(SourceLocation Loc)
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
@ FastWidth
The width of the "fast" qualifier mask.
@ FastMask
The fast qualifier mask.
void setAmpAmpLoc(SourceLocation Loc)
Wrapper for source info for record types.
Declaration of a redeclarable template.
This table allows us to fully hide how we implement multi-keyword caching.
Selector getNullarySelector(const IdentifierInfo *ID)
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Selector getUnarySelector(const IdentifierInfo *ID)
Smart pointer class that efficiently represents Objective-C method names.
void * getAsOpaquePtr() const
void addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method)
Add the given method to the list of globally-known methods.
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
Sema - This implements semantic analysis and AST building for C.
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
IdentifierResolver IdResolver
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
Encodes a location in the source.
static SourceLocation getFromRawEncoding(UIntTy Encoding)
Turn a raw encoding of a SourceLocation object into a real SourceLocation.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
bool isFileOverridden(const FileEntry *File) const
Returns true if the file contents have been overridden.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
OptionalFileEntryRef bypassFileContentsOverride(FileEntryRef File)
Bypass the overridden contents of a file.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
One instance of this struct is kept for every file loaded or used.
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
std::optional< llvm::MemoryBufferRef > getBufferIfLoaded() const
Return the buffer, only if it has been loaded.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Information about a FileID, basically just the logical file that it represents and include stack info...
void setHasLineDirectives()
Set the flag that indicates that this FileID has line table entries associated with it.
Stmt - This represents one statement.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
unsigned getNumArgs() const
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Token - This structure provides full information about a lexed token.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
TypeLocReader(ASTRecordReader &Reader)
void VisitArrayTypeLoc(ArrayTypeLoc)
void VisitFunctionTypeLoc(FunctionTypeLoc)
void VisitTagTypeLoc(TagTypeLoc TL)
RetTy Visit(TypeLoc TyLoc)
Base wrapper for a particular "section" of type source info.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
void setLParenLoc(SourceLocation Loc)
void setTypeofLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
void setNameLoc(SourceLocation Loc)
Captures information about a #pragma weak directive.
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ None
State at construction.
@ AlreadyLoaded
The module file had already been loaded.
Source location and bit offset of a declaration.
A key used when looking up entities by DeclarationName.
unsigned getHash() const
Compute a fingerprint of this key for use in on-disk hash table.
DeclarationNameKey()=default
Information about a module that has been loaded by the ASTReader.
const PPEntityOffset * PreprocessedEntityOffsets
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
StringRef Data
The serialized bitstream data for this file.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
uint64_t SubmodulesOffsetBase
Absolute offset of the start of the submodules block.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
ModuleFileKey FileKey
The key ModuleManager used for the module file.
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
const llvm::support::unaligned_uint64_t * SubmoduleOffsets
Relative offsets for all submodule entries in the AST file.
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
llvm::BitstreamCursor SubmodulesCursor
The cursor to the start of the submodules block.
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
SourceLocation ImportLoc
The source location where this module was first imported.
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
time_t ModTime
Modification of the module file.
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
unsigned LocalNumSubmodules
The number of submodules in this module.
SourceLocation FirstLoc
The first source location in this module.
unsigned LocalTopLevelSubmoduleID
Local submodule ID of the top-level module.
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
bool HasTimestamps
Whether timestamps are included in this module file.
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
unsigned NumPreprocessedEntities
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
unsigned NumFileSortedDecls
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
unsigned Index
The index of this module in the list of modules.
unsigned NumUserInputFiles
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
uint64_t SizeInBits
The size of this file, in bits.
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
bool StandardCXXModule
Whether this module file is a standard C++ module.
unsigned LocalNumTypes
The number of types in this AST file.
StringRef ModuleOffsetMap
The module offset map data for this file.
const PPSkippedRange * PreprocessedSkippedRangeOffsets
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
bool isDirectlyImported() const
Determine whether this module was directly imported at any point during translation.
std::string ModuleMapPath
unsigned LocalBaseSubmoduleID
Base submodule ID for submodules local to this module within its own address space.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned NumPreprocessedSkippedRanges
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
InputFilesValidation InputFilesValidationStatus
Captures the high-level result of validating input files.
unsigned Generation
The generation of which this module file is a part.
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
ModuleFileName FileName
The file name of the module file.
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
std::string BaseDirectory
The base directory of the module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
uint32_t getOffset() const
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
unsigned getFactoryBits() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
bool instanceHasMoreThanOneDecl() const
bool operator()(ModuleFile &M)
bool factoryHasMoreThanOneDecl() const
unsigned getInstanceBits() const
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
file_type ReadFileRef(const unsigned char *&d)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
DeclarationNameKey internal_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
StringRef internal_key_type
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
external_key_type internal_key_type
Class that performs lookup to specialized decls.
file_type ReadFileRef(const unsigned char *&d)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
unsigned internal_key_type
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
@ ModuleFile
The module file (.pcm). Required.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
GlobalDeclID LazySpecializationInfo
@ EXTENSION_METADATA
Metadata describing this particular extension.
SubmoduleRecordTypes
Record types used within a submodule description block.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_CHILD
Specifies a direct submodule by name and ID, enabling on-demand deserialization of children without l...
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_END
Defines the end of a single submodule. Sentinel record without any data.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
@ SkippedInBuildSession
When the validation is skipped because it was already done in the current build session.
@ AllFiles
When the validation is done both for user files and system files.
@ Disabled
When the validation is disabled. For example, for a precompiled header.
@ UserFiles
When the validation is done only for user files as an optimization.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
uint64_t MacroID
An ID number that refers to a macro in an AST file.
InputFileRecordTypes
Record types that occur within the input-files block inside the control block.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
@ MK_MainFile
File is a PCH file treated as the actual main file.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
@ MK_PrebuiltModule
File is from a prebuilt module path.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ CXX_ADDED_TEMPLATE_SPECIALIZATION
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ SUBMODULE_METADATA
Record that encodes the number of submodules, their base ID in the AST file, and for each module the ...
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ EXTNAME_UNDECLARED_IDENTIFIERS
Record code for extname-redefined undeclared identifiers.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ RISCV_VECTOR_INTRINSICS_PRAGMA
Record code for pragma clang riscv intrinsic vector.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ UPDATE_MODULE_LOCAL_VISIBLE
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UPDATE_TU_LOCAL_VISIBLE
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Top level wrappers for InstallAPI frontend operations.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
@ Success
Annotation was successful.
std::pair< FileID, unsigned > FileIDAndOffset
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenMPNumTeamsClauseModifier
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
OpenMPDynGroupprivateClauseFallbackModifier
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
@ Undefined
Keep undefined.
PredefinedDeclIDs
Predefined declaration IDs.
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
@ PREDEF_DECL_NULL_ID
The NULL declaration.
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
@ PREDEF_DECL_BUILTIN_ZOS_VA_LIST_ID
The internal '__builtin_zos_va_list' typedef.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
std::string createSpecificModuleCachePath(FileManager &FileMgr, StringRef ModuleCachePath, bool DisableModuleHash, std::string ContextHash)
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
OpenMPUseDevicePtrFallbackModifier
OpenMP 6.1 use_device_ptr fallback modifier.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
OpenMPDynGroupprivateClauseModifier
OpenMPThreadLimitClauseModifier
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ Module
Disable validation for module files.
bool shouldSkipCheckingODR(const Decl *D)
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
OpenMPNumThreadsClauseModifier
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
OpenMPThreadsetKind
OpenMP modifiers for 'threadset' clause.
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
__LIBC_ATTRS FILE * stderr
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponents
Total number of expression components.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumVars
Number of expressions listed.
unsigned NumComponentLists
Number of component lists.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
The signature of a module, which is a hash of the AST content.
static constexpr size_t size
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
static ASTFileSignature createDummy()
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setInfo(const DeclarationNameLoc &Info)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
ExceptionSpecInfo ExceptionSpec
static LineEntry get(unsigned Offs, unsigned Line, int Filename, SrcMgr::CharacteristicKind FileKind, unsigned IncludeOffset)
A conflict between two modules.
std::string Message
The message provided to the user when there is a conflict.
ModuleRef Other
The module that this module conflicts with.
A library or framework to link against when an entity from this module is used.
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
SanitizerMask Mask
Bitmask of enabled sanitizers.
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
Describes a single change detected in a module file or input file.
Describes the categories of an Objective-C class.
void insert(GlobalDeclID ID)
void insert(LazySpecializationInfo Info)