97#include "llvm/ADT/APFloat.h"
98#include "llvm/ADT/APInt.h"
99#include "llvm/ADT/ArrayRef.h"
100#include "llvm/ADT/DenseMap.h"
101#include "llvm/ADT/FoldingSet.h"
102#include "llvm/ADT/IntrusiveRefCntPtr.h"
103#include "llvm/ADT/STLExtras.h"
104#include "llvm/ADT/ScopeExit.h"
105#include "llvm/ADT/Sequence.h"
106#include "llvm/ADT/SmallPtrSet.h"
107#include "llvm/ADT/SmallVector.h"
108#include "llvm/ADT/StringExtras.h"
109#include "llvm/ADT/StringMap.h"
110#include "llvm/ADT/StringRef.h"
111#include "llvm/ADT/iterator_range.h"
112#include "llvm/Bitstream/BitstreamReader.h"
113#include "llvm/Support/Compiler.h"
114#include "llvm/Support/Compression.h"
115#include "llvm/Support/DJB.h"
116#include "llvm/Support/Endian.h"
117#include "llvm/Support/Error.h"
118#include "llvm/Support/ErrorHandling.h"
119#include "llvm/Support/LEB128.h"
120#include "llvm/Support/MemoryBuffer.h"
121#include "llvm/Support/Path.h"
122#include "llvm/Support/SaveAndRestore.h"
123#include "llvm/Support/TimeProfiler.h"
124#include "llvm/Support/Timer.h"
125#include "llvm/Support/VersionTuple.h"
126#include "llvm/Support/raw_ostream.h"
127#include "llvm/TargetParser/Triple.h"
140#include <system_error>
145using namespace clang;
148using llvm::BitstreamCursor;
156 return First->ReadFullVersionInformation(FullVersion) ||
157 Second->ReadFullVersionInformation(FullVersion);
161 First->ReadModuleName(ModuleName);
162 Second->ReadModuleName(ModuleName);
166 First->ReadModuleMapFile(ModuleMapPath);
167 Second->ReadModuleMapFile(ModuleMapPath);
171 const LangOptions &LangOpts, StringRef ModuleFilename,
bool Complain,
172 bool AllowCompatibleDifferences) {
173 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
174 AllowCompatibleDifferences) ||
175 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
176 AllowCompatibleDifferences);
180 const CodeGenOptions &CGOpts, StringRef ModuleFilename,
bool Complain,
181 bool AllowCompatibleDifferences) {
182 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
183 AllowCompatibleDifferences) ||
184 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
185 AllowCompatibleDifferences);
189 const TargetOptions &TargetOpts, StringRef ModuleFilename,
bool Complain,
190 bool AllowCompatibleDifferences) {
191 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
192 AllowCompatibleDifferences) ||
193 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
194 AllowCompatibleDifferences);
199 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
200 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
206 return First->ReadFileSystemOptions(FSOpts, Complain) ||
207 Second->ReadFileSystemOptions(FSOpts, Complain);
212 StringRef ContextHash,
bool Complain) {
213 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
215 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
221 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
222 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
223 Complain, SuggestedPredefines) ||
224 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
225 Complain, SuggestedPredefines);
230 First->ReadCounter(M,
Value);
231 Second->ReadCounter(M,
Value);
235 return First->needsInputFileVisitation() ||
236 Second->needsInputFileVisitation();
240 return First->needsSystemInputFileVisitation() ||
241 Second->needsSystemInputFileVisitation();
246 bool DirectlyImported) {
247 First->visitModuleFile(Filename, Kind, DirectlyImported);
248 Second->visitModuleFile(Filename, Kind, DirectlyImported);
254 bool isExplicitModule) {
255 bool Continue =
false;
256 if (First->needsInputFileVisitation() &&
257 (!isSystem || First->needsSystemInputFileVisitation()))
258 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
260 if (Second->needsInputFileVisitation() &&
261 (!isSystem || Second->needsSystemInputFileVisitation()))
262 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
269 First->readModuleFileExtension(Metadata);
270 Second->readModuleFileExtension(Metadata);
289 StringRef ModuleFilename,
291 bool AllowCompatibleDifferences =
true) {
295#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
296 if constexpr (CK::Compatibility != CK::Benign) { \
297 if ((CK::Compatibility == CK::NotCompatible) || \
298 (CK::Compatibility == CK::Compatible && \
299 !AllowCompatibleDifferences)) { \
300 if (ExistingLangOpts.Name != LangOpts.Name) { \
303 Diags->Report(diag::err_ast_file_langopt_mismatch) \
304 << Description << LangOpts.Name << ExistingLangOpts.Name \
307 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
308 << Description << ModuleFilename; \
315#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
316 if constexpr (CK::Compatibility != CK::Benign) { \
317 if ((CK::Compatibility == CK::NotCompatible) || \
318 (CK::Compatibility == CK::Compatible && \
319 !AllowCompatibleDifferences)) { \
320 if (ExistingLangOpts.Name != LangOpts.Name) { \
322 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
323 << Description << ModuleFilename; \
329#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
330 if constexpr (CK::Compatibility != CK::Benign) { \
331 if ((CK::Compatibility == CK::NotCompatible) || \
332 (CK::Compatibility == CK::Compatible && \
333 !AllowCompatibleDifferences)) { \
334 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
336 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
337 << Description << ModuleFilename; \
343#include "clang/Basic/LangOptions.def"
347 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
348 <<
"module features" << ModuleFilename;
354 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
355 <<
"target Objective-C runtime" << ModuleFilename;
362 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
363 <<
"block command names" << ModuleFilename;
371 if (!AllowCompatibleDifferences) {
375 ExistingSanitizers.
clear(ModularSanitizers);
376 ImportedSanitizers.
clear(ModularSanitizers);
377 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
378 const std::string Flag =
"-fsanitize=";
380#define SANITIZER(NAME, ID) \
382 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
383 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
384 if (InExistingModule != InImportedModule) \
385 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
386 << InExistingModule << ModuleFilename << (Flag + NAME); \
388#include "clang/Basic/Sanitizers.def"
399 StringRef ModuleFilename,
401 bool AllowCompatibleDifferences =
true) {
405#define CODEGENOPT(Name, Bits, Default, Compatibility) \
406 if constexpr (CK::Compatibility != CK::Benign) { \
407 if ((CK::Compatibility == CK::NotCompatible) || \
408 (CK::Compatibility == CK::Compatible && \
409 !AllowCompatibleDifferences)) { \
410 if (ExistingCGOpts.Name != CGOpts.Name) { \
413 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
414 << #Name << CGOpts.Name << ExistingCGOpts.Name \
417 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
418 << #Name << ModuleFilename; \
425#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
426 if constexpr (CK::Compatibility != CK::Benign) { \
427 if ((CK::Compatibility == CK::NotCompatible) || \
428 (CK::Compatibility == CK::Compatible && \
429 !AllowCompatibleDifferences)) { \
430 if (ExistingCGOpts.Name != CGOpts.Name) { \
432 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
433 << #Name << ModuleFilename; \
438#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
439 if constexpr (CK::Compatibility != CK::Benign) { \
440 if ((CK::Compatibility == CK::NotCompatible) || \
441 (CK::Compatibility == CK::Compatible && \
442 !AllowCompatibleDifferences)) { \
443 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
445 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
446 << #Name << ModuleFilename; \
451#define DEBUGOPT(Name, Bits, Default, Compatibility)
452#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
453#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
454#include "clang/Basic/CodeGenOptions.def"
459static std::vector<std::string>
461 llvm::erase_if(FeaturesAsWritten, [](
const std::string &S) {
462 return S.empty() || (S[0] !=
'+' && S[0] !=
'-');
464 llvm::stable_sort(FeaturesAsWritten,
465 [](
const std::string &A,
const std::string &B) {
466 return A.substr(1) < B.substr(1);
469 std::unique(FeaturesAsWritten.rbegin(), FeaturesAsWritten.rend(),
470 [](
const std::string &A,
const std::string &B) {
471 return A.substr(1) == B.substr(1);
475 FeaturesAsWritten.erase(FeaturesAsWritten.begin(), NewRend.base());
476 return FeaturesAsWritten;
487 StringRef ModuleFilename,
489 bool AllowCompatibleDifferences =
true) {
490#define CHECK_TARGET_OPT(Field, Name) \
491 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
493 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
494 << ModuleFilename << Name << TargetOpts.Field \
495 << ExistingTargetOpts.Field; \
506 if (!AllowCompatibleDifferences) {
511#undef CHECK_TARGET_OPT
516 std::vector<std::string> ExistingFeatures =
518 std::vector<std::string> ReadFeatures =
525 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
526 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
527 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
528 ExistingFeatures.begin(), ExistingFeatures.end(),
529 std::back_inserter(UnmatchedReadFeatures));
533 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
537 for (StringRef
Feature : UnmatchedReadFeatures)
538 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
539 <<
false << ModuleFilename <<
Feature;
540 for (StringRef
Feature : UnmatchedExistingFeatures)
541 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
542 <<
true << ModuleFilename <<
Feature;
545 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
549 StringRef ModuleFilename,
bool Complain,
550 bool AllowCompatibleDifferences) {
551 const LangOptions &ExistingLangOpts = PP.getLangOpts();
553 Complain ? &Reader.Diags :
nullptr,
554 AllowCompatibleDifferences);
558 StringRef ModuleFilename,
bool Complain,
559 bool AllowCompatibleDifferences) {
562 Complain ? &Reader.Diags :
nullptr,
563 AllowCompatibleDifferences);
567 StringRef ModuleFilename,
bool Complain,
568 bool AllowCompatibleDifferences) {
569 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
571 Complain ? &Reader.Diags :
nullptr,
572 AllowCompatibleDifferences);
577using MacroDefinitionsMap =
578 llvm::StringMap<std::pair<StringRef,
bool >>;
587 bool empty()
const {
return Decls.empty(); }
589 bool insert(NamedDecl *ND) {
590 auto [_, Inserted] =
Found.insert(ND);
597using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
603 StringRef ModuleFilename,
613 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
622 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
624 ->getWarningOptionForDiag(DiagID)
644 StringRef ModuleFilename,
bool IsSystem,
645 bool SystemHeaderWarningsInModule,
654 !SystemHeaderWarningsInModule) {
656 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
657 <<
"-Wsystem-headers" << ModuleFilename;
664 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
665 <<
"-Werror" << ModuleFilename;
672 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
673 <<
"-Weverything -Werror" << ModuleFilename;
680 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
681 <<
"-pedantic-errors" << ModuleFilename;
706 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
710 assert(M &&
"missing module");
715 StringRef ModuleFilename,
719 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
723 PP.getFileManager().getVirtualFileSystem(),
727 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
733 Module *Importer = PP.getCurrentModule();
736 bool SystemHeaderWarningsInModule =
743 TopM->
IsSystem, SystemHeaderWarningsInModule,
751 MacroDefinitionsMap &
Macros,
753 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
755 bool IsUndef = PPOpts.
Macros[I].second;
757 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
758 StringRef MacroName = MacroPair.first;
759 StringRef MacroBody = MacroPair.second;
763 auto [It, Inserted] =
Macros.try_emplace(MacroName);
764 if (MacroNames && Inserted)
765 MacroNames->push_back(MacroName);
767 It->second = std::make_pair(
"",
true);
772 if (MacroName.size() ==
Macro.size())
776 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
777 MacroBody = MacroBody.substr(0, End);
780 auto [It, Inserted] =
Macros.try_emplace(MacroName);
781 if (MacroNames && Inserted)
782 MacroNames->push_back(MacroName);
783 It->second = std::make_pair(MacroBody,
false);
807 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
811 MacroDefinitionsMap ASTFileMacros;
813 MacroDefinitionsMap ExistingMacros;
816 &ExistingMacroNames);
820 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
822 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
824 StringRef MacroName = ExistingMacroNames[I];
825 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
828 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
829 ASTFileMacros.find(MacroName);
835 Diags->
Report(diag::err_ast_file_macro_def_undef)
836 << MacroName <<
true << ModuleFilename;
844 if (Existing.second) {
845 SuggestedPredefines +=
"#undef ";
846 SuggestedPredefines += MacroName.str();
847 SuggestedPredefines +=
'\n';
849 SuggestedPredefines +=
"#define ";
850 SuggestedPredefines += MacroName.str();
851 SuggestedPredefines +=
' ';
852 SuggestedPredefines += Existing.first.str();
853 SuggestedPredefines +=
'\n';
860 if (Existing.second != Known->second.second) {
862 Diags->
Report(diag::err_ast_file_macro_def_undef)
863 << MacroName << Known->second.second << ModuleFilename;
870 if (Existing.second || Existing.first == Known->second.first) {
871 ASTFileMacros.erase(Known);
877 Diags->
Report(diag::err_ast_file_macro_def_conflict)
878 << MacroName << Known->second.first << Existing.first
885 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
890 for (
const auto &MacroName : ASTFileMacros.keys()) {
892 Diags->
Report(diag::err_ast_file_macro_def_undef)
893 << MacroName <<
false << ModuleFilename;
904 Diags->
Report(diag::err_ast_file_undef)
911 if (LangOpts.Modules &&
915 Diags->
Report(diag::err_ast_file_pp_detailed_record)
922 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
929 SuggestedPredefines +=
"#include \"";
930 SuggestedPredefines +=
File;
931 SuggestedPredefines +=
"\"\n";
941 SuggestedPredefines +=
"#include \"";
942 SuggestedPredefines +=
File;
943 SuggestedPredefines +=
"\"\n";
946 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
951 SuggestedPredefines +=
"#__include_macros \"";
952 SuggestedPredefines +=
File;
953 SuggestedPredefines +=
"\"\n##\n";
960 StringRef ModuleFilename,
961 bool ReadMacros,
bool Complain,
962 std::string &SuggestedPredefines) {
966 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
967 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
968 SuggestedPredefines, PP.getLangOpts());
973 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
975 ModuleFilename, ReadMacros,
nullptr,
976 PP.getFileManager(), SuggestedPredefines,
985 StringRef ExistingSpecificModuleCachePath,
986 StringRef ASTFilename,
994 std::string(ContextHash));
997 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
999 auto EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1000 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
1001 if (EqualOrErr && *EqualOrErr)
1007 EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1009 if (EqualOrErr && *EqualOrErr)
1010 Diags->
Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
1012 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
1013 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1020 StringRef ASTFilename,
1021 StringRef ContextHash,
1023 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1026 ASTFilename, Complain ? &Reader.Diags :
nullptr,
1027 PP.getLangOpts(), PP.getPreprocessorOpts(),
1032 PP.setCounterValue(
Value);
1040 unsigned Length = 0;
1041 const char *
Error =
nullptr;
1043 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1045 llvm::report_fatal_error(
Error);
1051static std::pair<unsigned, unsigned>
1054 if ((
unsigned)KeyLen != KeyLen)
1055 llvm::report_fatal_error(
"key too large");
1058 if ((
unsigned)DataLen != DataLen)
1059 llvm::report_fatal_error(
"data too large");
1061 return std::make_pair(KeyLen, DataLen);
1065 bool TakeOwnership) {
1066 DeserializationListener = Listener;
1067 OwnsDeserializationListener = TakeOwnership;
1078 Reader.ReadModuleOffsetMap(MF);
1080 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1081 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1087 assert(OwningModuleFile);
1091 if (!ModuleFileIndex)
1094 assert(LocalDeclID < LocalNumDecls);
1102 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1107std::pair<unsigned, unsigned>
1114 using namespace llvm::support;
1117 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1119 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1126 Args.push_back(FirstII);
1127 for (
unsigned I = 1; I != N; ++I)
1128 Args.push_back(Reader.getLocalIdentifier(
1129 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1137 using namespace llvm::support;
1141 Result.ID = Reader.getGlobalSelectorID(
1142 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1143 unsigned FullInstanceBits =
1144 endian::readNext<uint16_t, llvm::endianness::little>(d);
1145 unsigned FullFactoryBits =
1146 endian::readNext<uint16_t, llvm::endianness::little>(d);
1147 Result.InstanceBits = FullInstanceBits & 0x3;
1148 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1149 Result.FactoryBits = FullFactoryBits & 0x3;
1150 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1151 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1152 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1155 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1159 endian::readNext<DeclID, llvm::endianness::little>(d))))
1164 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1168 endian::readNext<DeclID, llvm::endianness::little>(d))))
1176 return llvm::djbHash(a);
1179std::pair<unsigned, unsigned>
1186 assert(n >= 2 && d[n-1] ==
'\0');
1187 return StringRef((
const char*) d, n-1);
1193 bool IsInteresting =
1204 bool Value = Bits & 0x1;
1210 using namespace llvm::support;
1213 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1214 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1227 const unsigned char* d,
1229 using namespace llvm::support;
1232 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1233 bool IsInteresting = RawID & 0x01;
1243 II = &Reader.getIdentifierTable().getOwn(k);
1246 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1248 Reader.markIdentifierUpToDate(II);
1250 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1251 if (!IsInteresting) {
1254 Reader.SetIdentifierInfo(ID, II);
1258 unsigned ObjCOrBuiltinID =
1259 endian::readNext<uint16_t, llvm::endianness::little>(d);
1260 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1261 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1262 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1263 bool Poisoned =
readBit(Bits);
1264 bool ExtensionToken =
readBit(Bits);
1265 bool HasMacroDefinition =
readBit(Bits);
1267 assert(Bits == 0 &&
"Extra bits in the identifier?");
1268 DataLen -=
sizeof(uint16_t) * 2;
1272 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1277 "Incorrect extension token flag");
1278 (void)ExtensionToken;
1282 "Incorrect C++ operator keyword flag");
1283 (void)CPlusPlusOperatorKeyword;
1287 if (HasMacroDefinition) {
1288 uint32_t MacroDirectivesOffset =
1289 endian::readNext<uint32_t, llvm::endianness::little>(d);
1292 if (MacroDirectivesOffset)
1293 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1295 hasMacroDefinitionInDependencies =
true;
1298 Reader.SetIdentifierInfo(ID, II);
1304 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1305 DeclIDs.push_back(Reader.getGlobalDeclID(
1308 endian::readNext<DeclID, llvm::endianness::little>(d))));
1309 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1316 : Kind(Name.getNameKind()) {
1346 llvm::FoldingSetNodeID ID;
1347 ID.AddInteger(Kind);
1370 return ID.computeStableHash();
1375 using namespace llvm::support;
1377 uint32_t ModuleFileID =
1378 endian::readNext<uint32_t, llvm::endianness::little>(d);
1379 return Reader.getLocalModuleFile(
F, ModuleFileID);
1382std::pair<unsigned, unsigned>
1389 using namespace llvm::support;
1398 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1405 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1429 using namespace llvm::support;
1431 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1433 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1439 const unsigned char *d,
1447 llvm::FoldingSetNodeID ID;
1448 ID.AddInteger(Key.first.getHash());
1449 ID.AddInteger(Key.second);
1450 return ID.computeStableHash();
1461 return {Name, *ModuleHash};
1467 unsigned PrimaryModuleHash =
1468 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1469 return {Name, PrimaryModuleHash};
1473 const unsigned char *d,
1481 using namespace llvm::support;
1483 uint32_t ModuleFileID =
1484 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1485 return Reader.getLocalModuleFile(F, ModuleFileID);
1490 using namespace llvm::support;
1491 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1494std::pair<unsigned, unsigned>
1500 const unsigned char *d,
1503 using namespace llvm::support;
1505 for (
unsigned NumDecls =
1507 NumDecls; --NumDecls) {
1510 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1511 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1515bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1516 BitstreamCursor &Cursor,
1519 assert(Offset != 0);
1522 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1523 Error(std::move(Err));
1531 Error(MaybeCode.takeError());
1534 unsigned Code = MaybeCode.get();
1537 if (!MaybeRecCode) {
1538 Error(MaybeRecCode.takeError());
1541 unsigned RecCode = MaybeRecCode.get();
1543 Error(
"Expected lexical block");
1548 "expected a TU_UPDATE_LEXICAL record for TU");
1553 auto &Lex = LexicalDecls[DC];
1555 Lex = std::make_pair(
1558 Blob.size() /
sizeof(
DeclID)));
1564bool ASTReader::ReadVisibleDeclContextStorage(
1565 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1566 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1567 assert(Offset != 0);
1569 SavedStreamPosition SavedPosition(Cursor);
1570 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1571 Error(std::move(Err));
1577 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1579 Error(MaybeCode.takeError());
1582 unsigned Code = MaybeCode.get();
1584 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1585 if (!MaybeRecCode) {
1586 Error(MaybeRecCode.takeError());
1589 unsigned RecCode = MaybeRecCode.get();
1590 switch (VisibleKind) {
1591 case VisibleDeclContextStorageKind::GenerallyVisible:
1593 Error(
"Expected visible lookup table block");
1597 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1599 Error(
"Expected module local visible lookup table block");
1603 case VisibleDeclContextStorageKind::TULocalVisible:
1605 Error(
"Expected TU local lookup table block");
1613 auto *
Data = (
const unsigned char*)Blob.data();
1614 switch (VisibleKind) {
1615 case VisibleDeclContextStorageKind::GenerallyVisible:
1616 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1618 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1619 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1621 case VisibleDeclContextStorageKind::TULocalVisible:
1623 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1629void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1633 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1634 SpecLookups[D].Table.add(&M,
Data,
1638bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1639 uint64_t Offset, Decl *D,
bool IsPartial) {
1640 assert(Offset != 0);
1642 SavedStreamPosition SavedPosition(Cursor);
1643 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1644 Error(std::move(Err));
1650 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1652 Error(MaybeCode.takeError());
1655 unsigned Code = MaybeCode.get();
1657 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1658 if (!MaybeRecCode) {
1659 Error(MaybeRecCode.takeError());
1662 unsigned RecCode = MaybeRecCode.get();
1665 Error(
"Expected decl specs block");
1669 auto *
Data = (
const unsigned char *)Blob.data();
1670 AddSpecializations(D,
Data, M, IsPartial);
1674void ASTReader::Error(StringRef Msg)
const {
1675 Error(diag::err_fe_ast_file_malformed, Msg);
1676 if (PP.getLangOpts().Modules &&
1677 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1678 Diag(diag::note_module_cache_path)
1679 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1683void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1684 StringRef Arg3)
const {
1685 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1689struct AlreadyReportedDiagnosticError
1690 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1693 void log(raw_ostream &OS)
const override {
1694 llvm_unreachable(
"reporting an already-reported diagnostic error");
1697 std::error_code convertToErrorCode()
const override {
1698 return llvm::inconvertibleErrorCode();
1702char AlreadyReportedDiagnosticError::ID = 0;
1705void ASTReader::Error(llvm::Error &&Err)
const {
1707 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1708 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1718 LineTableInfo &LineTable = SourceMgr.getLineTable();
1721 std::map<int, int> FileIDs;
1723 for (
unsigned I = 0;
Record[Idx]; ++I) {
1725 auto Filename = ReadPath(F,
Record, Idx);
1731 std::vector<LineEntry> Entries;
1732 while (Idx <
Record.size()) {
1733 FileID FID = ReadFileID(F,
Record, Idx);
1736 unsigned NumEntries =
Record[Idx++];
1737 assert(NumEntries &&
"no line entries for file ID");
1739 Entries.reserve(NumEntries);
1740 for (
unsigned I = 0; I != NumEntries; ++I) {
1741 unsigned FileOffset =
Record[Idx++];
1742 unsigned LineNo =
Record[Idx++];
1743 int FilenameID = FileIDs[
Record[Idx++]];
1746 unsigned IncludeOffset =
Record[Idx++];
1748 FileKind, IncludeOffset));
1755llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1756 using namespace SrcMgr;
1764 SLocEntryCursor = F.
Stream;
1767 if (llvm::Error Err = F.
Stream.SkipBlock())
1777 Expected<llvm::BitstreamEntry> MaybeE =
1778 SLocEntryCursor.advanceSkippingSubblocks();
1780 return MaybeE.takeError();
1781 llvm::BitstreamEntry E = MaybeE.get();
1784 case llvm::BitstreamEntry::SubBlock:
1785 case llvm::BitstreamEntry::Error:
1786 return llvm::createStringError(std::errc::illegal_byte_sequence,
1787 "malformed block record in AST file");
1788 case llvm::BitstreamEntry::EndBlock:
1789 return llvm::Error::success();
1790 case llvm::BitstreamEntry::Record:
1798 Expected<unsigned> MaybeRecord =
1799 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1801 return MaybeRecord.takeError();
1802 switch (MaybeRecord.get()) {
1810 return llvm::Error::success();
1815llvm::Expected<SourceLocation::UIntTy>
1821 return std::move(Err);
1825 return MaybeEntry.takeError();
1827 llvm::BitstreamEntry Entry = MaybeEntry.get();
1828 if (Entry.Kind != llvm::BitstreamEntry::Record)
1829 return llvm::createStringError(
1830 std::errc::illegal_byte_sequence,
1831 "incorrectly-formatted source location entry in AST file");
1837 return MaybeSLOC.takeError();
1839 switch (MaybeSLOC.get()) {
1841 return llvm::createStringError(
1842 std::errc::illegal_byte_sequence,
1843 "incorrectly-formatted source location entry in AST file");
1853 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1854 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1855 "Corrupted global sloc offset map");
1860 auto It = llvm::upper_bound(
1863 int ID = F->SLocEntryBaseID + LocalIndex;
1864 std::size_t Index = -ID - 2;
1865 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1866 assert(!SourceMgr.SLocEntryLoaded[Index]);
1867 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1868 if (!MaybeEntryOffset) {
1869 Error(MaybeEntryOffset.takeError());
1873 SourceMgr.LoadedSLocEntryTable[Index] =
1874 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1875 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1877 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1893 Error(
"source location entry ID out-of-range for AST file");
1899 auto ReadBuffer = [
this](
1900 BitstreamCursor &SLocEntryCursor,
1901 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1906 Error(MaybeCode.takeError());
1909 unsigned Code = MaybeCode.get();
1912 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1913 if (!MaybeRecCode) {
1914 Error(MaybeRecCode.takeError());
1917 unsigned RecCode = MaybeRecCode.get();
1922 const llvm::compression::Format F =
1923 Blob.size() > 0 && Blob.data()[0] == 0x78
1924 ? llvm::compression::Format::Zlib
1925 : llvm::compression::Format::Zstd;
1926 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1931 if (llvm::Error E = llvm::compression::decompress(
1932 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1933 Error(
"could not decompress embedded file contents: " +
1934 llvm::toString(std::move(E)));
1937 return llvm::MemoryBuffer::getMemBufferCopy(
1938 llvm::toStringRef(Decompressed), Name);
1940 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1942 Error(
"AST record has invalid code");
1947 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1951 Error(std::move(Err));
1958 ++NumSLocEntriesRead;
1961 Error(MaybeEntry.takeError());
1964 llvm::BitstreamEntry Entry = MaybeEntry.get();
1966 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1967 Error(
"incorrectly-formatted source location entry in AST file");
1974 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1976 Error(MaybeSLOC.takeError());
1979 switch (MaybeSLOC.get()) {
1981 Error(
"incorrectly-formatted source location entry in AST file");
1987 unsigned InputID =
Record[4];
1988 InputFile IF = getInputFile(*F, InputID);
2001 IncludeLoc = getImportLocation(F);
2005 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
2008 FileInfo.NumCreatedFIDs =
Record[5];
2012 unsigned NumFileDecls =
Record[7];
2013 if (NumFileDecls && ContextObj) {
2015 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
2021 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
2025 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
2028 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
2035 const char *Name = Blob.data();
2036 unsigned Offset =
Record[0];
2041 IncludeLoc = getImportLocation(F);
2044 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2047 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2048 BaseOffset + Offset, IncludeLoc);
2050 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2051 FileInfo.setHasLineDirectives();
2060 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2075 Error(
"source location entry ID out-of-range for AST file");
2080 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2098 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2099 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2109 uint64_t *StartOfBlockOffset) {
2110 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2113 if (StartOfBlockOffset)
2114 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2117 uint64_t Offset = Cursor.GetCurrentBitNo();
2120 return MaybeCode.takeError();
2121 unsigned Code = MaybeCode.get();
2124 if (Code != llvm::bitc::DEFINE_ABBREV) {
2125 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2127 return llvm::Error::success();
2129 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2142 if (
Tok.isAnnotation()) {
2144 switch (
Tok.getKind()) {
2145 case tok::annot_pragma_loop_hint: {
2149 unsigned NumTokens =
Record[Idx++];
2151 Toks.reserve(NumTokens);
2152 for (
unsigned I = 0; I < NumTokens; ++I)
2154 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2155 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2158 case tok::annot_pragma_pack: {
2163 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2165 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2169 case tok::annot_pragma_openmp:
2170 case tok::annot_pragma_openmp_end:
2171 case tok::annot_pragma_unused:
2172 case tok::annot_pragma_openacc:
2173 case tok::annot_pragma_openacc_end:
2174 case tok::annot_repl_input_end:
2177 llvm_unreachable(
"missing deserialization code for annotation token");
2182 Tok.setIdentifierInfo(II);
2194 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2196 consumeError(std::move(Err));
2208 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2210 Stream.advanceSkippingSubblocks(Flags);
2212 Error(MaybeEntry.takeError());
2215 llvm::BitstreamEntry Entry = MaybeEntry.get();
2217 switch (Entry.Kind) {
2218 case llvm::BitstreamEntry::SubBlock:
2219 case llvm::BitstreamEntry::Error:
2220 Error(
"malformed block record in AST file");
2222 case llvm::BitstreamEntry::EndBlock:
2224 case llvm::BitstreamEntry::Record:
2235 Error(MaybeRecType.takeError());
2251 unsigned NextIndex = 1;
2253 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2258 PP.getPreprocessorAllocator());
2261 bool isC99VarArgs =
Record[NextIndex++];
2262 bool isGNUVarArgs =
Record[NextIndex++];
2263 bool hasCommaPasting =
Record[NextIndex++];
2264 MacroParams.clear();
2265 unsigned NumArgs =
Record[NextIndex++];
2266 for (
unsigned i = 0; i != NumArgs; ++i)
2281 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2286 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2288 PreprocessingRecord::PPEntityID PPID =
2289 PPRec.getPPEntityID(Index,
true);
2291 PPRec.getPreprocessedEntity(PPID));
2293 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2304 if (MacroTokens.empty()) {
2305 Error(
"unexpected number of macro tokens for a macro in AST file");
2311 MacroTokens = MacroTokens.drop_front();
2322 ReadModuleOffsetMap(M);
2324 unsigned ModuleFileIndex = LocalID >> 32;
2325 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2328 assert(MF &&
"malformed identifier ID encoding?");
2330 if (!ModuleFileIndex) {
2339HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2342 return FileMgr.getOptionalFileRef(Key.Filename);
2346 return FileMgr.getOptionalFileRef(*Resolved);
2350 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2353 return llvm::xxh3_64bits(buf);
2374 return FEA && FEA == FEB;
2377std::pair<unsigned, unsigned>
2384 using namespace llvm::support;
2387 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2389 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2398 using namespace llvm::support;
2400 const unsigned char *End = d + DataLen;
2402 unsigned Flags = *d++;
2405 bool Included = (Flags >> 6) & 0x01;
2407 if ((FE = getFile(key)))
2410 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2413 HFI.
isImport |= (Flags >> 5) & 0x01;
2415 HFI.
DirInfo = (Flags >> 1) & 0x07;
2417 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2419 assert((End - d) % 4 == 0 &&
2420 "Wrong data length in HeaderFileInfo deserialization");
2422 uint32_t LocalSMID =
2423 endian::readNext<uint32_t, llvm::endianness::little>(d);
2429 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2430 Module *Mod = Reader.getSubmodule(GlobalSMID);
2432 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2434 if (FE || (FE = getFile(key))) {
2437 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2449 uint32_t MacroDirectivesOffset) {
2450 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2451 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2458 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2459 BitstreamCursor &MacroCursor = I.MacroCursor;
2462 if (MacroCursor.getBitcodeBytes().empty())
2465 BitstreamCursor Cursor = MacroCursor;
2466 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2467 Error(std::move(Err));
2475 Error(MaybeE.takeError());
2478 llvm::BitstreamEntry E = MaybeE.get();
2481 case llvm::BitstreamEntry::SubBlock:
2482 case llvm::BitstreamEntry::Error:
2483 Error(
"malformed block record in AST file");
2485 case llvm::BitstreamEntry::EndBlock:
2488 case llvm::BitstreamEntry::Record: {
2492 Error(MaybeRecord.takeError());
2495 switch (MaybeRecord.get()) {
2522 class IdentifierLookupVisitor {
2525 unsigned PriorGeneration;
2526 unsigned &NumIdentifierLookups;
2527 unsigned &NumIdentifierLookupHits;
2531 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2532 unsigned &NumIdentifierLookups,
2533 unsigned &NumIdentifierLookupHits)
2535 PriorGeneration(PriorGeneration),
2536 NumIdentifierLookups(NumIdentifierLookups),
2537 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2551 ++NumIdentifierLookups;
2552 ASTIdentifierLookupTable::iterator Pos =
2553 IdTable->find_hashed(Name, NameHash, &Trait);
2554 if (Pos == IdTable->end())
2560 ++NumIdentifierLookupHits;
2562 if (Trait.hasMoreInformationInDependencies()) {
2571 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2580 unsigned PriorGeneration = 0;
2582 PriorGeneration = IdentifierGeneration[&II];
2589 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2594 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2595 NumIdentifierLookups,
2596 NumIdentifierLookupHits);
2597 ModuleMgr.visit(Visitor, HitsPtr);
2614 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2615 uint64_t LocalIndex =
Record[Idx++];
2620 const PendingMacroInfo &PMInfo) {
2625 if (llvm::Error Err =
2627 Error(std::move(Err));
2631 struct ModuleMacroRecord {
2644 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2646 Error(MaybeEntry.takeError());
2649 llvm::BitstreamEntry Entry = MaybeEntry.get();
2651 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2652 Error(
"malformed block record in AST file");
2659 Error(MaybePP.takeError());
2667 ModuleMacros.push_back(ModuleMacroRecord());
2668 auto &Info = ModuleMacros.back();
2672 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2678 Error(
"malformed block record in AST file");
2689 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2691 for (
auto &MMR : ModuleMacros) {
2693 for (
unsigned ModID : MMR.Overrides) {
2695 auto *
Macro = PP.getModuleMacro(Mod, II);
2696 assert(
Macro &&
"missing definition for overridden macro");
2697 Overrides.push_back(
Macro);
2700 bool Inserted =
false;
2702 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2713 unsigned Idx = 0, N =
Record.size();
2721 MD = PP.AllocateDefMacroDirective(MI, Loc);
2725 MD = PP.AllocateUndefMacroDirective(Loc);
2728 bool isPublic =
Record[Idx++];
2729 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2741 PP.setLoadedMacroDirective(II, Earliest, Latest);
2744bool ASTReader::shouldDisableValidationForFile(
2767static std::pair<StringRef, StringRef>
2769 const StringRef InputBlob) {
2770 uint16_t AsRequestedLength =
Record[7];
2771 return {InputBlob.substr(0, AsRequestedLength),
2772 InputBlob.substr(AsRequestedLength)};
2786 SavedStreamPosition SavedPosition(Cursor);
2790 consumeError(std::move(Err));
2793 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2796 consumeError(MaybeCode.takeError());
2798 unsigned Code = MaybeCode.get();
2802 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2804 "invalid record type for input file");
2807 consumeError(
Maybe.takeError());
2810 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2812 R.StoredSize =
static_cast<off_t
>(
Record[1]);
2813 R.StoredTime =
static_cast<time_t
>(
Record[2]);
2814 R.Overridden =
static_cast<bool>(
Record[3]);
2815 R.Transient =
static_cast<bool>(
Record[4]);
2816 R.TopLevel =
static_cast<bool>(
Record[5]);
2817 R.ModuleMap =
static_cast<bool>(
Record[6]);
2818 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2820 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2821 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2822 ? UnresolvedFilenameAsRequested
2823 : UnresolvedFilename;
2825 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2827 consumeError(MaybeEntry.takeError());
2828 llvm::BitstreamEntry Entry = MaybeEntry.get();
2829 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2830 "expected record type for input file hash");
2833 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2835 "invalid record type for input file hash");
2838 consumeError(
Maybe.takeError());
2863 SavedStreamPosition SavedPosition(Cursor);
2867 consumeError(std::move(Err));
2882 const HeaderSearchOptions &HSOpts =
2883 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2896 if ((Overridden || Transient || SkipChecks) && !
File)
2901 std::string ErrorStr =
"could not find file '";
2902 ErrorStr += *Filename;
2903 ErrorStr +=
"' referenced by AST file '";
2917 SourceManager &
SM = getSourceManager();
2919 if ((!Overridden && !Transient) && !SkipChecks &&
2920 SM.isFileOverridden(*
File)) {
2922 Error(diag::err_fe_pch_file_overridden, *Filename);
2933 auto HasInputContentChanged = [&](
Change OriginalChange) {
2934 assert(ValidateASTInputFilesContent &&
2935 "We should only check the content of the inputs with "
2936 "ValidateASTInputFilesContent enabled.");
2938 if (StoredContentHash == 0)
2939 return OriginalChange;
2942 if (!MemBuffOrError) {
2944 return OriginalChange;
2945 std::string ErrorStr =
"could not get buffer for file '";
2946 ErrorStr +=
File->getName();
2949 return OriginalChange;
2952 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2953 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2958 auto HasInputFileChanged = [&]() {
2959 if (StoredSize !=
File->getSize())
2961 if (!shouldDisableValidationForFile(F) && StoredTime &&
2962 StoredTime !=
File->getModificationTime()) {
2964 File->getModificationTime()};
2968 if (ValidateASTInputFilesContent)
2969 return HasInputContentChanged(MTimeChange);
2976 bool IsOutOfDate =
false;
2983 FileChange = HasInputContentChanged(FileChange);
2989 if (!StoredTime && ValidateASTInputFilesContent &&
2991 FileChange = HasInputContentChanged(FileChange);
2997 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2998 while (!ImportStack.back()->ImportedBy.empty())
2999 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
3002 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
3003 Diag(diag::err_fe_ast_file_modified)
3005 << TopLevelASTFileName;
3006 Diag(diag::note_fe_ast_file_modified)
3007 << FileChange.Kind << (FileChange.Old && FileChange.New)
3008 << llvm::itostr(FileChange.Old.value_or(0))
3009 << llvm::itostr(FileChange.New.value_or(0));
3012 if (ImportStack.size() > 1) {
3013 Diag(diag::note_ast_file_required_by)
3014 << *Filename << ImportStack[0]->FileName;
3015 for (
unsigned I = 1; I < ImportStack.size(); ++I)
3016 Diag(diag::note_ast_file_required_by)
3017 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3021 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3022 Diag(diag::note_ast_file_input_files_validation_status)
3038ASTReader::TemporarilyOwnedStringRef
3044ASTReader::TemporarilyOwnedStringRef
3047 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3049 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3050 Path ==
"<built-in>" || Path ==
"<command line>")
3054 llvm::sys::path::append(Buf, Prefix, Path);
3055 StringRef ResolvedPath{Buf.data(), Buf.size()};
3056 return {ResolvedPath, Buf};
3069 return ResolvedPath->str();
3084 llvm_unreachable(
"unknown ASTReadResult");
3088 BitstreamCursor &Stream, StringRef Filename,
3089 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3090 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3093 consumeError(std::move(Err));
3101 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3104 consumeError(MaybeEntry.takeError());
3107 llvm::BitstreamEntry Entry = MaybeEntry.get();
3109 switch (Entry.Kind) {
3110 case llvm::BitstreamEntry::Error:
3111 case llvm::BitstreamEntry::SubBlock:
3114 case llvm::BitstreamEntry::EndBlock:
3117 case llvm::BitstreamEntry::Record:
3124 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3125 if (!MaybeRecordType) {
3127 consumeError(MaybeRecordType.takeError());
3132 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3133 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3134 AllowCompatibleConfigurationMismatch))
3135 Result = ConfigurationMismatch;
3140 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3141 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3142 AllowCompatibleConfigurationMismatch))
3143 Result = ConfigurationMismatch;
3148 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3149 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3150 AllowCompatibleConfigurationMismatch))
3151 Result = ConfigurationMismatch;
3156 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3157 if (!AllowCompatibleConfigurationMismatch &&
3158 ParseFileSystemOptions(
Record, Complain, Listener))
3159 Result = ConfigurationMismatch;
3164 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3165 if (!AllowCompatibleConfigurationMismatch &&
3166 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3167 Result = ConfigurationMismatch;
3172 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3173 if (!AllowCompatibleConfigurationMismatch &&
3174 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3175 SuggestedPredefines))
3176 Result = ConfigurationMismatch;
3182ASTReader::RelocationResult
3183ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3185 const bool IgnoreError =
3186 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3189 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3190 return {std::nullopt, IgnoreError};
3194 if (!DirectoryCheck &&
3195 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3196 return {std::nullopt, IgnoreError};
3198 const HeaderSearchOptions &HSOpts =
3199 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3206 return {std::nullopt, IgnoreError};
3208 return {std::nullopt, IgnoreError};
3216 Module *M = PP.getHeaderSearchInfo().lookupModule(
3221 return {M, IgnoreError};
3226 SmallVectorImpl<ImportedModule> &Loaded,
3228 unsigned ClientLoadCapabilities) {
3229 BitstreamCursor &Stream = F.
Stream;
3232 Error(std::move(Err));
3242 bool HasReadUnhashedControlBlock =
false;
3243 auto readUnhashedControlBlockOnce = [&]() {
3244 if (!HasReadUnhashedControlBlock) {
3245 HasReadUnhashedControlBlock =
true;
3246 if (ASTReadResult
Result =
3247 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3253 bool DisableValidation = shouldDisableValidationForFile(F);
3257 unsigned NumInputs = 0;
3258 unsigned NumUserInputs = 0;
3259 StringRef BaseDirectoryAsWritten;
3261 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3263 Error(MaybeEntry.takeError());
3266 llvm::BitstreamEntry Entry = MaybeEntry.get();
3268 switch (Entry.Kind) {
3269 case llvm::BitstreamEntry::Error:
3270 Error(
"malformed block record in AST file");
3272 case llvm::BitstreamEntry::EndBlock: {
3275 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3279 const HeaderSearchOptions &HSOpts =
3280 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3287 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3293 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3300 N = ForceValidateUserInputs ? NumUserInputs : 0;
3302 ForceValidateUserInputs
3308 Diag(diag::remark_module_validation)
3311 for (
unsigned I = 0; I < N; ++I) {
3312 InputFile IF = getInputFile(F, I+1, Complain);
3326 for (
unsigned I = 0; I < N; ++I) {
3327 bool IsSystem = I >= NumUserInputs;
3329 auto FilenameAsRequested = ResolveImportedPath(
3332 *FilenameAsRequested, IsSystem, FI.
Overridden,
3340 case llvm::BitstreamEntry::SubBlock:
3344 if (llvm::Error Err = Stream.SkipBlock()) {
3345 Error(std::move(Err));
3349 Error(
"malformed block record in AST file");
3359 if (Listener && !ImportedBy) {
3365 bool AllowCompatibleConfigurationMismatch =
3369 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3370 AllowCompatibleConfigurationMismatch, *Listener,
3371 SuggestedPredefines);
3373 Error(
"malformed block record in AST file");
3377 if (DisableValidation ||
3378 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3386 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3387 Error(std::move(Err));
3393 if (llvm::Error Err = Stream.SkipBlock()) {
3394 Error(std::move(Err));
3400 case llvm::BitstreamEntry::Record:
3408 Expected<unsigned> MaybeRecordType =
3409 Stream.readRecord(Entry.ID,
Record, &Blob);
3410 if (!MaybeRecordType) {
3411 Error(MaybeRecordType.takeError());
3417 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3419 : diag::err_ast_file_version_too_new)
3424 bool hasErrors =
Record[7];
3425 if (hasErrors && !DisableValidation) {
3428 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3429 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3432 if (!AllowASTWithCompilerErrors) {
3433 Diag(diag::err_ast_file_with_compiler_errors)
3439 Diags.ErrorOccurred =
true;
3440 Diags.UncompilableErrorOccurred =
true;
3441 Diags.UnrecoverableErrorOccurred =
true;
3454 StringRef ASTBranch = Blob;
3455 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3456 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3457 Diag(diag::err_ast_file_different_branch)
3469 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3479 auto [ImportLoc, ImportModuleFileIndex] =
3480 ReadUntranslatedSourceLocation(
Record[Idx++]);
3482 assert(ImportModuleFileIndex == 0);
3484 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3486 bool IsImportingStdCXXModule =
Record[Idx++];
3488 off_t StoredSize = 0;
3489 time_t StoredModTime = 0;
3490 unsigned ImplicitModuleSuffixLength = 0;
3491 ASTFileSignature StoredSignature;
3492 ModuleFileName ImportedFile;
3493 std::string StoredFile;
3494 bool IgnoreImportedByNote =
false;
3503 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3504 ImportedName, !IsImportingStdCXXModule);
3506 if (IsImportingStdCXXModule && ImportedFile.
empty()) {
3507 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3511 if (!IsImportingStdCXXModule) {
3512 StoredSize = (off_t)
Record[Idx++];
3513 StoredModTime = (time_t)
Record[Idx++];
3514 ImplicitModuleSuffixLength = (unsigned)
Record[Idx++];
3518 SignatureBytes.end());
3521 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3522 if (ImportedFile.
empty()) {
3523 ImportedFile = ImplicitModuleSuffixLength
3525 StoredFile, ImplicitModuleSuffixLength)
3526 : ModuleFileName::makeExplicit(StoredFile);
3528 (ImplicitModuleSuffixLength != 0));
3529 }
else if (!getDiags().isIgnored(
3530 diag::warn_module_file_mapping_mismatch,
3531 CurrentImportLoc)) {
3532 auto ImportedFileRef =
3533 PP.getFileManager().getOptionalFileRef(ImportedFile);
3534 auto StoredFileRef =
3535 PP.getFileManager().getOptionalFileRef(StoredFile);
3536 if ((ImportedFileRef && StoredFileRef) &&
3537 (*ImportedFileRef != *StoredFileRef)) {
3538 Diag(diag::warn_module_file_mapping_mismatch)
3539 << ImportedFile << StoredFile;
3540 Diag(diag::note_module_file_imported_by)
3542 IgnoreImportedByNote =
true;
3549 unsigned Capabilities = ClientLoadCapabilities;
3550 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3551 Capabilities &= ~ARR_Missing;
3554 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3555 Loaded, StoredSize, StoredModTime,
3556 StoredSignature, Capabilities);
3561 if (IsImportingStdCXXModule) {
3562 if (
const auto *Imported =
3563 getModuleManager().lookupByFileName(ImportedFile);
3564 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3565 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3571 bool recompilingFinalized =
Result == OutOfDate &&
3572 (Capabilities & ARR_OutOfDate) &&
3575 .getInMemoryModuleCache()
3577 if (!IgnoreImportedByNote &&
3579 Diag(diag::note_module_file_imported_by)
3586 case OutOfDate:
return OutOfDate;
3588 case ConfigurationMismatch:
return ConfigurationMismatch;
3589 case HadErrors:
return HadErrors;
3608 Diag(diag::remark_module_import)
3610 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3616 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3624 BaseDirectoryAsWritten = Blob;
3626 "MODULE_DIRECTORY found before MODULE_NAME");
3629 auto [MaybeM, IgnoreError] =
3630 getModuleForRelocationChecks(F,
true);
3631 if (!MaybeM.has_value())
3634 Module *M = MaybeM.value();
3646 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3647 if (BuildDir && (*BuildDir == M->
Directory)) {
3651 Diag(diag::remark_module_relocated)
3654 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3655 Diag(diag::err_imported_module_relocated)
3661 if (ASTReadResult
Result =
3662 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3668 NumUserInputs =
Record[1];
3670 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3679llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3680 unsigned ClientLoadCapabilities) {
3681 BitstreamCursor &Stream = F.
Stream;
3683 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3690 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3692 return MaybeEntry.takeError();
3693 llvm::BitstreamEntry Entry = MaybeEntry.get();
3695 switch (Entry.Kind) {
3696 case llvm::BitstreamEntry::Error:
3697 return llvm::createStringError(
3698 std::errc::illegal_byte_sequence,
3699 "error at end of module block in AST file");
3700 case llvm::BitstreamEntry::EndBlock:
3706 if (ASTContext *Ctx = ContextObj) {
3707 DeclContext *DC = Ctx->getTranslationUnitDecl();
3712 return llvm::Error::success();
3713 case llvm::BitstreamEntry::SubBlock:
3721 if (llvm::Error Err = Stream.SkipBlock())
3723 if (llvm::Error Err = ReadBlockAbbrevs(
3730 if (!PP.getExternalSource())
3731 PP.setExternalSource(
this);
3733 if (llvm::Error Err = Stream.SkipBlock())
3735 if (llvm::Error Err =
3744 if (llvm::Error Err = Stream.SkipBlock()) {
3753 if (!PP.getPreprocessingRecord())
3754 PP.createPreprocessingRecord();
3755 if (!PP.getPreprocessingRecord()->getExternalSource())
3756 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3760 if (llvm::Error Err = ReadSourceManagerBlock(F))
3766 if (llvm::Error Err = Stream.SkipBlock())
3768 if (llvm::Error Err =
3775 BitstreamCursor
C = Stream;
3777 if (llvm::Error Err = Stream.SkipBlock())
3781 CommentsCursors.push_back(std::make_pair(
C, &F));
3786 if (llvm::Error Err = Stream.SkipBlock())
3792 case llvm::BitstreamEntry::Record:
3800 Expected<unsigned> MaybeRecordType =
3801 Stream.readRecord(Entry.ID,
Record, &Blob);
3802 if (!MaybeRecordType)
3803 return MaybeRecordType.takeError();
3808 switch (RecordType) {
3830 switch (RecordType) {
3840 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3844 GlobalSubmoduleMap.insert(
3845 std::make_pair(getTotalNumSubmodules() + 1, &F));
3856 auto ReadSubmodule = [&](
unsigned LocalID) ->
Module * {
3857 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3860 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.
ModuleName)) {
3866 ReadSubmodule(LocalID);
3880 return llvm::createStringError(
3881 std::errc::illegal_byte_sequence,
3882 "duplicate TYPE_OFFSET record in AST file");
3895 return llvm::createStringError(
3896 std::errc::illegal_byte_sequence,
3897 "duplicate DECL_OFFSET record in AST file");
3909 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3910 LexicalContents Contents(
3912 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3913 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3920 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3921 auto *
Data = (
const unsigned char*)Blob.data();
3922 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3925 if (Decl *D = GetExistingDecl(ID))
3926 PendingUpdateRecords.push_back(
3927 PendingUpdateRecord(ID, D,
false));
3933 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3934 auto *
Data = (
const unsigned char *)Blob.data();
3935 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3938 if (Decl *D = GetExistingDecl(ID))
3939 PendingUpdateRecords.push_back(
3940 PendingUpdateRecord(ID, D,
false));
3948 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3949 auto *
Data = (
const unsigned char *)Blob.data();
3950 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3953 if (Decl *D = GetExistingDecl(ID))
3954 PendingUpdateRecords.push_back(
3955 PendingUpdateRecord(ID, D,
false));
3961 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3962 auto *
Data = (
const unsigned char *)Blob.data();
3963 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3966 if (Decl *D = GetExistingDecl(ID))
3967 PendingUpdateRecords.push_back(
3968 PendingUpdateRecord(ID, D,
false));
3974 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3975 auto *
Data = (
const unsigned char *)Blob.data();
3976 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3979 if (Decl *D = GetExistingDecl(ID))
3980 PendingUpdateRecords.push_back(
3981 PendingUpdateRecord(ID, D,
false));
3987 reinterpret_cast<const unsigned char *
>(Blob.data());
3993 ASTIdentifierLookupTrait(*
this, F));
3995 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
4001 return llvm::createStringError(
4002 std::errc::illegal_byte_sequence,
4003 "duplicate IDENTIFIER_OFFSET record in AST file");
4009 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4021 for (
unsigned I = 0, N =
Record.size(); I != N; )
4022 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4029 getContext().getLangOpts().BuildingPCHWithObjectFile)
4030 for (
unsigned I = 0, N =
Record.size(); I != N; )
4031 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4035 if (SpecialTypes.empty()) {
4036 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
4037 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
4044 if (SpecialTypes.size() !=
Record.size())
4045 return llvm::createStringError(std::errc::illegal_byte_sequence,
4046 "invalid special-types record");
4048 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4050 if (!SpecialTypes[I])
4051 SpecialTypes[I] =
ID;
4058 TotalNumStatements +=
Record[0];
4059 TotalNumMacros +=
Record[1];
4060 TotalLexicalDeclContexts +=
Record[2];
4061 TotalVisibleDeclContexts +=
Record[3];
4062 TotalModuleLocalVisibleDeclContexts +=
Record[4];
4063 TotalTULocalVisibleDeclContexts +=
Record[5];
4067 for (
unsigned I = 0, N =
Record.size(); I != N; )
4068 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4072 for (
unsigned I = 0, N =
Record.size(); I != N; )
4073 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4077 if (
Record.size() % 3 != 0)
4078 return llvm::createStringError(std::errc::illegal_byte_sequence,
4079 "invalid weak identifiers record");
4083 WeakUndeclaredIdentifiers.clear();
4086 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4087 WeakUndeclaredIdentifiers.push_back(
4088 getGlobalIdentifierID(F,
Record[I++]));
4089 WeakUndeclaredIdentifiers.push_back(
4090 getGlobalIdentifierID(F,
Record[I++]));
4091 WeakUndeclaredIdentifiers.push_back(
4092 ReadSourceLocation(F,
Record, I).getRawEncoding());
4097 if (
Record.size() % 3 != 0)
4098 return llvm::createStringError(std::errc::illegal_byte_sequence,
4099 "invalid extname identifiers record");
4103 ExtnameUndeclaredIdentifiers.clear();
4107 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4108 ExtnameUndeclaredIdentifiers.push_back(
4109 getGlobalIdentifierID(F,
Record[I++]));
4110 ExtnameUndeclaredIdentifiers.push_back(
4111 getGlobalIdentifierID(F,
Record[I++]));
4112 ExtnameUndeclaredIdentifiers.push_back(
4113 ReadSourceLocation(F,
Record, I).getRawEncoding());
4120 unsigned LocalBaseSelectorID =
Record[1];
4126 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4131 std::make_pair(LocalBaseSelectorID,
4143 = ASTSelectorLookupTable::Create(
4146 ASTSelectorLookupTrait(*
this, F));
4147 TotalNumMethodPoolEntries +=
Record[1];
4152 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4153 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4155 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4164 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4165 ReadSourceLocation(F,
Record, Idx));
4171 SmallVector<SourceLocation, 64> SrcLocs;
4173 while (Idx <
Record.size())
4174 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4175 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4182 unsigned Idx = 0, End =
Record.size() - 1;
4183 bool ReachedEOFWhileSkipping =
Record[Idx++];
4184 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4185 if (ReachedEOFWhileSkipping) {
4186 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4187 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4188 bool FoundNonSkipPortion =
Record[Idx++];
4189 bool FoundElse =
Record[Idx++];
4190 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4191 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4192 FoundElse, ElseLoc);
4194 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4196 auto Loc = ReadSourceLocation(F,
Record, Idx);
4197 bool WasSkipping =
Record[Idx++];
4198 bool FoundNonSkip =
Record[Idx++];
4199 bool FoundElse =
Record[Idx++];
4200 ConditionalStack.push_back(
4201 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4203 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4208 if (!
Record.empty() && Listener)
4226 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4227 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4228 return llvm::createStringError(std::errc::invalid_argument,
4229 "ran out of source locations");
4234 unsigned RangeStart =
4236 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4241 GlobalSLocOffsetMap.insert(
4243 - SLocSpaceSize,&F));
4254 ParseLineTable(F,
Record);
4258 for (
unsigned I = 0, N =
Record.size(); I != N; )
4259 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4263 if (
Record.size() % 3 != 0)
4264 return llvm::createStringError(std::errc::illegal_byte_sequence,
4265 "Invalid VTABLE_USES record");
4272 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4273 VTableUses.push_back(
4274 {ReadDeclID(F,
Record, Idx),
4275 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4282 if (
Record.size() % 2 != 0)
4283 return llvm::createStringError(
4284 std::errc::illegal_byte_sequence,
4285 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4290 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4291 PendingInstantiations.push_back(
4292 {ReadDeclID(F,
Record, I),
4293 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4300 return llvm::createStringError(std::errc::illegal_byte_sequence,
4301 "Invalid SEMA_DECL_REFS block");
4302 for (
unsigned I = 0, N =
Record.size(); I != N; )
4303 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4311 unsigned StartingID;
4312 if (!PP.getPreprocessingRecord())
4313 PP.createPreprocessingRecord();
4314 if (!PP.getPreprocessingRecord()->getExternalSource())
4315 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4317 = PP.getPreprocessingRecord()
4324 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4335 if (!PP.getPreprocessingRecord())
4336 PP.createPreprocessingRecord();
4337 if (!PP.getPreprocessingRecord()->getExternalSource())
4338 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4343 GlobalSkippedRangeMap.insert(
4349 if (
Record.size() % 2 != 0)
4350 return llvm::createStringError(
4351 std::errc::illegal_byte_sequence,
4352 "invalid DECL_UPDATE_OFFSETS block in AST file");
4353 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4354 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4355 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4359 if (Decl *D = GetExistingDecl(ID))
4360 PendingUpdateRecords.push_back(
4361 PendingUpdateRecord(ID, D,
false));
4366 if (
Record.size() % 5 != 0)
4367 return llvm::createStringError(
4368 std::errc::illegal_byte_sequence,
4369 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4371 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4372 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4375 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4378 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4381 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4384 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4387 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4389 DelayedNamespaceOffsetMap[
ID] = {
4390 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4392 assert(!GetExistingDecl(ID) &&
4393 "We shouldn't load the namespace in the front of delayed "
4394 "namespace lexical and visible block");
4400 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4401 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4402 auto &RelatedDecls = RelatedDeclsMap[
ID];
4403 unsigned NN =
Record[I++];
4404 RelatedDecls.reserve(NN);
4405 for (
unsigned II = 0; II < NN; II++)
4406 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4412 return llvm::createStringError(
4413 std::errc::illegal_byte_sequence,
4414 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4427 CUDASpecialDeclRefs.clear();
4428 for (
unsigned I = 0, N =
Record.size(); I != N; )
4429 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4439 HeaderFileInfoTrait(*
this, F));
4441 PP.getHeaderSearchInfo().SetExternalSource(
this);
4442 if (!PP.getHeaderSearchInfo().getExternalLookup())
4443 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4449 FPPragmaOptions.swap(
Record);
4453 for (
unsigned I = 0, N =
Record.size(); I != N; )
4454 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4458 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4459 auto Name = ReadString(
Record, I);
4460 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4461 OptInfo.Supported =
Record[I++] != 0;
4462 OptInfo.Enabled =
Record[I++] != 0;
4463 OptInfo.WithPragma =
Record[I++] != 0;
4464 OptInfo.Avail =
Record[I++];
4465 OptInfo.Core =
Record[I++];
4466 OptInfo.Opt =
Record[I++];
4471 for (
unsigned I = 0, N =
Record.size(); I != N; )
4472 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4476 for (
unsigned I = 0, N =
Record.size(); I != N; )
4477 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4481 if (
Record.size() % 2 != 0)
4482 return llvm::createStringError(std::errc::illegal_byte_sequence,
4483 "invalid undefined-but-used record");
4484 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4485 UndefinedButUsed.push_back(
4486 {ReadDeclID(F,
Record, I),
4487 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4492 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4493 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4495 DelayedDeleteExprs.push_back(Count);
4496 for (uint64_t
C = 0;
C < Count; ++
C) {
4497 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4498 bool IsArrayForm =
Record[I++] == 1;
4499 DelayedDeleteExprs.push_back(IsArrayForm);
4506 getContext().getLangOpts().BuildingPCHWithObjectFile)
4507 for (
unsigned I = 0, N =
Record.size(); I != N;)
4508 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4516 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4517 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4518 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4520 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4521 if (DeserializationListener)
4522 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4530 return llvm::createStringError(
4531 std::errc::illegal_byte_sequence,
4532 "duplicate MACRO_OFFSET record in AST file");
4544 LateParsedTemplates.emplace_back(
4545 std::piecewise_construct, std::forward_as_tuple(&F),
4551 return llvm::createStringError(std::errc::illegal_byte_sequence,
4552 "invalid pragma optimize record");
4553 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4558 return llvm::createStringError(std::errc::illegal_byte_sequence,
4559 "invalid pragma ms_struct record");
4560 PragmaMSStructState =
Record[0];
4565 return llvm::createStringError(
4566 std::errc::illegal_byte_sequence,
4567 "invalid pragma pointers to members record");
4568 PragmaMSPointersToMembersState =
Record[0];
4569 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4573 for (
unsigned I = 0, N =
Record.size(); I != N; )
4574 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4579 return llvm::createStringError(std::errc::illegal_byte_sequence,
4580 "invalid cuda pragma options record");
4581 ForceHostDeviceDepth =
Record[0];
4586 return llvm::createStringError(std::errc::illegal_byte_sequence,
4587 "invalid pragma pack record");
4588 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4589 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4590 unsigned NumStackEntries =
Record[2];
4593 PragmaAlignPackStack.clear();
4594 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4595 PragmaAlignPackStackEntry Entry;
4596 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4597 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4598 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4599 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4600 Entry.SlotLabel = PragmaAlignPackStrings.back();
4601 PragmaAlignPackStack.push_back(Entry);
4608 return llvm::createStringError(std::errc::illegal_byte_sequence,
4609 "invalid pragma float control record");
4611 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4612 unsigned NumStackEntries =
Record[2];
4615 FpPragmaStack.clear();
4616 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4617 FpPragmaStackEntry Entry;
4619 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4620 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4621 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4622 Entry.SlotLabel = FpPragmaStrings.back();
4623 FpPragmaStack.push_back(Entry);
4629 for (
unsigned I = 0, N =
Record.size(); I != N; )
4630 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4634 unsigned NumRecords =
Record.front();
4636 if (
Record.size() - 1 != NumRecords)
4637 return llvm::createStringError(std::errc::illegal_byte_sequence,
4638 "invalid rvv intrinsic pragma record");
4640 if (RISCVVecIntrinsicPragma.empty())
4641 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4644 for (
unsigned i = 0; i < NumRecords; ++i)
4645 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4652void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4665 assert(ImportedModuleVector.empty());
4667 while (
Data < DataEnd) {
4671 using namespace llvm::support;
4673 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4674 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4675 StringRef Name = StringRef((
const char*)
Data, Len);
4680 ? ModuleMgr.lookupByModuleName(Name)
4683 std::string Msg =
"refers to unknown module, cannot find ";
4684 Msg.append(std::string(Name));
4689 ImportedModuleVector.push_back(OM);
4692 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4694 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4697 RemapBuilder &Remap) {
4698 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4700 Remap.insert(std::make_pair(Offset,
4701 static_cast<int>(BaseOffset - Offset)));
4712 unsigned ClientLoadCapabilities) {
4721 "MODULE_NAME should come before MODULE_MAP_FILE");
4722 auto [MaybeM, IgnoreError] =
4723 getModuleForRelocationChecks(F,
false);
4724 if (MaybeM.has_value()) {
4727 Module *M = MaybeM.value();
4728 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4730 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4731 if (!IgnoreError && !ModMap) {
4733 Diag(diag::remark_module_relocated)
4736 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4739 Diag(diag::err_module_file_conflict)
4744 Diag(diag::err_imported_module_not_found)
4751 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4752 Diag(diag::note_imported_by_pch_module_not_found)
4759 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4763 if (!StoredModMap || *StoredModMap != ModMap) {
4764 assert(ModMap &&
"found module is missing module map file");
4766 "top-level import should be verified");
4768 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4769 Diag(diag::err_imported_module_modmap_changed)
4776 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4778 std::string Filename = ReadPath(F,
Record, Idx);
4781 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4782 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4785 AdditionalStoredMaps.insert(*SF);
4790 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4791 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4794 if (!AdditionalStoredMaps.erase(ModMap)) {
4795 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4796 Diag(diag::err_module_different_modmap)
4805 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4806 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4807 Diag(diag::err_module_different_modmap)
4821 SemaObjC::GlobalMethodPool::iterator Known =
4827 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4828 : Known->second.second;
4832 if (List->getMethod() == Method) {
4840 if (List->getNext())
4841 List->setMethod(List->getNext()->getMethod());
4843 List->setMethod(Method);
4849 for (
Decl *D : Names) {
4853 if (wasHidden && SemaObj) {
4866 Stack.push_back(Mod);
4867 while (!Stack.empty()) {
4868 Mod = Stack.pop_back_val();
4870 if (NameVisibility <= Mod->NameVisibility) {
4886 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4887 if (Hidden != HiddenNamesMap.end()) {
4888 auto HiddenNames = std::move(*Hidden);
4889 HiddenNamesMap.erase(Hidden);
4891 assert(!HiddenNamesMap.contains(Mod) &&
4892 "making names visible added hidden names");
4899 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4901 if (Visited.insert(Exported).second)
4902 Stack.push_back(Exported);
4920 PendingMergedDefinitionsToDeduplicate.insert(Def);
4929 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4930 !PP.getLangOpts().Modules)
4934 TriedLoadingGlobalIndex =
true;
4935 StringRef SpecificModuleCachePath =
4937 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4939 if (llvm::Error Err = std::move(
Result.second)) {
4941 consumeError(std::move(Err));
4945 GlobalIndex.reset(
Result.first);
4946 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4951 return PP.getLangOpts().Modules && UseGlobalIndex &&
4963 consumeError(MaybeEntry.takeError());
4966 llvm::BitstreamEntry Entry = MaybeEntry.get();
4968 switch (Entry.Kind) {
4969 case llvm::BitstreamEntry::Error:
4970 case llvm::BitstreamEntry::EndBlock:
4973 case llvm::BitstreamEntry::Record:
4979 consumeError(Skipped.takeError());
4983 case llvm::BitstreamEntry::SubBlock:
4984 if (Entry.ID == BlockID) {
4985 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4987 consumeError(std::move(Err));
4994 if (llvm::Error Err = Cursor.SkipBlock()) {
4996 consumeError(std::move(Err));
5006 unsigned ClientLoadCapabilities,
5008 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
5012 CurrentDeserializingModuleKind,
Type);
5018 unsigned PreviousGeneration = 0;
5022 unsigned NumModules = ModuleMgr.size();
5027 ClientLoadCapabilities)) {
5028 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5032 GlobalIndex.reset();
5033 ModuleMgr.setGlobalIndex(
nullptr);
5037 if (NewLoadedModuleFile && !Loaded.empty())
5038 *NewLoadedModuleFile = Loaded.back().Mod;
5051 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
5054 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5055 Error(std::move(Err));
5061 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
5067 if (llvm::Error Err = ReadExtensionBlock(F)) {
5068 Error(std::move(Err));
5097 if (!PP.getLangOpts().CPlusPlus) {
5104 auto It = PP.getIdentifierTable().find(Key);
5105 if (It == PP.getIdentifierTable().end())
5114 II = &PP.getIdentifierTable().getOwn(Key);
5132 for (
auto &Id : PP.getIdentifierTable())
5133 Id.second->setOutOfDate(
true);
5136 for (
const auto &Sel : SelectorGeneration)
5137 SelectorOutOfDate[Sel.first] =
true;
5144 ModuleMgr.moduleFileAccepted(&F);
5166 if (DeserializationListener)
5167 DeserializationListener->ReaderInitialized(
this);
5169 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5184 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5185 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5186 ObjCClassesLoaded[I], PreviousGeneration);
5191 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5196 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5215 if (!Stream.canSkipToPos(4))
5216 return llvm::createStringError(
5217 std::errc::illegal_byte_sequence,
5218 "file too small to contain precompiled file magic");
5219 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5222 return llvm::createStringError(
5223 std::errc::illegal_byte_sequence,
5224 "file doesn't start with precompiled file magic");
5226 return Res.takeError();
5227 return llvm::Error::success();
5242 llvm_unreachable(
"unknown module kind");
5248 off_t ExpectedSize, time_t ExpectedModTime,
5250 auto Result = ModuleMgr.addModule(
5255 switch (
Result.getKind()) {
5257 Diag(diag::remark_module_import)
5259 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5274 Diag(diag::err_ast_file_not_found)
5276 if (!
Result.getBufferError().empty())
5277 Diag(diag::note_ast_file_buffer_failed) <<
Result.getBufferError();
5287 Diag(diag::err_ast_file_out_of_date)
5289 for (
const auto &
C :
Result.getChanges()) {
5290 Diag(diag::note_fe_ast_file_modified)
5291 <<
C.Kind << (
C.Old &&
C.New) << llvm::itostr(
C.Old.value_or(0))
5292 << llvm::itostr(
C.New.value_or(0));
5294 Diag(diag::note_ast_file_input_files_validation_status)
5295 <<
Result.getValidationStatus();
5296 if (!
Result.getSignatureError().empty())
5297 Diag(diag::note_ast_file_signature_failed) <<
Result.getSignatureError();
5301 llvm_unreachable(
"Unexpected value from adding module.");
5304 assert(M &&
"Missing module file");
5306 bool ShouldFinalizePCM =
false;
5307 llvm::scope_exit FinalizeOrDropPCM([&]() {
5309 if (ShouldFinalizePCM)
5315 BitstreamCursor &Stream = F.
Stream;
5316 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5317 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5321 Diag(diag::err_ast_file_invalid)
5327 bool HaveReadControlBlock =
false;
5331 Error(MaybeEntry.takeError());
5334 llvm::BitstreamEntry Entry = MaybeEntry.get();
5336 switch (Entry.Kind) {
5337 case llvm::BitstreamEntry::Error:
5338 case llvm::BitstreamEntry::Record:
5339 case llvm::BitstreamEntry::EndBlock:
5340 Error(
"invalid record at top-level of AST file");
5343 case llvm::BitstreamEntry::SubBlock:
5349 HaveReadControlBlock =
true;
5350 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5358 F.ModuleName.empty()) {
5377 if (!HaveReadControlBlock) {
5379 Diag(diag::err_ast_file_version_too_old)
5386 ShouldFinalizePCM =
true;
5390 if (llvm::Error Err = Stream.SkipBlock()) {
5391 Error(std::move(Err));
5398 llvm_unreachable(
"unexpected break; expected return");
5402ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5403 unsigned ClientLoadCapabilities) {
5405 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5406 bool AllowCompatibleConfigurationMismatch =
5408 bool DisableValidation = shouldDisableValidationForFile(F);
5410 ASTReadResult
Result = readUnhashedControlBlockImpl(
5412 AllowCompatibleConfigurationMismatch, Listener.get(),
5417 if (DisableValidation || WasImportedBy ||
5418 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5422 Error(
"malformed block record in AST file");
5445 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5447 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5456 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5457 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5458 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5460 BitstreamCursor Stream(StreamData);
5465 consumeError(std::move(Err));
5477 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5480 consumeError(MaybeEntry.takeError());
5483 llvm::BitstreamEntry Entry = MaybeEntry.get();
5485 switch (Entry.Kind) {
5486 case llvm::BitstreamEntry::Error:
5487 case llvm::BitstreamEntry::SubBlock:
5490 case llvm::BitstreamEntry::EndBlock:
5493 case llvm::BitstreamEntry::Record:
5501 Expected<unsigned> MaybeRecordType =
5502 Stream.readRecord(Entry.ID,
Record, &Blob);
5503 if (!MaybeRecordType) {
5512 "Dummy AST file signature not backpatched in ASTWriter.");
5519 "Dummy AST block hash not backpatched in ASTWriter.");
5523 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5524 if (Listener && ValidateDiagnosticOptions &&
5525 !AllowCompatibleConfigurationMismatch &&
5526 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5531 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5532 if (Listener && !AllowCompatibleConfigurationMismatch &&
5533 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5534 Result = ConfigurationMismatch;
5563 if (
Record.size() < 4)
return true;
5568 unsigned BlockNameLen =
Record[2];
5569 unsigned UserInfoLen =
Record[3];
5571 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5573 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5574 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5575 Blob.data() + BlockNameLen + UserInfoLen);
5579llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5580 BitstreamCursor &Stream = F.
Stream;
5584 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5586 return MaybeEntry.takeError();
5587 llvm::BitstreamEntry Entry = MaybeEntry.get();
5589 switch (Entry.Kind) {
5590 case llvm::BitstreamEntry::SubBlock:
5591 if (llvm::Error Err = Stream.SkipBlock())
5594 case llvm::BitstreamEntry::EndBlock:
5595 return llvm::Error::success();
5596 case llvm::BitstreamEntry::Error:
5597 return llvm::createStringError(std::errc::illegal_byte_sequence,
5598 "malformed block record in AST file");
5599 case llvm::BitstreamEntry::Record:
5605 Expected<unsigned> MaybeRecCode =
5606 Stream.readRecord(Entry.ID,
Record, &Blob);
5608 return MaybeRecCode.takeError();
5609 switch (MaybeRecCode.get()) {
5611 ModuleFileExtensionMetadata Metadata;
5613 return llvm::createStringError(
5614 std::errc::illegal_byte_sequence,
5615 "malformed EXTENSION_METADATA in AST file");
5618 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5619 if (Known == ModuleFileExtensions.end())
break;
5622 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5632 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5636 assert(ContextObj &&
"no context to initialize");
5640 if (DeserializationListener)
5641 DeserializationListener->DeclRead(
5643 Context.getTranslationUnitDecl());
5651 if (!Context.CFConstantStringTypeDecl)
5652 Context.setCFConstantStringType(
GetType(String));
5657 if (FileType.isNull()) {
5658 Error(
"FILE type is NULL");
5662 if (!Context.FILEDecl) {
5664 Context.setFILEDecl(
Typedef->getDecl());
5666 const TagType *Tag = FileType->getAs<TagType>();
5668 Error(
"Invalid FILE type in AST file");
5671 Context.setFILEDecl(Tag->getDecl());
5678 if (Jmp_bufType.
isNull()) {
5679 Error(
"jmp_buf type is NULL");
5683 if (!Context.jmp_bufDecl) {
5685 Context.setjmp_bufDecl(
Typedef->getDecl());
5687 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5689 Error(
"Invalid jmp_buf type in AST file");
5692 Context.setjmp_bufDecl(Tag->getDecl());
5699 if (Sigjmp_bufType.
isNull()) {
5700 Error(
"sigjmp_buf type is NULL");
5704 if (!Context.sigjmp_bufDecl) {
5706 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5708 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5709 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5710 Context.setsigjmp_bufDecl(Tag->getDecl());
5716 if (Context.ObjCIdRedefinitionType.isNull())
5717 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5720 if (
TypeID ObjCClassRedef =
5722 if (Context.ObjCClassRedefinitionType.isNull())
5723 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5726 if (
TypeID ObjCSelRedef =
5728 if (Context.ObjCSelRedefinitionType.isNull())
5729 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5734 if (Ucontext_tType.
isNull()) {
5735 Error(
"ucontext_t type is NULL");
5739 if (!Context.ucontext_tDecl) {
5741 Context.setucontext_tDecl(
Typedef->getDecl());
5743 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5744 assert(Tag &&
"Invalid ucontext_t type in AST file");
5745 Context.setucontext_tDecl(Tag->getDecl());
5754 if (!CUDASpecialDeclRefs.empty()) {
5755 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5756 Context.setcudaConfigureCallDecl(
5757 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5758 Context.setcudaGetParameterBufferDecl(
5759 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5760 Context.setcudaLaunchDeviceDecl(
5761 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5766 for (
auto &Import : PendingImportedModules) {
5770 if (Import.ImportLoc.isValid())
5771 PP.makeModuleVisible(Imported, Import.ImportLoc);
5778 PendingImportedModulesSema.append(PendingImportedModules);
5779 PendingImportedModules.clear();
5789 BitstreamCursor Stream(
PCH);
5792 consumeError(std::move(Err));
5804 Stream.advanceSkippingSubblocks();
5807 consumeError(MaybeEntry.takeError());
5810 llvm::BitstreamEntry Entry = MaybeEntry.get();
5812 if (Entry.Kind != llvm::BitstreamEntry::Record)
5820 consumeError(MaybeRecord.takeError());
5826 "Dummy AST file signature not backpatched in ASTWriter.");
5836 const std::string &ASTFileName,
FileManager &FileMgr,
5839 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5844 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5845 << ASTFileName << Buffer.getError().message();
5846 return std::string();
5850 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5854 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5855 return std::string();
5860 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5861 return std::string();
5868 Stream.advanceSkippingSubblocks();
5871 consumeError(MaybeEntry.takeError());
5872 return std::string();
5874 llvm::BitstreamEntry Entry = MaybeEntry.get();
5876 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5877 return std::string();
5879 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5880 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5881 return std::string();
5889 consumeError(MaybeRecord.takeError());
5890 return std::string();
5905 std::string ExistingSpecificModuleCachePath;
5907 bool StrictOptionMatches;
5910 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5915 StringRef ExistingSpecificModuleCachePath,
5917 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5918 ExistingTargetOpts(ExistingTargetOpts),
5919 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5920 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5923 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5924 StringRef ModuleFilename,
bool Complain,
5925 bool AllowCompatibleDifferences)
override {
5927 nullptr, AllowCompatibleDifferences);
5930 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5931 StringRef ModuleFilename,
bool Complain,
5932 bool AllowCompatibleDifferences)
override {
5934 nullptr, AllowCompatibleDifferences);
5937 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5938 StringRef ModuleFilename,
bool Complain,
5939 bool AllowCompatibleDifferences)
override {
5941 nullptr, AllowCompatibleDifferences);
5944 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5945 StringRef ASTFilename, StringRef ContextHash,
5946 bool Complain)
override {
5948 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5949 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5952 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5953 StringRef ModuleFilename,
bool ReadMacros,
5955 std::string &SuggestedPredefines)
override {
5957 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5958 FileMgr, SuggestedPredefines, ExistingLangOpts,
5970 unsigned ClientLoadCapabilities) {
5974 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5975 llvm::MemoryBuffer *Buffer =
5984 auto Entry = Filename ==
"-" ? FileMgr.getSTDIN()
5985 : FileMgr.getFileRef(Filename,
5990 llvm::consumeError(Entry.takeError());
5994 FileMgr.getBufferForFile(*Entry,
6001 OwnedBuffer = std::move(*BufferOrErr);
6002 Buffer = OwnedBuffer.get();
6006 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6007 BitstreamCursor Stream(Bytes);
6011 consumeError(std::move(Err));
6019 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6020 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6021 bool NeedsImports = Listener.needsImportVisitation();
6022 BitstreamCursor InputFilesCursor;
6023 uint64_t InputFilesOffsetBase = 0;
6026 std::string ModuleDir;
6027 bool DoneWithControlBlock =
false;
6029 PathBuf.reserve(256);
6034 AdditionalPathBuf.reserve(256);
6035 while (!DoneWithControlBlock) {
6039 consumeError(MaybeEntry.takeError());
6042 llvm::BitstreamEntry Entry = MaybeEntry.get();
6044 switch (Entry.Kind) {
6045 case llvm::BitstreamEntry::SubBlock: {
6048 std::string IgnoredSuggestedPredefines;
6049 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6051 Listener, IgnoredSuggestedPredefines) !=
Success)
6057 InputFilesCursor = Stream;
6058 if (llvm::Error Err = Stream.SkipBlock()) {
6060 consumeError(std::move(Err));
6063 if (NeedsInputFiles &&
6066 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6070 if (llvm::Error Err = Stream.SkipBlock()) {
6072 consumeError(std::move(Err));
6081 case llvm::BitstreamEntry::EndBlock:
6082 DoneWithControlBlock =
true;
6085 case llvm::BitstreamEntry::Error:
6088 case llvm::BitstreamEntry::Record:
6092 if (DoneWithControlBlock)
break;
6097 Stream.readRecord(Entry.ID,
Record, &Blob);
6098 if (!MaybeRecCode) {
6106 if (Listener.ReadFullVersionInformation(Blob))
6110 Listener.ReadModuleName(Blob);
6113 ModuleDir = std::string(Blob);
6119 Listener.ReadModuleMapFile(*Path);
6123 if (!NeedsInputFiles)
6126 unsigned NumInputFiles =
Record[0];
6127 unsigned NumUserFiles =
Record[1];
6128 const llvm::support::unaligned_uint64_t *InputFileOffs =
6129 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6130 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6132 bool isSystemFile = I >= NumUserFiles;
6134 if (isSystemFile && !NeedsSystemInputFiles)
6137 BitstreamCursor &Cursor = InputFilesCursor;
6139 if (llvm::Error Err =
6140 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6142 consumeError(std::move(Err));
6148 consumeError(MaybeCode.takeError());
6150 unsigned Code = MaybeCode.get();
6154 bool shouldContinue =
false;
6156 Cursor.readRecord(Code,
Record, &Blob);
6157 if (!MaybeRecordType) {
6159 consumeError(MaybeRecordType.takeError());
6165 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6166 bool Overridden =
static_cast<bool>(
Record[3]);
6167 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6170 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6172 if (UnresolvedFilename.empty())
6173 Filename = *FilenameAsRequestedBuf;
6176 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6177 Filename = *FilenameBuf;
6179 shouldContinue = Listener.visitInputFileAsRequested(
6180 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6184 if (!shouldContinue)
6205 bool IsStandardCXXModule =
Record[Idx++];
6209 if (IsStandardCXXModule) {
6210 Listener.visitImport(ModuleName,
"");
6221 Listener.visitImport(ModuleName, *Filename);
6232 if (FindModuleFileExtensions) {
6233 BitstreamCursor SavedStream = Stream;
6235 bool DoneWithExtensionBlock =
false;
6236 while (!DoneWithExtensionBlock) {
6242 llvm::BitstreamEntry Entry = MaybeEntry.get();
6244 switch (Entry.Kind) {
6245 case llvm::BitstreamEntry::SubBlock:
6246 if (llvm::Error Err = Stream.SkipBlock()) {
6248 consumeError(std::move(Err));
6253 case llvm::BitstreamEntry::EndBlock:
6254 DoneWithExtensionBlock =
true;
6257 case llvm::BitstreamEntry::Error:
6260 case llvm::BitstreamEntry::Record:
6267 Stream.readRecord(Entry.ID,
Record, &Blob);
6268 if (!MaybeRecCode) {
6272 switch (MaybeRecCode.get()) {
6278 Listener.readModuleFileExtension(Metadata);
6284 Stream = std::move(SavedStream);
6288 if (readUnhashedControlBlockImpl(
6289 nullptr, Bytes, Filename, ClientLoadCapabilities,
6291 ValidateDiagnosticOptions) !=
Success)
6302 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6303 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6304 SpecificModuleCachePath, FileMgr,
6305 RequireStrictOptionMatches);
6313 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
6318 if (GlobalIndex >= SubmodulesLoaded.size()) {
6319 Error(
"submodule ID out of range in AST file");
6323 if (SubmodulesLoaded[GlobalIndex])
6324 return SubmodulesLoaded[GlobalIndex];
6327 assert(It != GlobalSubmoduleMap.end());
6330 [[maybe_unused]]
unsigned LocalID =
6337 Error(std::move(Err));
6341 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6346 auto CreateModule = !KnowsTopLevelModule
6350 Module *CurrentModule =
nullptr;
6355 Error(MaybeEntry.takeError());
6358 llvm::BitstreamEntry Entry = MaybeEntry.get();
6360 switch (Entry.Kind) {
6361 case llvm::BitstreamEntry::SubBlock:
6362 case llvm::BitstreamEntry::Error:
6363 case llvm::BitstreamEntry::EndBlock: {
6364 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6365 "malformed block record in AST file"));
6368 case llvm::BitstreamEntry::Record:
6378 Error(MaybeKind.takeError());
6385 if (!CurrentModule) {
6386 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6387 "malformed module definition"));
6390 return CurrentModule;
6393 if (
Record.size() < 13) {
6394 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6395 "malformed module definition"));
6399 StringRef Name = Blob;
6401 [[maybe_unused]]
unsigned ReadLocalID =
Record[Idx++];
6402 assert(LocalID == ReadLocalID);
6408 bool IsFramework =
Record[Idx++];
6409 bool IsExplicit =
Record[Idx++];
6410 bool IsSystem =
Record[Idx++];
6411 bool IsExternC =
Record[Idx++];
6412 bool InferSubmodules =
Record[Idx++];
6413 bool InferExplicitSubmodules =
Record[Idx++];
6414 bool InferExportWildcard =
Record[Idx++];
6415 bool ConfigMacrosExhaustive =
Record[Idx++];
6416 bool ModuleMapIsPrivate =
Record[Idx++];
6417 bool NamedModuleHasInit =
Record[Idx++];
6419 Module *ParentModule =
nullptr;
6426 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6427 IsFramework, IsExplicit);
6429 if (!ParentModule) {
6433 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6435 assert(*CurFileKey != F.
FileKey &&
6436 "ModuleManager did not de-duplicate");
6438 Diag(diag::err_module_file_conflict)
6442 auto CurModMapFile =
6444 auto ModMapFile = FileMgr.getOptionalFileRef(F.
ModuleMapPath);
6445 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6446 Diag(diag::note_module_file_conflict)
6447 << CurModMapFile->getName() << ModMapFile->getName();
6458 CurrentModule->
Kind = Kind;
6468 if (InferredAllowedBy.
isValid())
6480 if (
auto Dir = FileMgr.getOptionalDirectoryRef(F.
BaseDirectory))
6482 }
else if (ParentModule && ParentModule->
Directory) {
6487 if (DeserializationListener)
6488 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6490 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6514 CurrentModule, Blob.str(), RelativePathName)) {
6550 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6560 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6567 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6575 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6577 bool IsWildcard =
Record[Idx + 1];
6580 if (ExportedMod || IsWildcard)
6581 CurrentModule->
Exports.push_back({ExportedMod, IsWildcard});
6591 PP.getTargetInfo());
6608 Conflict.
Message = Blob.str();
6609 CurrentModule->
Conflicts.push_back(Conflict);
6619 for (
unsigned I = 0; I <
Record.size(); )
6621 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6648bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6649 StringRef ModuleFilename,
bool Complain,
6651 bool AllowCompatibleDifferences) {
6654#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6655 LangOpts.Name = Record[Idx++];
6656#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6657 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6658#include "clang/Basic/LangOptions.def"
6659#define SANITIZER(NAME, ID) \
6660 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6661#include "clang/Basic/Sanitizers.def"
6663 for (
unsigned N =
Record[Idx++]; N; --N)
6667 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6673 for (
unsigned N =
Record[Idx++]; N; --N) {
6675 ReadString(
Record, Idx));
6680 for (
unsigned N =
Record[Idx++]; N; --N) {
6687 AllowCompatibleDifferences);
6690bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6691 StringRef ModuleFilename,
bool Complain,
6692 ASTReaderListener &Listener,
6693 bool AllowCompatibleDifferences) {
6695 CodeGenOptions CGOpts;
6697#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6698 if constexpr (CK::Compatibility != CK::Benign) \
6699 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6700#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6701 if constexpr (CK::Compatibility != CK::Benign) \
6702 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6703#define DEBUGOPT(Name, Bits, Default, Compatibility)
6704#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6705#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6706#include "clang/Basic/CodeGenOptions.def"
6709 AllowCompatibleDifferences);
6712bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6713 StringRef ModuleFilename,
bool Complain,
6714 ASTReaderListener &Listener,
6715 bool AllowCompatibleDifferences) {
6717 TargetOptions TargetOpts;
6719 TargetOpts.
CPU = ReadString(
Record, Idx);
6721 TargetOpts.
ABI = ReadString(
Record, Idx);
6722 for (
unsigned N =
Record[Idx++]; N; --N) {
6725 for (
unsigned N =
Record[Idx++]; N; --N) {
6730 AllowCompatibleDifferences);
6733bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6734 StringRef ModuleFilename,
bool Complain,
6735 ASTReaderListener &Listener) {
6736 DiagnosticOptions DiagOpts;
6738#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6739#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6740 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6741#include "clang/Basic/DiagnosticOptions.def"
6743 for (
unsigned N =
Record[Idx++]; N; --N)
6745 for (
unsigned N =
Record[Idx++]; N; --N)
6751bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6752 ASTReaderListener &Listener) {
6753 FileSystemOptions FSOpts;
6759bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6760 StringRef ModuleFilename,
6762 ASTReaderListener &Listener) {
6763 HeaderSearchOptions HSOpts;
6778 std::string ContextHash = ReadString(
Record, Idx);
6784bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6785 ASTReaderListener &Listener) {
6786 HeaderSearchOptions HSOpts;
6790 for (
unsigned N =
Record[Idx++]; N; --N) {
6791 std::string Path = ReadString(
Record, Idx);
6794 bool IsFramework =
Record[Idx++];
6795 bool IgnoreSysRoot =
Record[Idx++];
6796 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6801 for (
unsigned N =
Record[Idx++]; N; --N) {
6802 std::string Prefix = ReadString(
Record, Idx);
6803 bool IsSystemHeader =
Record[Idx++];
6808 for (
unsigned N =
Record[Idx++]; N; --N) {
6809 std::string VFSOverlayFile = ReadString(
Record, Idx);
6816bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6817 StringRef ModuleFilename,
6819 ASTReaderListener &Listener,
6820 std::string &SuggestedPredefines) {
6821 PreprocessorOptions PPOpts;
6825 bool ReadMacros =
Record[Idx++];
6827 for (
unsigned N =
Record[Idx++]; N; --N) {
6829 bool IsUndef =
Record[Idx++];
6830 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6835 for (
unsigned N =
Record[Idx++]; N; --N) {
6840 for (
unsigned N =
Record[Idx++]; N; --N) {
6849 SuggestedPredefines.clear();
6851 Complain, SuggestedPredefines);
6854std::pair<ModuleFile *, unsigned>
6855ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6856 GlobalPreprocessedEntityMapType::iterator
6857 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6858 assert(I != GlobalPreprocessedEntityMap.end() &&
6859 "Corrupted global preprocessed entity map");
6862 return std::make_pair(M, LocalIndex);
6865llvm::iterator_range<PreprocessingRecord::iterator>
6866ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6867 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6871 return llvm::make_range(PreprocessingRecord::iterator(),
6872 PreprocessingRecord::iterator());
6875bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6876 unsigned int ClientLoadCapabilities) {
6877 return ClientLoadCapabilities & ARR_OutOfDate &&
6880 .getInMemoryModuleCache()
6881 .isPCMFinal(ModuleFileName);
6884llvm::iterator_range<ASTReader::ModuleDeclIterator>
6886 return llvm::make_range(
6893 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6894 assert(I != GlobalSkippedRangeMap.end() &&
6895 "Corrupted global skipped range map");
6898 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6902 assert(Range.isValid());
6908 unsigned ModuleFileIndex = ID >> 32;
6909 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6910 assert(getModuleManager().size() > ModuleFileIndex - 1);
6911 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6913 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6918 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6920 unsigned LocalIndex = PPInfo.second;
6925 if (!PP.getPreprocessingRecord()) {
6926 Error(
"no preprocessing record");
6933 Error(std::move(Err));
6940 Error(MaybeEntry.takeError());
6943 llvm::BitstreamEntry Entry = MaybeEntry.get();
6945 if (Entry.Kind != llvm::BitstreamEntry::Record)
6956 if (!MaybeRecType) {
6957 Error(MaybeRecType.takeError());
6962 bool isBuiltin =
Record[0];
6970 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6990 if (DeserializationListener)
6991 DeserializationListener->MacroDefinitionRead(PPID, MD);
6997 const char *FullFileNameStart = Blob.data() +
Record[0];
6998 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
7000 if (!FullFileName.empty())
7001 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7008 StringRef(Blob.data(),
Record[0]),
7016 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
7025unsigned ASTReader::findNextPreprocessedEntity(
7026 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
7028 for (GlobalSLocOffsetMapType::const_iterator
7029 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7035 return getTotalNumPreprocessedEntities();
7040struct PPEntityComp {
7041 const ASTReader &Reader;
7044 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7046 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
7047 SourceLocation LHS = getLoc(L);
7048 SourceLocation RHS = getLoc(R);
7052 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
7053 SourceLocation LHS = getLoc(L);
7057 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
7058 SourceLocation RHS = getLoc(R);
7062 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7069unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7070 bool EndsAfter)
const {
7071 if (SourceMgr.isLocalSourceLocation(Loc))
7072 return getTotalNumPreprocessedEntities();
7074 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7075 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7076 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7077 "Corrupted global sloc offset map");
7079 if (SLocMapI->second->NumPreprocessedEntities == 0)
7080 return findNextPreprocessedEntity(SLocMapI);
7091 pp_iterator
First = pp_begin;
7095 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7096 PPEntityComp(*
this, M));
7105 std::advance(PPI,
Half);
7106 if (SourceMgr.isBeforeInTranslationUnit(
7107 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7110 Count = Count -
Half - 1;
7117 return findNextPreprocessedEntity(SLocMapI);
7124std::pair<unsigned, unsigned>
7126 if (Range.isInvalid())
7127 return std::make_pair(0,0);
7128 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7130 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7131 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7132 return std::make_pair(BeginID, EndID);
7142 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7144 unsigned LocalIndex = PPInfo.second;
7151 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7160 class HeaderFileInfoVisitor {
7162 std::optional<HeaderFileInfo> HFI;
7165 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7174 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7175 if (Pos == Table->end())
7182 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7188 HeaderFileInfoVisitor Visitor(FE);
7189 ModuleMgr.visit(Visitor);
7190 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7197 using DiagState = DiagnosticsEngine::DiagState;
7208 auto ReadDiagState = [&](
const DiagState &BasedOn,
7209 bool IncludeNonPragmaStates) {
7210 unsigned BackrefID =
Record[Idx++];
7212 return DiagStates[BackrefID - 1];
7215 Diag.DiagStates.push_back(BasedOn);
7216 DiagState *NewState = &
Diag.DiagStates.back();
7217 DiagStates.push_back(NewState);
7218 unsigned Size =
Record[Idx++];
7219 assert(Idx + Size * 2 <=
Record.size() &&
7220 "Invalid data, not enough diag/map pairs");
7222 unsigned DiagID =
Record[Idx++];
7225 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7238 Mapping = NewMapping;
7244 DiagState *FirstState;
7249 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7250 DiagStates.push_back(FirstState);
7254 "Invalid data, unexpected backref in initial state");
7256 assert(Idx <
Record.size() &&
7257 "Invalid data, not enough state change pairs in initial state");
7262 unsigned Flags =
Record[Idx++];
7263 DiagState Initial(*
Diag.getDiagnosticIDs());
7264 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7265 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7266 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7267 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7268 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7270 FirstState = ReadDiagState(Initial,
true);
7278 .StateTransitions.push_back({FirstState, 0});
7283 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7287 unsigned NumLocations =
Record[Idx++];
7288 while (NumLocations--) {
7289 assert(Idx <
Record.size() &&
7290 "Invalid data, missing pragma diagnostic states");
7292 assert(FID.
isValid() &&
"invalid FileID for transition");
7293 unsigned Transitions =
Record[Idx++];
7299 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7300 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7301 for (
unsigned I = 0; I != Transitions; ++I) {
7302 unsigned Offset =
Record[Idx++];
7303 auto *State = ReadDiagState(*FirstState,
false);
7304 F.StateTransitions.push_back({State, Offset});
7309 assert(Idx <
Record.size() &&
7310 "Invalid data, missing final pragma diagnostic state");
7312 auto *CurState = ReadDiagState(*FirstState,
false);
7315 Diag.DiagStatesByLoc.CurDiagState = CurState;
7316 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7321 auto &T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7323 T.push_back({CurState, 0});
7325 T[0].State = CurState;
7331 assert(Idx <
Record.size() &&
7332 "Invalid data, missing diagnostic push stack");
7333 unsigned NumPushes =
Record[Idx++];
7334 for (
unsigned I = 0; I != NumPushes; ++I) {
7335 auto *State = ReadDiagState(*FirstState,
false);
7337 Diag.DiagStateOnPushStack.push_back(State);
7346ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7347 auto [M, Index] = translateTypeIDToIndex(ID);
7354#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7355 case TYPE_##CODE_ID: return Type::CLASS_ID;
7356#include "clang/Serialization/TypeBitCodes.def"
7358 return std::nullopt;
7368QualType ASTReader::readTypeRecord(
TypeID ID) {
7369 assert(ContextObj &&
"reading type with no AST context");
7370 ASTContext &Context = *ContextObj;
7371 RecordLocation Loc = TypeCursorForIndex(ID);
7372 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7376 SavedStreamPosition SavedPosition(DeclsCursor);
7378 ReadingKindTracker ReadingKind(Read_Type, *
this);
7381 Deserializing AType(
this);
7383 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7384 Error(std::move(Err));
7387 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7389 Error(RawCode.takeError());
7393 ASTRecordReader
Record(*
this, *Loc.F);
7394 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7396 Error(Code.takeError());
7400 QualType baseType =
Record.readQualType();
7401 Qualifiers quals =
Record.readQualifiers();
7407 Error(
"Unexpected code for type");
7411 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7412 return TypeReader.read(*maybeClass);
7420 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7421 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7424 return Reader.readTypeSourceInfo();
7428 return Reader.readNestedNameSpecifierLoc();
7432 return Reader.readAttr();
7441#define ABSTRACT_TYPELOC(CLASS, PARENT)
7442#define TYPELOC(CLASS, PARENT) \
7443 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7444#include "clang/AST/TypeLocNodes.def"
7453void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7457void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7467void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7471void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7475void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7479void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7483void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7487void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7491void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7495void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7499void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7503void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7511 if (Reader.readBool())
7518 VisitArrayTypeLoc(TL);
7522 VisitArrayTypeLoc(TL);
7525void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7526 VisitArrayTypeLoc(TL);
7529void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7530 DependentSizedArrayTypeLoc TL) {
7531 VisitArrayTypeLoc(TL);
7534void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7535 DependentAddressSpaceTypeLoc TL) {
7542void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7543 DependentSizedExtVectorTypeLoc TL) {
7547void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7551void TypeLocReader::VisitDependentVectorTypeLoc(
7552 DependentVectorTypeLoc TL) {
7556void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7560void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7567void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7568 DependentSizedMatrixTypeLoc TL) {
7581 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7587 VisitFunctionTypeLoc(TL);
7591 VisitFunctionTypeLoc(TL);
7594void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7595 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7596 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7597 SourceLocation NameLoc = readSourceLocation();
7598 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7601void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7602 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7603 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7604 SourceLocation NameLoc = readSourceLocation();
7605 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7608void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7609 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7610 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7611 SourceLocation NameLoc = readSourceLocation();
7612 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7615void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7621void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7628void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7633void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7637void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7651 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7656void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7658 if (Reader.readBool())
7660 if (Reader.readBool())
7664void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7678 VisitTagTypeLoc(TL);
7682 VisitTagTypeLoc(TL);
7685void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7687void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7691void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7695void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7699void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7703void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7704 HLSLAttributedResourceTypeLoc TL) {
7708void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7712void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7716void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7717 SubstTemplateTypeParmTypeLoc TL) {
7721void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7722 SubstTemplateTypeParmPackTypeLoc TL) {
7726void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7727 SubstBuiltinTemplatePackTypeLoc TL) {
7731void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7732 TemplateSpecializationTypeLoc TL) {
7733 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7734 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7735 SourceLocation TemplateKeywordLoc = readSourceLocation();
7736 SourceLocation NameLoc = readSourceLocation();
7737 SourceLocation LAngleLoc = readSourceLocation();
7738 SourceLocation RAngleLoc = readSourceLocation();
7739 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7740 LAngleLoc, RAngleLoc);
7741 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7742 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7743 Args[I] = Reader.readTemplateArgumentLocInfo(
7744 TL.
getTypePtr()->template_arguments()[I].getKind());
7747void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7752void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7758void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7762void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7767void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7776void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7788void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7792void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7798void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7802void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7806void TypeLocReader::VisitDependentBitIntTypeLoc(
7807 clang::DependentBitIntTypeLoc TL) {
7811void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7845std::pair<ModuleFile *, unsigned>
7848 "Predefined type shouldn't be in TypesLoaded");
7850 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7852 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7853 assert(OwningModuleFile &&
7854 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7856 return {OwningModuleFile,
7861 assert(ContextObj &&
"reading type with no AST context");
7872 llvm_unreachable(
"Invalid predefined type");
7888 T = Context.UnsignedCharTy;
7891 T = Context.UnsignedShortTy;
7894 T = Context.UnsignedIntTy;
7897 T = Context.UnsignedLongTy;
7900 T = Context.UnsignedLongLongTy;
7903 T = Context.UnsignedInt128Ty;
7906 T = Context.SignedCharTy;
7909 T = Context.WCharTy;
7912 T = Context.ShortTy;
7921 T = Context.LongLongTy;
7924 T = Context.Int128Ty;
7927 T = Context.BFloat16Ty;
7933 T = Context.FloatTy;
7936 T = Context.DoubleTy;
7939 T = Context.LongDoubleTy;
7942 T = Context.ShortAccumTy;
7945 T = Context.AccumTy;
7948 T = Context.LongAccumTy;
7951 T = Context.UnsignedShortAccumTy;
7954 T = Context.UnsignedAccumTy;
7957 T = Context.UnsignedLongAccumTy;
7960 T = Context.ShortFractTy;
7963 T = Context.FractTy;
7966 T = Context.LongFractTy;
7969 T = Context.UnsignedShortFractTy;
7972 T = Context.UnsignedFractTy;
7975 T = Context.UnsignedLongFractTy;
7978 T = Context.SatShortAccumTy;
7981 T = Context.SatAccumTy;
7984 T = Context.SatLongAccumTy;
7987 T = Context.SatUnsignedShortAccumTy;
7990 T = Context.SatUnsignedAccumTy;
7993 T = Context.SatUnsignedLongAccumTy;
7996 T = Context.SatShortFractTy;
7999 T = Context.SatFractTy;
8002 T = Context.SatLongFractTy;
8005 T = Context.SatUnsignedShortFractTy;
8008 T = Context.SatUnsignedFractTy;
8011 T = Context.SatUnsignedLongFractTy;
8014 T = Context.Float16Ty;
8017 T = Context.Float128Ty;
8020 T = Context.Ibm128Ty;
8023 T = Context.OverloadTy;
8026 T = Context.UnresolvedTemplateTy;
8029 T = Context.BoundMemberTy;
8032 T = Context.PseudoObjectTy;
8035 T = Context.DependentTy;
8038 T = Context.UnknownAnyTy;
8041 T = Context.NullPtrTy;
8044 T = Context.Char8Ty;
8047 T = Context.Char16Ty;
8050 T = Context.Char32Ty;
8053 T = Context.ObjCBuiltinIdTy;
8056 T = Context.ObjCBuiltinClassTy;
8059 T = Context.ObjCBuiltinSelTy;
8061#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8062 case PREDEF_TYPE_##Id##_ID: \
8063 T = Context.SingletonId; \
8065#include "clang/Basic/OpenCLImageTypes.def"
8066#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8067 case PREDEF_TYPE_##Id##_ID: \
8068 T = Context.Id##Ty; \
8070#include "clang/Basic/OpenCLExtensionTypes.def"
8072 T = Context.OCLSamplerTy;
8075 T = Context.OCLEventTy;
8078 T = Context.OCLClkEventTy;
8081 T = Context.OCLQueueTy;
8084 T = Context.OCLReserveIDTy;
8087 T = Context.getAutoDeductType();
8090 T = Context.getAutoRRefDeductType();
8093 T = Context.ARCUnbridgedCastTy;
8096 T = Context.BuiltinFnTy;
8099 T = Context.IncompleteMatrixIdxTy;
8102 T = Context.ArraySectionTy;
8105 T = Context.OMPArrayShapingTy;
8108 T = Context.OMPIteratorTy;
8110#define SVE_TYPE(Name, Id, SingletonId) \
8111 case PREDEF_TYPE_##Id##_ID: \
8112 T = Context.SingletonId; \
8114#include "clang/Basic/AArch64ACLETypes.def"
8115#define PPC_VECTOR_TYPE(Name, Id, Size) \
8116 case PREDEF_TYPE_##Id##_ID: \
8117 T = Context.Id##Ty; \
8119#include "clang/Basic/PPCTypes.def"
8120#define RVV_TYPE(Name, Id, SingletonId) \
8121 case PREDEF_TYPE_##Id##_ID: \
8122 T = Context.SingletonId; \
8124#include "clang/Basic/RISCVVTypes.def"
8125#define WASM_TYPE(Name, Id, SingletonId) \
8126 case PREDEF_TYPE_##Id##_ID: \
8127 T = Context.SingletonId; \
8129#include "clang/Basic/WebAssemblyReferenceTypes.def"
8130#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8131 case PREDEF_TYPE_##Id##_ID: \
8132 T = Context.SingletonId; \
8134#include "clang/Basic/AMDGPUTypes.def"
8135#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8136 case PREDEF_TYPE_##Id##_ID: \
8137 T = Context.SingletonId; \
8139#include "clang/Basic/HLSLIntangibleTypes.def"
8142 assert(!T.isNull() &&
"Unknown predefined type");
8143 return T.withFastQualifiers(FastQuals);
8146 unsigned Index = translateTypeIDToIndex(ID).second;
8148 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8149 if (TypesLoaded[Index].isNull()) {
8150 TypesLoaded[Index] = readTypeRecord(ID);
8151 if (TypesLoaded[Index].isNull())
8154 TypesLoaded[Index]->setFromAST();
8155 if (DeserializationListener)
8157 TypesLoaded[Index]);
8160 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8173 ReadModuleOffsetMap(F);
8176 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8178 if (ModuleFileIndex == 0)
8183 ModuleFileIndex = MF.
Index + 1;
8184 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8203 TemplateNameLoc, EllipsisLoc);
8214 llvm_unreachable(
"unexpected template argument loc");
8231 unsigned NumArgsAsWritten =
readInt();
8232 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8246 if (NumCurrentElementsDeserializing) {
8251 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8274 auto *II = Name.getAsIdentifierInfo();
8275 assert(II &&
"non-identifier name in C?");
8276 if (II->isOutOfDate())
8293 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8294 Template = CTSD->getSpecializedTemplate();
8295 Args = CTSD->getTemplateArgs().asArray();
8296 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8297 Template = VTSD->getSpecializedTemplate();
8298 Args = VTSD->getTemplateArgs().asArray();
8299 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8300 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8302 Args = FD->getTemplateSpecializationArgs()->asArray();
8307 Template->loadLazySpecializationsImpl(Args);
8312 RecordLocation Loc = getLocalBitOffset(Offset);
8315 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8316 Error(std::move(Err));
8319 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8324 Error(MaybeCode.takeError());
8327 unsigned Code = MaybeCode.get();
8331 if (!MaybeRecCode) {
8332 Error(MaybeRecCode.takeError());
8336 Error(
"malformed AST file: missing C++ ctor initializers");
8340 return Record.readCXXCtorInitializers();
8344 assert(ContextObj &&
"reading base specifiers with no AST context");
8347 RecordLocation Loc = getLocalBitOffset(Offset);
8350 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8351 Error(std::move(Err));
8354 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8359 Error(MaybeCode.takeError());
8362 unsigned Code = MaybeCode.get();
8366 if (!MaybeRecCode) {
8367 Error(MaybeCode.takeError());
8370 unsigned RecCode = MaybeRecCode.get();
8373 Error(
"malformed AST file: missing C++ base specifiers");
8377 unsigned NumBases =
Record.readInt();
8380 for (
unsigned I = 0; I != NumBases; ++I)
8381 Bases[I] =
Record.readCXXBaseSpecifier();
8394 ReadModuleOffsetMap(F);
8397 OwningModuleFileIndex == 0
8401 if (OwningModuleFileIndex == 0)
8404 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8413 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8414 return M.
Index == ModuleFileIndex - 1;
8422 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8423 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8443 DeclCursorForID(ID, Loc);
8448 assert(ContextObj &&
"reading predefined decl without AST context");
8450 Decl *NewLoaded =
nullptr;
8456 return Context.getTranslationUnitDecl();
8459 if (Context.ObjCIdDecl)
8460 return Context.ObjCIdDecl;
8461 NewLoaded = Context.getObjCIdDecl();
8465 if (Context.ObjCSelDecl)
8466 return Context.ObjCSelDecl;
8467 NewLoaded = Context.getObjCSelDecl();
8471 if (Context.ObjCClassDecl)
8472 return Context.ObjCClassDecl;
8473 NewLoaded = Context.getObjCClassDecl();
8477 if (Context.ObjCProtocolClassDecl)
8478 return Context.ObjCProtocolClassDecl;
8479 NewLoaded = Context.getObjCProtocolDecl();
8483 if (Context.Int128Decl)
8484 return Context.Int128Decl;
8485 NewLoaded = Context.getInt128Decl();
8489 if (Context.UInt128Decl)
8490 return Context.UInt128Decl;
8491 NewLoaded = Context.getUInt128Decl();
8495 if (Context.ObjCInstanceTypeDecl)
8496 return Context.ObjCInstanceTypeDecl;
8497 NewLoaded = Context.getObjCInstanceTypeDecl();
8501 if (Context.BuiltinVaListDecl)
8502 return Context.BuiltinVaListDecl;
8503 NewLoaded = Context.getBuiltinVaListDecl();
8507 if (Context.VaListTagDecl)
8508 return Context.VaListTagDecl;
8509 NewLoaded = Context.getVaListTagDecl();
8513 if (Context.BuiltinMSVaListDecl)
8514 return Context.BuiltinMSVaListDecl;
8515 NewLoaded = Context.getBuiltinMSVaListDecl();
8520 return Context.getMSGuidTagDecl();
8523 if (Context.ExternCContext)
8524 return Context.ExternCContext;
8525 NewLoaded = Context.getExternCContextDecl();
8529 if (Context.CFConstantStringTypeDecl)
8530 return Context.CFConstantStringTypeDecl;
8531 NewLoaded = Context.getCFConstantStringDecl();
8535 if (Context.CFConstantStringTagDecl)
8536 return Context.CFConstantStringTagDecl;
8537 NewLoaded = Context.getCFConstantStringTagDecl();
8541 return Context.getMSTypeInfoTagDecl();
8543#define BuiltinTemplate(BTName) \
8544 case PREDEF_DECL##BTName##_ID: \
8545 if (Context.Decl##BTName) \
8546 return Context.Decl##BTName; \
8547 NewLoaded = Context.get##BTName##Decl(); \
8549#include "clang/Basic/BuiltinTemplates.inc"
8552 llvm_unreachable(
"Invalid decl ID");
8556 assert(NewLoaded &&
"Failed to load predefined decl?");
8558 if (DeserializationListener)
8559 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8564unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8565 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8566 if (!OwningModuleFile) {
8575 assert(ContextObj &&
"reading decl with no AST context");
8584 Merged.push_back(ID);
8589 unsigned Index = translateGlobalDeclIDToIndex(ID);
8591 if (Index >= DeclsLoaded.size()) {
8592 assert(0 &&
"declaration ID out-of-range for AST file");
8593 Error(
"declaration ID out-of-range for AST file");
8597 return DeclsLoaded[Index];
8604 unsigned Index = translateGlobalDeclIDToIndex(ID);
8606 if (Index >= DeclsLoaded.size()) {
8607 assert(0 &&
"declaration ID out-of-range for AST file");
8608 Error(
"declaration ID out-of-range for AST file");
8612 if (!DeclsLoaded[Index]) {
8614 if (DeserializationListener)
8615 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8618 return DeclsLoaded[Index];
8627 ReadModuleOffsetMap(M);
8637 uint64_t OrignalModuleFileIndex = 0;
8640 OrignalModuleFileIndex = I + 1;
8644 if (!OrignalModuleFileIndex)
8652 if (Idx >=
Record.size()) {
8653 Error(
"Corrupted AST file");
8670 RecordLocation Loc = getLocalBitOffset(Offset);
8671 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8672 Error(std::move(Err));
8675 assert(NumCurrentElementsDeserializing == 0 &&
8676 "should not be called while already deserializing");
8678 return ReadStmtFromStream(*Loc.F);
8681bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8685 auto It = SpecLookups.find(D);
8686 if (It == SpecLookups.end())
8692 It->second.Table.findAll();
8696 SpecLookups.erase(It);
8698 bool NewSpecsFound =
false;
8699 Deserializing LookupResults(
this);
8700 for (
auto &Info : Infos) {
8701 if (GetExistingDecl(Info))
8703 NewSpecsFound =
true;
8707 return NewSpecsFound;
8714 bool NewSpecsFound =
8715 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8717 return NewSpecsFound;
8719 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8720 return NewSpecsFound;
8723bool ASTReader::LoadExternalSpecializationsImpl(
8724 SpecLookupTableTy &SpecLookups,
const Decl *D,
8729 if (
auto It = SpecLookups.find(D); It != SpecLookups.end())
8730 LookupTable = &It->getSecond();
8736 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8738 llvm::raw_string_ostream OS(Name);
8745 Deserializing LookupResults(
this);
8750 LookupTable->
Table.find(HashValue);
8752 bool NewSpecsFound =
false;
8753 for (
auto &Info : Infos) {
8754 if (GetExistingDecl(Info))
8756 NewSpecsFound =
true;
8760 return NewSpecsFound;
8767 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8768 PartialSpecializationsLookups, D, TemplateArgs);
8770 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8772 return NewDeclsFound;
8780 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8781 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8782 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8784 if (!IsKindWeWant(K))
8787 auto ID = (
DeclID) + LexicalDecls[I + 1];
8792 if (PredefsVisited[ID])
8795 PredefsVisited[ID] =
true;
8799 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8807 for (
const auto &Lexical : TULexicalDecls)
8808 Visit(Lexical.first, Lexical.second);
8810 auto I = LexicalDecls.find(DC);
8811 if (I != LexicalDecls.end())
8812 Visit(I->second.first, I->second.second);
8815 ++NumLexicalDeclContextsRead;
8820class UnalignedDeclIDComp {
8826 : Reader(Reader), Mod(M) {}
8835 SourceLocation RHS = getLocation(R);
8840 SourceLocation LHS = getLocation(L);
8854 unsigned Offset,
unsigned Length,
8858 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8859 if (I == FileDeclIDs.end())
8862 FileDeclsInfo &DInfo = I->second;
8863 if (DInfo.Decls.empty())
8867 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8870 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8872 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8873 if (BeginIt != DInfo.Decls.begin())
8879 while (BeginIt != DInfo.Decls.begin() &&
8882 ->isTopLevelDeclInObjCContainer())
8886 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8887 if (EndIt != DInfo.Decls.end())
8900 "DeclContext has no visible decls in storage");
8907 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8929 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8930 ++NumVisibleDeclContextsRead;
8931 Find(It->second.Table, Name);
8934 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8935 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8936 ++NumModuleLocalVisibleDeclContexts;
8937 Find(It->second.Table, std::make_pair(Name, NamedModule));
8940 if (
auto *NamedModule =
8941 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8943 FindModuleLocalLookup(NamedModule);
8948 if (ContextObj && ContextObj->getCurrentNamedModule())
8949 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8951 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8952 ++NumTULocalVisibleDeclContexts;
8953 Find(It->second.Table, Name);
8966 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8967 auto It = LookupTables.find(DC);
8968 if (It == LookupTables.end())
8990 findAll(Lookups, NumVisibleDeclContextsRead);
8991 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8992 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8994 for (
auto &[Name, DS] : Decls)
8997 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
9002 auto I = Lookups.find(Primary);
9003 return I == Lookups.end() ?
nullptr : &I->second;
9008 auto I = ModuleLocalLookups.find(Primary);
9009 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
9014 auto I = TULocalLookups.find(Primary);
9015 return I == TULocalLookups.end() ?
nullptr : &I->second;
9022 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9023 auto I = LookupTable.find(D);
9024 return I == LookupTable.end() ?
nullptr : &I->second;
9029 return PartialSpecializationsLookups.contains(D) ||
9030 SpecializationsLookups.contains(D);
9039 assert(ImplD && Consumer);
9041 for (
auto *I : ImplD->
methods())
9047void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9048 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9051 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9054void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9055 Consumer->HandleVTable(RD);
9059 this->Consumer = Consumer;
9062 PassInterestingDeclsToConsumer();
9064 if (DeserializationListener)
9065 DeserializationListener->ReaderInitialized(
this);
9069 std::fprintf(
stderr,
"*** AST File Statistics:\n");
9071 unsigned NumTypesLoaded =
9072 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
9073 unsigned NumDeclsLoaded =
9074 DeclsLoaded.size() -
9075 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9076 unsigned NumIdentifiersLoaded =
9077 IdentifiersLoaded.size() -
9079 unsigned NumMacrosLoaded =
9080 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9081 unsigned NumSelectorsLoaded =
9082 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9085 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9086 NumSLocEntriesRead, TotalNumSLocEntries,
9087 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9088 if (!TypesLoaded.empty())
9089 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9090 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9091 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9092 if (!DeclsLoaded.empty())
9093 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9094 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9095 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9096 if (!IdentifiersLoaded.empty())
9097 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9098 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9099 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9100 if (!MacrosLoaded.empty())
9101 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9102 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9103 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9104 if (!SelectorsLoaded.empty())
9105 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9106 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9107 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9108 if (TotalNumStatements)
9109 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9110 NumStatementsRead, TotalNumStatements,
9111 ((
float)NumStatementsRead/TotalNumStatements * 100));
9113 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9114 NumMacrosRead, TotalNumMacros,
9115 ((
float)NumMacrosRead/TotalNumMacros * 100));
9116 if (TotalLexicalDeclContexts)
9117 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9118 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9119 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9121 if (TotalVisibleDeclContexts)
9122 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9123 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9124 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9126 if (TotalModuleLocalVisibleDeclContexts)
9128 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9129 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9130 ((
float)NumModuleLocalVisibleDeclContexts /
9131 TotalModuleLocalVisibleDeclContexts * 100));
9132 if (TotalTULocalVisibleDeclContexts)
9133 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9134 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9135 ((
float)NumTULocalVisibleDeclContexts /
9136 TotalTULocalVisibleDeclContexts * 100));
9137 if (TotalNumMethodPoolEntries)
9138 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9139 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9140 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9142 if (NumMethodPoolLookups)
9143 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9144 NumMethodPoolHits, NumMethodPoolLookups,
9145 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9146 if (NumMethodPoolTableLookups)
9147 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9148 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9149 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9151 if (NumIdentifierLookupHits)
9153 " %u / %u identifier table lookups succeeded (%f%%)\n",
9154 NumIdentifierLookupHits, NumIdentifierLookups,
9155 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9158 std::fprintf(
stderr,
"\n");
9159 GlobalIndex->printStats();
9162 std::fprintf(
stderr,
"\n");
9164 std::fprintf(
stderr,
"\n");
9167template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9168LLVM_DUMP_METHOD
static void
9171 InitialCapacity> &Map) {
9172 if (Map.begin() == Map.end())
9177 llvm::errs() << Name <<
":\n";
9178 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9180 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9185 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9187 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9191 GlobalPreprocessedEntityMap);
9193 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9202 if (llvm::MemoryBuffer *buf = I.Buffer) {
9203 size_t bytes = buf->getBufferSize();
9204 switch (buf->getBufferKind()) {
9205 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9208 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9229 if (!FPPragmaOptions.empty()) {
9230 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9233 SemaObj->CurFPFeatures =
9239 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9240 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9241 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9242 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9244 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9246 DeclsWithEffectsToVerify.clear();
9248 SemaObj->OpenCLFeatures = OpenCLExtensions;
9254 assert(SemaObj &&
"no Sema to update");
9258 if (!SemaDeclRefs.empty()) {
9259 assert(SemaDeclRefs.size() % 3 == 0);
9260 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9261 if (!SemaObj->StdNamespace)
9262 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9263 if (!SemaObj->StdBadAlloc)
9264 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9265 if (!SemaObj->StdAlignValT)
9266 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9268 SemaDeclRefs.clear();
9273 if(OptimizeOffPragmaLocation.isValid())
9274 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9275 if (PragmaMSStructState != -1)
9277 if (PointersToMembersPragmaLocation.isValid()) {
9278 SemaObj->ActOnPragmaMSPointersToMembers(
9280 PragmaMSPointersToMembersState,
9281 PointersToMembersPragmaLocation);
9283 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9284 if (!RISCVVecIntrinsicPragma.empty()) {
9285 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9286 "Wrong number of RISCVVecIntrinsicPragma");
9287 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9288 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9289 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9292 if (PragmaAlignPackCurrentValue) {
9296 bool DropFirst =
false;
9297 if (!PragmaAlignPackStack.empty() &&
9298 PragmaAlignPackStack.front().Location.isInvalid()) {
9299 assert(PragmaAlignPackStack.front().Value ==
9300 SemaObj->AlignPackStack.DefaultValue &&
9301 "Expected a default alignment value");
9302 SemaObj->AlignPackStack.Stack.emplace_back(
9303 PragmaAlignPackStack.front().SlotLabel,
9304 SemaObj->AlignPackStack.CurrentValue,
9305 SemaObj->AlignPackStack.CurrentPragmaLocation,
9306 PragmaAlignPackStack.front().PushLocation);
9309 for (
const auto &Entry :
9310 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9311 SemaObj->AlignPackStack.Stack.emplace_back(
9312 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9314 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9315 assert(*PragmaAlignPackCurrentValue ==
9316 SemaObj->AlignPackStack.DefaultValue &&
9317 "Expected a default align and pack value");
9320 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9321 SemaObj->AlignPackStack.CurrentPragmaLocation =
9322 PragmaAlignPackCurrentLocation;
9325 if (FpPragmaCurrentValue) {
9329 bool DropFirst =
false;
9330 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9331 assert(FpPragmaStack.front().Value ==
9332 SemaObj->FpPragmaStack.DefaultValue &&
9333 "Expected a default pragma float_control value");
9334 SemaObj->FpPragmaStack.Stack.emplace_back(
9335 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9336 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9337 FpPragmaStack.front().PushLocation);
9340 for (
const auto &Entry :
9342 SemaObj->FpPragmaStack.Stack.emplace_back(
9343 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9344 if (FpPragmaCurrentLocation.isInvalid()) {
9345 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9346 "Expected a default pragma float_control value");
9349 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9350 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9355 for (
auto &Import : PendingImportedModulesSema) {
9356 if (Import.ImportLoc.isInvalid())
9359 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9362 PendingImportedModulesSema.clear();
9369 IdentifierLookupVisitor Visitor(Name, 0,
9370 NumIdentifierLookups,
9371 NumIdentifierLookupHits);
9377 if (PP.getLangOpts().CPlusPlus) {
9378 for (
auto *F : ModuleMgr.pch_modules())
9387 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9392 ModuleMgr.visit(Visitor, HitsPtr);
9414 ASTIdentifierLookupTable::key_iterator Current;
9418 ASTIdentifierLookupTable::key_iterator End;
9425 bool SkipModules =
false);
9427 StringRef
Next()
override;
9434 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9438 while (Current == End) {
9450 Current = IdTable->key_begin();
9451 End = IdTable->key_end();
9456 StringRef
Result = *Current;
9465 std::unique_ptr<IdentifierIterator> Current;
9466 std::unique_ptr<IdentifierIterator> Queued;
9469 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9470 std::unique_ptr<IdentifierIterator> Second)
9471 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9473 StringRef
Next()
override {
9477 StringRef result = Current->Next();
9478 if (!result.empty())
9483 std::swap(Current, Queued);
9492 std::unique_ptr<IdentifierIterator> ReaderIter(
9494 std::unique_ptr<IdentifierIterator> ModulesIter(
9495 GlobalIndex->createIdentifierIterator());
9496 return new ChainedIdentifierIterator(std::move(ReaderIter),
9497 std::move(ModulesIter));
9509 unsigned PriorGeneration;
9510 unsigned InstanceBits = 0;
9511 unsigned FactoryBits = 0;
9512 bool InstanceHasMoreThanOneDecl =
false;
9513 bool FactoryHasMoreThanOneDecl =
false;
9519 unsigned PriorGeneration)
9520 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9530 ++Reader.NumMethodPoolTableLookups;
9533 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9534 if (Pos == PoolTable->end())
9537 ++Reader.NumMethodPoolTableHits;
9538 ++Reader.NumSelectorsRead;
9542 ++Reader.NumMethodPoolEntriesRead;
9544 if (Reader.DeserializationListener)
9545 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9550 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9551 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9552 InstanceBits =
Data.InstanceBits;
9553 FactoryBits =
Data.FactoryBits;
9554 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9555 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9561 return InstanceMethods;
9566 return FactoryMethods;
9573 return InstanceHasMoreThanOneDecl;
9591 unsigned &Generation = SelectorGeneration[Sel];
9592 unsigned PriorGeneration = Generation;
9594 SelectorOutOfDate[Sel] =
false;
9597 ++NumMethodPoolLookups;
9599 ModuleMgr.visit(Visitor);
9605 ++NumMethodPoolHits;
9626 if (SelectorOutOfDate[Sel])
9634 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9636 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9637 Namespaces.push_back(Namespace);
9642 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9643 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9644 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9647 Undefined.insert(std::make_pair(D, Loc));
9649 UndefinedButUsed.clear();
9655 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9658 uint64_t Count = DelayedDeleteExprs[Idx++];
9659 for (uint64_t
C = 0;
C < Count; ++
C) {
9662 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9663 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9670 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9671 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9673 TentativeDefs.push_back(Var);
9675 TentativeDefinitions.clear();
9680 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9682 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9686 UnusedFileScopedDecls.clear();
9691 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9693 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9697 DelegatingCtorDecls.clear();
9701 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9703 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9707 ExtVectorDecls.clear();
9712 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9715 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9719 UnusedLocalTypedefNameCandidates.clear();
9724 for (
auto I : DeclsToCheckForDeferredDiags) {
9725 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9729 DeclsToCheckForDeferredDiags.clear();
9734 if (ReferencedSelectorsData.empty())
9739 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9741 while (I < DataSize) {
9745 Sels.push_back(std::make_pair(Sel, SelLoc));
9747 ReferencedSelectorsData.clear();
9752 if (WeakUndeclaredIdentifiers.empty())
9755 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9763 WeakIDs.push_back(std::make_pair(WeakId, WI));
9765 WeakUndeclaredIdentifiers.clear();
9769 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9770 if (ExtnameUndeclaredIdentifiers.empty())
9773 for (
unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9780 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
9784 ExtnameIDs.push_back(std::make_pair(NameId,
Attr));
9786 ExtnameUndeclaredIdentifiers.clear();
9790 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9792 VTableUse &TableInfo = VTableUses[Idx++];
9793 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9796 VTables.push_back(VT);
9804 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9805 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9809 Pending.push_back(std::make_pair(D, Loc));
9811 PendingInstantiations.clear();
9815 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9817 for (
auto &LPT : LateParsedTemplates) {
9820 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9824 auto LT = std::make_unique<LateParsedTemplate>();
9825 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9829 assert(F &&
"No module");
9831 unsigned TokN = LateParsed[Idx++];
9832 LT->Toks.reserve(TokN);
9833 for (
unsigned T = 0; T < TokN; ++T)
9834 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9836 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9840 LateParsedTemplates.clear();
9852 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9853 Iter != LambdaDeclarationsForMerging.end() &&
9854 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9863 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9872 assert(ID &&
"Non-zero identifier ID required");
9873 unsigned Index = translateIdentifierIDToIndex(ID).second;
9874 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9875 IdentifiersLoaded[Index] = II;
9876 if (DeserializationListener)
9877 DeserializationListener->IdentifierRead(ID, II);
9899 if (NumCurrentElementsDeserializing && !Decls) {
9900 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9904 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9917 Decls->push_back(D);
9924 pushExternalDeclIntoScope(D, II);
9928std::pair<ModuleFile *, unsigned>
9929ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9931 return {
nullptr, 0};
9933 unsigned ModuleFileIndex = ID >> 32;
9934 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9936 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9948 if (IdentifiersLoaded.empty()) {
9949 Error(
"no identifier table in AST file");
9953 auto [M, Index] = translateIdentifierIDToIndex(ID);
9954 if (!IdentifiersLoaded[Index]) {
9955 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9958 const unsigned char *
Data =
9964 auto &II = PP.getIdentifierTable().get(Key);
9965 IdentifiersLoaded[Index] = &II;
9968 if (DeserializationListener)
9969 DeserializationListener->IdentifierRead(ID, &II);
9972 return IdentifiersLoaded[Index];
9984 ReadModuleOffsetMap(M);
9986 unsigned ModuleFileIndex = LocalID >> 32;
9987 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9990 assert(MF &&
"malformed identifier ID encoding?");
9992 if (!ModuleFileIndex)
9998std::pair<ModuleFile *, unsigned>
9999ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
10001 return {
nullptr, 0};
10003 unsigned ModuleFileIndex = ID >> 32;
10004 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
10008 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10017 if (MacrosLoaded.empty()) {
10018 Error(
"no macro table in AST file");
10022 auto [M, Index] = translateMacroIDToIndex(ID);
10023 if (!MacrosLoaded[Index]) {
10024 assert(M !=
nullptr &&
"Untranslated Macro ID?");
10030 if (DeserializationListener)
10031 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10034 return MacrosLoaded[Index];
10042 ReadModuleOffsetMap(M);
10044 unsigned ModuleFileIndex = LocalID >> 32;
10045 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10048 assert(MF &&
"malformed identifier ID encoding?");
10050 if (!ModuleFileIndex) {
10055 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
10064 ReadModuleOffsetMap(M);
10069 &&
"Invalid index into submodule index remap");
10071 return LocalID + I->second;
10082 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10085 int IndexFromEnd =
static_cast<int>(ID >> 1);
10086 assert(IndexFromEnd &&
"got reference to unknown module file");
10103 auto I = llvm::find(PCHModules, M);
10104 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10105 return std::distance(I, PCHModules.end()) << 1;
10114 const auto &PCHChain = ModuleMgr.pch_modules();
10115 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10116 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10120 llvm::sys::path::parent_path(MF.
FileName),
10123 return std::nullopt;
10127 auto I = DefinitionSource.find(FD);
10128 if (I == DefinitionSource.end())
10134 return ThisDeclarationWasADefinitionSet.contains(FD);
10145 if (ID > SelectorsLoaded.size()) {
10146 Error(
"selector ID out of range in AST file");
10150 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10153 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10157 SelectorsLoaded[ID - 1] =
10159 if (DeserializationListener)
10160 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10163 return SelectorsLoaded[ID - 1];
10181 ReadModuleOffsetMap(M);
10186 &&
"Invalid index into selector index remap");
10188 return LocalID + I->second;
10219 NameInfo.
setName(readDeclarationName());
10233 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10234 assert(Op.isValid());
10240 unsigned NumTPLists =
readInt();
10245 for (
unsigned i = 0; i != NumTPLists; ++i)
10256 unsigned NumParams =
readInt();
10258 Params.reserve(NumParams);
10259 while (NumParams--)
10262 bool HasRequiresClause =
readBool();
10263 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10266 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10267 return TemplateParams;
10272 bool Canonicalize) {
10273 unsigned NumTemplateArgs =
readInt();
10274 TemplArgs.reserve(NumTemplateArgs);
10275 while (NumTemplateArgs--)
10281 unsigned NumDecls =
readInt();
10283 while (NumDecls--) {
10295 bool inheritConstructors =
readBool();
10301 Result.setInheritConstructors(inheritConstructors);
10308 unsigned NumInitializers =
readInt();
10309 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10311 for (
unsigned i = 0; i != NumInitializers; ++i) {
10313 bool IsBaseVirtual =
false;
10344 BOMInit =
new (Context)
10346 RParenLoc, MemberOrEllipsisLoc);
10348 BOMInit =
new (Context)
10351 BOMInit =
new (Context)
10355 BOMInit =
new (Context)
10357 LParenLoc,
Init, RParenLoc);
10360 unsigned SourceOrder =
readInt();
10364 CtorInitializers[i] = BOMInit;
10367 return CtorInitializers;
10375 for (
unsigned I = 0; I != N; ++I) {
10376 auto Kind = readNestedNameSpecifierKind();
10381 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10390 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10396 Builder.MakeGlobal(Context, ColonColonLoc);
10403 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10408 llvm_unreachable(
"unexpected null nested name specifier");
10423 const StringRef Blob) {
10424 unsigned Count =
Record[0];
10425 const char *Byte = Blob.data();
10426 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10427 for (
unsigned I = 0; I < Count; ++Byte)
10428 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10429 if (*Byte & (1 << Bit))
10436 return llvm::APFloat(Sem,
readAPInt());
10441 unsigned Len =
Record[Idx++];
10449 unsigned Len =
Record[Idx++];
10450 StringRef
Result = Blob.substr(0, Len);
10451 Blob = Blob.substr(Len);
10475 unsigned Major =
Record[Idx++];
10476 unsigned Minor =
Record[Idx++];
10477 unsigned Subminor =
Record[Idx++];
10479 return VersionTuple(Major);
10481 return VersionTuple(Major, Minor - 1);
10482 return VersionTuple(Major, Minor - 1, Subminor - 1);
10493 return Diag(CurrentImportLoc, DiagID);
10497 return Diags.Report(Loc, DiagID);
10501 llvm::function_ref<
void()> Fn) {
10504 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10508 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10514 return PP.getIdentifierTable();
10520 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10521 "Already have a SwitchCase with this ID");
10522 (*CurrSwitchCaseStmts)[ID] = SC;
10527 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10528 return (*CurrSwitchCaseStmts)[ID];
10532 CurrSwitchCaseStmts->clear();
10537 std::vector<RawComment *> Comments;
10544 BitstreamCursor &Cursor = I->first;
10551 Cursor.advanceSkippingSubblocks(
10552 BitstreamCursor::AF_DontPopBlockAtEnd);
10554 Error(MaybeEntry.takeError());
10557 llvm::BitstreamEntry Entry = MaybeEntry.get();
10559 switch (Entry.Kind) {
10560 case llvm::BitstreamEntry::SubBlock:
10561 case llvm::BitstreamEntry::Error:
10562 Error(
"malformed block record in AST file");
10564 case llvm::BitstreamEntry::EndBlock:
10566 case llvm::BitstreamEntry::Record:
10574 if (!MaybeComment) {
10575 Error(MaybeComment.takeError());
10584 bool IsTrailingComment =
Record[Idx++];
10585 bool IsAlmostTrailingComment =
Record[Idx++];
10586 Comments.push_back(
new (Context)
RawComment(
10587 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10597 if (Loc.first.isValid())
10598 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10611 assert(NumUserInputs <= NumInputs);
10612 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10613 for (
unsigned I = 0; I < N; ++I) {
10614 bool IsSystem = I >= NumUserInputs;
10616 Visitor(IFI, IsSystem);
10621 bool IncludeSystem,
bool Complain,
10623 bool isSystem)> Visitor) {
10626 assert(NumUserInputs <= NumInputs);
10627 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10628 for (
unsigned I = 0; I < N; ++I) {
10629 bool IsSystem = I >= NumUserInputs;
10630 InputFile IF = getInputFile(MF, I+1, Complain);
10631 Visitor(IF, IsSystem);
10639 for (
unsigned I = 0; I < NumInputs; ++I) {
10642 if (
auto FE = getInputFile(MF, I + 1).getFile())
10647void ASTReader::finishPendingActions() {
10648 while (!PendingIdentifierInfos.empty() ||
10649 !PendingDeducedFunctionTypes.empty() ||
10650 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10651 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10652 !PendingUpdateRecords.empty() ||
10653 !PendingObjCExtensionIvarRedeclarations.empty()) {
10656 using TopLevelDeclsMap =
10657 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10658 TopLevelDeclsMap TopLevelDecls;
10660 while (!PendingIdentifierInfos.empty()) {
10663 std::move(PendingIdentifierInfos.back().second);
10664 PendingIdentifierInfos.pop_back();
10671 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10672 auto *FD = PendingDeducedFunctionTypes[I].first;
10673 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10675 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10678 if (DT->isDeduced()) {
10679 PendingDeducedTypeUpdates.insert(
10680 {FD->getCanonicalDecl(), FD->getReturnType()});
10687 PendingUndeducedFunctionDecls.push_back(FD);
10691 PendingDeducedFunctionTypes.clear();
10695 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10696 auto *VD = PendingDeducedVarTypes[I].first;
10697 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10699 PendingDeducedVarTypes.clear();
10702 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10703 loadPendingDeclChain(PendingDeclChains[I].first,
10704 PendingDeclChains[I].second);
10705 PendingDeclChains.clear();
10708 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10709 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10710 IdentifierInfo *II = TLD->first;
10711 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10717 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10718 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10719 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10720 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10722 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10724 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10725 if (!Info.M->isModule())
10729 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10731 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10732 if (Info.M->isModule())
10736 PendingMacroIDs.clear();
10740 while (!PendingDeclContextInfos.empty()) {
10741 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10742 PendingDeclContextInfos.pop_front();
10745 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10749 while (!PendingUpdateRecords.empty()) {
10750 auto Update = PendingUpdateRecords.pop_back_val();
10751 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10752 loadDeclUpdateRecords(
Update);
10755 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10756 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10757 auto DuplicateIvars =
10758 PendingObjCExtensionIvarRedeclarations.back().second;
10760 StructuralEquivalenceContext Ctx(
10761 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10762 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10766 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10768 for (
auto IvarPair : DuplicateIvars) {
10769 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10771 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10777 ExtensionsPair.first->setInvalidDecl();
10778 ExtensionsPair.second->getClassInterface()
10780 ->setIvarList(
nullptr);
10782 for (
auto IvarPair : DuplicateIvars) {
10783 Diag(IvarPair.first->getLocation(),
10784 diag::err_duplicate_ivar_declaration)
10785 << IvarPair.first->getIdentifier();
10786 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10789 PendingObjCExtensionIvarRedeclarations.pop_back();
10795 assert(PendingFakeDefinitionData.empty() &&
10796 "faked up a class definition but never saw the real one");
10802 for (Decl *D : PendingDefinitions) {
10803 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10804 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10805 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10806 R =
R->getPreviousDecl()) {
10809 "declaration thinks it's the definition but it isn't");
10817 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10822 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10828 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10829 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10836 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10839 PendingDefinitions.clear();
10841 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10842 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10843 if (
auto *VD = dyn_cast<VarDecl>(D))
10844 return VD->isThisDeclarationADefinition() ||
10845 VD->isThisDeclarationADemotedDefinition();
10847 if (
auto *TD = dyn_cast<TagDecl>(D))
10848 return TD->isThisDeclarationADefinition() ||
10849 TD->isThisDeclarationADemotedDefinition();
10851 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10852 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10854 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10855 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10862 return hasDefinitionImpl(D, hasDefinitionImpl);
10878 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10884 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10885 PBEnd = PendingBodies.end();
10886 PB != PBEnd; ++PB) {
10887 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10889 const FunctionDecl *Defn =
nullptr;
10890 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10891 FD->setLazyBody(PB->second);
10893 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10896 if (!FD->isLateTemplateParsed() &&
10897 !NonConstDefn->isLateTemplateParsed() &&
10902 FD->getODRHash() != NonConstDefn->getODRHash()) {
10904 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10905 }
else if (FD->getLexicalParent()->isFileContext() &&
10906 NonConstDefn->getLexicalParent()->isFileContext()) {
10910 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10921 PendingBodies.clear();
10924 for (
auto [RD, MD] : PendingAddedClassMembers) {
10925 RD->addedMember(MD);
10927 PendingAddedClassMembers.clear();
10930 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10932 PendingMergedDefinitionsToDeduplicate.clear();
10936 for (Decl *D : PendingIncompleteDeclChains)
10937 markIncompleteDeclChain(D);
10938 PendingIncompleteDeclChains.clear();
10940 assert(PendingIdentifierInfos.empty() &&
10941 "Should be empty at the end of finishPendingActions");
10942 assert(PendingDeducedFunctionTypes.empty() &&
10943 "Should be empty at the end of finishPendingActions");
10944 assert(PendingDeducedVarTypes.empty() &&
10945 "Should be empty at the end of finishPendingActions");
10946 assert(PendingDeclChains.empty() &&
10947 "Should be empty at the end of finishPendingActions");
10948 assert(PendingMacroIDs.empty() &&
10949 "Should be empty at the end of finishPendingActions");
10950 assert(PendingDeclContextInfos.empty() &&
10951 "Should be empty at the end of finishPendingActions");
10952 assert(PendingUpdateRecords.empty() &&
10953 "Should be empty at the end of finishPendingActions");
10954 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10955 "Should be empty at the end of finishPendingActions");
10956 assert(PendingFakeDefinitionData.empty() &&
10957 "Should be empty at the end of finishPendingActions");
10958 assert(PendingDefinitions.empty() &&
10959 "Should be empty at the end of finishPendingActions");
10960 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10961 "Should be empty at the end of finishPendingActions");
10962 assert(PendingBodies.empty() &&
10963 "Should be empty at the end of finishPendingActions");
10964 assert(PendingAddedClassMembers.empty() &&
10965 "Should be empty at the end of finishPendingActions");
10966 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10967 "Should be empty at the end of finishPendingActions");
10968 assert(PendingIncompleteDeclChains.empty() &&
10969 "Should be empty at the end of finishPendingActions");
10972void ASTReader::diagnoseOdrViolations() {
10973 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10974 PendingRecordOdrMergeFailures.empty() &&
10975 PendingFunctionOdrMergeFailures.empty() &&
10976 PendingEnumOdrMergeFailures.empty() &&
10977 PendingObjCInterfaceOdrMergeFailures.empty() &&
10978 PendingObjCProtocolOdrMergeFailures.empty())
10985 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10986 PendingOdrMergeFailures.clear();
10987 for (
auto &Merge : OdrMergeFailures) {
10988 Merge.first->buildLookup();
10989 Merge.first->decls_begin();
10990 Merge.first->bases_begin();
10991 Merge.first->vbases_begin();
10992 for (
auto &RecordPair : Merge.second) {
10993 auto *RD = RecordPair.first;
11001 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11002 PendingRecordOdrMergeFailures.clear();
11003 for (
auto &Merge : RecordOdrMergeFailures) {
11004 Merge.first->decls_begin();
11005 for (
auto &D : Merge.second)
11010 auto ObjCInterfaceOdrMergeFailures =
11011 std::move(PendingObjCInterfaceOdrMergeFailures);
11012 PendingObjCInterfaceOdrMergeFailures.clear();
11013 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11014 Merge.first->decls_begin();
11015 for (
auto &InterfacePair : Merge.second)
11016 InterfacePair.first->decls_begin();
11020 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11021 PendingFunctionOdrMergeFailures.clear();
11022 for (
auto &Merge : FunctionOdrMergeFailures) {
11023 Merge.first->buildLookup();
11024 Merge.first->decls_begin();
11025 Merge.first->getBody();
11026 for (
auto &FD : Merge.second) {
11034 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11035 PendingEnumOdrMergeFailures.clear();
11036 for (
auto &Merge : EnumOdrMergeFailures) {
11037 Merge.first->decls_begin();
11038 for (
auto &
Enum : Merge.second) {
11039 Enum->decls_begin();
11044 auto ObjCProtocolOdrMergeFailures =
11045 std::move(PendingObjCProtocolOdrMergeFailures);
11046 PendingObjCProtocolOdrMergeFailures.clear();
11047 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11048 Merge.first->decls_begin();
11049 for (
auto &ProtocolPair : Merge.second)
11050 ProtocolPair.first->decls_begin();
11059 while (!PendingOdrMergeChecks.empty()) {
11060 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11071 bool Found =
false;
11074 for (
auto *RI : D->
redecls()) {
11075 if (RI->getLexicalDeclContext() == CanonDef) {
11089 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11090 for (
auto *CanonMember : CanonDef->
decls()) {
11091 if (CanonMember->getCanonicalDecl() == DCanon) {
11100 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11102 Candidates.push_back(ND);
11115 std::string CanonDefModule =
11120 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11122 if (Candidates.empty())
11124 diag::note_module_odr_violation_no_possible_decls) << D;
11126 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11127 Diag(Candidates[I]->getLocation(),
11128 diag::note_module_odr_violation_possible_decl)
11132 DiagnosedOdrMergeFailures.insert(CanonDef);
11136 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11137 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11138 ObjCInterfaceOdrMergeFailures.empty() &&
11139 ObjCProtocolOdrMergeFailures.empty())
11142 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11146 for (
auto &Merge : OdrMergeFailures) {
11149 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11152 bool Diagnosed =
false;
11153 CXXRecordDecl *FirstRecord = Merge.first;
11154 for (
auto &RecordPair : Merge.second) {
11155 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11156 RecordPair.second)) {
11169 Diag(Merge.first->getLocation(),
11170 diag::err_module_odr_violation_different_instantiations)
11177 for (
auto &Merge : RecordOdrMergeFailures) {
11180 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11183 RecordDecl *FirstRecord = Merge.first;
11184 bool Diagnosed =
false;
11185 for (
auto *SecondRecord : Merge.second) {
11186 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11192 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11196 for (
auto &Merge : FunctionOdrMergeFailures) {
11197 FunctionDecl *FirstFunction = Merge.first;
11198 bool Diagnosed =
false;
11199 for (
auto &SecondFunction : Merge.second) {
11200 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11206 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11210 for (
auto &Merge : EnumOdrMergeFailures) {
11213 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11216 EnumDecl *FirstEnum = Merge.first;
11217 bool Diagnosed =
false;
11218 for (
auto &SecondEnum : Merge.second) {
11219 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11225 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11228 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11231 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11234 bool Diagnosed =
false;
11235 ObjCInterfaceDecl *FirstID = Merge.first;
11236 for (
auto &InterfacePair : Merge.second) {
11237 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11238 InterfacePair.second)) {
11244 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11247 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11250 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11253 ObjCProtocolDecl *FirstProtocol = Merge.first;
11254 bool Diagnosed =
false;
11255 for (
auto &ProtocolPair : Merge.second) {
11256 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11257 ProtocolPair.second)) {
11263 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11268 if (llvm::Timer *T = ReadTimer.get();
11269 ++NumCurrentElementsDeserializing == 1 && T)
11270 ReadTimeRegion.emplace(T);
11274 assert(NumCurrentElementsDeserializing &&
11275 "FinishedDeserializing not paired with StartedDeserializing");
11276 if (NumCurrentElementsDeserializing == 1) {
11279 finishPendingActions();
11281 --NumCurrentElementsDeserializing;
11283 if (NumCurrentElementsDeserializing == 0) {
11287 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11295 while (!PendingExceptionSpecUpdates.empty() ||
11296 !PendingDeducedTypeUpdates.empty() ||
11297 !PendingUndeducedFunctionDecls.empty()) {
11298 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11299 PendingExceptionSpecUpdates.clear();
11300 for (
auto Update : ESUpdates) {
11301 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11304 if (
auto *Listener =
getContext().getASTMutationListener())
11306 for (
auto *Redecl :
Update.second->redecls())
11310 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11311 PendingDeducedTypeUpdates.clear();
11312 for (
auto Update : DTUpdates) {
11313 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11320 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11321 PendingUndeducedFunctionDecls.clear();
11325 (void)UndeducedFD->getMostRecentDecl();
11328 ReadTimeRegion.reset();
11330 diagnoseOdrViolations();
11336 PassInterestingDeclsToConsumer();
11343 auto It = PendingFakeLookupResults.find(II);
11344 if (It != PendingFakeLookupResults.end()) {
11345 for (
auto *ND : It->second)
11350 It->second.clear();
11354 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11355 SemaObj->TUScope->AddDecl(D);
11356 }
else if (SemaObj->TUScope) {
11360 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11361 SemaObj->TUScope->AddDecl(D);
11369 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11370 StringRef isysroot,
11372 bool AllowASTWithCompilerErrors,
11373 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11374 bool ForceValidateUserInputs,
11375 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11376 std::unique_ptr<llvm::Timer> ReadTimer)
11381 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11382 StackHandler(Diags), PP(PP), ContextObj(Context),
11383 CodeGenOpts(CodeGenOpts),
11385 PP.getHeaderSearchInfo()),
11386 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11387 DisableValidationKind(DisableValidationKind),
11388 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11389 AllowConfigurationMismatch(AllowConfigurationMismatch),
11390 ValidateSystemInputs(ValidateSystemInputs),
11391 ForceValidateUserInputs(ForceValidateUserInputs),
11392 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11393 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11394 SourceMgr.setExternalSLocEntrySource(
this);
11396 PathBuf.reserve(256);
11398 for (
const auto &Ext : Extensions) {
11399 auto BlockName = Ext->getExtensionMetadata().BlockName;
11400 auto Known = ModuleFileExtensions.find(BlockName);
11401 if (Known != ModuleFileExtensions.end()) {
11402 Diags.Report(diag::warn_duplicate_module_file_extension)
11407 ModuleFileExtensions.insert({BlockName, Ext});
11412 if (OwnsDeserializationListener)
11413 delete DeserializationListener;
11417 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11421 unsigned AbbrevID) {
11424 return Cursor.readRecord(AbbrevID, Record);
11440 : Record(Record), Context(Record.getContext()) {}
11441#define GEN_CLANG_CLAUSE_CLASS
11442#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11443#include "llvm/Frontend/OpenMP/OMP.inc"
11457 switch (llvm::omp::Clause(Record.readInt())) {
11458 case llvm::omp::OMPC_if:
11461 case llvm::omp::OMPC_final:
11464 case llvm::omp::OMPC_num_threads:
11467 case llvm::omp::OMPC_safelen:
11470 case llvm::omp::OMPC_simdlen:
11473 case llvm::omp::OMPC_sizes: {
11474 unsigned NumSizes = Record.readInt();
11478 case llvm::omp::OMPC_counts: {
11479 unsigned NumCounts = Record.readInt();
11483 case llvm::omp::OMPC_permutation: {
11484 unsigned NumLoops = Record.readInt();
11488 case llvm::omp::OMPC_full:
11491 case llvm::omp::OMPC_partial:
11494 case llvm::omp::OMPC_looprange:
11497 case llvm::omp::OMPC_allocator:
11500 case llvm::omp::OMPC_collapse:
11503 case llvm::omp::OMPC_default:
11506 case llvm::omp::OMPC_proc_bind:
11507 C =
new (Context) OMPProcBindClause();
11509 case llvm::omp::OMPC_schedule:
11510 C =
new (Context) OMPScheduleClause();
11512 case llvm::omp::OMPC_ordered:
11513 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11515 case llvm::omp::OMPC_nowait:
11516 C =
new (Context) OMPNowaitClause();
11518 case llvm::omp::OMPC_untied:
11519 C =
new (Context) OMPUntiedClause();
11521 case llvm::omp::OMPC_mergeable:
11522 C =
new (Context) OMPMergeableClause();
11524 case llvm::omp::OMPC_threadset:
11527 case llvm::omp::OMPC_transparent:
11528 C =
new (Context) OMPTransparentClause();
11530 case llvm::omp::OMPC_read:
11531 C =
new (Context) OMPReadClause();
11533 case llvm::omp::OMPC_write:
11534 C =
new (Context) OMPWriteClause();
11536 case llvm::omp::OMPC_update:
11537 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11539 case llvm::omp::OMPC_capture:
11540 C =
new (Context) OMPCaptureClause();
11542 case llvm::omp::OMPC_compare:
11543 C =
new (Context) OMPCompareClause();
11545 case llvm::omp::OMPC_fail:
11546 C =
new (Context) OMPFailClause();
11548 case llvm::omp::OMPC_seq_cst:
11549 C =
new (Context) OMPSeqCstClause();
11551 case llvm::omp::OMPC_acq_rel:
11552 C =
new (Context) OMPAcqRelClause();
11554 case llvm::omp::OMPC_absent: {
11555 unsigned NumKinds = Record.readInt();
11556 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11559 case llvm::omp::OMPC_holds:
11560 C =
new (Context) OMPHoldsClause();
11562 case llvm::omp::OMPC_contains: {
11563 unsigned NumKinds = Record.readInt();
11564 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11567 case llvm::omp::OMPC_no_openmp:
11568 C =
new (Context) OMPNoOpenMPClause();
11570 case llvm::omp::OMPC_no_openmp_routines:
11571 C =
new (Context) OMPNoOpenMPRoutinesClause();
11573 case llvm::omp::OMPC_no_openmp_constructs:
11574 C =
new (Context) OMPNoOpenMPConstructsClause();
11576 case llvm::omp::OMPC_no_parallelism:
11577 C =
new (Context) OMPNoParallelismClause();
11579 case llvm::omp::OMPC_acquire:
11580 C =
new (Context) OMPAcquireClause();
11582 case llvm::omp::OMPC_release:
11583 C =
new (Context) OMPReleaseClause();
11585 case llvm::omp::OMPC_relaxed:
11586 C =
new (Context) OMPRelaxedClause();
11588 case llvm::omp::OMPC_weak:
11589 C =
new (Context) OMPWeakClause();
11591 case llvm::omp::OMPC_threads:
11594 case llvm::omp::OMPC_simd:
11597 case llvm::omp::OMPC_nogroup:
11600 case llvm::omp::OMPC_unified_address:
11601 C =
new (Context) OMPUnifiedAddressClause();
11603 case llvm::omp::OMPC_unified_shared_memory:
11604 C =
new (Context) OMPUnifiedSharedMemoryClause();
11606 case llvm::omp::OMPC_reverse_offload:
11607 C =
new (Context) OMPReverseOffloadClause();
11609 case llvm::omp::OMPC_dynamic_allocators:
11610 C =
new (Context) OMPDynamicAllocatorsClause();
11612 case llvm::omp::OMPC_atomic_default_mem_order:
11613 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11615 case llvm::omp::OMPC_self_maps:
11616 C =
new (Context) OMPSelfMapsClause();
11618 case llvm::omp::OMPC_at:
11619 C =
new (Context) OMPAtClause();
11621 case llvm::omp::OMPC_severity:
11622 C =
new (Context) OMPSeverityClause();
11624 case llvm::omp::OMPC_message:
11625 C =
new (Context) OMPMessageClause();
11627 case llvm::omp::OMPC_private:
11628 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11630 case llvm::omp::OMPC_firstprivate:
11631 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11633 case llvm::omp::OMPC_lastprivate:
11634 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11636 case llvm::omp::OMPC_shared:
11637 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11639 case llvm::omp::OMPC_reduction: {
11640 unsigned N = Record.readInt();
11642 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11645 case llvm::omp::OMPC_task_reduction:
11646 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11648 case llvm::omp::OMPC_in_reduction:
11649 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11651 case llvm::omp::OMPC_linear:
11652 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11654 case llvm::omp::OMPC_aligned:
11657 case llvm::omp::OMPC_copyin:
11660 case llvm::omp::OMPC_copyprivate:
11663 case llvm::omp::OMPC_flush:
11666 case llvm::omp::OMPC_depobj:
11669 case llvm::omp::OMPC_depend: {
11670 unsigned NumVars = Record.readInt();
11671 unsigned NumLoops = Record.readInt();
11675 case llvm::omp::OMPC_device:
11678 case llvm::omp::OMPC_map: {
11680 Sizes.
NumVars = Record.readInt();
11687 case llvm::omp::OMPC_num_teams:
11690 case llvm::omp::OMPC_thread_limit:
11693 case llvm::omp::OMPC_priority:
11696 case llvm::omp::OMPC_grainsize:
11699 case llvm::omp::OMPC_num_tasks:
11702 case llvm::omp::OMPC_hint:
11705 case llvm::omp::OMPC_dist_schedule:
11708 case llvm::omp::OMPC_defaultmap:
11711 case llvm::omp::OMPC_to: {
11713 Sizes.
NumVars = Record.readInt();
11720 case llvm::omp::OMPC_from: {
11722 Sizes.
NumVars = Record.readInt();
11729 case llvm::omp::OMPC_use_device_ptr: {
11731 Sizes.
NumVars = Record.readInt();
11738 case llvm::omp::OMPC_use_device_addr: {
11740 Sizes.
NumVars = Record.readInt();
11747 case llvm::omp::OMPC_is_device_ptr: {
11749 Sizes.
NumVars = Record.readInt();
11756 case llvm::omp::OMPC_has_device_addr: {
11758 Sizes.
NumVars = Record.readInt();
11765 case llvm::omp::OMPC_allocate:
11768 case llvm::omp::OMPC_nontemporal:
11771 case llvm::omp::OMPC_inclusive:
11774 case llvm::omp::OMPC_exclusive:
11777 case llvm::omp::OMPC_order:
11780 case llvm::omp::OMPC_init:
11783 case llvm::omp::OMPC_use:
11786 case llvm::omp::OMPC_destroy:
11789 case llvm::omp::OMPC_novariants:
11792 case llvm::omp::OMPC_nocontext:
11795 case llvm::omp::OMPC_detach:
11798 case llvm::omp::OMPC_uses_allocators:
11801 case llvm::omp::OMPC_affinity:
11804 case llvm::omp::OMPC_filter:
11807 case llvm::omp::OMPC_bind:
11810 case llvm::omp::OMPC_align:
11813 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11816 case llvm::omp::OMPC_dyn_groupprivate:
11819 case llvm::omp::OMPC_doacross: {
11820 unsigned NumVars = Record.readInt();
11821 unsigned NumLoops = Record.readInt();
11825 case llvm::omp::OMPC_ompx_attribute:
11828 case llvm::omp::OMPC_ompx_bare:
11831#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11832 case llvm::omp::Enum: \
11834#include "llvm/Frontend/OpenMP/OMPKinds.def"
11838 assert(
C &&
"Unknown OMPClause type");
11841 C->setLocStart(Record.readSourceLocation());
11842 C->setLocEnd(Record.readSourceLocation());
11848 C->setPreInitStmt(Record.readSubStmt(),
11854 C->setPostUpdateExpr(Record.readSubExpr());
11857void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11860 C->setNameModifierLoc(
Record.readSourceLocation());
11861 C->setColonLoc(
Record.readSourceLocation());
11862 C->setCondition(
Record.readSubExpr());
11863 C->setLParenLoc(
Record.readSourceLocation());
11868 C->setCondition(
Record.readSubExpr());
11869 C->setLParenLoc(
Record.readSourceLocation());
11875 C->setNumThreads(Record.readSubExpr());
11876 C->setModifierLoc(Record.readSourceLocation());
11877 C->setLParenLoc(Record.readSourceLocation());
11881 C->setSafelen(Record.readSubExpr());
11882 C->setLParenLoc(Record.readSourceLocation());
11886 C->setSimdlen(Record.readSubExpr());
11887 C->setLParenLoc(Record.readSourceLocation());
11891 for (Expr *&E :
C->getSizesRefs())
11892 E = Record.readSubExpr();
11893 C->setLParenLoc(Record.readSourceLocation());
11897 bool HasFill = Record.readBool();
11899 C->setOmpFillIndex(Record.readInt());
11900 C->setOmpFillLoc(Record.readSourceLocation());
11901 for (Expr *&E :
C->getCountsRefs())
11902 E = Record.readSubExpr();
11903 C->setLParenLoc(Record.readSourceLocation());
11907 for (Expr *&E :
C->getArgsRefs())
11908 E = Record.readSubExpr();
11909 C->setLParenLoc(Record.readSourceLocation());
11915 C->setFactor(Record.readSubExpr());
11916 C->setLParenLoc(Record.readSourceLocation());
11920 C->setFirst(Record.readSubExpr());
11921 C->setCount(Record.readSubExpr());
11922 C->setLParenLoc(Record.readSourceLocation());
11923 C->setFirstLoc(Record.readSourceLocation());
11924 C->setCountLoc(Record.readSourceLocation());
11928 C->setAllocator(Record.readExpr());
11929 C->setLParenLoc(Record.readSourceLocation());
11933 C->setNumForLoops(Record.readSubExpr());
11934 C->setLParenLoc(Record.readSourceLocation());
11938 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11939 C->setLParenLoc(Record.readSourceLocation());
11940 C->setDefaultKindKwLoc(Record.readSourceLocation());
11941 C->setDefaultVariableCategory(
11943 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11949 C->setLParenLoc(Record.readSourceLocation());
11950 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11951 C->setThreadsetKindLoc(ThreadsetKindLoc);
11954 C->setThreadsetKind(TKind);
11957void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11958 C->setLParenLoc(Record.readSourceLocation());
11959 C->setImpexTypeKind(Record.readSubExpr());
11962void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11963 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11964 C->setLParenLoc(Record.readSourceLocation());
11965 C->setProcBindKindKwLoc(Record.readSourceLocation());
11968void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
11970 C->setScheduleKind(
11972 C->setFirstScheduleModifier(
11974 C->setSecondScheduleModifier(
11976 C->setChunkSize(Record.readSubExpr());
11977 C->setLParenLoc(Record.readSourceLocation());
11978 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11979 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11980 C->setScheduleKindLoc(Record.readSourceLocation());
11981 C->setCommaLoc(Record.readSourceLocation());
11984void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
11985 C->setNumForLoops(Record.readSubExpr());
11986 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11987 C->setLoopNumIterations(I, Record.readSubExpr());
11988 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11989 C->setLoopCounter(I, Record.readSubExpr());
11990 C->setLParenLoc(Record.readSourceLocation());
11993void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
11994 C->setEventHandler(Record.readSubExpr());
11995 C->setLParenLoc(Record.readSourceLocation());
11998void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
11999 C->setCondition(Record.readSubExpr());
12000 C->setLParenLoc(Record.readSourceLocation());
12003void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12005void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12007void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12009void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12011void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *
C) {
12012 if (
C->isExtended()) {
12013 C->setLParenLoc(Record.readSourceLocation());
12014 C->setArgumentLoc(Record.readSourceLocation());
12019void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12021void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12025void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
12026 C->setLParenLoc(Record.readSourceLocation());
12027 SourceLocation FailParameterLoc = Record.readSourceLocation();
12028 C->setFailParameterLoc(FailParameterLoc);
12030 C->setFailParameter(CKind);
12033void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
12034 unsigned Count =
C->getDirectiveKinds().size();
12035 C->setLParenLoc(Record.readSourceLocation());
12036 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12037 DKVec.reserve(Count);
12038 for (
unsigned I = 0; I < Count; I++) {
12041 C->setDirectiveKinds(DKVec);
12044void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
12045 C->setExpr(Record.readExpr());
12046 C->setLParenLoc(Record.readSourceLocation());
12049void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
12050 unsigned Count =
C->getDirectiveKinds().size();
12051 C->setLParenLoc(Record.readSourceLocation());
12052 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12053 DKVec.reserve(Count);
12054 for (
unsigned I = 0; I < Count; I++) {
12057 C->setDirectiveKinds(DKVec);
12060void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12062void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12063 OMPNoOpenMPRoutinesClause *) {}
12065void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12066 OMPNoOpenMPConstructsClause *) {}
12068void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12070void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12072void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12074void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12076void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12078void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12080void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12082void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12084void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12086void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12088void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
12089 unsigned NumVars =
C->varlist_size();
12090 SmallVector<Expr *, 16> Vars;
12091 Vars.reserve(NumVars);
12092 for (
unsigned I = 0; I != NumVars; ++I)
12093 Vars.push_back(Record.readSubExpr());
12094 C->setVarRefs(Vars);
12095 C->setIsTarget(Record.readBool());
12096 C->setIsTargetSync(Record.readBool());
12097 C->setLParenLoc(Record.readSourceLocation());
12098 C->setVarLoc(Record.readSourceLocation());
12101void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12102 C->setInteropVar(Record.readSubExpr());
12103 C->setLParenLoc(Record.readSourceLocation());
12104 C->setVarLoc(Record.readSourceLocation());
12107void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12108 C->setInteropVar(Record.readSubExpr());
12109 C->setLParenLoc(Record.readSourceLocation());
12110 C->setVarLoc(Record.readSourceLocation());
12113void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12115 C->setCondition(Record.readSubExpr());
12116 C->setLParenLoc(Record.readSourceLocation());
12119void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12121 C->setCondition(Record.readSubExpr());
12122 C->setLParenLoc(Record.readSourceLocation());
12125void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12127void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12128 OMPUnifiedSharedMemoryClause *) {}
12130void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12133OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12136void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12137 OMPAtomicDefaultMemOrderClause *
C) {
12138 C->setAtomicDefaultMemOrderKind(
12140 C->setLParenLoc(Record.readSourceLocation());
12141 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12144void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12146void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12148 C->setLParenLoc(Record.readSourceLocation());
12149 C->setAtKindKwLoc(Record.readSourceLocation());
12152void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12154 C->setLParenLoc(Record.readSourceLocation());
12155 C->setSeverityKindKwLoc(Record.readSourceLocation());
12158void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12160 C->setMessageString(Record.readSubExpr());
12161 C->setLParenLoc(Record.readSourceLocation());
12164void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12165 C->setLParenLoc(Record.readSourceLocation());
12166 unsigned NumVars =
C->varlist_size();
12167 SmallVector<Expr *, 16> Vars;
12168 Vars.reserve(NumVars);
12169 for (
unsigned i = 0; i != NumVars; ++i)
12170 Vars.push_back(Record.readSubExpr());
12171 C->setVarRefs(Vars);
12173 for (
unsigned i = 0; i != NumVars; ++i)
12174 Vars.push_back(Record.readSubExpr());
12175 C->setPrivateCopies(Vars);
12178void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12180 C->setLParenLoc(Record.readSourceLocation());
12181 unsigned NumVars =
C->varlist_size();
12182 SmallVector<Expr *, 16> Vars;
12183 Vars.reserve(NumVars);
12184 for (
unsigned i = 0; i != NumVars; ++i)
12185 Vars.push_back(Record.readSubExpr());
12186 C->setVarRefs(Vars);
12188 for (
unsigned i = 0; i != NumVars; ++i)
12189 Vars.push_back(Record.readSubExpr());
12190 C->setPrivateCopies(Vars);
12192 for (
unsigned i = 0; i != NumVars; ++i)
12193 Vars.push_back(Record.readSubExpr());
12197void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12199 C->setLParenLoc(Record.readSourceLocation());
12201 C->setKindLoc(Record.readSourceLocation());
12202 C->setColonLoc(Record.readSourceLocation());
12203 unsigned NumVars =
C->varlist_size();
12204 SmallVector<Expr *, 16> Vars;
12205 Vars.reserve(NumVars);
12206 for (
unsigned i = 0; i != NumVars; ++i)
12207 Vars.push_back(Record.readSubExpr());
12208 C->setVarRefs(Vars);
12210 for (
unsigned i = 0; i != NumVars; ++i)
12211 Vars.push_back(Record.readSubExpr());
12212 C->setPrivateCopies(Vars);
12214 for (
unsigned i = 0; i != NumVars; ++i)
12215 Vars.push_back(Record.readSubExpr());
12216 C->setSourceExprs(Vars);
12218 for (
unsigned i = 0; i != NumVars; ++i)
12219 Vars.push_back(Record.readSubExpr());
12220 C->setDestinationExprs(Vars);
12222 for (
unsigned i = 0; i != NumVars; ++i)
12223 Vars.push_back(Record.readSubExpr());
12224 C->setAssignmentOps(Vars);
12227void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
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);
12237void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12239 C->setLParenLoc(Record.readSourceLocation());
12240 C->setModifierLoc(Record.readSourceLocation());
12241 C->setColonLoc(Record.readSourceLocation());
12242 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12243 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12244 C->setQualifierLoc(NNSL);
12245 C->setNameInfo(DNI);
12247 unsigned NumVars =
C->varlist_size();
12248 SmallVector<Expr *, 16> Vars;
12249 Vars.reserve(NumVars);
12250 for (
unsigned i = 0; i != NumVars; ++i)
12251 Vars.push_back(Record.readSubExpr());
12252 C->setVarRefs(Vars);
12254 for (
unsigned i = 0; i != NumVars; ++i)
12255 Vars.push_back(Record.readSubExpr());
12256 C->setPrivates(Vars);
12258 for (
unsigned i = 0; i != NumVars; ++i)
12259 Vars.push_back(Record.readSubExpr());
12260 C->setLHSExprs(Vars);
12262 for (
unsigned i = 0; i != NumVars; ++i)
12263 Vars.push_back(Record.readSubExpr());
12264 C->setRHSExprs(Vars);
12266 for (
unsigned i = 0; i != NumVars; ++i)
12267 Vars.push_back(Record.readSubExpr());
12268 C->setReductionOps(Vars);
12269 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12271 for (
unsigned i = 0; i != NumVars; ++i)
12272 Vars.push_back(Record.readSubExpr());
12273 C->setInscanCopyOps(Vars);
12275 for (
unsigned i = 0; i != NumVars; ++i)
12276 Vars.push_back(Record.readSubExpr());
12277 C->setInscanCopyArrayTemps(Vars);
12279 for (
unsigned i = 0; i != NumVars; ++i)
12280 Vars.push_back(Record.readSubExpr());
12281 C->setInscanCopyArrayElems(Vars);
12283 unsigned NumFlags = Record.readInt();
12284 SmallVector<bool, 16> Flags;
12285 Flags.reserve(NumFlags);
12286 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12287 Flags.push_back(Record.readInt());
12288 C->setPrivateVariableReductionFlags(Flags);
12291void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12293 C->setLParenLoc(Record.readSourceLocation());
12294 C->setColonLoc(Record.readSourceLocation());
12295 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12296 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12297 C->setQualifierLoc(NNSL);
12298 C->setNameInfo(DNI);
12300 unsigned NumVars =
C->varlist_size();
12301 SmallVector<Expr *, 16> Vars;
12302 Vars.reserve(NumVars);
12303 for (
unsigned I = 0; I != NumVars; ++I)
12304 Vars.push_back(Record.readSubExpr());
12305 C->setVarRefs(Vars);
12307 for (
unsigned I = 0; I != NumVars; ++I)
12308 Vars.push_back(Record.readSubExpr());
12309 C->setPrivates(Vars);
12311 for (
unsigned I = 0; I != NumVars; ++I)
12312 Vars.push_back(Record.readSubExpr());
12313 C->setLHSExprs(Vars);
12315 for (
unsigned I = 0; I != NumVars; ++I)
12316 Vars.push_back(Record.readSubExpr());
12317 C->setRHSExprs(Vars);
12319 for (
unsigned I = 0; I != NumVars; ++I)
12320 Vars.push_back(Record.readSubExpr());
12321 C->setReductionOps(Vars);
12324void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12326 C->setLParenLoc(Record.readSourceLocation());
12327 C->setColonLoc(Record.readSourceLocation());
12328 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12329 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12330 C->setQualifierLoc(NNSL);
12331 C->setNameInfo(DNI);
12333 unsigned NumVars =
C->varlist_size();
12334 SmallVector<Expr *, 16> Vars;
12335 Vars.reserve(NumVars);
12336 for (
unsigned I = 0; I != NumVars; ++I)
12337 Vars.push_back(Record.readSubExpr());
12338 C->setVarRefs(Vars);
12340 for (
unsigned I = 0; I != NumVars; ++I)
12341 Vars.push_back(Record.readSubExpr());
12342 C->setPrivates(Vars);
12344 for (
unsigned I = 0; I != NumVars; ++I)
12345 Vars.push_back(Record.readSubExpr());
12346 C->setLHSExprs(Vars);
12348 for (
unsigned I = 0; I != NumVars; ++I)
12349 Vars.push_back(Record.readSubExpr());
12350 C->setRHSExprs(Vars);
12352 for (
unsigned I = 0; I != NumVars; ++I)
12353 Vars.push_back(Record.readSubExpr());
12354 C->setReductionOps(Vars);
12356 for (
unsigned I = 0; I != NumVars; ++I)
12357 Vars.push_back(Record.readSubExpr());
12358 C->setTaskgroupDescriptors(Vars);
12361void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12363 C->setLParenLoc(Record.readSourceLocation());
12364 C->setColonLoc(Record.readSourceLocation());
12366 C->setModifierLoc(Record.readSourceLocation());
12367 unsigned NumVars =
C->varlist_size();
12368 SmallVector<Expr *, 16> Vars;
12369 Vars.reserve(NumVars);
12370 for (
unsigned i = 0; i != NumVars; ++i)
12371 Vars.push_back(Record.readSubExpr());
12372 C->setVarRefs(Vars);
12374 for (
unsigned i = 0; i != NumVars; ++i)
12375 Vars.push_back(Record.readSubExpr());
12376 C->setPrivates(Vars);
12378 for (
unsigned i = 0; i != NumVars; ++i)
12379 Vars.push_back(Record.readSubExpr());
12382 for (
unsigned i = 0; i != NumVars; ++i)
12383 Vars.push_back(Record.readSubExpr());
12384 C->setUpdates(Vars);
12386 for (
unsigned i = 0; i != NumVars; ++i)
12387 Vars.push_back(Record.readSubExpr());
12388 C->setFinals(Vars);
12389 C->setStep(Record.readSubExpr());
12390 C->setCalcStep(Record.readSubExpr());
12392 for (
unsigned I = 0; I != NumVars + 1; ++I)
12393 Vars.push_back(Record.readSubExpr());
12394 C->setUsedExprs(Vars);
12397void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12398 C->setLParenLoc(Record.readSourceLocation());
12399 C->setColonLoc(Record.readSourceLocation());
12400 unsigned NumVars =
C->varlist_size();
12401 SmallVector<Expr *, 16> Vars;
12402 Vars.reserve(NumVars);
12403 for (
unsigned i = 0; i != NumVars; ++i)
12404 Vars.push_back(Record.readSubExpr());
12405 C->setVarRefs(Vars);
12406 C->setAlignment(Record.readSubExpr());
12409void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12410 C->setLParenLoc(Record.readSourceLocation());
12411 unsigned NumVars =
C->varlist_size();
12412 SmallVector<Expr *, 16> Exprs;
12413 Exprs.reserve(NumVars);
12414 for (
unsigned i = 0; i != NumVars; ++i)
12415 Exprs.push_back(Record.readSubExpr());
12416 C->setVarRefs(Exprs);
12418 for (
unsigned i = 0; i != NumVars; ++i)
12419 Exprs.push_back(Record.readSubExpr());
12420 C->setSourceExprs(Exprs);
12422 for (
unsigned i = 0; i != NumVars; ++i)
12423 Exprs.push_back(Record.readSubExpr());
12424 C->setDestinationExprs(Exprs);
12426 for (
unsigned i = 0; i != NumVars; ++i)
12427 Exprs.push_back(Record.readSubExpr());
12428 C->setAssignmentOps(Exprs);
12431void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12432 C->setLParenLoc(Record.readSourceLocation());
12433 unsigned NumVars =
C->varlist_size();
12434 SmallVector<Expr *, 16> Exprs;
12435 Exprs.reserve(NumVars);
12436 for (
unsigned i = 0; i != NumVars; ++i)
12437 Exprs.push_back(Record.readSubExpr());
12438 C->setVarRefs(Exprs);
12440 for (
unsigned i = 0; i != NumVars; ++i)
12441 Exprs.push_back(Record.readSubExpr());
12442 C->setSourceExprs(Exprs);
12444 for (
unsigned i = 0; i != NumVars; ++i)
12445 Exprs.push_back(Record.readSubExpr());
12446 C->setDestinationExprs(Exprs);
12448 for (
unsigned i = 0; i != NumVars; ++i)
12449 Exprs.push_back(Record.readSubExpr());
12450 C->setAssignmentOps(Exprs);
12453void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12454 C->setLParenLoc(Record.readSourceLocation());
12455 unsigned NumVars =
C->varlist_size();
12456 SmallVector<Expr *, 16> Vars;
12457 Vars.reserve(NumVars);
12458 for (
unsigned i = 0; i != NumVars; ++i)
12459 Vars.push_back(Record.readSubExpr());
12460 C->setVarRefs(Vars);
12463void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12464 C->setDepobj(Record.readSubExpr());
12465 C->setLParenLoc(Record.readSourceLocation());
12468void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12469 C->setLParenLoc(Record.readSourceLocation());
12470 C->setModifier(Record.readSubExpr());
12471 C->setDependencyKind(
12473 C->setDependencyLoc(Record.readSourceLocation());
12474 C->setColonLoc(Record.readSourceLocation());
12475 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12476 unsigned NumVars =
C->varlist_size();
12477 SmallVector<Expr *, 16> Vars;
12478 Vars.reserve(NumVars);
12479 for (
unsigned I = 0; I != NumVars; ++I)
12480 Vars.push_back(Record.readSubExpr());
12481 C->setVarRefs(Vars);
12482 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12483 C->setLoopData(I, Record.readSubExpr());
12486void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12489 C->setDevice(Record.readSubExpr());
12490 C->setModifierLoc(Record.readSourceLocation());
12491 C->setLParenLoc(Record.readSourceLocation());
12494void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12495 C->setLParenLoc(Record.readSourceLocation());
12496 bool HasIteratorModifier =
false;
12498 C->setMapTypeModifier(
12500 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12501 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12502 HasIteratorModifier =
true;
12504 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12505 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12508 C->setMapLoc(Record.readSourceLocation());
12509 C->setColonLoc(Record.readSourceLocation());
12510 auto NumVars =
C->varlist_size();
12511 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12512 auto TotalLists =
C->getTotalComponentListNum();
12513 auto TotalComponents =
C->getTotalComponentsNum();
12515 SmallVector<Expr *, 16> Vars;
12516 Vars.reserve(NumVars);
12517 for (
unsigned i = 0; i != NumVars; ++i)
12518 Vars.push_back(Record.readExpr());
12519 C->setVarRefs(Vars);
12521 SmallVector<Expr *, 16> UDMappers;
12522 UDMappers.reserve(NumVars);
12523 for (
unsigned I = 0; I < NumVars; ++I)
12524 UDMappers.push_back(Record.readExpr());
12525 C->setUDMapperRefs(UDMappers);
12527 if (HasIteratorModifier)
12528 C->setIteratorModifier(Record.readExpr());
12530 SmallVector<ValueDecl *, 16> Decls;
12531 Decls.reserve(UniqueDecls);
12532 for (
unsigned i = 0; i < UniqueDecls; ++i)
12533 Decls.push_back(Record.readDeclAs<ValueDecl>());
12534 C->setUniqueDecls(Decls);
12536 SmallVector<unsigned, 16> ListsPerDecl;
12537 ListsPerDecl.reserve(UniqueDecls);
12538 for (
unsigned i = 0; i < UniqueDecls; ++i)
12539 ListsPerDecl.push_back(Record.readInt());
12540 C->setDeclNumLists(ListsPerDecl);
12542 SmallVector<unsigned, 32> ListSizes;
12543 ListSizes.reserve(TotalLists);
12544 for (
unsigned i = 0; i < TotalLists; ++i)
12545 ListSizes.push_back(Record.readInt());
12546 C->setComponentListSizes(ListSizes);
12548 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12549 Components.reserve(TotalComponents);
12550 for (
unsigned i = 0; i < TotalComponents; ++i) {
12551 Expr *AssociatedExprPr = Record.readExpr();
12552 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12553 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12556 C->setComponents(Components, ListSizes);
12562 C->setLParenLoc(Record.readSourceLocation());
12563 C->setColonLoc(Record.readSourceLocation());
12564 C->setAllocator(Record.readSubExpr());
12565 C->setAlignment(Record.readSubExpr());
12566 unsigned NumVars =
C->varlist_size();
12567 SmallVector<Expr *, 16> Vars;
12568 Vars.reserve(NumVars);
12569 for (
unsigned i = 0; i != NumVars; ++i)
12570 Vars.push_back(Record.readSubExpr());
12571 C->setVarRefs(Vars);
12574void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12576 C->setLParenLoc(Record.readSourceLocation());
12577 unsigned NumVars =
C->varlist_size();
12578 SmallVector<Expr *, 16> Vars;
12579 Vars.reserve(NumVars);
12580 for (
unsigned I = 0; I != NumVars; ++I)
12581 Vars.push_back(Record.readSubExpr());
12582 C->setVarRefs(Vars);
12585void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12587 C->setLParenLoc(Record.readSourceLocation());
12588 unsigned NumVars =
C->varlist_size();
12589 SmallVector<Expr *, 16> Vars;
12590 Vars.reserve(NumVars);
12591 for (
unsigned I = 0; I != NumVars; ++I)
12592 Vars.push_back(Record.readSubExpr());
12593 C->setVarRefs(Vars);
12596void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12598 C->setPriority(Record.readSubExpr());
12599 C->setLParenLoc(Record.readSourceLocation());
12602void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12605 C->setGrainsize(Record.readSubExpr());
12606 C->setModifierLoc(Record.readSourceLocation());
12607 C->setLParenLoc(Record.readSourceLocation());
12610void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12613 C->setNumTasks(Record.readSubExpr());
12614 C->setModifierLoc(Record.readSourceLocation());
12615 C->setLParenLoc(Record.readSourceLocation());
12618void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12619 C->setHint(Record.readSubExpr());
12620 C->setLParenLoc(Record.readSourceLocation());
12623void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12625 C->setDistScheduleKind(
12627 C->setChunkSize(Record.readSubExpr());
12628 C->setLParenLoc(Record.readSourceLocation());
12629 C->setDistScheduleKindLoc(Record.readSourceLocation());
12630 C->setCommaLoc(Record.readSourceLocation());
12633void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12634 C->setDefaultmapKind(
12636 C->setDefaultmapModifier(
12638 C->setLParenLoc(Record.readSourceLocation());
12639 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12640 C->setDefaultmapKindLoc(Record.readSourceLocation());
12643void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12644 C->setLParenLoc(Record.readSourceLocation());
12646 C->setMotionModifier(
12648 C->setMotionModifierLoc(I, Record.readSourceLocation());
12649 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12650 C->setIteratorModifier(Record.readExpr());
12652 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12653 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12654 C->setColonLoc(Record.readSourceLocation());
12655 auto NumVars =
C->varlist_size();
12656 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12657 auto TotalLists =
C->getTotalComponentListNum();
12658 auto TotalComponents =
C->getTotalComponentsNum();
12660 SmallVector<Expr *, 16> Vars;
12661 Vars.reserve(NumVars);
12662 for (
unsigned i = 0; i != NumVars; ++i)
12663 Vars.push_back(Record.readSubExpr());
12664 C->setVarRefs(Vars);
12666 SmallVector<Expr *, 16> UDMappers;
12667 UDMappers.reserve(NumVars);
12668 for (
unsigned I = 0; I < NumVars; ++I)
12669 UDMappers.push_back(Record.readSubExpr());
12670 C->setUDMapperRefs(UDMappers);
12672 SmallVector<ValueDecl *, 16> Decls;
12673 Decls.reserve(UniqueDecls);
12674 for (
unsigned i = 0; i < UniqueDecls; ++i)
12675 Decls.push_back(Record.readDeclAs<ValueDecl>());
12676 C->setUniqueDecls(Decls);
12678 SmallVector<unsigned, 16> ListsPerDecl;
12679 ListsPerDecl.reserve(UniqueDecls);
12680 for (
unsigned i = 0; i < UniqueDecls; ++i)
12681 ListsPerDecl.push_back(Record.readInt());
12682 C->setDeclNumLists(ListsPerDecl);
12684 SmallVector<unsigned, 32> ListSizes;
12685 ListSizes.reserve(TotalLists);
12686 for (
unsigned i = 0; i < TotalLists; ++i)
12687 ListSizes.push_back(Record.readInt());
12688 C->setComponentListSizes(ListSizes);
12690 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12691 Components.reserve(TotalComponents);
12692 for (
unsigned i = 0; i < TotalComponents; ++i) {
12693 Expr *AssociatedExprPr = Record.readSubExpr();
12694 bool IsNonContiguous = Record.readBool();
12695 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12696 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12698 C->setComponents(Components, ListSizes);
12701void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12702 C->setLParenLoc(Record.readSourceLocation());
12704 C->setMotionModifier(
12706 C->setMotionModifierLoc(I, Record.readSourceLocation());
12707 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12708 C->setIteratorModifier(Record.readExpr());
12710 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12711 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12712 C->setColonLoc(Record.readSourceLocation());
12713 auto NumVars =
C->varlist_size();
12714 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12715 auto TotalLists =
C->getTotalComponentListNum();
12716 auto TotalComponents =
C->getTotalComponentsNum();
12718 SmallVector<Expr *, 16> Vars;
12719 Vars.reserve(NumVars);
12720 for (
unsigned i = 0; i != NumVars; ++i)
12721 Vars.push_back(Record.readSubExpr());
12722 C->setVarRefs(Vars);
12724 SmallVector<Expr *, 16> UDMappers;
12725 UDMappers.reserve(NumVars);
12726 for (
unsigned I = 0; I < NumVars; ++I)
12727 UDMappers.push_back(Record.readSubExpr());
12728 C->setUDMapperRefs(UDMappers);
12730 SmallVector<ValueDecl *, 16> Decls;
12731 Decls.reserve(UniqueDecls);
12732 for (
unsigned i = 0; i < UniqueDecls; ++i)
12733 Decls.push_back(Record.readDeclAs<ValueDecl>());
12734 C->setUniqueDecls(Decls);
12736 SmallVector<unsigned, 16> ListsPerDecl;
12737 ListsPerDecl.reserve(UniqueDecls);
12738 for (
unsigned i = 0; i < UniqueDecls; ++i)
12739 ListsPerDecl.push_back(Record.readInt());
12740 C->setDeclNumLists(ListsPerDecl);
12742 SmallVector<unsigned, 32> ListSizes;
12743 ListSizes.reserve(TotalLists);
12744 for (
unsigned i = 0; i < TotalLists; ++i)
12745 ListSizes.push_back(Record.readInt());
12746 C->setComponentListSizes(ListSizes);
12748 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12749 Components.reserve(TotalComponents);
12750 for (
unsigned i = 0; i < TotalComponents; ++i) {
12751 Expr *AssociatedExprPr = Record.readSubExpr();
12752 bool IsNonContiguous = Record.readBool();
12753 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12754 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12756 C->setComponents(Components, ListSizes);
12759void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12760 C->setLParenLoc(Record.readSourceLocation());
12762 C->setFallbackModifierLoc(Record.readSourceLocation());
12763 auto NumVars =
C->varlist_size();
12764 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12765 auto TotalLists =
C->getTotalComponentListNum();
12766 auto TotalComponents =
C->getTotalComponentsNum();
12768 SmallVector<Expr *, 16> Vars;
12769 Vars.reserve(NumVars);
12770 for (
unsigned i = 0; i != NumVars; ++i)
12771 Vars.push_back(Record.readSubExpr());
12772 C->setVarRefs(Vars);
12774 for (
unsigned i = 0; i != NumVars; ++i)
12775 Vars.push_back(Record.readSubExpr());
12776 C->setPrivateCopies(Vars);
12778 for (
unsigned i = 0; i != NumVars; ++i)
12779 Vars.push_back(Record.readSubExpr());
12782 SmallVector<ValueDecl *, 16> Decls;
12783 Decls.reserve(UniqueDecls);
12784 for (
unsigned i = 0; i < UniqueDecls; ++i)
12785 Decls.push_back(Record.readDeclAs<ValueDecl>());
12786 C->setUniqueDecls(Decls);
12788 SmallVector<unsigned, 16> ListsPerDecl;
12789 ListsPerDecl.reserve(UniqueDecls);
12790 for (
unsigned i = 0; i < UniqueDecls; ++i)
12791 ListsPerDecl.push_back(Record.readInt());
12792 C->setDeclNumLists(ListsPerDecl);
12794 SmallVector<unsigned, 32> ListSizes;
12795 ListSizes.reserve(TotalLists);
12796 for (
unsigned i = 0; i < TotalLists; ++i)
12797 ListSizes.push_back(Record.readInt());
12798 C->setComponentListSizes(ListSizes);
12800 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12801 Components.reserve(TotalComponents);
12802 for (
unsigned i = 0; i < TotalComponents; ++i) {
12803 auto *AssociatedExprPr = Record.readSubExpr();
12804 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12805 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12808 C->setComponents(Components, ListSizes);
12811void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12812 C->setLParenLoc(Record.readSourceLocation());
12813 auto NumVars =
C->varlist_size();
12814 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12815 auto TotalLists =
C->getTotalComponentListNum();
12816 auto TotalComponents =
C->getTotalComponentsNum();
12818 SmallVector<Expr *, 16> Vars;
12819 Vars.reserve(NumVars);
12820 for (
unsigned i = 0; i != NumVars; ++i)
12821 Vars.push_back(Record.readSubExpr());
12822 C->setVarRefs(Vars);
12824 SmallVector<ValueDecl *, 16> Decls;
12825 Decls.reserve(UniqueDecls);
12826 for (
unsigned i = 0; i < UniqueDecls; ++i)
12827 Decls.push_back(Record.readDeclAs<ValueDecl>());
12828 C->setUniqueDecls(Decls);
12830 SmallVector<unsigned, 16> ListsPerDecl;
12831 ListsPerDecl.reserve(UniqueDecls);
12832 for (
unsigned i = 0; i < UniqueDecls; ++i)
12833 ListsPerDecl.push_back(Record.readInt());
12834 C->setDeclNumLists(ListsPerDecl);
12836 SmallVector<unsigned, 32> ListSizes;
12837 ListSizes.reserve(TotalLists);
12838 for (
unsigned i = 0; i < TotalLists; ++i)
12839 ListSizes.push_back(Record.readInt());
12840 C->setComponentListSizes(ListSizes);
12842 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12843 Components.reserve(TotalComponents);
12844 for (
unsigned i = 0; i < TotalComponents; ++i) {
12845 Expr *AssociatedExpr = Record.readSubExpr();
12846 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12847 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12850 C->setComponents(Components, ListSizes);
12853void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12854 C->setLParenLoc(Record.readSourceLocation());
12855 auto NumVars =
C->varlist_size();
12856 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12857 auto TotalLists =
C->getTotalComponentListNum();
12858 auto TotalComponents =
C->getTotalComponentsNum();
12860 SmallVector<Expr *, 16> Vars;
12861 Vars.reserve(NumVars);
12862 for (
unsigned i = 0; i != NumVars; ++i)
12863 Vars.push_back(Record.readSubExpr());
12864 C->setVarRefs(Vars);
12867 SmallVector<ValueDecl *, 16> Decls;
12868 Decls.reserve(UniqueDecls);
12869 for (
unsigned i = 0; i < UniqueDecls; ++i)
12870 Decls.push_back(Record.readDeclAs<ValueDecl>());
12871 C->setUniqueDecls(Decls);
12873 SmallVector<unsigned, 16> ListsPerDecl;
12874 ListsPerDecl.reserve(UniqueDecls);
12875 for (
unsigned i = 0; i < UniqueDecls; ++i)
12876 ListsPerDecl.push_back(Record.readInt());
12877 C->setDeclNumLists(ListsPerDecl);
12879 SmallVector<unsigned, 32> ListSizes;
12880 ListSizes.reserve(TotalLists);
12881 for (
unsigned i = 0; i < TotalLists; ++i)
12882 ListSizes.push_back(Record.readInt());
12883 C->setComponentListSizes(ListSizes);
12885 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12886 Components.reserve(TotalComponents);
12887 for (
unsigned i = 0; i < TotalComponents; ++i) {
12888 Expr *AssociatedExpr = Record.readSubExpr();
12889 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12890 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12893 C->setComponents(Components, ListSizes);
12896void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12897 C->setLParenLoc(Record.readSourceLocation());
12898 auto NumVars =
C->varlist_size();
12899 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12900 auto TotalLists =
C->getTotalComponentListNum();
12901 auto TotalComponents =
C->getTotalComponentsNum();
12903 SmallVector<Expr *, 16> Vars;
12904 Vars.reserve(NumVars);
12905 for (
unsigned I = 0; I != NumVars; ++I)
12906 Vars.push_back(Record.readSubExpr());
12907 C->setVarRefs(Vars);
12910 SmallVector<ValueDecl *, 16> Decls;
12911 Decls.reserve(UniqueDecls);
12912 for (
unsigned I = 0; I < UniqueDecls; ++I)
12913 Decls.push_back(Record.readDeclAs<ValueDecl>());
12914 C->setUniqueDecls(Decls);
12916 SmallVector<unsigned, 16> ListsPerDecl;
12917 ListsPerDecl.reserve(UniqueDecls);
12918 for (
unsigned I = 0; I < UniqueDecls; ++I)
12919 ListsPerDecl.push_back(Record.readInt());
12920 C->setDeclNumLists(ListsPerDecl);
12922 SmallVector<unsigned, 32> ListSizes;
12923 ListSizes.reserve(TotalLists);
12924 for (
unsigned i = 0; i < TotalLists; ++i)
12925 ListSizes.push_back(Record.readInt());
12926 C->setComponentListSizes(ListSizes);
12928 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12929 Components.reserve(TotalComponents);
12930 for (
unsigned I = 0; I < TotalComponents; ++I) {
12931 Expr *AssociatedExpr = Record.readSubExpr();
12932 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12933 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12936 C->setComponents(Components, ListSizes);
12939void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12940 C->setLParenLoc(Record.readSourceLocation());
12941 unsigned NumVars =
C->varlist_size();
12942 SmallVector<Expr *, 16> Vars;
12943 Vars.reserve(NumVars);
12944 for (
unsigned i = 0; i != NumVars; ++i)
12945 Vars.push_back(Record.readSubExpr());
12946 C->setVarRefs(Vars);
12948 Vars.reserve(NumVars);
12949 for (
unsigned i = 0; i != NumVars; ++i)
12950 Vars.push_back(Record.readSubExpr());
12951 C->setPrivateRefs(Vars);
12954void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
12955 C->setLParenLoc(Record.readSourceLocation());
12956 unsigned NumVars =
C->varlist_size();
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);
12964void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
12965 C->setLParenLoc(Record.readSourceLocation());
12966 unsigned NumVars =
C->varlist_size();
12967 SmallVector<Expr *, 16> Vars;
12968 Vars.reserve(NumVars);
12969 for (
unsigned i = 0; i != NumVars; ++i)
12970 Vars.push_back(Record.readSubExpr());
12971 C->setVarRefs(Vars);
12974void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
12975 C->setLParenLoc(Record.readSourceLocation());
12976 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12977 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12978 Data.reserve(NumOfAllocators);
12979 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12980 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12983 D.
LParenLoc = Record.readSourceLocation();
12984 D.
RParenLoc = Record.readSourceLocation();
12986 C->setAllocatorsData(
Data);
12989void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
12990 C->setLParenLoc(Record.readSourceLocation());
12991 C->setModifier(Record.readSubExpr());
12992 C->setColonLoc(Record.readSourceLocation());
12993 unsigned NumOfLocators =
C->varlist_size();
12994 SmallVector<Expr *, 4> Locators;
12995 Locators.reserve(NumOfLocators);
12996 for (
unsigned I = 0; I != NumOfLocators; ++I)
12997 Locators.push_back(Record.readSubExpr());
12998 C->setVarRefs(Locators);
13001void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
13004 C->setLParenLoc(Record.readSourceLocation());
13005 C->setKindKwLoc(Record.readSourceLocation());
13006 C->setModifierKwLoc(Record.readSourceLocation());
13009void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
13011 C->setThreadID(Record.readSubExpr());
13012 C->setLParenLoc(Record.readSourceLocation());
13015void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
13017 C->setLParenLoc(Record.readSourceLocation());
13018 C->setBindKindLoc(Record.readSourceLocation());
13022 C->setAlignment(Record.readExpr());
13023 C->setLParenLoc(Record.readSourceLocation());
13026void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
13028 C->setSize(Record.readSubExpr());
13029 C->setLParenLoc(Record.readSourceLocation());
13032void OMPClauseReader::VisitOMPDynGroupprivateClause(
13033 OMPDynGroupprivateClause *
C) {
13035 C->setDynGroupprivateModifier(
13037 C->setDynGroupprivateFallbackModifier(
13039 C->setSize(Record.readSubExpr());
13040 C->setLParenLoc(Record.readSourceLocation());
13041 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13042 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13045void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
13046 C->setLParenLoc(Record.readSourceLocation());
13047 C->setDependenceType(
13049 C->setDependenceLoc(Record.readSourceLocation());
13050 C->setColonLoc(Record.readSourceLocation());
13051 unsigned NumVars =
C->varlist_size();
13052 SmallVector<Expr *, 16> Vars;
13053 Vars.reserve(NumVars);
13054 for (
unsigned I = 0; I != NumVars; ++I)
13055 Vars.push_back(Record.readSubExpr());
13056 C->setVarRefs(Vars);
13057 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
13058 C->setLoopData(I, Record.readSubExpr());
13061void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
13063 Record.readAttributes(Attrs);
13064 C->setAttrs(Attrs);
13065 C->setLocStart(Record.readSourceLocation());
13066 C->setLParenLoc(Record.readSourceLocation());
13067 C->setLocEnd(Record.readSourceLocation());
13070void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
13080 Selector.ScoreOrCondition =
nullptr;
13082 Selector.ScoreOrCondition = readExprRef();
13094 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13099 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13101 Data->setClauses(Clauses);
13102 if (
Data->hasAssociatedStmt())
13104 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13109 unsigned NumVars =
readInt();
13111 for (
unsigned I = 0; I < NumVars; ++I)
13117 unsigned NumExprs =
readInt();
13119 for (
unsigned I = 0; I < NumExprs; ++I)
13129 switch (ClauseKind) {
13144 bool isConditionExprClause =
readBool();
13145 if (isConditionExprClause) {
13150 unsigned NumVars =
readInt();
13152 for (
unsigned I = 0; I < NumVars; ++I)
13159 unsigned NumClauses =
readInt();
13161 for (
unsigned I = 0; I < NumClauses; ++I)
13195 for (
unsigned I = 0; I < VarList.size(); ++I) {
13198 RecipeList.push_back({Alloca});
13202 VarList, RecipeList, EndLoc);
13220 for (
unsigned I = 0; I < VarList.size(); ++I) {
13224 RecipeList.push_back({Recipe, RecipeTemp});
13228 VarList, RecipeList, EndLoc);
13279 LParenLoc, ModList, VarList, EndLoc);
13288 LParenLoc, ModList, VarList, EndLoc);
13297 LParenLoc, ModList, VarList, EndLoc);
13306 LParenLoc, ModList, VarList, EndLoc);
13312 AsyncExpr, EndLoc);
13320 DevNumExpr, QueuesLoc, QueueIdExprs,
13327 unsigned NumArchs =
readInt();
13329 for (
unsigned I = 0; I < NumArchs; ++I) {
13332 Archs.emplace_back(Loc, Ident);
13336 LParenLoc, Archs, EndLoc);
13344 for (
unsigned I = 0; I < VarList.size(); ++I) {
13348 3 *
sizeof(
int *));
13351 unsigned NumCombiners =
readInt();
13352 for (
unsigned I = 0; I < NumCombiners; ++I) {
13357 Combiners.push_back({LHS, RHS, Op});
13360 RecipeList.push_back({Recipe, Combiners});
13364 VarList, RecipeList, EndLoc);
13383 HasForce, LoopCount, EndLoc);
13387 unsigned NumClauses =
readInt();
13389 for (
unsigned I = 0; I < NumClauses; ++I)
13392 SizeExprs, EndLoc);
13396 unsigned NumExprs =
readInt();
13399 for (
unsigned I = 0; I < NumExprs; ++I) {
13405 GangKinds, Exprs, EndLoc);
13411 WorkerExpr, EndLoc);
13417 VectorExpr, EndLoc);
13429 LParenLoc, VarList, EndLoc);
13443 llvm_unreachable(
"Clause serialization not yet implemented");
13445 llvm_unreachable(
"Invalid Clause Kind");
13450 for (
unsigned I = 0; I < Clauses.size(); ++I)
13455 unsigned NumVars =
readInt();
13456 A->Clauses.resize(NumVars);
13463 llvm::FoldingSetNodeID ID;
13464 ID.AddString(PrimaryModuleName);
13465 return ID.computeStableHash();
13470 return std::nullopt;
13473 return std::nullopt;
13476 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 bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
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 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.
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 N)
Creates an empty clause with N expressions.
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
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.
void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override
Notify the external source that a lambda was assigned a mangling number.
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
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.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
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, TemplateDecl *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.
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 makeImplicit(std::string Name, unsigned SuffixLength)
Creates a file name for an implicit module.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
StringRef str() const
Returns the plain module file name.
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.
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.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
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.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
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.
The JSON file list parser is used to communicate input to InstallAPI.
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.
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
@ 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',...
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.
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.
@ 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
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
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.
__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)
MultiOnDiskHashTable< LazySpecializationInfoLookupTrait > Table
void insert(LazySpecializationInfo Info)